1
0
mirror of https://github.com/postgres/postgres.git synced 2025-04-24 10:47:04 +03:00

Add routines to help with single-byte (internal) character type support.

This commit is contained in:
Thomas G. Lockhart 1998-12-13 23:36:48 +00:00
parent f9f4004b7c
commit 239564e9ef
3 changed files with 42 additions and 14 deletions

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/char.c,v 1.19 1998/09/01 03:25:50 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/char.c,v 1.20 1998/12/13 23:35:48 thomas Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -29,7 +29,7 @@ int32
charin(char *ch) charin(char *ch)
{ {
if (ch == NULL) if (ch == NULL)
return (int32) NULL; return (int32) '\0';
return (int32) *ch; return (int32) *ch;
} }
@ -153,3 +153,21 @@ cideq(int8 arg1, int8 arg2)
{ {
return arg1 == arg2; return arg1 == arg2;
} }
int8
text_char(text *arg1)
{
return ((int8) *(VARDATA(arg1)));
}
text *
char_text(int8 arg1)
{
text *result;
result = palloc(VARHDRSZ+1);
VARSIZE(result) = VARHDRSZ+1;
*(VARDATA(result)) = arg1;
return result;
}

View File

@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.45 1998/12/08 06:19:15 thomas Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.46 1998/12/13 23:35:48 thomas Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -313,9 +313,8 @@ textcat(text *t1, text *t2)
* - starting position (is one-based) * - starting position (is one-based)
* - string length * - string length
* *
* If the starting position is zero or less, then return the entire string. * If the starting position is zero or less, then return from the start of the string
* XXX Note that this may not be the right behavior: * adjusting the length to be consistant with the "negative start" per SQL92.
* if we are calculating the starting position we might want it to start at one.
* If the length is less than zero, return the remaining string. * If the length is less than zero, return the remaining string.
* *
* Note that the arguments operate on octet length, * Note that the arguments operate on octet length,
@ -323,6 +322,9 @@ textcat(text *t1, text *t2)
* *
* Added multi-byte support. * Added multi-byte support.
* - Tatsuo Ishii 1998-4-21 * - Tatsuo Ishii 1998-4-21
* Changed behavior if starting position is less than one to conform to SQL92 behavior.
* Formerly returned the entire string; now returns a portion.
* - Thomas Lockhart 1998-12-10
*/ */
text * text *
text_substr(text *string, int32 m, int32 n) text_substr(text *string, int32 m, int32 n)
@ -336,7 +338,7 @@ text_substr(text *string, int32 m, int32 n)
#endif #endif
if ((string == (text *) NULL) || (m <= 0)) if (string == (text *) NULL)
return string; return string;
len = VARSIZE(string) - VARHDRSZ; len = VARSIZE(string) - VARHDRSZ;
@ -344,18 +346,24 @@ text_substr(text *string, int32 m, int32 n)
len = pg_mbstrlen_with_len(VARDATA(string), len); len = pg_mbstrlen_with_len(VARDATA(string), len);
#endif #endif
/* m will now become a zero-based starting position */ /* starting position after the end of the string? */
if (m > len) if (m > len)
{ {
m = 0; m = 1;
n = 0; n = 0;
} }
else /* starting position before the start of the string?
* then offset into the string per SQL92 spec... */
else if (m < 1)
{ {
n += (m-1);
m = 1;
}
/* m will now become a zero-based starting position */
m--; m--;
if (((m + n) > len) || (n < 0)) if (((m + n) > len) || (n < 0))
n = (len - m); n = (len - m);
}
#ifdef MULTIBYTE #ifdef MULTIBYTE
p = VARDATA(string); p = VARDATA(string);

View File

@ -6,7 +6,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: builtins.h,v 1.71 1998/12/08 06:18:34 thomas Exp $ * $Id: builtins.h,v 1.72 1998/12/13 23:36:48 thomas Exp $
* *
* NOTES * NOTES
* This should normally only be included by fmgr.h. * This should normally only be included by fmgr.h.
@ -60,6 +60,8 @@ extern int8 charmi(int8 arg1, int8 arg2);
extern int8 charmul(int8 arg1, int8 arg2); extern int8 charmul(int8 arg1, int8 arg2);
extern int8 chardiv(int8 arg1, int8 arg2); extern int8 chardiv(int8 arg1, int8 arg2);
extern bool cideq(int8 arg1, int8 arg2); extern bool cideq(int8 arg1, int8 arg2);
extern int8 text_char(text *arg1);
extern text* char_text(int8 arg1);
/* int.c */ /* int.c */
extern int32 int2in(char *num); extern int32 int2in(char *num);