BSD 4_3_Tahoe release
[unix-history] / usr / src / usr.bin / refer / refer7.c
index 5708f5f..fafd712 100644 (file)
-# include "refer..c"
-# define NRS 500
-int newr[NRS];
-chkdup ( tag )
-       char *tag;
+#ifndef lint
+static char *sccsid = "@(#)refer7.c    4.4 (Berkeley) 9/30/87";
+#endif
+
+#include "refer..c"
+
+int newr[250];
+
+chkdup(tag)
+char *tag;
 {
 {
-int i;
-for(i=1; i<=refnum; i++)
-       {
-       if (strcmp(reftable[i], tag)==0)
-               return(i);
+       int i;
+
+       for(i = 1; i <= refnum; i++) {
+               if (strcmp(reftable[i], tag)==0)
+                       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);
+       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("reference pointers too long (%d)", rtp-reftext);
+       return(0);
 }
 }
+
 dumpold()
 {
 dumpold()
 {
-FILE *fi;
-int c, g1 = 0, nr = 1;
-if (!endpush) return;
-fclose(fo);
-# ifdef 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[100];
-       sprintf(comm, "sort -fd %s -o %s", tfile, tfile);
-       system(comm);
+       FILE *fi;
+       int c, g1 = 0, nr = 1;
+
+       if (!endpush)
+               return;
+       if (fo != NULL) {
+               fclose(fo);
+               fo = NULL;
        }
        }
-fi = fopen(tfile, "r");
-# if D1
-fprintf(stderr, "reopened %s as %o\n",tfile,fi);
-# endif
-if (fi==NULL) return;
-flout();
-fprintf(ftemp,".]<\n");
-while ( (c = getc(fi)) >=0)
-       {
-       if (c=='\n')
-               {
-               nr++;
-               g1 = 0;
+       if (sort) {
+               char comm[100];
+               sprintf(comm, "sort -f %s -o %s", tfile, tfile);
+               system(comm);
+       }
+       fi = fopen(tfile, "r");
+       if (fi == NULL)
+               return;
+       flout();
+       fprintf(ftemp, ".]<\n");
+       while ((c = getc(fi)) > 0) {
+               if (c == '\n') {
+                       nr++;
+                       g1 = 0;
                }
                }
-       if (c==sep)
-               c = '\n';
-       if (c== FLAG)
-               {
-               /* make old-new ref number table */
-               char tb[20];
-               int irr;
-               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);
+               if (c == sep)
+                       c = '\n';
+               if (c == FLAG) {
+                       /* make old-new ref number table */
+                       char tb[20];
+                       char *s = tb;
+                       while ((c = getc(fi)) != FLAG)
+                               *s++ = c;
+                       *s = 0;
+                       if (g1++ == 0)
+                               newr[atoi(tb)] = nr;
+#if EBUG
+                       fprintf(stderr,
+                               "nr %d assigned to atoi(tb) %d\n",nr,atoi(tb));
 # endif
 # endif
-               if (!labels)
                        fprintf(ftemp,"%d", nr);
                        fprintf(ftemp,"%d", nr);
-               else
-                       expkey (irr, nr, ftemp);
-               continue;
+                       continue;
                }
                }
-       putc(c, ftemp);
+               putc(c, ftemp);
        }
        }
-fclose(fi);
-# ifndef D1
-unlink(tfile);
-# endif
-fprintf(ftemp, ".]>\n");
+       fclose(fi);
+#ifndef TF
+       unlink(tfile);
+#endif
+       fprintf(ftemp, ".]>\n");
 }
 
 recopy (fnam)
 }
 
 recopy (fnam)
-       char *fnam;
+char *fnam;
 {
 {
-int c;
-fclose(ftemp);
-# if D1
-fprintf(stderr, "recopy, fnam %s\n",fnam);
-# endif
+       int c;
+       int *wref = NULL;
+       int wcnt = 0;
+       int wsize = 50;
+       int finalrn;
+       char sig[MXSIG];
+       extern int *realloc();
 
 
-ftemp = fopen(fnam, "r");
-if (ftemp==NULL)
-       {
-       fprintf(stderr, "Can't reopen %s\n", fnam);
-       exit(1);
+       wref = (int *)calloc((unsigned)wsize, (unsigned)sizeof(int));
+       fclose(ftemp);
+       ftemp = fopen(fnam, "r");
+       if (ftemp == NULL) {
+               fprintf(stderr, "Can't reopen %s\n", fnam);
+               exit(1);
        }
        }
-# if D1
-fprintf(stderr, "open ok ftemp %o\n",ftemp);
-# endif
-while ( 1)
-       {
-       c = fgetc(ftemp);
-# if D1
-fprintf(stderr, "read char %o /%c/\n",c,c);
-# endif
-       if (c == FLAG)
-               {
-               char tb[10];
-               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
-               if (!labels)
-                       printf("%d", newr[tbx]);
-               else
-                       expkey (tbx, newr[tbx], stdout);
-               continue;
+       while ((c = getc(ftemp)) != EOF) {
+               if (c == FLAG) {
+                       char tb[10];
+                       char *s = tb;
+                       while ((c = getc(ftemp)) != FLAG)
+                               *s++ = c;
+                       *s = 0;
+                       /*
+                        * If sort was done, permute the reference number
+                        * to obtain the final reference number, finalrn.
+                        */
+                       if (sort)
+                               finalrn = newr[atoi(tb)];
+                       else
+                               finalrn = atoi(tb);
+                       if ((++wcnt > wsize) && 
+                        ((wref=realloc(wref,(wsize+=50)*sizeof(int)))==NULL)){
+                               fprintf(stderr, "Ref condense out of memory.");
+                               exit(1);
+                       }
+                       wref[wcnt-1] = finalrn;
+                       if ((c = getc(ftemp)) == AFLAG) 
+                               continue;
+                       wref[wcnt] = 0;
+                       condense(wref,wcnt,sig);
+                       wcnt = 0;
+                       printf("%s", sig);
                }
                }
-       if (c==EOF) break;
-       putchar(c);
+               putchar(c);
        }
        }
-# if D1
-fprintf(stderr, "finished reading file \n");
-# endif
-fclose(ftemp);
-unlink(fnam);
-# if D1
-fprintf(stderr, "le\ 1aving recopy\n");
-# endif
+       fclose(ftemp);
+       unlink(fnam);
+}
+
+/*
+ * sort and condense referance signals when they are placed in
+ * the text. Viz, the signal 1,2,3,4 is condensed to 1-4 and signals
+ * of the form 5,2,9 are converted to 2,5,9
+ */
+condense(wref, wcnt, sig)
+int    *wref;
+int    wcnt;
+char   *sig;
+{
+       register int i = 0;
+       char wt[4];
+       extern int wswap();
+
+       qsort(wref, wcnt, sizeof(int), wswap);
+       sig[0] = 0;
+       while (i < wcnt) {
+               sprintf(wt,"%d",wref[i]);
+               strcat(sig,wt);
+               if ((i+2 < wcnt) && (wref[i] == (wref[i+2] - 2))) {
+                       while (wref[i] == (wref[i+1] - 1))
+                               i++;
+                       strcat(sig, "-");
+               } else if (++i < wcnt)
+                       strcat(sig,",\\|");
+       }
+}
+
+wswap(iw1, iw2)
+register int *iw1,*iw2;
+{
+       return(*iw1 - *iw2);
 }
 }