|
|
1.1 root 1: #ifndef lint
2: static char *sccsid = "@(#)refer5.c 4.8 (Berkeley) 7/6/87";
3: #endif
4:
5: #include "refer..c"
6: #define SAME 0
7: #define NFLAB 3000 /* number of bytes to record all labels */
8: #define NLABC 1000 /* max number of labels */
9:
10: static char sig[MXSIG];
11: static char bflab[NFLAB];
12: static char *labtab[NLABC];
13: static char *lbp = bflab;
14: static char labc[NLABC];
15: static char stbuff[50];
16: static int prevsig;
17:
18: putsig (nf, flds, nref, nstline, endline, toindex) /* choose signal style */
19: char *flds[], *nstline, *endline;
20: {
21: char t[100], t1[MXSIG], t2[100], format[10], *sd, *stline;
22: int addon, another = 0;
23: static FILE *fhide = 0;
24: int i;
25: char tag;
26:
27: if (labels) {
28: if (nf == 0) /* old */
29: sprintf(t, "%s%c", labtab[nref], labc[nref]);
30: else {
31: *t = 0;
32: if (keywant)
33: sprintf(t, "%s", fpar(nf,flds,t1,keywant,1,0));
34: if (science && t[0] == 0) {
35: sd = fpar(nf, flds, t2, 'D', 1, 0);
36: sprintf(t, "%s, %s", fpar(nf,flds,t1,'A',1,0),
37: sd);
38: }
39: else if (t[0] == 0) {
40: sprintf(format,
41: nmlen>0 ? "%%.%ds%%s" : "%%s%%s",
42: nmlen);
43: /* format is %s%s for default labels */
44: /* or %.3s%s eg if wanted */
45: sd = fpar(nf, flds, t2, 'D', 1, 0);
46: if (dtlen > 0) {
47: char *sdb;
48: for (sdb = sd; *sd; sd++)
49: ;
50: sd = sd - dtlen;
51: if (sd < sdb)
52: sd = sdb;
53: }
54: sprintf(t, format, fpar(nf,flds,t1,'A',1,0),
55: sd);
56: }
57: if (keywant) {
58: addon = 0;
59: for (sd = t; *sd; sd++)
60: ;
61: if (*--sd == '-') {
62: addon = 1;
63: *sd = 0;
64: }
65: }
66: if ((!keywant || addon) && !science) {
67: addch(t, keylet(t, nref));
68: }
69: else {
70: tokeytab (t,nref);
71: }
72: }
73: }
74: else {
75: sprintf(t, "%c%d%c", FLAG, nref, FLAG);
76: }
77: another = prefix (".[", sd=lookat());
78: if (another && (strcmp(".[\n", sd) != SAME))
79: fprintf(stderr, "File %s line %d: punctuation ignored from: %s",
80: Ifile, Iline, sd);
81: if ((strlen(sig) + strlen(t)) > MXSIG)
82: err("sig overflow (%d)", MXSIG);
83: strcat(sig, t);
84: #if EBUG
85: fprintf(stderr, "sig is now %s leng %d\n",sig,strlen(sig));
86: #endif
87: trimnl(nstline);
88: trimnl(endline);
89: stline = stbuff;
90: if (prevsig == 0) {
91: strcpy (stline, nstline);
92: prevsig=1;
93: }
94: if (stline[2] || endline[2]) {
95: stline += 2;
96: endline += 2;
97: }
98: else {
99: stline = "\\*([.";
100: endline = "\\*(.]";
101: }
102: if (science) {
103: stline = " (";
104: endline = ")";
105: }
106: if (bare == 0) {
107: if (!another) {
108: sprintf(t1, "%s%s\%s\n", stline, sig, endline);
109: if (strlen(t1) > MXSIG)
110: err("t1 overflow (%d)", MXSIG);
111: append(t1);
112: flout();
113: sig[0] = 0;
114: prevsig = 0;
115: if (fo == fhide) {
116: int ch;
117: fclose(fhide);
118: fhide = fopen(hidenam, "r");
119: fo = ftemp;
120: while ((ch = getc(fhide)) != EOF)
121: putc(ch, fo);
122: fclose(fhide);
123: unlink(hidenam);
124: }
125: }
126: else {
127: if (labels) {
128: strcat(sig, ",\\|");
129: } else {
130: /*
131: * Seperate reference numbers with AFLAG
132: * for later sorting and condensing.
133: */
134: t1[0] = AFLAG;
135: t1[1] = '\0';
136: strcat(sig, t1);
137: }
138: if (fo == ftemp) { /* hide if need be */
139: sprintf(hidenam, "/tmp/rj%dc", getpid());
140: #if EBUG
141: fprintf(stderr, "hiding in %s\n", hidenam);
142: #endif
143: fhide = fopen(hidenam, "w");
144: if (fhide == NULL)
145: err("Can't get scratch file %s",
146: hidenam);
147: fo = fhide;
148: }
149: }
150: }
151: if (bare < 2)
152: if (nf > 0 && toindex)
153: fprintf(fo,".ds [F %s%c",t,sep);
154: if (bare > 0)
155: flout();
156: #if EBUG
157: fprintf(stderr, "sig is now %s\n",sig);
158: #endif
159: }
160:
161: char *
162: fpar (nf, flds, out, c, seq, prepend)
163: char *flds[], *out;
164: {
165: char *p, *s;
166: int i, fnd = 0;
167:
168: for(i = 0; i < nf; i++)
169: /* following if statement modified to cope with Q authors */
170: if ((flds[i][1] == c || (c == 'A' && flds[i][1] == 'Q'))
171: && ++fnd >= seq) {
172: c = flds[i][1];
173: /* for titles use first word otherwise last */
174: if (c == 'T' || c == 'J' || c == 'Q') {
175: p = flds[i]+3;
176: if (prefix("A ", p))
177: p += 2;
178: if (prefix("An ", p))
179: p += 3;
180: if (prefix("The ", p))
181: p += 4;
182: mycpy2(out, p, 20);
183: return(out);
184: }
185: /* if its not 'L' then use just the last word */
186: s = p = flds[i]+2;
187: if (c != 'L') {
188: for(; *p; p++);
189: while (p > s && *p != ' ')
190: p--;
191: }
192: /* special wart for authors */
193: if (c == 'A' && (p[-1] == ',' || p[1] =='(')) {
194: p--;
195: while (p > s && *p != ' ')
196: p--;
197: mycpy(out, p+1);
198: }
199: else
200: strcpy(out, p+1);
201: if (c == 'A' && prepend)
202: initadd(out, flds[i]+2, p);
203: return(out);
204: }
205: return(0);
206: }
207:
208: putkey(nf, flds, nref, keystr)
209: char *flds[], *keystr;
210: {
211: char t1[50], *sf;
212: int ctype, i, count;
213:
214: fprintf(fo, ".\\\"");
215: if (nf <= 0)
216: fprintf(fo, "%s%c%c", labtab[nref], labc[nref], sep);
217: else {
218: while (ctype = *keystr++) {
219: count = atoi(keystr);
220: if (*keystr=='+')
221: count=999;
222: if (count <= 0)
223: count = 1;
224: for(i = 1; i <= count; i++) {
225: sf = fpar(nf, flds, t1, ctype, i, 1);
226: if (sf == 0)
227: break;
228: sf = artskp(sf);
229: fprintf(fo, "%s%c", sf, '-');
230: }
231: }
232: fprintf(fo, "%c%d%c%c", FLAG, nref, FLAG, sep);
233: }
234: }
235:
236:
237: tokeytab (t, nref)
238: char *t;
239: {
240: strcpy(labtab[nref]=lbp, t);
241: while (*lbp++)
242: ;
243: }
244:
245: keylet(t, nref)
246: char *t;
247: {
248: int i;
249: int x = 'a' - 1;
250:
251: for(i = 1; i < nref; i++) {
252: if (strcmp(labtab[i], t) == 0)
253: x = labc[i];
254: }
255: tokeytab (t, nref);
256: if (lbp-bflab > NFLAB)
257: err("bflab overflow (%d)", NFLAB);
258: if (nref > NLABC)
259: err("nref in labc overflow (%d)", NLABC);
260: #if EBUG
261: fprintf(stderr, "lbp up to %d of %d\n", lbp-bflab, NFLAB);
262: #endif
263: return(labc[nref] = x+1);
264: }
265:
266: mycpy(s, t)
267: char *s, *t;
268: {
269: while (*t && *t != ',' && *t != ' ')
270: *s++ = *t++;
271: *s = 0;
272: }
273:
274: mycpy2(s, t, n)
275: char *s, *t;
276: {
277: int c;
278:
279: while (n-- && (c= *t++) > 0) {
280: if (c == ' ')
281: c = '-';
282: *s++ = c;
283: }
284: *s = 0;
285: }
286:
287: initadd(to, from, stop)
288: char *to, *from, *stop;
289: {
290: int c, nalph = 1;
291:
292: while (*to)
293: to++;
294: while (from < stop) {
295: c = *from++;
296: if (!isalpha(c)) {
297: if (nalph)
298: *to++ = '.';
299: nalph = 0;
300: continue;
301: }
302: if (nalph++ == 0)
303: *to++ = c;
304: }
305: *to = 0;
306: }
307:
308: static char *articles[] = {
309: "the ", "an ", "a ", 0
310: };
311:
312: char *
313: artskp(s) /* skips over initial "a ", "an ", "the " in s */
314: char *s;
315: {
316:
317: char **p, *r1, *r2;
318:
319: for (p = articles; *p; p++) {
320: r2 = s;
321: for (r1 = *p; ((*r1 ^ *r2) & ~040 ) == 0; r1++)
322: r2++;
323: if (*r1 == 0 && *r2 != 0)
324: return(r2);
325: }
326: return(s);
327: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.