Обсуждение: type text in c functions
i tried to write a simple typechecking function in c. but it does not work correct -- CODE -- #include <postgres.h> #include <string.h> #include <fmgr.h> 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
"Robert Wimmer" <seppwimmer@hotmail.com> 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