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