1996-07-09 08:22:35 +02:00
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
*
|
|
|
|
* name.c--
|
1997-09-07 07:04:48 +02:00
|
|
|
* Functions for the built-in type "name".
|
1996-07-09 08:22:35 +02:00
|
|
|
* 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
|
1997-09-07 07:04:48 +02:00
|
|
|
*
|
1996-07-09 08:22:35 +02:00
|
|
|
*
|
|
|
|
* Copyright (c) 1994, Regents of the University of California
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* IDENTIFICATION
|
1998-06-15 21:30:31 +02:00
|
|
|
* $Header: /cvsroot/pgsql/src/backend/utils/adt/name.c,v 1.13 1998/06/15 19:29:35 momjian Exp $
|
1996-07-09 08:22:35 +02:00
|
|
|
*
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
*/
|
|
|
|
#include <string.h>
|
|
|
|
#include "postgres.h"
|
1997-09-07 07:04:48 +02:00
|
|
|
#include "utils/builtins.h" /* where the declarations go */
|
|
|
|
#include "utils/palloc.h" /* where the declarations go */
|
1996-07-09 08:22:35 +02:00
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
/*****************************************************************************
|
|
|
|
* USER I/O ROUTINES (none) *
|
1996-07-09 08:22:35 +02:00
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
1997-09-07 07:04:48 +02:00
|
|
|
* namein - converts "..." to internal representation
|
1996-07-09 08:22:35 +02:00
|
|
|
*
|
1997-09-07 07:04:48 +02:00
|
|
|
* Note:
|
|
|
|
* [Old] Currently if strlen(s) < NAMEDATALEN, the extra chars are nulls
|
|
|
|
* Now, always NULL terminated
|
1996-07-09 08:22:35 +02:00
|
|
|
*/
|
1997-09-08 04:41:22 +02:00
|
|
|
NameData *
|
1997-09-07 07:04:48 +02:00
|
|
|
namein(char *s)
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
1997-09-08 04:41:22 +02:00
|
|
|
NameData *result;
|
1998-05-29 15:31:52 +02:00
|
|
|
int len;
|
1997-09-07 07:04:48 +02:00
|
|
|
|
|
|
|
if (s == NULL)
|
|
|
|
return (NULL);
|
|
|
|
result = (NameData *) palloc(NAMEDATALEN);
|
|
|
|
/* always keep it null-padded */
|
1997-10-25 03:10:58 +02:00
|
|
|
StrNCpy(result->data, s, NAMEDATALEN);
|
1998-05-29 15:31:52 +02:00
|
|
|
len = strlen(result->data);
|
|
|
|
while (len < NAMEDATALEN)
|
|
|
|
{
|
|
|
|
*(result->data + len) = '\0';
|
|
|
|
len++;
|
|
|
|
}
|
1997-09-07 07:04:48 +02:00
|
|
|
return (result);
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
1997-09-07 07:04:48 +02:00
|
|
|
* nameout - converts internal reprsentation to "..."
|
1996-07-09 08:22:35 +02:00
|
|
|
*/
|
1998-02-26 05:46:47 +01:00
|
|
|
char *
|
1997-09-08 23:56:23 +02:00
|
|
|
nameout(NameData *s)
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
1997-09-07 07:04:48 +02:00
|
|
|
if (s == NULL)
|
|
|
|
return "-";
|
|
|
|
else
|
|
|
|
return pstrdup(s->data);
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
/*****************************************************************************
|
|
|
|
* PUBLIC ROUTINES *
|
1996-07-09 08:22:35 +02:00
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
/*
|
1997-09-07 07:04:48 +02:00
|
|
|
* nameeq - returns 1 iff arguments are equal
|
|
|
|
* namene - returns 1 iff arguments are not equal
|
1996-07-09 08:22:35 +02:00
|
|
|
*
|
1997-09-07 07:04:48 +02:00
|
|
|
* BUGS:
|
|
|
|
* Assumes that "xy\0\0a" should be equal to "xy\0b".
|
|
|
|
* If not, can do the comparison backwards for efficiency.
|
1996-07-09 08:22:35 +02:00
|
|
|
*
|
1997-09-07 07:04:48 +02:00
|
|
|
* namelt - returns 1 iff a < b
|
|
|
|
* namele - returns 1 iff a <= b
|
|
|
|
* namegt - returns 1 iff a < b
|
|
|
|
* namege - returns 1 iff a <= b
|
1996-07-09 08:22:35 +02:00
|
|
|
*
|
|
|
|
*/
|
1997-09-07 07:04:48 +02:00
|
|
|
bool
|
1997-09-08 23:56:23 +02:00
|
|
|
nameeq(NameData *arg1, NameData *arg2)
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
1997-09-07 07:04:48 +02:00
|
|
|
if (!arg1 || !arg2)
|
|
|
|
return 0;
|
|
|
|
else
|
|
|
|
return ((bool) strncmp(arg1->data, arg2->data, NAMEDATALEN) == 0);
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
bool
|
1997-09-08 23:56:23 +02:00
|
|
|
namene(NameData *arg1, NameData *arg2)
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
1997-09-07 07:04:48 +02:00
|
|
|
if (arg1 == NULL || arg2 == NULL)
|
|
|
|
return ((bool) 0);
|
|
|
|
return ((bool) (strncmp(arg1->data, arg2->data, NAMEDATALEN) != 0));
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
bool
|
1997-09-08 23:56:23 +02:00
|
|
|
namelt(NameData *arg1, NameData *arg2)
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
1997-09-07 07:04:48 +02:00
|
|
|
if (arg1 == NULL || arg2 == NULL)
|
|
|
|
return ((bool) 0);
|
|
|
|
return ((bool) (strncmp(arg1->data, arg2->data, NAMEDATALEN) < 0));
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
bool
|
1997-09-08 23:56:23 +02:00
|
|
|
namele(NameData *arg1, NameData *arg2)
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
1997-09-07 07:04:48 +02:00
|
|
|
if (arg1 == NULL || arg2 == NULL)
|
|
|
|
return ((bool) 0);
|
|
|
|
return ((bool) (strncmp(arg1->data, arg2->data, NAMEDATALEN) <= 0));
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
bool
|
1997-09-08 23:56:23 +02:00
|
|
|
namegt(NameData *arg1, NameData *arg2)
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
1997-09-07 07:04:48 +02:00
|
|
|
if (arg1 == NULL || arg2 == NULL)
|
|
|
|
return ((bool) 0);
|
|
|
|
|
|
|
|
return ((bool) (strncmp(arg1->data, arg2->data, NAMEDATALEN) > 0));
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
bool
|
1997-09-08 23:56:23 +02:00
|
|
|
namege(NameData *arg1, NameData *arg2)
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
1997-09-07 07:04:48 +02:00
|
|
|
if (arg1 == NULL || arg2 == NULL)
|
|
|
|
return ((bool) 0);
|
|
|
|
|
|
|
|
return ((bool) (strncmp(arg1->data, arg2->data, NAMEDATALEN) >= 0));
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* (see char.c for comparison/operation routines) */
|
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
int
|
|
|
|
namecpy(Name n1, Name n2)
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
1997-09-07 07:04:48 +02:00
|
|
|
if (!n1 || !n2)
|
|
|
|
return (-1);
|
|
|
|
strncpy(n1->data, n2->data, NAMEDATALEN);
|
|
|
|
return (0);
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
|
|
|
|
1997-08-19 23:40:56 +02:00
|
|
|
#ifdef NOT_USED
|
1997-09-07 07:04:48 +02:00
|
|
|
int
|
|
|
|
namecat(Name n1, Name n2)
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
1997-09-07 07:04:48 +02:00
|
|
|
return (namestrcat(n1, n2->data)); /* n2 can't be any longer than n1 */
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
1997-09-07 07:04:48 +02:00
|
|
|
|
1997-08-19 23:40:56 +02:00
|
|
|
#endif
|
1996-07-09 08:22:35 +02:00
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
int
|
|
|
|
namecmp(Name n1, Name n2)
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
1997-09-07 07:04:48 +02:00
|
|
|
return (strncmp(n1->data, n2->data, NAMEDATALEN));
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
int
|
1996-07-09 08:22:35 +02:00
|
|
|
namestrcpy(Name name, char *str)
|
|
|
|
{
|
1997-09-07 07:04:48 +02:00
|
|
|
if (!name || !str)
|
|
|
|
return (-1);
|
1997-10-25 03:10:58 +02:00
|
|
|
StrNCpy(name->data, str, NAMEDATALEN);
|
1997-09-07 07:04:48 +02:00
|
|
|
return (0);
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
|
|
|
|
1997-08-19 23:40:56 +02:00
|
|
|
#ifdef NOT_USED
|
1997-09-07 07:04:48 +02:00
|
|
|
int
|
|
|
|
namestrcat(Name name, char *str)
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
1997-09-08 04:41:22 +02:00
|
|
|
int i;
|
|
|
|
char *p,
|
|
|
|
*q;
|
1997-09-07 07:04:48 +02:00
|
|
|
|
|
|
|
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);
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
1997-09-07 07:04:48 +02:00
|
|
|
|
1997-08-19 23:40:56 +02:00
|
|
|
#endif
|
1996-07-09 08:22:35 +02:00
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
int
|
1996-07-09 08:22:35 +02:00
|
|
|
namestrcmp(Name name, char *str)
|
|
|
|
{
|
1997-09-07 07:04:48 +02:00
|
|
|
if (!name && !str)
|
|
|
|
return (0);
|
|
|
|
if (!name)
|
|
|
|
return (-1); /* NULL < anything */
|
|
|
|
if (!str)
|
|
|
|
return (1); /* NULL < anything */
|
|
|
|
return (strncmp(name->data, str, NAMEDATALEN));
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
/*****************************************************************************
|
|
|
|
* PRIVATE ROUTINES *
|
1996-07-09 08:22:35 +02:00
|
|
|
*****************************************************************************/
|
|
|
|
|
1997-08-19 23:40:56 +02:00
|
|
|
#ifdef NOT_USED
|
1997-09-07 07:04:48 +02:00
|
|
|
uint32
|
1996-07-09 08:22:35 +02:00
|
|
|
NameComputeLength(Name name)
|
|
|
|
{
|
1997-09-08 04:41:22 +02:00
|
|
|
char *charP;
|
|
|
|
int length;
|
1997-09-07 07:04:48 +02:00
|
|
|
|
|
|
|
for (length = 0, charP = name->data;
|
|
|
|
length < NAMEDATALEN && *charP != '\0';
|
|
|
|
length++, charP++)
|
|
|
|
;
|
|
|
|
return (uint32) length;
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
1997-09-07 07:04:48 +02:00
|
|
|
|
1997-08-19 23:40:56 +02:00
|
|
|
#endif
|