Skip to content

Commit

Permalink
Renamed.
Browse files Browse the repository at this point in the history
  • Loading branch information
warsaw committed Dec 12, 1996
1 parent eb14d61 commit 30695fa
Showing 1 changed file with 88 additions and 82 deletions.
170 changes: 88 additions & 82 deletions Modules/structmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,9 @@ PERFORMANCE OF THIS SOFTWARE.

/* struct module -- pack values into and (out of) strings */

#include "allobjects.h"
#include "modsupport.h"
#include "Python.h"

static object *StructError;
static PyObject *StructError;


/* Define various structs to figure out the alignments of types */
Expand Down Expand Up @@ -105,8 +104,8 @@ calcsize(fmt)
while ('0' <= (c = *s++) && c <= '9') {
x = num*10 + (c - '0');
if (x/10 != num) {
err_setstr(StructError,
"int overflow in fmt");
PyErr_SetString(StructError,
"int overflow in fmt");
return -1;
}
num = x;
Expand Down Expand Up @@ -148,15 +147,16 @@ calcsize(fmt)
break;

default:
err_setstr(StructError, "bad char in fmt");
PyErr_SetString(StructError, "bad char in fmt");
return -1;

}

x = num * itemsize;
size += x;
if (x/itemsize != num || size < 0) {
err_setstr(StructError, "total struct size too long");
PyErr_SetString(StructError,
"total struct size too long");
return -1;
}

Expand All @@ -168,31 +168,31 @@ calcsize(fmt)

/* pack(fmt, v1, v2, ...) --> string */

static object *
static PyObject *
struct_calcsize(self, args)
object *self; /* Not used */
object *args;
PyObject *self; /* Not used */
PyObject *args;
{
char *fmt;
int size;

if (!getargs(args, "s", &fmt))
if (!PyArg_Parse(args, "s", &fmt))
return NULL;
size = calcsize(fmt);
if (size < 0)
return NULL;
return newintobject((long)size);
return PyInt_FromLong((long)size);
}


/* pack(fmt, v1, v2, ...) --> string */

