1 #ifndef lint
2 static char sccsid[] = "@(#)listrefs.c 2.7 01/03/94";
3 #endif not lint
4 /*
5 Listrefs - list references for bib system
6
7 Authored by: Tim Budd, University of Arizona, 1983.
8 lookup routines written by gary levin 2/82
9
10 version 7/4/83
11
12 Various modifications suggested by:
13 David Cherveny - Duke University Medical Center
14 Phil Garrison - UC Berkeley
15 M. J. Hawley - Yale University
16
17
18
19
20 */
21 # include <stdio.h>
22 # include <ctype.h>
23 # include "bib.h"
24 # include "streams.h"
25 # define MAXLIST 2000 /* maximum number of references that can be listed */
26 # define getch(c,fd) (c = getc(fd))
27
28 FILE *tfd;
29
30 #ifndef INCORE
31 FILE *rfd; /* reference file position */
32 char reffile[] = TMPREFFILE; /* temporary file (see bib.h) */
33 #endif INCORE
34 struct refinfo refinfo[MAXLIST]; /* references temporary file, seek positions */
35 struct refinfo *refshash[HASHSIZE];
36 long int rend = 1; /* last used position in reference file */
37 int numrefs = 0; /* number of references */
38 extern int sort; /* see if things are to be sorted */
39 extern char bibfname[];
40 extern int biblineno;
41 char *programName;
42
43 #include <signal.h>
main(argc,argv)44 main(argc, argv)
45 int argc;
46 char **argv;
47 { char defult[120];
48 int i, rcomp();
49 void intr();
50
51 InitDirectory(BMACLIB,N_BMACLIB);
52 InitDirectory(COMFILE,N_COMFILE);
53 InitDirectory(DEFSTYLE,N_DEFSTYLE);
54
55 signal(SIGINT, intr);
56 programName = argv[0];
57 tfd = stdout;
58 strcpy(defult, BMACLIB);
59 strcat(defult,"/bib.list");
60 #ifndef INCORE
61 mktemp(reffile);
62 rfd = fopen(reffile,"w+");
63 if (rfd == NULL)
64 error("can't open temporary reference file");
65 putc('x', rfd); /* put garbage in first position */
66 #endif not INCORE
67
68 doargs(argc, argv, defult);
69
70 if (sort)
71 qsort(refinfo, numrefs, sizeof(struct refinfo), rcomp);
72 makecites();
73 disambiguate();
74
75 for (i = 0; i < numrefs; i++)
76 dumpref(i, stdout);
77
78 cleanup(0);
79 }
80 void
intr()81 intr()
82 {
83 cleanup(1);
84 }
cleanup(val)85 cleanup(val)
86 {
87 #ifndef INCORE
88 fclose(rfd);
89 unlink(reffile);
90 #endif not INCORE
91 exit(val);
92 }
93
94 /* rdtext - process a file */
rdtext(ifile)95 rdtext(ifile)
96 FILE *ifile;
97 { int c;
98 char *p, rec[REFSIZE];
99 int i;
100 int hash, lg;
101
102 biblineno = 1;
103 for (;;) {
104 getch(c, ifile);
105 for (;;) {
106 /* skip leading newlines and comments */
107 if (c == '\n') getch(c, ifile);
108 else if (c == '#') while (getch(c, ifile) != '\n' && c != EOF) ;
109 else break;
110 biblineno++;
111 }
112 if (c == EOF)
113 return;
114
115 p = rec; /* read a reference */
116 for (;;) {
117 for (*p++ = c; getch(c, ifile) != '\n'; )
118 if (c == EOF)
119 error("ill formed reference file");
120 else
121 *p++ = c;
122 /* at end-of-line */
123 while (getch(c, ifile) == '#')
124 while (getch(c, ifile) != '\n' && c != EOF) ;
125 if (c == '\n' || c == EOF) { /* if empty or eof */
126 biblineno++;
127 *p++ = '\n';
128 break;
129 }
130 if (c == '.' || c == '%')
131 *p++ = '\n';
132 else
133 *p++ = ' ';
134 }
135
136 *p = 0;
137 expand(rec);
138
139 /* didn't match any existing reference, create new one */
140 if (numrefs >= MAXLIST)
141 error("too many references, max of %d", MAXLIST);
142 hash = strhash(rec);
143 lg = strlen(rec) + 1;
144 refinfo[numrefs].ri_pos = rend;
145 refinfo[numrefs].ri_length = lg;
146 refinfo[numrefs].ri_hp = refshash[hash];
147 refinfo[numrefs].ri_n = numrefs;
148 refshash[hash] = &refinfo[numrefs];
149 wrref(&refinfo[numrefs], rec);
150 numrefs++;
151 }
152 }
153