# include "refer.h" # include "error.h" # define NRS 500 int newr[NRS]; extern char *maynard; int chkdup(char *tag) { int i; for (i = 1; i <= refnum; i++) { if (reftable[i] != 0 && strcmp(reftable[i], tag) == 0) { if(0&&maynard) { fprintf(stderr, "warning: duplicate ref: %s, %s\n", tag, maynard); continue; } return i; } } reftable[refnum+1] = rtp; if (refnum >= NRFTBL) err("too many references (%d) for table", refnum); strcpy (rtp, tag); while (*rtp++) ; if (rtp > reftext + NRFTXT) err("reftext too big (%d)", rtp - reftext); return 0; } #define HBUFSIZE 256 void dumpold(void) { FILE * fi; int c, oc = -1, g1 = 0, nr = 1, h = 0, inh, hstart, puth = 0; char headbuff1[HBUFSIZE], headbuff2[HBUFSIZE]; char *thishbuff, *lasthbuff, *t; if (!endpush) return; fclose(fo); #if D1 fprintf(stderr, "closing %o\n", fo); #endif fo = NULL; #if D1 fprintf(stderr, "dumpold for %s ftemp is %o stdout %o\n", tfile, ftemp, stdout); #endif if (sort) { char comm[200]; lim512(tfile); sprintf(comm, "PATH=/york/bin:/bin:/usr/bin sort -fd %s -o %s", tfile, tfile); system(comm); } fi = fopen(tfile, "r"); #if D1 fprintf(stderr, "reopened %s as %o\n", tfile, fi); #endif if (fi == NULL) return; flout(); fprintf(ftemp, ".]<\n"); thishbuff = headbuff1; lasthbuff = headbuff2; hstart = 1; inh = 1; while ((c = getc(fi)) >= 0) { if (c == '\n') { inh = 1; h = 0; if (oc == sep) continue; nr++; g1 = 0; } oc = c; if (c == hsep) { if (headers) { thishbuff[h] = '\0'; #if D1 if (!hstart) fprintf(stderr, "comparing \"%s\" with \"%s\"\n", thishbuff, lasthbuff); #endif D1 puth = inh && (hstart || strcmp(thishbuff, lasthbuff)); hstart = 0; t = thishbuff; thishbuff = lasthbuff; lasthbuff = t; inh = 0; } continue; } if (c == sep) { putc('\n', ftemp); if (puth) fputs(".nr h] 1\n", ftemp); puth = 0; continue; } if (c == FLAG) { /* make old-new ref number table */ char tb[20]; int irr = 0; char *s = tb; while ( (c = getc(fi)) != FLAG) *s++ = c; *s = 0; if (g1++ == 0) { irr = atoi(tb); if (irr >= NRS) err("too many references to renumber", 0); newr[irr] = nr; } #if D1 fprintf(stderr, "nr %d assigned to atoi(tb) %d\n", nr, irr); #endif /* order is -R flag and is for wierdo referencing */ if (order) expkey (irr, irr, ftemp); else if (!labels) fprintf(ftemp, "%d", nr); else expkey (irr, nr, ftemp); continue; } if (headers && inh) thishbuff[h++] = c; putc(c, ftemp); } fclose(fi); #ifndef D1 remove(tfile); #endif widelab(); fprintf(ftemp, ".]>\n"); } void recopy(char *fnam) { int c; fclose(ftemp); #if D1 fprintf(stderr, "recopy, fnam %s\n", fnam); #endif ftemp = efopen(fnam, "r"); for (;;) { c = getc(ftemp); #if D1 fprintf(stderr, "read char %o /%c/\n", c, c); #endif if (c == FLAG) { char tb[20]; char *s = tb; int tbx; while ( (c = getc(ftemp)) != FLAG && c != EOF) *s++ = c; *s = 0; tbx = atoi(tb); #if D1 fprintf(stderr, "prelim number is %d\n", tbx); #endif /* order is -R flag and is for wierdo referencing */ if (order) expkey (tbx, tbx, stdout); else if (!labels) printf("%d", newr[tbx]); else expkey (tbx, newr[tbx], stdout); continue; } if (c == EOF) break; putchar(c); } #if D1 fprintf(stderr, "finished reading file \n"); #endif fclose(ftemp); remove(fnam); #if D1 fprintf(stderr, "leaving recopy\n"); #endif } void lim512(char *tfile) { /* this stupid program merely breaks up very long citations into lines of 512 bytes */ FILE * f1, *f2; char *zline, *p, *q; extern char one[]; int ln, no; zline = one; f1 = efopen(tfile, "r"); f2 = efopen(tdfile, "w"); #if D1 fprintf(stderr, "in lim512 %s is %o, %s is %o\n", tfile, f1, tdfile, f2); #endif while (fgets(zline, ANSLEN, f1)) { if (strlen(zline) < 512) { fputs(zline, f2); continue; } no = 'a'; for (p = zline; *p != sep; p++) ; *p++ = 0; ln = 500 - strlen(zline); while (strlen(p) > ln) { for (q = p + ln; q > p && *q != sep; q--) ; *q++ = 0; fprintf(f2, "%s%c%c%s%c\n", zline, no++, sep, p, sep); p = q; } fprintf(f2, "%s%c%c%s", zline, no, sep, p); } fclose(f1); fclose(f2); #if D1 fprintf(stderr, "removing in lim512\n"); #endif rename(tdfile, tfile); }