fixes for textcat(), but headers were missing from archive :(

This commit is contained in:
Marc G. Fournier 1996-07-19 06:08:21 +00:00
parent 89ad633897
commit 64bfa0487b
1 changed files with 28 additions and 17 deletions

View File

@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.1.1.1 1996/07/09 06:22:06 scrappy Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.2 1996/07/19 06:08:21 scrappy Exp $
*
*-------------------------------------------------------------------------
*/
@ -198,6 +198,24 @@ textout(struct varlena *vlena)
/* ========== PUBLIC ROUTINES ========== */
/*
/*
* textlen -
* returns the actual length of a text* (which may be less than
* the VARSIZE of the text*)
*/
int textlen (text* t)
{
int i = 0;
int max = VARSIZE(t) - VARHDRSZ;
char *ptr = VARDATA(t);
while (i < max && *ptr++)
i++;
return i;
}
/*
* textcat -
* takes two text* and returns a text* that is the concatentation of
@ -206,28 +224,21 @@ textout(struct varlena *vlena)
text*
textcat(text* t1, text* t2)
{
int newlen;
char *str1, *str2;
int len1, len2, newlen;
text* result;
if (t1 == NULL) return t2;
if (t2 == NULL) return t1;
/* since t1, and t2 are non-null, str1 and str2 must also be non-null */
str1 = textout(t1);
str2 = textout(t2);
/* we use strlen here to calculate the length because the size fields
of t1, t2 may be longer than necessary to hold the string */
newlen = strlen(str1) + strlen(str2) + VARHDRSZ;
result = (text*)palloc(newlen);
strcpy(VARDATA(result), str1);
strncat(VARDATA(result), str2, newlen - VARHDRSZ);
/* [TRH] Was:
strcat(VARDATA(result), str2);
which may corrupt the malloc arena due to writing trailing \0. */
len1 = textlen (t1);
len2 = textlen (t2);
newlen = len1 + len2 + VARHDRSZ;
result = (text*) palloc (newlen);
VARSIZE(result) = newlen;
memcpy (VARDATA(result), VARDATA(t1), len1);
memcpy (VARDATA(result) + len1, VARDATA(t2), len2);
pfree(str1);
pfree(str2);
return result;
}