mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-01-06 10:46:21 +08:00
72 lines
1.6 KiB
C
72 lines
1.6 KiB
C
/*++
|
|
/* NAME
|
|
/* strsave 3
|
|
/* SUMMARY
|
|
/* maintain unique copy of a string
|
|
/* SYNOPSIS
|
|
/* char *strsave(string)
|
|
/* char *string;
|
|
/* DESCRIPTION
|
|
/* This function returns a pointer to an unique copy of its
|
|
/* argument.
|
|
/* DIAGNOSTISC
|
|
/* strsave() calls fatal() when it runs out of memory.
|
|
/* AUTHOR(S)
|
|
/* Wietse Venema
|
|
/* Eindhoven University of Technology
|
|
/* Department of Mathematics and Computer Science
|
|
/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands
|
|
/* LAST MODIFICATION
|
|
/* 92/01/15 21:53:13
|
|
/* VERSION/RELEASE
|
|
/* 1.1
|
|
/*--*/
|
|
|
|
static char strsave_sccsid[] = "@(#) strsave.c 1.1 92/01/15 21:53:13";
|
|
|
|
/* C library */
|
|
|
|
extern char *strcpy();
|
|
extern char *malloc();
|
|
|
|
/* Application-specific stuff */
|
|
|
|
#include "error.h"
|
|
|
|
#define STR_TABSIZE 100
|
|
|
|
struct string {
|
|
char *strval; /* unique string copy */
|
|
struct string *next; /* next one in hash chain */
|
|
};
|
|
|
|
static struct string *str_tab[STR_TABSIZE] = {0,};
|
|
|
|
/* More string stuff. Maybe it should go to an #include file. */
|
|
|
|
#define STREQ(x,y) (*(x) == *(y) && strcmp((x),(y)) == 0)
|
|
|
|
/* strsave - save unique copy of string */
|
|
|
|
char *strsave(str)
|
|
register char *str;
|
|
{
|
|
register struct string *s;
|
|
register int where = hash(str, STR_TABSIZE);
|
|
|
|
/* Look for existing entry. */
|
|
|
|
for (s = str_tab[where]; s; s = s->next)
|
|
if (STREQ(str, s->strval))
|
|
return (s->strval);
|
|
|
|
/* Add new entry. */
|
|
|
|
if ((s = (struct string *) malloc(sizeof(*s))) == 0
|
|
|| (s->strval = malloc(strlen(str) + 1)) == 0)
|
|
fatal("out of memory");
|
|
s->next = str_tab[where];
|
|
str_tab[where] = s;
|
|
return (strcpy(s->strval, str));
|
|
}
|