Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > C Wrapper Function, crashing Python?

Reply
Thread Tools

C Wrapper Function, crashing Python?

 
 
Java and Swing
Guest
Posts: n/a
 
      10-12-2005
static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
// this will store the result in a Python object
PyObject *finalResult;

// get arguments from Python
char *result = 0;
char *in= 0;
char *aString = 0;
char *bString = 0;
MY_NUM *a;
MY_NUM *b;
int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
if (!ok) return 0;

// do work to get a and b
// count - returns an int; GetVal - returns a char *
a = GetVal(aString, count(aString, ","));
b = GetVal(bString, count(bString, ","));

// make function call, which returns a char *
result = doStuff(in, a, b);

// save result in Python string
finalResult = PyString_FromString(result);

// free memory
PyMem_Free(result);
PyMem_Free(a);
PyMem_Free(b);

// return the result as a Python string
return finalResult;
}

....from python I can call this function 4 times...works fine. WHen I
call it for the fifth time python.exe crashes. im thinking some memory
problem in the wrapper function perhaps...but I am not sure. The
actually C function, doStuff can be called 5, 6,7...N times without a
problem
so i know its gotta be my wrapper.

Any ideas? Thanks!

 
Reply With Quote
 
 
 
 
Java and Swing
Guest
Posts: n/a
 
      10-12-2005
update:
if I use C's free(result), free(a) free(b) instead of PyMem_Free...I
only get one successfuly use/call of doStuff.

i.e.
// this works
doStuff(...)

// python crashes here
doStuff(...)

Java and Swing wrote:
> static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
> // this will store the result in a Python object
> PyObject *finalResult;
>
> // get arguments from Python
> char *result = 0;
> char *in= 0;
> char *aString = 0;
> char *bString = 0;
> MY_NUM *a;
> MY_NUM *b;
> int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
> if (!ok) return 0;
>
> // do work to get a and b
> // count - returns an int; GetVal - returns a char *
> a = GetVal(aString, count(aString, ","));
> b = GetVal(bString, count(bString, ","));
>
> // make function call, which returns a char *
> result = doStuff(in, a, b);
>
> // save result in Python string
> finalResult = PyString_FromString(result);
>
> // free memory
> PyMem_Free(result);
> PyMem_Free(a);
> PyMem_Free(b);
>
> // return the result as a Python string
> return finalResult;
> }
>
> ...from python I can call this function 4 times...works fine. WHen I
> call it for the fifth time python.exe crashes. im thinking some memory
> problem in the wrapper function perhaps...but I am not sure. The
> actually C function, doStuff can be called 5, 6,7...N times without a
> problem
> so i know its gotta be my wrapper.
>
> Any ideas? Thanks!


 
Reply With Quote
 
 
 
 
Java and Swing
Guest
Posts: n/a
 
      10-12-2005
one more update...

if I remove PyMem_Free and free(...) ...so no memory clean up...I can
still only call doStuff 4 times, the 5th attemp crashes Python.

Java and Swing wrote:
> update:
> if I use C's free(result), free(a) free(b) instead of PyMem_Free...I
> only get one successfuly use/call of doStuff.
>
> i.e.
> // this works
> doStuff(...)
>
> // python crashes here
> doStuff(...)
>
> Java and Swing wrote:
> > static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
> > // this will store the result in a Python object
> > PyObject *finalResult;
> >
> > // get arguments from Python
> > char *result = 0;
> > char *in= 0;
> > char *aString = 0;
> > char *bString = 0;
> > MY_NUM *a;
> > MY_NUM *b;
> > int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
> > if (!ok) return 0;
> >
> > // do work to get a and b
> > // count - returns an int; GetVal - returns a char *
> > a = GetVal(aString, count(aString, ","));
> > b = GetVal(bString, count(bString, ","));
> >
> > // make function call, which returns a char *
> > result = doStuff(in, a, b);
> >
> > // save result in Python string
> > finalResult = PyString_FromString(result);
> >
> > // free memory
> > PyMem_Free(result);
> > PyMem_Free(a);
> > PyMem_Free(b);
> >
> > // return the result as a Python string
> > return finalResult;
> > }
> >
> > ...from python I can call this function 4 times...works fine. WHen I
> > call it for the fifth time python.exe crashes. im thinking some memory
> > problem in the wrapper function perhaps...but I am not sure. The
> > actually C function, doStuff can be called 5, 6,7...N times without a
> > problem
> > so i know its gotta be my wrapper.
> >
> > Any ideas? Thanks!


 
Reply With Quote
 
