BSD 4_3_Reno release
[unix-history] / usr / src / usr.bin / refer / refer / refer7.c
#ifndef lint
static char *sccsid = "@(#)refer7.c 4.4 (Berkeley) 9/30/87";
#endif
#include "refer..c"
int newr[250];
chkdup(tag)
char *tag;
{
int i;
for(i = 1; i <= refnum; i++) {
if (strcmp(reftable[i], tag)==0)
return(i);
}
reftable[refnum+1] = rtp;
if (refnum >= NRFTBL)
err("too many references (%d) for table", refnum);
strcpy(rtp, tag);
while (*rtp++);
if (rtp > reftext + NRFTXT)
err("reference pointers too long (%d)", rtp-reftext);
return(0);
}
dumpold()
{
FILE *fi;
int c, g1 = 0, nr = 1;
if (!endpush)
return;
if (fo != NULL) {
fclose(fo);
fo = NULL;
}
if (sort) {
char comm[100];
sprintf(comm, "sort -f %s -o %s", tfile, tfile);
system(comm);
}
fi = fopen(tfile, "r");
if (fi == NULL)
return;
flout();
fprintf(ftemp, ".]<\n");
while ((c = getc(fi)) > 0) {
if (c == '\n') {
nr++;
g1 = 0;
}
if (c == sep)
c = '\n';
if (c == FLAG) {
/* make old-new ref number table */
char tb[20];
char *s = tb;
while ((c = getc(fi)) != FLAG)
*s++ = c;
*s = 0;
if (g1++ == 0)
newr[atoi(tb)] = nr;
#if EBUG
fprintf(stderr,
"nr %d assigned to atoi(tb) %d\n",nr,atoi(tb));
# endif
fprintf(ftemp,"%d", nr);
continue;
}
putc(c, ftemp);
}
fclose(fi);
#ifndef TF
unlink(tfile);
#endif
fprintf(ftemp, ".]>\n");
}
recopy (fnam)
char *fnam;
{
int c;
int *wref = NULL;
int wcnt = 0;
int wsize = 50;
int finalrn;
char sig[MXSIG];
extern int *realloc();
wref = (int *)calloc((unsigned)wsize, (unsigned)sizeof(int));
fclose(ftemp);
ftemp = fopen(fnam, "r");
if (ftemp == NULL) {
fprintf(stderr, "Can't reopen %s\n", fnam);
exit(1);
}
while ((c = getc(ftemp)) != EOF) {
if (c == FLAG) {
char tb[10];
char *s = tb;
while ((c = getc(ftemp)) != FLAG)
*s++ = c;
*s = 0;
/*
* If sort was done, permute the reference number
* to obtain the final reference number, finalrn.
*/
if (sort)
finalrn = newr[atoi(tb)];
else
finalrn = atoi(tb);
if ((++wcnt > wsize) &&
((wref=realloc(wref,(wsize+=50)*sizeof(int)))==NULL)){
fprintf(stderr, "Ref condense out of memory.");
exit(1);
}
wref[wcnt-1] = finalrn;
if ((c = getc(ftemp)) == AFLAG)
continue;
wref[wcnt] = 0;
condense(wref,wcnt,sig);
wcnt = 0;
printf("%s", sig);
}
putchar(c);
}
fclose(ftemp);
unlink(fnam);
}
/*
* sort and condense referance signals when they are placed in
* the text. Viz, the signal 1,2,3,4 is condensed to 1-4 and signals
* of the form 5,2,9 are converted to 2,5,9
*/
condense(wref, wcnt, sig)
int *wref;
int wcnt;
char *sig;
{
register int i = 0;
char wt[4];
extern int wswap();
qsort(wref, wcnt, sizeof(int), wswap);
sig[0] = 0;
while (i < wcnt) {
sprintf(wt,"%d",wref[i]);
strcat(sig,wt);
if ((i+2 < wcnt) && (wref[i] == (wref[i+2] - 2))) {
while (wref[i] == (wref[i+1] - 1))
i++;
strcat(sig, "-");
} else if (++i < wcnt)
strcat(sig,",\\|");
}
}
wswap(iw1, iw2)
register int *iw1,*iw2;
{
return(*iw1 - *iw2);
}