xref: /csrg-svn/contrib/bib/src/listrefs.c (revision 17249)
113111Srrh #ifndef lint
2*17249Srrh static char sccsid[] = "@(#)listrefs.c	2.5	10/12/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 */
3716939Srrh 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 
49*17249Srrh    strcpy(BMACLIB, N_BMACLIB);
50*17249Srrh    strcpy(COMFILE, N_COMFILE);
51*17249Srrh    strcpy(DEFSTYLE, N_DEFSTYLE);
52*17249Srrh 
5315905Srrh    signal(SIGINT, intr);
5412912Sgarrison    tfd = stdout;
5515062Sgarrison    strcpy(defult, BMACLIB);
5615062Sgarrison    strcat(defult,"/bib.list");
5715905Srrh #ifndef INCORE
5815062Sgarrison    mktemp(reffile);
5915062Sgarrison    rfd = fopen(reffile,"w+");
6015062Sgarrison    if (rfd == NULL)
6115062Sgarrison       error("can't open temporary reference file");
6215062Sgarrison    putc('x', rfd);      /* put garbage in first position */
6315905Srrh #endif not INCORE
6415062Sgarrison 
6515062Sgarrison    doargs(argc, argv, defult);
6615062Sgarrison 
6715062Sgarrison    if (sort)
6815905Srrh       qsort(refinfo, numrefs, sizeof(struct refinfo), rcomp);
6915905Srrh    makecites();
7015062Sgarrison    disambiguate();
7115062Sgarrison 
7215905Srrh    for (i = 0; i < numrefs; i++)
7315062Sgarrison       dumpref(i, stdout);
7415062Sgarrison 
7515905Srrh    cleanup(0);
7612912Sgarrison }
7715905Srrh intr()
7815905Srrh {
7915905Srrh   cleanup(1);
8015905Srrh }
8115905Srrh cleanup(val)
8215905Srrh {
8315905Srrh #ifndef INCORE
8415905Srrh   fclose(rfd);
8515905Srrh   unlink(reffile);
8615905Srrh #endif not INCORE
8715905Srrh   exit(val);
8815905Srrh }
8912912Sgarrison 
9012912Sgarrison /* rdtext - process a file */
9112912Sgarrison    rdtext(ifile)
9212912Sgarrison    FILE *ifile;
9315062Sgarrison {  char c, *p, rec[REFSIZE];
9415062Sgarrison    int i;
9515905Srrh    int hash, lg;
9612912Sgarrison 
9715062Sgarrison    biblineno = 1;
9812912Sgarrison    for (;;) {
9915062Sgarrison       while (getch(c, ifile) == '\n')
10015062Sgarrison          biblineno++;   /* skip leading newlines */
10115062Sgarrison       if (c == EOF)
10215062Sgarrison          return;
10312912Sgarrison 
10415062Sgarrison       p = rec;          /* read a reference */
10515062Sgarrison       for (;;) {
10615062Sgarrison          for (*p++ = c; getch(c, ifile) != '\n'; )
10715062Sgarrison             if (c == EOF)
10815062Sgarrison                error("ill formed reference file");
10915062Sgarrison             else
11015062Sgarrison                *p++ = c;
11115062Sgarrison          if (getch(c, ifile) == '\n' || c == EOF) {
11215062Sgarrison             biblineno++;
11315062Sgarrison             *p++ = '\n';
11415062Sgarrison             break;
11512912Sgarrison             }
11615062Sgarrison          if (c == '.' || c == '%')
11715062Sgarrison             *p++ = '\n';
11815062Sgarrison          else
11915062Sgarrison             *p++ = ' ';
12015062Sgarrison          }
12112912Sgarrison 
12212912Sgarrison       *p = 0;
12315062Sgarrison       expand(rec);
12412912Sgarrison 
12515905Srrh       /* didn't match any existing reference, create new one */
12615905Srrh       if (numrefs >= MAXLIST)
12715905Srrh 	error("too many references, max of %d", MAXLIST);
12815905Srrh       hash = strhash(rec);
12915905Srrh       lg = strlen(rec) + 1;
13015905Srrh       refinfo[numrefs].ri_pos = rend;
13115905Srrh       refinfo[numrefs].ri_length = lg;
13215905Srrh       refinfo[numrefs].ri_hp = refshash[hash];
13315905Srrh       refinfo[numrefs].ri_n = numrefs;
13415905Srrh       refshash[hash] = &refinfo[numrefs];
13515905Srrh       wrref(&refinfo[numrefs], rec);
13615905Srrh       numrefs++;
13712912Sgarrison       }
13812912Sgarrison }
139