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
20int newr[250];
21
22extern void err();
23extern void flout();
24
25static void condense(int *, int, char *);
26
27int
28chkdup(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
47void
48dumpold(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
99void
100recopy(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 */
157static void
158condense(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
178int
179wswap(int *iw1, int *iw2)
180{
181	return (*iw1 - *iw2);
182}
183