|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T s
Length: 4678 (0x1246)
Types: TextFile
Names: »srtunq.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦this⟧ »EUUGD11/euug-87hel/sec8/ease/maketd/srtunq.c«
/* Sorting function that inserts strings one at a time into memory.
* Strings are null terminated.
* Only uniq strings are stored (no count is kept of how many)
* Any memory used is freed on init (or re-init).
*
* Author: Stephen Uitti, PUCC, 1985
* libsrtunq is copyright (C) Purdue University, 1985
*
* Permission is hereby given for its free reproduction and
* modification for non-commercial purposes, provided that this
* notice and all embedded copyright notices be retained.
* Commercial organisations may give away copies as part of their
* systems provided that they do so without charge, and that they
* acknowledge the source of the software.
*/
#ifndef lint
static char *rcsid =
"$Id: srtunq.c,v 1.4 86/08/30 21:35:36 ksb Exp Locker: ksb $";
#endif
#ifdef BSD2_9
#include <sys/types.h>
#endif
#ifdef notdef /* a comment that allows comments. */
* use:
* #include <local/srtunq.h> /* defines, etc */
* struct srtent d; /* data structure foothold */
* char *p; /* temp */
* srtinit(&d); /* init the structure */
* if ((p = srtin(&d, "foo", NULL)) != NULL) err(p); /* add the data */
* ...
* srtgti(&d); /* init for get */
* p = srtgets(&d); /* get next entry */
* ...
* srtfree(&d); /* delete the structure */
#endif
#include <stdio.h> /* for null */
#include <sys/types.h> /* for void, in V7 */
#include "srtunq.h" /* for srtunq structs & functions */
/* #include <local/srtunq.h> /* for srtunq structs & functions */
/* libc functions */
char *malloc(); /* need more memory */
char *strcpy(); /* copy string */
/* srtgti - init get string function */
void
srtgti(ent)
struct srtent *ent;
{
ent->srt_next = ent->srt_top;
if (ent->srt_next == NULL)
return;
while (ent->srt_next->srt_less != NULL)
ent->srt_next = ent->srt_next->srt_less;
}
/* srtgets - get next string from sorted list, NULL if none more. */
/* The least shall be first... and the greatest shall be last */
char *
srtgets(ent)
struct srtent *ent;
{
register struct srtbl *s; /* tmp */
register char *p; /* ret val */
if ((s = ent->srt_next) == NULL)
return NULL;
p = s->srt_str; /* ret val */
if (s->srt_more != NULL) {
s = s->srt_more; /* go one more */
while (s->srt_less != NULL) /* then all the way less */
s = s->srt_less;
ent->srt_next = s;
return p;
}
while (s != ent->srt_top && s->srt_prev->srt_more == s)
s = s->srt_prev; /* back down any more's */
if (s == ent->srt_top)
s = NULL; /* no more */
else
s = s->srt_prev;
ent->srt_next = s;
return p;
}
/* srtinit - init the database tag */
void
srtinit(ent)
struct srtent *ent;
{
ent->srt_top = NULL; /* erase any knowledge of it */
ent->srt_next = NULL; /* extractions at the begining */
}
/* srtfree - delete all the data, init the tag */
void
srtfree(ent)
struct srtent *ent;
{
if (ent->srt_top == NULL) /* is the structure empty? */
return; /* yes - exit */
srtdtree(ent->srt_top);
free((char *)ent->srt_top); /* clean up last struct */
srtinit(ent); /* init the tag */
}
/* srtdtree - recursive tree delete
* frees all less & more entries pointed to by the srt struct */
void
srtdtree(srt)
register struct srtbl *srt;
{
if (srt->srt_less != NULL) {
srtdtree(srt->srt_less);
free((char *)srt->srt_less);
srt->srt_less = NULL; /* for consistency */
}
if (srt->srt_more != NULL) {
srtdtree(srt->srt_more);
free((char *)srt->srt_more);
srt->srt_more = NULL;
}
}
/* srtin - insert string sorted & unique.
* returns NULL if good, else error message string. */
char *
srtin(ent, str, compar)
struct srtent *ent;
char *str;
int (*compar)(); /* if NULL: use strcmp */
{
register char *p; /* temp string pointer */
register i; /* string compare result */
register struct srtbl *s; /* temp */
register struct srtbl *srtold; /* old temp */
s = srtold = ent->srt_top;
while (s != NULL) {
if ((i = (compar == NULL ?
strcmp(str, s->srt_str) : (*compar)(str, s->srt_str))) == 0)
return NULL; /* found: do nothing - "good" */
srtold = s;
if (i > 0)
s = s->srt_more;
else
s = s->srt_less;
}
if ((p = malloc((unsigned)(strlen(str) + sizeof(struct srtbl)))) == NULL)
return "srtin: warning - out of memory"; /* soft error - caller \n */
s = (struct srtbl *)p;
if (srtold == NULL) { /* empty list */
ent->srt_top = s;
srtold = ent->srt_top;
} else {
if (i > 0)
srtold->srt_more = s;
else
srtold->srt_less = s;
}
s->srt_prev = srtold;
s->srt_less = NULL;
s->srt_more = NULL;
(void) strcpy(s->srt_str, str);
return NULL;
}