xref: /original-bsd/old/refer/refer/refer7.c (revision 7d595439)
1 #ifndef lint
2 static char *sccsid = "@(#)refer7.c	4.3 (Berkeley) 04/23/86";
3 #endif
4 
5 #include "refer..c"
6 
7 int newr[250];
8 
9 chkdup(tag)
10 char *tag;
11 {
12 	int i;
13 
14 	for(i = 1; i <= refnum; i++) {
15 		if (strcmp(reftable[i], tag)==0)
16 			return(i);
17 	}
18 	reftable[refnum+1] = rtp;
19 	if (refnum >= NRFTBL)
20 		err("too many references (%d) for table", refnum);
21 	strcpy(rtp, tag);
22 	while (*rtp++);
23 	if (rtp > reftext + NRFTXT)
24 		err("reference pointers too long (%d)", rtp-reftext);
25 	return(0);
26 }
27 
28 dumpold()
29 {
30 	FILE *fi;
31 	int c, g1 = 0, nr = 1;
32 
33 	if (!endpush)
34 		return;
35 	fclose(fo);
36 	fo = NULL;
37 	if (sort) {
38 		char comm[100];
39 		sprintf(comm, "sort -f %s -o %s", tfile, tfile);
40 		system(comm);
41 	}
42 	fi = fopen(tfile, "r");
43 	if (fi == NULL)
44 		return;
45 	flout();
46 	fprintf(ftemp, ".]<\n");
47 	while ((c = getc(fi)) > 0) {
48 		if (c == '\n') {
49 			nr++;
50 			g1 = 0;
51 		}
52 		if (c == sep)
53 			c = '\n';
54 		if (c == FLAG) {
55 			/* make old-new ref number table */
56 			char tb[20];
57 			char *s = tb;
58 			while ((c = getc(fi)) != FLAG)
59 				*s++ = c;
60 			*s = 0;
61 			if (g1++ == 0)
62 				newr[atoi(tb)] = nr;
63 #if EBUG
64 			fprintf(stderr,
65 				"nr %d assigned to atoi(tb) %d\n",nr,atoi(tb));
66 # endif
67 			fprintf(ftemp,"%d", nr);
68 			continue;
69 		}
70 		putc(c, ftemp);
71 	}
72 	fclose(fi);
73 #ifndef TF
74 	unlink(tfile);
75 #endif
76 	fprintf(ftemp, ".]>\n");
77 }
78 
79 recopy (fnam)
80 char *fnam;
81 {
82 	int c;
83 	int *wref = NULL;
84 	int wcnt = 0;
85 	int wsize = 50;
86 	int finalrn;
87 	char sig[MXSIG];
88 	extern int *realloc();
89 
90 	wref = (int *)calloc((unsigned)wsize, (unsigned)sizeof(int));
91 	fclose(ftemp);
92 	ftemp = fopen(fnam, "r");
93 	if (ftemp == NULL) {
94 		fprintf(stderr, "Can't reopen %s\n", fnam);
95 		exit(1);
96 	}
97 	while ((c = getc(ftemp)) != EOF) {
98 		if (c == FLAG) {
99 			char tb[10];
100 			char *s = tb;
101 			while ((c = getc(ftemp)) != FLAG)
102 				*s++ = c;
103 			*s = 0;
104 			/*
105 			 * If sort was done, permute the reference number
106 			 * to obtain the final reference number, finalrn.
107 			 */
108 			if (sort)
109 				finalrn = newr[atoi(tb)];
110 			else
111 				finalrn = atoi(tb);
112 			if ((++wcnt > wsize) &&
113 			 ((wref=realloc(wref,(wsize+=50)*sizeof(int)))==NULL)){
114 				fprintf(stderr, "Ref condense out of memory.");
115 				exit(1);
116 			}
117 			wref[wcnt-1] = finalrn;
118 			if ((c = getc(ftemp)) == AFLAG)
119 				continue;
120 			wref[wcnt] = 0;
121 			condense(wref,wcnt,sig);
122 			wcnt = 0;
123 			printf("%s", sig);
124 		}
125 		putchar(c);
126 	}
127 	fclose(ftemp);
128 	unlink(fnam);
129 }
130 
131 /*
132  * sort and condense referance signals when they are placed in
133  * the text. Viz, the signal 1,2,3,4 is condensed to 1-4 and signals
134  * of the form 5,2,9 are converted to 2,5,9
135  */
136 condense(wref, wcnt, sig)
137 int	*wref;
138 int	wcnt;
139 char	*sig;
140 {
141 	register int i = 0;
142 	char wt[4];
143 	extern int wswap();
144 
145 	qsort(wref, wcnt, sizeof(int), wswap);
146 	sig[0] = 0;
147 	while (i < wcnt) {
148 		sprintf(wt,"%d",wref[i]);
149 		strcat(sig,wt);
150 		if ((i+2 < wcnt) && (wref[i] == (wref[i+2] - 2))) {
151 			while (wref[i] == (wref[i+1] - 1))
152 				i++;
153 			strcat(sig, "-");
154 		} else if (++i < wcnt)
155 			strcat(sig,",\\|");
156 	}
157 }
158 
159 wswap(iw1, iw2)
160 register int *iw1,*iw2;
161 {
162 	return(*iw1 - *iw2);
163 }
164