diff options
Diffstat (limited to 'src/backend/utils/adt/varlena.c')
-rw-r--r-- | src/backend/utils/adt/varlena.c | 72 |
1 files changed, 36 insertions, 36 deletions
diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c index b5380a8c52a..b075bf91112 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.64 2000/07/12 02:37:19 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.65 2000/07/29 03:26:42 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -41,18 +41,17 @@ static int text_cmp(text *arg1, text *arg2); * The input is scaned twice. * The error checking of input is minimal. */ -bytea * -byteain(char *inputText) +Datum +byteain(PG_FUNCTION_ARGS) { + char *inputText = PG_GETARG_CSTRING(0); char *tp; char *rp; int byte; bytea *result; - if (inputText == NULL) - elog(ERROR, "Bad input string for type bytea"); - for (byte = 0, tp = inputText; *tp != '\0'; byte++) + { if (*tp++ == '\\') { if (*tp == '\\') @@ -62,12 +61,16 @@ byteain(char *inputText) !isdigit((int) *tp++)) elog(ERROR, "Bad input string for type bytea"); } - tp = inputText; + } + byte += VARHDRSZ; result = (bytea *) palloc(byte); - result->vl_len = byte; /* varlena? */ + result->vl_len = byte; /* set varlena length */ + + tp = inputText; rp = result->vl_dat; while (*tp != '\0') + { if (*tp != '\\' || *++tp == '\\') *rp++ = *tp++; else @@ -78,7 +81,9 @@ byteain(char *inputText) byte <<= 3; *rp++ = byte + VAL(*tp++); } - return result; + } + + PG_RETURN_BYTEA_P(result); } /* @@ -89,9 +94,10 @@ byteain(char *inputText) * * NULL vlena should be an error--returning string with NULL for now. */ -char * -byteaout(bytea *vlena) +Datum +byteaout(PG_FUNCTION_ARGS) { + bytea *vlena = PG_GETARG_BYTEA_P(0); char *result; char *vp; char *rp; @@ -99,47 +105,42 @@ byteaout(bytea *vlena) int i; int len; - if (vlena == NULL) - { - result = (char *) palloc(2); - result[0] = '-'; - result[1] = '\0'; - return result; - } - vp = vlena->vl_dat; len = 1; /* empty string has 1 char */ + vp = vlena->vl_dat; for (i = vlena->vl_len - VARHDRSZ; i != 0; i--, vp++) + { if (*vp == '\\') len += 2; else if (isascii((int) *vp) && isprint((int) *vp)) len++; else - len += VARHDRSZ; + len += 4; + } rp = result = (char *) palloc(len); vp = vlena->vl_dat; - for (i = vlena->vl_len - VARHDRSZ; i != 0; i--) + for (i = vlena->vl_len - VARHDRSZ; i != 0; i--, vp++) + { if (*vp == '\\') { - vp++; *rp++ = '\\'; *rp++ = '\\'; } else if (isascii((int) *vp) && isprint((int) *vp)) - *rp++ = *vp++; + *rp++ = *vp; else { - val = *vp++; - *rp = '\\'; - rp += 3; - *rp-- = DIG(val & 07); + val = *vp; + rp[0] = '\\'; + rp[3] = DIG(val & 07); val >>= 3; - *rp-- = DIG(val & 07); + rp[2] = DIG(val & 07); val >>= 3; - *rp = DIG(val & 03); - rp += 3; + rp[1] = DIG(val & 03); + rp += 4; } + } *rp = '\0'; - return result; + PG_RETURN_CSTRING(result); } @@ -663,13 +664,12 @@ text_smaller(PG_FUNCTION_ARGS) * get the number of bytes contained in an instance of type 'bytea' *------------------------------------------------------------- */ -int32 -byteaoctetlen(bytea *v) +Datum +byteaoctetlen(PG_FUNCTION_ARGS) { - if (!PointerIsValid(v)) - return 0; + bytea *v = PG_GETARG_BYTEA_P(0); - return VARSIZE(v) - VARHDRSZ; + PG_RETURN_INT32(VARSIZE(v) - VARHDRSZ); } /*------------------------------------------------------------- |