aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc G. Fournier <scrappy@hub.org>1996-07-19 06:08:21 +0000
committerMarc G. Fournier <scrappy@hub.org>1996-07-19 06:08:21 +0000
commit64bfa0487b3df4c92cb570ba632c5b4da4b48cbc (patch)
treea2f392713f445e68fb201c64352080b8c612c74d
parent89ad6338973c033ac34265d829fa8e5c3e122067 (diff)
downloadpostgresql-64bfa0487b3df4c92cb570ba632c5b4da4b48cbc.tar.gz
postgresql-64bfa0487b3df4c92cb570ba632c5b4da4b48cbc.zip
fixes for textcat(), but headers were missing from archive :(
-rw-r--r--src/backend/utils/adt/varlena.c47
1 files changed, 29 insertions, 18 deletions
diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c
index 1ef6f19113e..e3f3c939306 100644
--- a/src/backend/utils/adt/varlena.c
+++ b/src/backend/utils/adt/varlena.c
@@ -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. */
-
- pfree(str1);
- pfree(str2);
+ 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);
+
return result;
}