Antoon Pardon
Guest
Posts: n/a
 
      10-12-2005
Op 2005-10-12, Java and Swing schreef <>:
> static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
> // this will store the result in a Python object
> PyObject *finalResult;
>
> // get arguments from Python
> char *result = 0;
> char *in= 0;
> char *aString = 0;
> char *bString = 0;
> MY_NUM *a;
> MY_NUM *b;
> int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
> if (!ok) return 0;
>
> // do work to get a and b
> // count - returns an int; GetVal - returns a char *
> a = GetVal(aString, count(aString, ","));
> b = GetVal(bString, count(bString, ","));
>
> // make function call, which returns a char *
> result = doStuff(in, a, b);
>
> // save result in Python string
> finalResult = PyString_FromString(result);
>
> // free memory
> PyMem_Free(result);
> PyMem_Free(a);
> PyMem_Free(b);
>
> // return the result as a Python string
> return finalResult;
> }
>
> ...from python I can call this function 4 times...works fine. WHen I
> call it for the fifth time python.exe crashes. im thinking some memory
> problem in the wrapper function perhaps...but I am not sure. The
> actually C function, doStuff can be called 5, 6,7...N times without a
> problem
> so i know its gotta be my wrapper.
>
> Any ideas? Thanks!


Well assuming your doStuff is a C function that knows nothing of python.
it might be the PyMem_Free(result).
http://docs.python.org/api/memoryInterface.html says the following:

void PyMem_Free(void *p)
Frees the memory block pointed to by p, which must have been
returned by a previous call to PyMem_Malloc() or PyMem_Realloc().
Otherwise, or if PyMem_Free(p) has been called before, undefined
behavior occurs. If p is NULL, no operation is performed.

But your result wasn't allocated by a PyMem_Malloc, it was returned
to you by a C function.

--
Antoon Pardon
 
Reply With Quote
 
Java and Swing
Guest
Posts: n/a
 
      10-12-2005
Antoon,
I just saw that to. I updated the code like so...

static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
// this will store the result in a Python object
PyObject *finalResult;

// get arguments from Python
char *result = 0;
char *in= 0;
char *aString = 0;
char *bString = 0;
MY_NUM *a = (MY_NUM *) PyMem_Malloc((20 * sizeof(MY_NUM) + 1); //
the array will be 20 long
MY_NUM *b = (MY_NUM *) PyMem_Malloc((20 * sizeof(MY_NUM) + 1); //
the array will be 20 long
int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
if (!ok) return 0;

// do work to get a and b
// count - returns an int; GetVal - returns a MY_NUM * (a pointer
to a MY_NUM array)
a = GetVal(aString, count(aString, ","));
b = GetVal(bString, count(bString, ","));

// make function call, which returns a char *
result = doStuff(in, a, b);

// save result in Python string
finalResult = PyString_FromString(result);

// free memory
PyMem_Free(a);
PyMem_Free(b);
free(aString);
free(bString);
free(result);

// return the result as a Python string
return finalResult;
}

...as you can see, i malloc'ed memory, and free'd the memory. However,
I still have python crashing (after only 3 successful calls to
doStuff). And yes, doStuff is a plain C function...nothing related to
Python.


