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