113111Srrh #ifndef lint 2*15062Sgarrison static char sccsid[] = "@(#)listrefs.c 2.2 09/23/83"; 313111Srrh #endif not lint 4*15062Sgarrison /* 5*15062Sgarrison Listrefs - list references for bib system 613111Srrh 7*15062Sgarrison Authored by: Tim Budd, University of Arizona, 1983. 8*15062Sgarrison lookup routines written by gary levin 2/82 9*15062Sgarrison 10*15062Sgarrison version 7/4/83 11*15062Sgarrison 12*15062Sgarrison Various modifications suggested by: 13*15062Sgarrison David Cherveny - Duke University Medical Center 14*15062Sgarrison Phil Garrison - UC Berkeley 15*15062Sgarrison M. J. Hawley - Yale University 16*15062Sgarrison 17*15062Sgarrison 18*15062Sgarrison 19*15062Sgarrison 2012912Sgarrison */ 2112912Sgarrison # include <stdio.h> 2212912Sgarrison # include <ctype.h> 2312912Sgarrison # include "bib.h" 2412912Sgarrison # include "streams.h" 25*15062Sgarrison # define MAXLIST 2000 /* maximum number of references that can be listed */ 26*15062Sgarrison # define getch(c,fd) (c = getc(fd)) 2712912Sgarrison 2812912Sgarrison FILE *tfd; 2912912Sgarrison 30*15062Sgarrison FILE *rfd; /* reference file position */ 31*15062Sgarrison char reffile[] = TMPREFFILE; /* temporary file (see bib.h) */ 32*15062Sgarrison long int refspos[MAXLIST]; /* references temporary file, seek positions */ 33*15062Sgarrison long int rend = 1; /* last used position in reference file */ 34*15062Sgarrison int numrefs = -1; /* number of references */ 35*15062Sgarrison char *citestr[MAXLIST]; /* citation strings */ 36*15062Sgarrison extern int sort; /* see if things are to be sorted */ 37*15062Sgarrison extern char bibfname[]; 38*15062Sgarrison extern int biblineno; 39*15062Sgarrison 4012912Sgarrison main(argc, argv) 4112912Sgarrison int argc; 4212912Sgarrison char **argv; 43*15062Sgarrison { char defult[120]; 44*15062Sgarrison int i, rcomp(); 45*15062Sgarrison 4612912Sgarrison tfd = stdout; 47*15062Sgarrison strcpy(defult, BMACLIB); 48*15062Sgarrison strcat(defult,"/bib.list"); 49*15062Sgarrison mktemp(reffile); 50*15062Sgarrison rfd = fopen(reffile,"w+"); 51*15062Sgarrison if (rfd == NULL) 52*15062Sgarrison error("can't open temporary reference file"); 53*15062Sgarrison putc('x', rfd); /* put garbage in first position */ 54*15062Sgarrison 55*15062Sgarrison doargs(argc, argv, defult); 56*15062Sgarrison 57*15062Sgarrison if (sort) 58*15062Sgarrison qsort(refspos, numrefs+1, sizeof(long), rcomp); 59*15062Sgarrison makecites(citestr); 60*15062Sgarrison disambiguate(); 61*15062Sgarrison 62*15062Sgarrison for (i = 0; i <= numrefs; i++) 63*15062Sgarrison dumpref(i, stdout); 64*15062Sgarrison 6512912Sgarrison exit(0); 6612912Sgarrison } 6712912Sgarrison 6812912Sgarrison /* rdtext - process a file */ 6912912Sgarrison rdtext(ifile) 7012912Sgarrison FILE *ifile; 71*15062Sgarrison { char c, *p, rec[REFSIZE]; 72*15062Sgarrison int i; 7312912Sgarrison 74*15062Sgarrison biblineno = 1; 7512912Sgarrison for (;;) { 76*15062Sgarrison while (getch(c, ifile) == '\n') 77*15062Sgarrison biblineno++; /* skip leading newlines */ 78*15062Sgarrison if (c == EOF) 79*15062Sgarrison return; 8012912Sgarrison 81*15062Sgarrison p = rec; /* read a reference */ 82*15062Sgarrison for (;;) { 83*15062Sgarrison for (*p++ = c; getch(c, ifile) != '\n'; ) 84*15062Sgarrison if (c == EOF) 85*15062Sgarrison error("ill formed reference file"); 86*15062Sgarrison else 87*15062Sgarrison *p++ = c; 88*15062Sgarrison if (getch(c, ifile) == '\n' || c == EOF) { 89*15062Sgarrison biblineno++; 90*15062Sgarrison *p++ = '\n'; 91*15062Sgarrison break; 9212912Sgarrison } 93*15062Sgarrison if (c == '.' || c == '%') 94*15062Sgarrison *p++ = '\n'; 95*15062Sgarrison else 96*15062Sgarrison *p++ = ' '; 97*15062Sgarrison } 9812912Sgarrison 9912912Sgarrison *p = 0; 100*15062Sgarrison expand(rec); 10112912Sgarrison 102*15062Sgarrison if (numrefs++ > MAXLIST) 103*15062Sgarrison error("too many references"); 104*15062Sgarrison refspos[numrefs] = rend; 105*15062Sgarrison #ifdef READWRITE 106*15062Sgarrison fixrfd( WRITE ); /* fix access mode of rfd, if nec. */ 107*15062Sgarrison #else 108*15062Sgarrison fseek(rfd, rend, 0); 109*15062Sgarrison #endif 110*15062Sgarrison i = strlen(rec) + 1; 111*15062Sgarrison fwrite(rec, 1, i, rfd); 112*15062Sgarrison rend = rend + i; 11312912Sgarrison } 11412912Sgarrison } 11512912Sgarrison 116