Antoon Pardon wrote:
> Op 2005-10-12, Java and Swing schreef <>:
> > static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
> > // this will store the result in a Python object
> > PyObject *finalResult;
> >
> > // get arguments from Python
> > char *result = 0;
> > char *in= 0;
> > char *aString = 0;
> > char *bString = 0;
> > MY_NUM *a;
> > MY_NUM *b;
> > int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
> > if (!ok) return 0;
> >
> > // do work to get a and b
> > // count - returns an int; GetVal - returns a char *
> > a = GetVal(aString, count(aString, ","));
> > b = GetVal(bString, count(bString, ","));
> >
> > // make function call, which returns a char *
> > result = doStuff(in, a, b);
> >
> > // save result in Python string
> > finalResult = PyString_FromString(result);
> >
> > // free memory
> > PyMem_Free(result);
> > PyMem_Free(a);
> > PyMem_Free(b);
> >
> > // return the result as a Python string
> > return finalResult;
> > }
> >
> > ...from python I can call this function 4 times...works fine. WHen I
> > call it for the fifth time python.exe crashes. im thinking some memory
> > problem in the wrapper function perhaps...but I am not sure. The
> > actually C function, doStuff can be called 5, 6,7...N times without a
> > problem
> > so i know its gotta be my wrapper.
> >
> > Any ideas? Thanks!

>
> Well assuming your doStuff is a C function that knows nothing of python.
> it might be the PyMem_Free(result).
> http://docs.python.org/api/memoryInterface.html says the following:
>
> void PyMem_Free(void *p)
> Frees the memory block pointed to by p, which must have been
> returned by a previous call to PyMem_Malloc() or PyMem_Realloc().
> Otherwise, or if PyMem_Free(p) has been called before, undefined
> behavior occurs. If p is NULL, no operation is performed.
>
> But your result wasn't allocated by a PyMem_Malloc, it was returned
> to you by a C function.
>
> --
> Antoon Pardon


 
Reply With Quote
 
Java and Swing
Guest
Posts: n/a
 
      10-12-2005
Antoon,
I just saw that to. I updated the code like so...

static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
// this will store the result in a Python object
PyObject *finalResult;

// get arguments from Python
char *result = 0;
char *in= 0;
char *aString = 0;
char *bString = 0;
MY_NUM *a = (MY_NUM *) PyMem_Malloc((20 * sizeof(MY_NUM) + 1); //
the array will be 20 long
MY_NUM *b = (MY_NUM *) PyMem_Malloc((20 * sizeof(MY_NUM) + 1); //
the array will be 20 long
int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
if (!ok) return 0;

// do work to get a and b
// count - returns an int; GetVal - returns a MY_NUM * (a pointer
to a MY_NUM array)
a = GetVal(aString, count(aString, ","));
b = GetVal(bString, count(bString, ","));

// make function call, which returns a char *
result = doStuff(in, a, b);

// save result in Python string
finalResult = PyString_FromString(result);

// free memory
PyMem_Free(a);
PyMem_Free(b);
free(aString);
free(bString);
free(result);

// return the result as a Python string
return finalResult;
}

...as you can see, i malloc'ed memory, and free'd the memory. However,
I still have python crashing (after only 3 successful calls to
doStuff). And yes, doStuff is a plain C function...nothing related to
Python.


Antoon Pardon wrote:
> Op 2005-10-12, Java and Swing schreef <>:
> > static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
> > // this will store the result in a Python object
> > PyObject *finalResult;
> >
> > // get arguments from Python
> > char *result = 0;
> > char *in= 0;
> > char *aString = 0;
> > char *bString = 0;
> > MY_NUM *a;
> > MY_NUM *b;
> > int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
> > if (!ok) return 0;
> >
> > // do work to get a and b
> > // count - returns an int; GetVal - returns a char *
> > a = GetVal(aString, count(aString, ","));
> > b = GetVal(bString, count(bString, ","));
> >
> > // make function call, which returns a char *
> > result = doStuff(in, a, b);
> >
> > // save result in Python string
> > finalResult = PyString_FromString(result);
> >
> > // free memory
> > PyMem_Free(result);
> > PyMem_Free(a);
> > PyMem_Free(b);
> >
> > // return the result as a Python string
> > return finalResult;
> > }
> >
> > ...from python I can call this function 4 times...works fine. WHen I
> > call it for the fifth time python.exe crashes. im thinking some memory
> > problem in the wrapper function perhaps...but I am not sure. The
> > actually C function, doStuff can be called 5, 6,7...N times without a
> > problem
> > so i know its gotta be my wrapper.
> >
> > Any ideas? Thanks!

