xref: /csrg-svn/contrib/bib/src/listrefs.c (revision 15905)
113111Srrh #ifndef lint
2*15905Srrh static char sccsid[] = "@(#)listrefs.c	2.3	01/29/84";
313111Srrh #endif not lint
415062Sgarrison /*
515062Sgarrison         Listrefs - list references for bib system
613111Srrh 
715062Sgarrison         Authored by: Tim Budd, University of Arizona, 1983.
815062Sgarrison                 lookup routines written by gary levin 2/82
915062Sgarrison 
1015062Sgarrison                 version 7/4/83
1115062Sgarrison 
1215062Sgarrison         Various modifications suggested by:
1315062Sgarrison                 David Cherveny - Duke University Medical Center
1415062Sgarrison                 Phil Garrison - UC Berkeley
1515062Sgarrison                 M. J. Hawley - Yale University
1615062Sgarrison 
1715062Sgarrison 
1815062Sgarrison 
1915062Sgarrison 
2012912Sgarrison                                                         */
2112912Sgarrison # include <stdio.h>
2212912Sgarrison # include <ctype.h>
2312912Sgarrison # include "bib.h"
2412912Sgarrison # include "streams.h"
2515062Sgarrison # define MAXLIST 2000  /* maximum number of references that can be listed */
2615062Sgarrison # define getch(c,fd) (c = getc(fd))
2712912Sgarrison 
2812912Sgarrison FILE *tfd;
2912912Sgarrison 
30*15905Srrh #ifndef INCORE
3115062Sgarrison FILE *rfd;                      /* reference file position */
3215062Sgarrison char reffile[] = TMPREFFILE;    /* temporary file (see bib.h) */
33*15905Srrh #endif INCORE
34*15905Srrh struct refinfo refinfo[MAXLIST];      /* references temporary file, seek positions */
35*15905Srrh struct refinfo *refshash[HASHSIZE];
3615062Sgarrison long int rend = 1;              /* last used position in reference file */
3715062Sgarrison int numrefs = -1;               /* number of references */
3815062Sgarrison extern int sort;                /* see if things are to be sorted */
3915062Sgarrison extern char bibfname[];
4015062Sgarrison extern int biblineno;
4115062Sgarrison 
42*15905Srrh #include <signal.h>
4312912Sgarrison main(argc, argv)
4412912Sgarrison    int argc;
4512912Sgarrison    char **argv;
4615062Sgarrison {  char defult[120];
47*15905Srrh    int  i, rcomp(), intr();
4815062Sgarrison 
49*15905Srrh    signal(SIGINT, intr);
5012912Sgarrison    tfd = stdout;
5115062Sgarrison    strcpy(defult, BMACLIB);
5215062Sgarrison    strcat(defult,"/bib.list");
53*15905Srrh #ifndef INCORE
5415062Sgarrison    mktemp(reffile);
5515062Sgarrison    rfd = fopen(reffile,"w+");
5615062Sgarrison    if (rfd == NULL)
5715062Sgarrison       error("can't open temporary reference file");
5815062Sgarrison    putc('x', rfd);      /* put garbage in first position */
59*15905Srrh #endif not INCORE
6015062Sgarrison 
6115062Sgarrison    doargs(argc, argv, defult);
6215062Sgarrison 
6315062Sgarrison    if (sort)
64*15905Srrh       qsort(refinfo, numrefs, sizeof(struct refinfo), rcomp);
65*15905Srrh    makecites();
6615062Sgarrison    disambiguate();
6715062Sgarrison 
68*15905Srrh    for (i = 0; i < numrefs; i++)
6915062Sgarrison       dumpref(i, stdout);
7015062Sgarrison 
71*15905Srrh    cleanup(0);
7212912Sgarrison }
73*15905Srrh intr()
74*15905Srrh {
75*15905Srrh   cleanup(1);
76*15905Srrh }
77*15905Srrh cleanup(val)
78*15905Srrh {
79*15905Srrh #ifndef INCORE
80*15905Srrh   fclose(rfd);
81*15905Srrh   unlink(reffile);
82*15905Srrh #endif not INCORE
83*15905Srrh   exit(val);
84*15905Srrh }
8512912Sgarrison 
8612912Sgarrison /* rdtext - process a file */
8712912Sgarrison    rdtext(ifile)
8812912Sgarrison    FILE *ifile;
8915062Sgarrison {  char c, *p, rec[REFSIZE];
9015062Sgarrison    int i;
91*15905Srrh    int hash, lg;
9212912Sgarrison 
9315062Sgarrison    biblineno = 1;
9412912Sgarrison    for (;;) {
9515062Sgarrison       while (getch(c, ifile) == '\n')
9615062Sgarrison          biblineno++;   /* skip leading newlines */
9715062Sgarrison       if (c == EOF)
9815062Sgarrison          return;
9912912Sgarrison 
10015062Sgarrison       p = rec;          /* read a reference */
10115062Sgarrison       for (;;) {
10215062Sgarrison          for (*p++ = c; getch(c, ifile) != '\n'; )
10315062Sgarrison             if (c == EOF)
10415062Sgarrison                error("ill formed reference file");
10515062Sgarrison             else
10615062Sgarrison                *p++ = c;
10715062Sgarrison          if (getch(c, ifile) == '\n' || c == EOF) {
10815062Sgarrison             biblineno++;
10915062Sgarrison             *p++ = '\n';
11015062Sgarrison             break;
11112912Sgarrison             }
11215062Sgarrison          if (c == '.' || c == '%')
11315062Sgarrison             *p++ = '\n';
11415062Sgarrison          else
11515062Sgarrison             *p++ = ' ';
11615062Sgarrison          }
11712912Sgarrison 
11812912Sgarrison       *p = 0;
11915062Sgarrison       expand(rec);
12012912Sgarrison 
121*15905Srrh       /* didn't match any existing reference, create new one */
122*15905Srrh       if (numrefs >= MAXLIST)
123*15905Srrh 	error("too many references, max of %d", MAXLIST);
124*15905Srrh       hash = strhash(rec);
125*15905Srrh       lg = strlen(rec) + 1;
126*15905Srrh       refinfo[numrefs].ri_pos = rend;
127*15905Srrh       refinfo[numrefs].ri_length = lg;
128*15905Srrh       refinfo[numrefs].ri_hp = refshash[hash];
129*15905Srrh       refinfo[numrefs].ri_n = numrefs;
130*15905Srrh       refshash[hash] = &refinfo[numrefs];
131*15905Srrh       wrref(&refinfo[numrefs], rec);
132*15905Srrh       numrefs++;
13312912Sgarrison       }
13412912Sgarrison }
135