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