xref: /csrg-svn/contrib/bib/src/listrefs.c (revision 16939)
113111Srrh #ifndef lint
2*16939Srrh static char sccsid[] = "@(#)listrefs.c	2.4	08/13/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 
3015905Srrh #ifndef INCORE
3115062Sgarrison FILE *rfd;                      /* reference file position */
3215062Sgarrison char reffile[] = TMPREFFILE;    /* temporary file (see bib.h) */
3315905Srrh #endif INCORE
3415905Srrh struct refinfo refinfo[MAXLIST];      /* references temporary file, seek positions */
3515905Srrh struct refinfo *refshash[HASHSIZE];
3615062Sgarrison long int rend = 1;              /* last used position in reference file */
37*16939Srrh int numrefs = 0;               /* number of references */
3815062Sgarrison extern int sort;                /* see if things are to be sorted */
3915062Sgarrison extern char bibfname[];
4015062Sgarrison extern int biblineno;
4115062Sgarrison 
4215905Srrh #include <signal.h>
4312912Sgarrison main(argc, argv)
4412912Sgarrison    int argc;
4512912Sgarrison    char **argv;
4615062Sgarrison {  char defult[120];
4715905Srrh    int  i, rcomp(), intr();
4815062Sgarrison 
4915905Srrh    signal(SIGINT, intr);
5012912Sgarrison    tfd = stdout;
5115062Sgarrison    strcpy(defult, BMACLIB);
5215062Sgarrison    strcat(defult,"/bib.list");
5315905Srrh #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 */
5915905Srrh #endif not INCORE
6015062Sgarrison 
6115062Sgarrison    doargs(argc, argv, defult);
6215062Sgarrison 
6315062Sgarrison    if (sort)
6415905Srrh       qsort(refinfo, numrefs, sizeof(struct refinfo), rcomp);
6515905Srrh    makecites();
6615062Sgarrison    disambiguate();
6715062Sgarrison 
6815905Srrh    for (i = 0; i < numrefs; i++)
6915062Sgarrison       dumpref(i, stdout);
7015062Sgarrison 
7115905Srrh    cleanup(0);
7212912Sgarrison }
7315905Srrh intr()
7415905Srrh {
7515905Srrh   cleanup(1);
7615905Srrh }
7715905Srrh cleanup(val)
7815905Srrh {
7915905Srrh #ifndef INCORE
8015905Srrh   fclose(rfd);
8115905Srrh   unlink(reffile);
8215905Srrh #endif not INCORE
8315905Srrh   exit(val);
8415905Srrh }
8512912Sgarrison 
8612912Sgarrison /* rdtext - process a file */
8712912Sgarrison    rdtext(ifile)
8812912Sgarrison    FILE *ifile;
8915062Sgarrison {  char c, *p, rec[REFSIZE];
9015062Sgarrison    int i;
9115905Srrh    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 
12115905Srrh       /* didn't match any existing reference, create new one */
12215905Srrh       if (numrefs >= MAXLIST)
12315905Srrh 	error("too many references, max of %d", MAXLIST);
12415905Srrh       hash = strhash(rec);
12515905Srrh       lg = strlen(rec) + 1;
12615905Srrh       refinfo[numrefs].ri_pos = rend;
12715905Srrh       refinfo[numrefs].ri_length = lg;
12815905Srrh       refinfo[numrefs].ri_hp = refshash[hash];
12915905Srrh       refinfo[numrefs].ri_n = numrefs;
13015905Srrh       refshash[hash] = &refinfo[numrefs];
13115905Srrh       wrref(&refinfo[numrefs], rec);
13215905Srrh       numrefs++;
13312912Sgarrison       }
13412912Sgarrison }
135