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