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