>
> Well assuming your doStuff is a C function that knows nothing of python.
> it might be the PyMem_Free(result).
> http://docs.python.org/api/memoryInterface.html says the following:
>
> void PyMem_Free(void *p)
> Frees the memory block pointed to by p, which must have been
> returned by a previous call to PyMem_Malloc() or PyMem_Realloc().
> Otherwise, or if PyMem_Free(p) has been called before, undefined
> behavior occurs. If p is NULL, no operation is performed.
>
> But your result wasn't allocated by a PyMem_Malloc, it was returned
> to you by a C function.
>
> --
> Antoon Pardon


 
Reply With Quote
 
Java and Swing
Guest
Posts: n/a
 
      10-12-2005
Sorry about the double post...

anyhow, after putting in debug statements I found that it was crashing
when it called, free(result)....so I removed the free(result).

now it crashes when it gets to, b = GetVal(bString, count(bString,
","));

...any ideas?

Java and Swing wrote:
> Antoon,
> I just saw that to. I updated the code like so...
>
> static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
> // this will store the result in a Python object
> PyObject *finalResult;
>
> // get arguments from Python
> char *result = 0;
> char *in= 0;
> char *aString = 0;
> char *bString = 0;
> MY_NUM *a = (MY_NUM *) PyMem_Malloc((20 * sizeof(MY_NUM) + 1); //
> the array will be 20 long
> MY_NUM *b = (MY_NUM *) PyMem_Malloc((20 * sizeof(MY_NUM) + 1); //
> the array will be 20 long
> int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
> if (!ok) return 0;
>
> // do work to get a and b
> // count - returns an int; GetVal - returns a MY_NUM * (a pointer
> to a MY_NUM array)
> a = GetVal(aString, count(aString, ","));
> b = GetVal(bString, count(bString, ","));
>
> // make function call, which returns a char *
> result = doStuff(in, a, b);
>
> // save result in Python string
> finalResult = PyString_FromString(result);
>
> // free memory
> PyMem_Free(a);
> PyMem_Free(b);
> free(aString);
> free(bString);
> free(result);
>
> // return the result as a Python string
> return finalResult;
> }
>
> ..as you can see, i malloc'ed memory, and free'd the memory. However,
> I still have python crashing (after only 3 successful calls to
> doStuff). And yes, doStuff is a plain C function...nothing related to
> Python.
>
>
> Antoon Pardon wrote:
> > Op 2005-10-12, Java and Swing schreef <>:
> > > static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
> > > // this will store the result in a Python object
> > > PyObject *finalResult;
> > >
> > > // get arguments from Python
> > > char *result = 0;
> > > char *in= 0;
> > > char *aString = 0;
> > > char *bString = 0;
> > > MY_NUM *a;
> > > MY_NUM *b;
> > > int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
> > > if (!ok) return 0;
> > >
> > > // do work to get a and b
> > > // count - returns an int; GetVal - returns a char *
> > > a = GetVal(aString, count(aString, ","));
> > > b = GetVal(bString, count(bString, ","));
> > >
> > > // make function call, which returns a char *
> > > result = doStuff(in, a, b);
> > >
> > > // save result in Python string
> > > finalResult = PyString_FromString(result);
> > >
> > > // free memory
> > > PyMem_Free(result);
> > > PyMem_Free(a);
> > > PyMem_Free(b);
> > >
> > > // return the result as a Python string
> > > return finalResult;
> > > }
> > >
> > > ...from python I can call this function 4 times...works fine. WHen I
> > > call it for the fifth time python.exe crashes. im thinking some memory
> > > problem in the wrapper function perhaps...but I am not sure. The
> > > actually C function, doStuff can be called 5, 6,7...N times without a
> > > problem
> > > so i know its gotta be my wrapper.
> > >
> > > Any ideas? Thanks!

