diff options
author | Thomas G. Lockhart <lockhart@fourpalms.org> | 1998-05-09 22:45:14 +0000 |
---|---|---|
committer | Thomas G. Lockhart <lockhart@fourpalms.org> | 1998-05-09 22:45:14 +0000 |
commit | cb0382620100b61267f58649ad54878f3bc9c50b (patch) | |
tree | ef4afa29e873f9f6f8efe611e7826c90df73ed47 /src/backend/utils/adt/varchar.c | |
parent | 9afe03355a8daa58e55ba34f7e6eee5f0a73c737 (diff) | |
download | postgresql-cb0382620100b61267f58649ad54878f3bc9c50b.tar.gz postgresql-cb0382620100b61267f58649ad54878f3bc9c50b.zip |
Add routines to convert between varchar and bpchar.
Add routines to allow sizing of varchar and bpchar into target columns.
Diffstat (limited to 'src/backend/utils/adt/varchar.c')
-rw-r--r-- | src/backend/utils/adt/varchar.c | 127 |
1 files changed, 125 insertions, 2 deletions
diff --git a/src/backend/utils/adt/varchar.c b/src/backend/utils/adt/varchar.c index cbd113bba85..7f30f2bab69 100644 --- a/src/backend/utils/adt/varchar.c +++ b/src/backend/utils/adt/varchar.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.30 1998/04/27 17:08:26 scrappy Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.31 1998/05/09 22:42:07 thomas Exp $ * *------------------------------------------------------------------------- */ @@ -130,12 +130,103 @@ bpcharout(char *s) return (result); } +/* bpchar() + * Converts a char() type to a specific internal length. + * len is the length specified in () plus VARHDRSZ bytes. + */ +char * +bpchar(char *s, int32 len) +{ + char *result, + *r; + int rlen, slen; + int i; + + if (s == NULL) + return ((char *) NULL); + + if ((len == -1) || (len == VARSIZE(s))) + return (s); + + rlen = len - VARHDRSZ; + + if (rlen > 4096) + elog(ERROR, "bpchar: length of char() must be less than 4096"); + +#ifdef STRINGDEBUG +printf("bpchar- convert string length %d (%d) ->%d (%d)\n", + VARSIZE(s)-VARHDRSZ, VARSIZE(s), rlen, len); +#endif + + result = (char *) palloc(len); + VARSIZE(result) = len; + r = VARDATA(result); + slen = VARSIZE(s) - VARHDRSZ; + s = VARDATA(s); + +#ifdef STRINGDEBUG +printf("bpchar- string is '"); +#endif + + for (i = 0; (i < rlen) && (i < slen); i++) + { + if (*s == '\0') + break; + +#ifdef STRINGDEBUG +printf("%c", *s); +#endif + + *r++ = *s++; + } + +#ifdef STRINGDEBUG +printf("'\n"); +#endif + + /* blank pad the string if necessary */ + for (; i < rlen; i++) + { + *r++ = ' '; + } + + return (result); +} /* bpchar() */ + + +/* bpchar_char() + * Convert bpchar(1) to char. + */ +int32 +bpchar_char(char *s) +{ + return ((int32) *VARDATA(s)); +} /* char_bpchar() */ + + +/* char_bpchar() + * Convert char to bpchar(1). + */ +char * +char_bpchar(int32 c) +{ + char *result; + + result = palloc(VARHDRSZ+1); + + VARSIZE(result) = VARHDRSZ+1; + *(VARDATA(result)) = (char) c; + + return result; +} /* char_bpchar() */ + + /***************************************************************************** * varchar - varchar() * *****************************************************************************/ /* - * vcharin - + * varcharin - * converts a string of varchar() type to the internal representation. * len is the length specified in () plus VARHDRSZ bytes. (XXX dummy is here * because we pass typelem as the second argument for array_in.) @@ -193,6 +284,38 @@ varcharout(char *s) return (result); } +/* varchar() + * Converts a varchar() type to the specified size. + * slen is the length specified in () plus VARHDRSZ bytes. + */ +char * +varchar(char *s, int32 slen) +{ + char *result; + int len; + + if (s == NULL) + return ((char *) NULL); + + len = VARSIZE(s); + if ((slen == -1) || (len <= slen)) + return ((char *) s); + + /* only reach here if we need to truncate string... */ + + len = slen - VARHDRSZ; + + if (len > 4096) + elog(ERROR, "varchar: length of varchar() must be less than 4096"); + + result = (char *) palloc(slen); + VARSIZE(result) = slen; + strncpy(VARDATA(result), VARDATA(s), len); + + return (result); +} /* varchar() */ + + /***************************************************************************** * Comparison Functions used for bpchar *****************************************************************************/ |