|
|
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: 4466 (0x1172)
Types: TextFile
Names: »srtunq.c«
└─⟦52210d11f⟧ Bits:30007239 EUUGD2: TeX 3 1992-12
└─⟦af5ba6c8e⟧ »unix3.0/DVIWARE.tar.Z«
└─⟦ca79c7339⟧
└─⟦this⟧ »DVIware/laser-setters/dvi-to-ps/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 organizations 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 2.2 87/06/29 22:01:11 doc Exp $";
#endif
#ifdef pdp11
#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 */
/* 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;
}