xref: /csrg-svn/contrib/bib/src/listrefs.c (revision 15062)
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