> >
> > Well assuming your doStuff is a C function that knows nothing of python.
> > it might be the PyMem_Free(result).
> > http://docs.python.org/api/memoryInterface.html says the following:
> >
> > void PyMem_Free(void *p)
> > Frees the memory block pointed to by p, which must have been
> > returned by a previous call to PyMem_Malloc() or PyMem_Realloc().
> > Otherwise, or if PyMem_Free(p) has been called before, undefined
> > behavior occurs. If p is NULL, no operation is performed.
> >
> > But your result wasn't allocated by a PyMem_Malloc, it was returned
> > to you by a C function.
> >
> > --
> > Antoon Pardon


 
Reply With Quote
 
Java and Swing
Guest
Posts: n/a
 
      10-12-2005
ok, further digging...I found that in the C function GetVal...it is
crashing where I try to malloc some memory. Note, I have no problems
when running this from C..just from Python using my wrapper.

GetVal looks something like..
MY_NUM *GetVal(const char *in, const int x) {
MY_NUM *results, *returnResults;
results = (MY_NUM *) malloc((x * sizeof(MY_NUM) + 1);
returnResults = results;
// ..do more work..
return returnResults;
}

I put in print statements into the C code and found that it is crashing
at the line where I malloc some space for "results".

....any ideas why this is crashing when calling from Python via C
wrapper?

Java and Swing wrote:
> Sorry about the double post...
>
> anyhow, after putting in debug statements I found that it was crashing
> when it called, free(result)....so I removed the free(result).
>
> now it crashes when it gets to, b = GetVal(bString, count(bString,
> ","));
>
> ..any ideas?
>
> Java and Swing wrote:
> > Antoon,
> > I just saw that to. I updated the code like so...
> >
> > static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
> > // this will store the result in a Python object
> > PyObject *finalResult;
> >
> > // get arguments from Python
> > char *result = 0;
> > char *in= 0;
> > char *aString = 0;
> > char *bString = 0;
> > MY_NUM *a = (MY_NUM *) PyMem_Malloc((20 * sizeof(MY_NUM) + 1); //
> > the array will be 20 long
> > MY_NUM *b = (MY_NUM *) PyMem_Malloc((20 * sizeof(MY_NUM) + 1); //
> > the array will be 20 long
> > int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
> > if (!ok) return 0;
> >
> > // do work to get a and b
> > // count - returns an int; GetVal - returns a MY_NUM * (a pointer
> > to a MY_NUM array)
> > a = GetVal(aString, count(aString, ","));
> > b = GetVal(bString, count(bString, ","));
> >
> > // make function call, which returns a char *
> > result = doStuff(in, a, b);
> >
> > // save result in Python string
> > finalResult = PyString_FromString(result);
> >
> > // free memory
> > PyMem_Free(a);
> > PyMem_Free(b);
> > free(aString);
> > free(bString);
> > free(result);
> >
> > // return the result as a Python string
> > return finalResult;
> > }
> >
> > ..as you can see, i malloc'ed memory, and free'd the memory. However,
> > I still have python crashing (after only 3 successful calls to
> > doStuff). And yes, doStuff is a plain C function...nothing related to
> > Python.
> >
> >
> > Antoon Pardon wrote:
> > > Op 2005-10-12, Java and Swing schreef <>:
> > > > static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
> > > > // this will store the result in a Python object
> > > > PyObject *finalResult;
> > > >
> > > > // get arguments from Python
> > > > char *result = 0;
> > > > char *in= 0;
> > > > char *aString = 0;
> > > > char *bString = 0;
> > > > MY_NUM *a;
> > > > MY_NUM *b;
> > > > int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
> > > > if (!ok) return 0;
> > > >
> > > > // do work to get a and b
> > > > // count - returns an int; GetVal - returns a char *
> > > > a = GetVal(aString, count(aString, ","));
> > > > b = GetVal(bString, count(bString, ","));
> > > >
> > > > // make function call, which returns a char *
> > > > result = doStuff(in, a, b);
> > > >
> > > > // save result in Python string
> > > > finalResult = PyString_FromString(result);
> > > >
> > > > // free memory
> > > > PyMem_Free(result);
> > > > PyMem_Free(a);
> > > > PyMem_Free(b);
> > > >
> > > > // return the result as a Python string
> > > > return finalResult;
> > > > }
> > > >
> > > > ...from python I can call this function 4 times...works fine. WHen I
> > > > call it for the fifth time python.exe crashes. im thinking some memory
> > > > problem in the wrapper function perhaps...but I am not sure. The
> > > > actually C function, doStuff can be called 5, 6,7...N times without a
> > > > problem
> > > > so i know its gotta be my wrapper.
> > > >
> > > > Any ideas? Thanks!
> > >
> > > Well assuming your doStuff is a C function that knows nothing of python.
> > > it might be the PyMem_Free(result).
> > > http://docs.python.org/api/memoryInterface.html says the following:
> > >
> > > void PyMem_Free(void *p)
> > > Frees the memory block pointed to by p, which must have been
> > > returned by a previous call to PyMem_Malloc() or PyMem_Realloc().
> > > Otherwise, or if PyMem_Free(p) has been called before, undefined
> > > behavior occurs. If p is NULL, no operation is performed.
> > >
> > > But your result wasn't allocated by a PyMem_Malloc, it was returned
> > > to you by a C function.
> > >
> > > --
> > > Antoon Pardon


 
Reply With Quote
 
