 | | From: | Robert Wimmer | | Subject: | type text in c functions | | Date: | Sun, 19 Dec 2004 01:16:44 +0000 |
|
|
 | i tried to write a simple typechecking function in c. but it does not work correct
-- CODE -- #include #include #include
PG_FUNCTION_INFO_V1(text_to_card);
Datum text_to_card(PG_FUNCTION_ARGS) { int i,l; int32 ret;
text *t = PG_GETARG_TEXT_P(0);
l = VARSIZE(t) - VARHDRSZ;
for (i = 0; i < l; i++) { if ( (t->vl_dat[i] < '0') || (t->vl_dat[i] > '9')) break; }
if (i==l) ret = 0; else ret = i;
PG_RETURN_INT32(ret); }
--END --
this function should check if it is possible to cast a TEXT in an unsigned INTEGER. if OK it returns 0 otherwise the position in the string where the error occured. ( so you can produce error messages like ERROR[234] text_to_card('paramete') failed at <3>)
i assumed - after reading the corresponding header files and docs and google - the type structure of a text as above. i only get zeros and ones as result
the algorithm works fine in 'normal' c.
is there a possibilty to treat a TEXT parameter like a char array ?
thanks and regards sepp
_________________________________________________________________ Schaffen Sie das Platzproblem in Ihrem E-Mail-Konto für immer aus der Welt! http://join.msn.com/?pgmarket=de-at&DI=1031&XAPID=1581
---------------------------(end of broadcast)--------------------------- TIP 2: you can get off all lists at once with the unregister command (send "unregister YourEmailAddressHere" to majordomo@postgresql.org)
|
|
 | | From: | Tom Lane | | Subject: | Re: type text in c functions | | Date: | Sat, 18 Dec 2004 22:21:07 -0500 |
|
|
 | "Robert Wimmer" writes: > text *t = PG_GETARG_TEXT_P(0);
> l = VARSIZE(t) - VARHDRSZ;
> for (i = 0; i < l; i++) { if ( (t->vl_dat[i] < '0') || (t->vl_dat[i] > > '9')) break; }
> if (i==l) ret = 0; > else ret = i;
I think you need to rethink your return convention --- success and failure at the first character both return 0.
Directly using the vl_dat field doesn't seem like good style (you won't find it anywhere in the backend sources) but it works.
regards, tom lane
---------------------------(end of broadcast)--------------------------- TIP 3: if posting/reading through Usenet, please send an appropriate subscribe-nomail command to majordomo@postgresql.org so that your message can get through to the mailing list cleanly
|
|