static object *
static PyObject *
struct_pack(self, args)
object *self; /* Not used */
object *args;
PyObject *self; /* Not used */
PyObject *args;
{
object *format, *result, *v;
PyObject *format, *result, *v;
char *fmt;
int size, num;
int i, n;
Expand All @@ -201,24 +201,25 @@ struct_pack(self, args)
long ival;
double fval;

if (args == NULL || !is_tupleobject(args) ||
(n = gettuplesize(args)) < 1) {
err_badarg();
if (args == NULL || !PyTuple_Check(args) ||
(n = PyTuple_Size(args)) < 1)
{
PyErr_BadArgument();
return NULL;
}
format = gettupleitem(args, 0);
if (!getargs(format, "s", &fmt))
format = PyTuple_GetItem(args, 0);
if (!PyArg_Parse(format, "s", &fmt))
return NULL;
size = calcsize(fmt);
if (size < 0)
return NULL;
result = newsizedstringobject((char *)NULL, size);
result = PyString_FromStringAndSize((char *)NULL, size);
if (result == NULL)
return NULL;

s = fmt;
i = 1;
res = restart = getstringvalue(result);
res = restart = PyString_AsString(result);

while ((c = *s++) != '\0') {
if ('0' <= c && c <= '9') {
Expand All @@ -245,17 +246,17 @@ struct_pack(self, args)
case 'h':
case 'b':
if (i >= n) {
err_setstr(StructError,
"insufficient arguments to pack");
PyErr_SetString(StructError,
"insufficient arguments to pack");
goto fail;
}
v = gettupleitem(args, i++);
if (!is_intobject(v)) {
err_setstr(StructError,
"bad argument type to pack");
v = PyTuple_GetItem(args, i++);
if (!PyInt_Check(v)) {
PyErr_SetString(StructError,
"bad argument type to pack");
goto fail;
}
ival = getintvalue(v);
ival = PyInt_AsLong(v);
switch (c) {
case 'b':
*res++ = ival;
Expand All @@ -277,34 +278,35 @@ struct_pack(self, args)

case 'c':
if (i >= n) {
err_setstr(StructError,
"insufficient arguments to pack");
PyErr_SetString(StructError,
"insufficient arguments to pack");
goto fail;
}
v = gettupleitem(args, i++);
if (!is_stringobject(v) ||
getstringsize(v) != 1) {
err_setstr(StructError,
"bad argument type to pack");
v = PyTuple_GetItem(args, i++);
if (!PyString_Check(v) ||
PyString_Size(v) != 1)
{
PyErr_SetString(StructError,
"bad argument type to pack");
goto fail;
}
*res++ = getstringvalue(v)[0];
*res++ = PyString_AsString(v)[0];
break;

case 'd':
case 'f':
if (i >= n) {
err_setstr(StructError,
"insufficient arguments to pack");
PyErr_SetString(StructError,
"insufficient arguments to pack");
goto fail;
}
v = gettupleitem(args, i++);
if (!is_floatobject(v)) {
err_setstr(StructError,
"bad argument type to pack");
v = PyTuple_GetItem(args, i++);
if (!PyFloat_Check(v)) {
PyErr_SetString(StructError,
"bad argument type to pack");
goto fail;
}
fval = getfloatvalue(v);
fval = PyFloat_AsDouble(v);
switch (c) {
case 'f':
*(float*)res = (float)fval;
Expand All @@ -318,67 +320,70 @@ struct_pack(self, args)
break;

default:
err_setstr(StructError, "bad char in fmt");
PyErr_SetString(StructError,
"bad char in fmt");
goto fail;

}
}
}

if (i < n) {
err_setstr(StructError, "too many arguments for pack fmt");
PyErr_SetString(StructError,
"too many arguments for pack fmt");
goto fail;
}

return result;

fail:
DECREF(result);
Py_DECREF(result);
return NULL;
}


/* Helper to convert a list to a tuple */

static object *
static PyObject *
totuple(list)
object *list;
PyObject *list;
{
int len = getlistsize(list);
object *tuple = newtupleobject(len);
int len = PyList_Size(list);
PyObject *tuple = PyTuple_New(len);
if (tuple != NULL) {
int i;
for (i = 0; i < len; i++) {
object *v = getlistitem(list, i);
INCREF(v);
settupleitem(tuple, i, v);
PyObject *v = PyList_GetItem(list, i);
Py_INCREF(v);
PyTuple_SetItem(tuple, i, v);
}
}
DECREF(list);
Py_DECREF(list);
return tuple;
}


/* unpack(fmt, string) --> (v1, v2, ...) */

static object *
static PyObject *
struct_unpack(self, args)
object *self; /* Not used */
object *args;
PyObject *self; /* Not used */
PyObject *args;
{
char *str, *start, *fmt, *s;
char c;
int len, size, num, x;
object *res, *v;
PyObject *res, *v;

if (!getargs(args, "(ss#)", &fmt, &start, &len))
if (!PyArg_Parse(args, "(ss#)", &fmt, &start, &len))
return NULL;
size = calcsize(fmt);
if (size != len) {
err_setstr(StructError, "unpack str size does not match fmt");
PyErr_SetString(StructError,
"unpack str size does not match fmt");
return NULL;
}
res = newlistobject(0);
res = PyList_New(0);
if (res == NULL)
return NULL;
str = start;
Expand Down Expand Up @@ -407,65 +412,66 @@ struct_unpack(self, args)
x = *str++;
if (x >= 128)
x -= 256;
v = newintobject((long)x);
v = PyInt_FromLong((long)x);
break;

case 'c':
v = newsizedstringobject(str, 1);
v = PyString_FromStringAndSize(str, 1);
str++;
break;

case 'h':
v = newintobject((long)*(short*)str);
v = PyInt_FromLong((long)*(short*)str);
str += sizeof(short);
break;

case 'i':
v = newintobject((long)*(int*)str);
v = PyInt_FromLong((long)*(int*)str);
str += sizeof(int);
break;

case 'l':
v = newintobject(*(long*)str);
v = PyInt_FromLong(*(long*)str);
str += sizeof(long);
break;

case 'f':
v = newfloatobject((double)*(float*)str);
v = PyFloat_FromDouble((double)*(float*)str);
str += sizeof(float);
break;

case 'd':
{
double d;
memcpy((char *)&d, str, sizeof d);
v = newfloatobject(d);
v = PyFloat_FromDouble(d);
str += sizeof(double);
break;
}

default:
err_setstr(StructError, "bad char in fmt");
PyErr_SetString(StructError,
"bad char in fmt");
goto fail;

}
if (v == NULL || addlistitem(res, v) < 0)
if (v == NULL || PyList_Append(res, v) < 0)
goto fail;
DECREF(v);
Py_DECREF(v);
}
}

return totuple(res);

fail:
DECREF(res);
Py_DECREF(res);
return NULL;
}


/* List of functions */

static struct methodlist struct_methods[] = {
static PyMethodDef struct_methods[] = {
{"calcsize", struct_calcsize},
{"pack", struct_pack, 1/*varargs*/},
{"unpack", struct_unpack},
Expand All @@ -478,17 +484,17 @@ static struct methodlist struct_methods[] = {
void
initstruct()
{
object *m, *d;
PyObject *m, *d;

/* Create the module and add the functions */
m = initmodule("struct", struct_methods);
m = Py_InitModule("struct", struct_methods);

/* Add some symbolic constants to the module */
d = getmoduledict(m);
StructError = newstringobject("struct.error");
dictinsert(d, "error", StructError);
d = PyModule_GetDict(m);
StructError = PyString_FromString("struct.error");
PyDict_SetItemString(d, "error", StructError);

/* Check for errors */
if (err_occurred())
fatal("can't initialize module struct");
if (PyErr_Occurred())
Py_FatalError("can't initialize module struct");
}

0 comments on commit 30695fa

Please sign in to comment.