diff options
Diffstat (limited to 'src/backend/utils/adt/varlena.c')
-rw-r--r-- | src/backend/utils/adt/varlena.c | 115 |
1 files changed, 63 insertions, 52 deletions
diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c index bdd486825d0..b333a0ed4e3 100644 --- a/src/backend/utils/adt/varlena.c +++ b/src/backend/utils/adt/varlena.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.56 2000/01/26 05:57:15 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.57 2000/03/24 02:41:46 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -41,13 +41,13 @@ static int text_cmp(text *arg1, text *arg2); * The input is scaned twice. * The error checking of input is minimal. */ -text * +bytea * byteain(char *inputText) { char *tp; char *rp; int byte; - text *result; + bytea *result; if (inputText == NULL) elog(ERROR, "Bad input string for type bytea"); @@ -64,7 +64,7 @@ byteain(char *inputText) } tp = inputText; byte += VARHDRSZ; - result = (text *) palloc(byte); + result = (bytea *) palloc(byte); result->vl_len = byte; /* varlena? */ rp = result->vl_dat; while (*tp != '\0') @@ -90,10 +90,9 @@ byteain(char *inputText) * NULL vlena should be an error--returning string with NULL for now. */ char * -byteaout(text *vlena) +byteaout(bytea *vlena) { char *result; - char *vp; char *rp; int val; /* holds unprintable chars */ @@ -173,7 +172,6 @@ textin(char *inputText) * textout - converts internal representation to "..." */ char * - textout(text *vlena) { int len; @@ -218,7 +216,7 @@ textlen(text *t) #endif if (!PointerIsValid(t)) - elog(ERROR, "Null input to textlen"); + return 0; #ifdef MULTIBYTE len = 0; @@ -247,10 +245,9 @@ int32 textoctetlen(text *t) { if (!PointerIsValid(t)) - elog(ERROR, "Null input to textoctetlen"); + return 0; return VARSIZE(t) - VARHDRSZ; - } /* textoctetlen() */ /* @@ -621,19 +618,18 @@ text_smaller(text *arg1, text *arg2) } /*------------------------------------------------------------- - * byteaGetSize + * byteaoctetlen * * get the number of bytes contained in an instance of type 'bytea' *------------------------------------------------------------- */ int32 -byteaGetSize(text *v) +byteaoctetlen(bytea *v) { - int len; - - len = v->vl_len - sizeof(v->vl_len); + if (!PointerIsValid(v)) + return 0; - return len; + return VARSIZE(v) - VARHDRSZ; } /*------------------------------------------------------------- @@ -645,23 +641,22 @@ byteaGetSize(text *v) *------------------------------------------------------------- */ int32 -byteaGetByte(text *v, int32 n) +byteaGetByte(bytea *v, int32 n) { int len; int byte; - len = byteaGetSize(v); + if (!PointerIsValid(v)) + return 0; - if (n >= len) - { - elog(ERROR, "byteaGetByte: index (=%d) out of range [0..%d]", + len = VARSIZE(v) - VARHDRSZ; + + if (n < 0 || n >= len) + elog(ERROR, "byteaGetByte: index %d out of range [0..%d]", n, len - 1); - } -#ifdef USE_LOCALE - byte = (unsigned char) (v->vl_dat[n]); -#else - byte = v->vl_dat[n]; -#endif + + byte = ((unsigned char *) VARDATA(v))[n]; + return (int32) byte; } @@ -675,16 +670,26 @@ byteaGetByte(text *v, int32 n) *------------------------------------------------------------- */ int32 -byteaGetBit(text *v, int32 n) +byteaGetBit(bytea *v, int32 n) { int byteNo, bitNo; + int len; int byte; + if (!PointerIsValid(v)) + return 0; + + len = VARSIZE(v) - VARHDRSZ; + + if (n < 0 || n >= len*8) + elog(ERROR, "byteaGetBit: index %d out of range [0..%d]", + n, len*8 - 1); + byteNo = n / 8; bitNo = n % 8; - byte = byteaGetByte(v, byteNo); + byte = ((unsigned char *) VARDATA(v))[byteNo]; if (byte & (1 << bitNo)) return (int32) 1; @@ -700,36 +705,31 @@ byteaGetBit(text *v, int32 n) * *------------------------------------------------------------- */ -text * -byteaSetByte(text *v, int32 n, int32 newByte) +bytea * +byteaSetByte(bytea *v, int32 n, int32 newByte) { int len; - text *res; + bytea *res; - len = byteaGetSize(v); + if (!PointerIsValid(v)) + return 0; - if (n >= len) - { - elog(ERROR, - "byteaSetByte: index (=%d) out of range [0..%d]", + len = VARSIZE(v) - VARHDRSZ; + + if (n < 0 || n >= len) + elog(ERROR, "byteaSetByte: index %d out of range [0..%d]", n, len - 1); - } /* * Make a copy of the original varlena. */ - res = (text *) palloc(VARSIZE(v)); - if (res == NULL) - { - elog(ERROR, "byteaSetByte: Out of memory (%d bytes requested)", - VARSIZE(v)); - } - memmove((char *) res, (char *) v, VARSIZE(v)); + res = (bytea *) palloc(VARSIZE(v)); + memcpy((char *) res, (char *) v, VARSIZE(v)); /* * Now set the byte. */ - res->vl_dat[n] = newByte; + ((unsigned char *) VARDATA(res))[n] = newByte; return res; } @@ -742,26 +742,37 @@ byteaSetByte(text *v, int32 n, int32 newByte) * *------------------------------------------------------------- */ -text * -byteaSetBit(text *v, int32 n, int32 newBit) +bytea * +byteaSetBit(bytea *v, int32 n, int32 newBit) { - text *res; + bytea *res; + int len; int oldByte, newByte; int byteNo, bitNo; + if (!PointerIsValid(v)) + return NULL; + + len = VARSIZE(v) - VARHDRSZ; + + if (n < 0 || n >= len*8) + elog(ERROR, "byteaSetBit: index %d out of range [0..%d]", + n, len*8 - 1); + + byteNo = n / 8; + bitNo = n % 8; + /* * sanity check! */ if (newBit != 0 && newBit != 1) - elog(ERROR, "byteaSetByte: new bit must be 0 or 1"); + elog(ERROR, "byteaSetBit: new bit must be 0 or 1"); /* * get the byte where the bit we want is stored. */ - byteNo = n / 8; - bitNo = n % 8; oldByte = byteaGetByte(v, byteNo); /* |