Problems extending Python with C.
Steinar Knutsen
sk at nvg.ntnu.no
Sat Feb 19 16:42:34 EST 2000
I do not understand why I only can use the function ncmp as defined below
properly in the sort method of a list when I put a Python function as a
wrapper around it.
Or in other words:
import numcompare
b = somefunctiongeneratingalistofstrings()
b.sort(numcompare.ncmp)
# b does not get sorted
Whereas
import numcompare
b = somefunctiongeneratingalistofstrings()
def NCMP(x,y):
return numcompare.ncmp(x,y)
b.sort(NCMP)
# b is sorted correctly
C-source for module:
------------------------------------------------------------------------
#include <string.h>
#include "/usr/local/include/python1.5/Python.h"
static PyObject * ncmp(PyObject *self, PyObject *args)
{
const char* x;
const char* y;
long cc;
if (!PyArg_ParseTuple(args, "ss", &x, &y)) {
return NULL;
}
else {
cc = numcompare(x, y);
if (cc > 0) {
return Py_BuildValue("i", 1);
}
else if ( cc == 0 ) {
return Py_BuildValue("i", 0);
}
else {
return Py_BuildValue("i", -1);
}
}
}
int numcompare(char* x, char* y)
{
int i0 = -1, i1 = -1;
char* endx;
char* endy;
int lenx, leny;
long X, Y;
lenx = strlen(x)-1;
leny = strlen(y)-1;
while ( i0 < lenx && i1 < leny ) {
i0++;
i1++;
if ( ( x[i0] >= '0' && x[i0] <= '9' ) &&
( y[i1] >= '0' && y[i1] <= '9' ) ) {
X = strtol(x+i0, &endx, 10);
Y = strtol(y+i1, &endy, 10);
}
if ( X != Y ) {
return X-Y;
}
else {
/* -1 on cause of increment in start of while-loop */
i0 = (int)(endx - x) - 1;
i1 = (int)(endy - y) - 1;
continue;
}
if ( x[i0] != y[i1] ) {
return x[i0]-y[i1];
}
}
return strcmp(x, y);
}
static struct PyMethodDef functions[] = {
{ "ncmp", ncmp, 1},
{ NULL, NULL}
};
void initnumcompare()
{
(void)Py_InitModule("numcompare", functions);
}
-----------------------------------------------------------------------
I guess I'm missing something very obvious here, but I just don't get
what. The Python is 1.5.2, the compiler is GCC 2.7.2.2, the OS is NetBSD
1.3.3. (Yeah, I know I should upgrade, but the system works. :) )
Thanks for any and all help.
--
Steinar
More information about the Python-list
mailing list