aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/name.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/adt/name.c')
-rw-r--r--src/backend/utils/adt/name.c198
1 files changed, 198 insertions, 0 deletions
diff --git a/src/backend/utils/adt/name.c b/src/backend/utils/adt/name.c
new file mode 100644
index 00000000000..1031b5bb49a
--- /dev/null
+++ b/src/backend/utils/adt/name.c
@@ -0,0 +1,198 @@
+/*-------------------------------------------------------------------------
+ *
+ * name.c--
+ * Functions for the built-in type "name".
+ * name replaces char16 and is carefully implemented so that it
+ * is a string of length NAMEDATALEN. DO NOT use hard-coded constants anywhere
+ * always use NAMEDATALEN as the symbolic constant! - jolly 8/21/95
+ *
+ *
+ * Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/name.c,v 1.1.1.1 1996/07/09 06:22:04 scrappy Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+#include <string.h>
+#include "postgres.h"
+#include "utils/builtins.h" /* where the declarations go */
+#include "utils/palloc.h" /* where the declarations go */
+
+/*****************************************************************************
+ * USER I/O ROUTINES (none) *
+ *****************************************************************************/
+
+
+/*
+ * namein - converts "..." to internal representation
+ *
+ * Note:
+ * Currently if strlen(s) < NAMEDATALEN, the extra chars are nulls
+ */
+NameData *namein(char *s)
+{
+ NameData *result;
+
+ if (s == NULL)
+ return(NULL);
+ result = (NameData*) palloc(NAMEDATALEN);
+ /* always keep it null-padded */
+ memset(result->data, 0, NAMEDATALEN);
+ (void) strncpy(result->data, s, NAMEDATALEN-1);
+ return(result);
+}
+
+/*
+ * nameout - converts internal reprsentation to "..."
+ */
+char *nameout(NameData *s)
+{
+ if (s == NULL)
+ return "-";
+ else
+ return pstrdup(s->data);
+}
+
+
+/*****************************************************************************
+ * PUBLIC ROUTINES *
+ *****************************************************************************/
+
+/*
+ * nameeq - returns 1 iff arguments are equal
+ * namene - returns 1 iff arguments are not equal
+ *
+ * BUGS:
+ * Assumes that "xy\0\0a" should be equal to "xy\0b".
+ * If not, can do the comparison backwards for efficiency.
+ *
+ * namelt - returns 1 iff a < b
+ * namele - returns 1 iff a <= b
+ * namegt - returns 1 iff a < b
+ * namege - returns 1 iff a <= b
+ *
+ */
+int32 nameeq(NameData *arg1, NameData *arg2)
+{
+ if (!arg1 || !arg2)
+ return 0;
+ else
+ return (strncmp(arg1->data, arg2->data, NAMEDATALEN) == 0);
+}
+
+int32 namene(NameData *arg1, NameData *arg2)
+{
+ if (arg1 == NULL || arg2 == NULL)
+ return((int32) 0);
+ return(strncmp(arg1->data, arg2->data, NAMEDATALEN) != 0);
+}
+
+int32 namelt(NameData *arg1, NameData *arg2)
+{
+ if (arg1 == NULL || arg2 == NULL)
+ return((int32) 0);
+ return((int32) (strncmp(arg1->data, arg2->data, NAMEDATALEN) < 0));
+}
+
+int32 namele(NameData *arg1, NameData *arg2)
+{
+ if (arg1 == NULL || arg2 == NULL)
+ return((int32) 0);
+ return((int32) (strncmp(arg1->data, arg2->data, NAMEDATALEN) <= 0));
+}
+
+int32 namegt(NameData *arg1, NameData *arg2)
+{
+ if (arg1 == NULL || arg2 == NULL)
+ return((int32) 0);
+
+ return((int32) (strncmp(arg1->data, arg2->data, NAMEDATALEN) > 0));
+}
+
+int32 namege(NameData *arg1, NameData *arg2)
+{
+ if (arg1 == NULL || arg2 == NULL)
+ return((int32) 0);
+
+ return((int32) (strncmp(arg1->data, arg2->data, NAMEDATALEN) >= 0));
+}
+
+
+/* (see char.c for comparison/operation routines) */
+
+int namecpy(Name n1, Name n2)
+{
+ if (!n1 || !n2)
+ return(-1);
+ (void) strncpy(n1->data, n2->data, NAMEDATALEN);
+ return(0);
+}
+
+int namecat(Name n1, Name n2)
+{
+ return(namestrcat(n1, n2->data)); /* n2 can't be any longer than n1 */
+}
+
+int namecmp(Name n1, Name n2)
+{
+ return(strncmp(n1->data, n2->data, NAMEDATALEN));
+}
+
+int
+namestrcpy(Name name, char *str)
+{
+ if (!name || !str)
+ return(-1);
+ memset(name->data, 0, sizeof(NameData));
+ (void) strncpy(name->data, str, NAMEDATALEN);
+ return(0);
+}
+
+int namestrcat(Name name, char *str)
+{
+ int i;
+ char *p, *q;
+
+ if (!name || !str)
+ return(-1);
+ for (i = 0, p = name->data; i < NAMEDATALEN && *p; ++i, ++p)
+ ;
+ for (q = str; i < NAMEDATALEN; ++i, ++p, ++q) {
+ *p = *q;
+ if (!*q)
+ break;
+ }
+ return(0);
+}
+
+int
+namestrcmp(Name name, char *str)
+{
+ if (!name && !str)
+ return(0);
+ if (!name)
+ return(-1); /* NULL < anything */
+ if (!str)
+ return(1); /* NULL < anything */
+ return(strncmp(name->data, str, NAMEDATALEN));
+}
+
+/*****************************************************************************
+ * PRIVATE ROUTINES *
+ *****************************************************************************/
+
+uint32
+NameComputeLength(Name name)
+{
+ char *charP;
+ int length;
+
+ for (length = 0, charP = name->data;
+ length < NAMEDATALEN && *charP != '\0';
+ length++, charP++) {
+ ;
+ }
+ return (uint32)length;
+}