Bernhard Herzog
Guest
Posts: n/a
 
      10-12-2005
"Java and Swing" <> writes:

> static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {

[...]
> char *aString = 0;
> char *bString = 0;

[...]
> int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);

[...]
> free(aString);
> free(bString);


aString and bString are pointers to memory managed by the strings in
your args tuple. You must not free them! The memory is automatically
managed by Python.

Bernhard

--
Intevation GmbH http://intevation.de/
Skencil http://skencil.org/
Thuban http://thuban.intevation.org/
 
Reply With Quote
 
Java and Swing
Guest
Posts: n/a
 
      10-12-2005
thanks for the tip, however even when I do not free aString or bString,
i'm still crashing at the malloc in the c function, not the wrapper.


Bernhard Herzog wrote:
> "Java and Swing" <> writes:
>
> > static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {

> [...]
> > char *aString = 0;
> > char *bString = 0;

> [...]
> > int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);

> [...]
> > free(aString);
> > free(bString);

>
> aString and bString are pointers to memory managed by the strings in
> your args tuple. You must not free them! The memory is automatically
> managed by Python.
>
> Bernhard
>
> --
> Intevation GmbH http://intevation.de/
> Skencil http://skencil.org/
> Thuban http://thuban.intevation.org/


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Wrapper on magic line? Nilsson Mats Perl 0 12-09-2003 02:48 PM
Deployment of DTSPKG.DLL wrapper Marlene Arauz ASP .Net 0 11-10-2003 07:50 PM
wrapper function for uploading files Brian Pittman ASP .Net 3 07-30-2003 06:09 PM
Re: Coding a c# wrapper class to unmanaged C++ program, need some guidance Brendan Duffy ASP .Net 0 07-25-2003 12:49 AM
Anyone know of a ASP.NET wrapper for HTMLTidy? Showjumper ASP .Net 2 07-04-2003 01:26 AM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57