|
|
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 a
Length: 6197 (0x1835)
Types: TextFile
Names: »abrv.c«
└─⟦52210d11f⟧ Bits:30007239 EUUGD2: TeX 3 1992-12
└─⟦af5ba6c8e⟧ »unix3.0/DVIWARE.tar.Z«
└─⟦ca79c7339⟧
└─⟦this⟧ »DVIware/laser-setters/dvi-to-ps/maketd/abrv.c«
/*
* abbreviation related routines
* Written & hacked by Stephen Uitti, PUCC staff
* 1985 maketd 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.
*/
#ifdef pdp11
#include <sys/types.h>
#endif
#include <stdio.h>
#include <ctype.h>
extern char *malloc();
#include "srtunq.h"
#include "abrv.h"
#include "maketd.h"
struct srtent abrv; /* include file abrevs */
char *abrvtbl[MXABR]; /* translation table strings */
int abrvlen[MXABR]; /* string lengths (for speed) */
/*
* lngsrt - string length more important than lexicographical compare.
* return > 0 if b is longer than a.
* return < 0 if b is shorter than a.
* if a & b are * the same length, return strcmp(a, b), which means that
* 0 is returned if the strings are THE SAME,
* if b > a: return > 0 if b < a: return < 0
*/
int
lngsrt(a, b)
char *a, *b;
{
register i;
if ((i = strlen(b) - strlen(a)) != 0)
return i;
else
return strcmp(a, b);
}
/*
* hincl - include header optimizer:
* Compress multiple leading /'s to just one. Remove leading "./".
* Doesn't change date, just returns pointer into beginning of path.
*/
char *
hincl(p)
register char *p;
{
if (*p == '/') /* compress multiple leading /'s */
while (p[1] == '/') /* to just one */
p++;
if (strncmp("./", p, 2) == 0) {
p += 2; /* leading "./" can confuse make */
while (*p == '/') /* don't change ".//a.h" to "/a.h" */
p++;
}
return p;
}
/*
* srchincl - search line for make defines of A-Z Put entries into abrvtbl.
*/
void
srchincl(p)
register char *p;
{
register char *q, *r;
register i;
if (shortincl && *p != '\0') {
while (*p == SPC || *p == '\t')
p++; /* ignore white space */
q = p; /* what letter */
if (isupper(*p)) { /* A-Z, for now */
p++;
while (*p == SPC || *p == '\t')
p++; /* ignore white space */
if (*p++ == '=') {
while (*p == SPC || *p == '\t')
p++;
if ((i = strlen(p)) != 0) {
if ((r = malloc((unsigned) (i + 1))) == NULL)
err("Out of memory in define search");
if (abrvtbl[*q - 'A'])
fprintf(stderr, "%s: warning - %c redefined in %s\n",
prgnm, *q, makename);
abrvtbl[*q - 'A'] = r;
while (*p != '\0' && *p != '#' && *p != '\n')
*r++ = *p++;
*r = '\0'; /* null terminate result */
} /* if non-null string */
} /* if = */
} /* if A-Z */
} /* if shortinclude & string */
}
/*
* abrvsetup - set up abrev table, spit out the abrevs.
* Use any A-Z definitions found in Makefile, no duplicates.
* Add /usr/include & /usr/include/sys if "all" dependencies
* are being generated (including /usr/include based files).
* Try to use I=/usr/include and S=/usr/include/sys, but don't
* make a stink about it.
*/
void
abrvsetup()
{
register i; /* temp */
register char *p; /* temp */
register slot; /* slot search point */
register j; /* temp */
static abrdone = FALSE;/* do this only once */
register flushi = FALSE;/* print I=.. */
register flushs = FALSE;/* print S=.. */
static char *istring = "I=/usr/include";
static char *sstring = "S=/usr/include/sys";
if (abrdone)
return;
if (shortincl) {
abrdone = TRUE; /* we've done this */
/* add /usr/include/sys, /usr/include if not already there */
if (alldep) {
if (abrvtbl['S' - 'A'] == NULL) {
flushs = TRUE;
srchincl(sstring);
} else if ((p = srtin(&abrv, &sstring[2], lngsrt)) != NULL)
fprintf(stderr, "%s: %s - %s\n", prgnm, p, &sstring[2]);
if (abrvtbl['I' - 'A'] == NULL) {
flushi = TRUE;
srchincl(istring);
} else if ((p = srtin(&abrv, &istring[2], lngsrt)) != NULL)
fprintf(stderr, "%s: %s - %s\n", prgnm, p, &istring[2]);
}
if (!replace) { /* no new defines with replace */
srtgti(&abrv); /* init tree traversal */
slot = 0; /* start at bgn */
while ((p = srtgets(&abrv)) != NULL) {
j = strlen(p);
for (i = 0; i < MXABR; i++) { /* look for this
* definition */
if (abrvtbl[i] == NULL)
continue; /* check non-null
* entries */
if (*abrvtbl[i] == '\0')
continue; /* check non-null
* entries */
if (strcmp(p, abrvtbl[i]) == 0)
break; /* exact match found */
else if (strlen(abrvtbl[i]) == j + 1 &&
strncmp(p, abrvtbl[i], j) == 0 &&
abrvtbl[i][j] == '/')
break; /* match of "p/" found */
}
if (i == MXABR) { /* not found */
for (i = slot; i < MXABR; i++) /* find free slot */
if (abrvtbl[i] == NULL)
break;
if (i < MXABR) { /* free slot found */
/*
* if (!usestdout &&
* !replace)
*/
fprintf(makefd, "%c=%s\n", 'A' + i, p);
abrvtbl[i++] = p;
slot = i; /* reduce free slot
* search time */
}
} /* if not found */
} /* while */
} /* if !replace */
if (flushi && !usestdout && !replace)
fprintf(makefd, "%s\n", istring);
if (flushs && !usestdout && !replace)
fprintf(makefd, "%s\n", sstring);
for (i = 0; i < MXABR; i++) { /* set up string lengths */
if (abrvtbl[i] == NULL) {
abrvlen[i] = 0;
} else {
abrvlen[i] = strlen(abrvtbl[i]);
if (verbose)
fprintf(stderr, "%s: %c='%s'\n",
prgnm, i + 'A', abrvtbl[i]);
} /* if */
} /* for */
} /* if */
}
/*
* findabr - find an abbreviation in abrvtbl for string p (if any).
* if multiple abbreations work, use longest. (ie: /usr/include &
* /usr/include/sys; use /usr/include/sys) if found, return index else: MXABR
* Do not match abbreviations of less than 3 characters.
*/
int
findabr(p)
register char *p; /* string pointer */
{
register i; /* for index */
register j; /* found index */
for (i = 0, j = MXABR; i < MXABR; i++)
if (abrvlen[i] > 2) /* changing "." to $A is evil */
if (strncmp(abrvtbl[i], p, abrvlen[i]) == 0)
if (j == MXABR || (abrvlen[i] > abrvlen[j]))
j = i;
return j;
}