|
|
1.1 root 1: # include "refer..c"
2: char *class();
3: char seenstr[60];
4: putref (n, tvec)
5: char *tvec[];
6: {
7: char *s, *tx, *sq;
8: char *caps(), *revauth();
9: char buf1[LLINE], buf2[50];
10: int nauth = 0, i, lastype = 0, cch, macro = 0, la;
11: int lauth =0, ltitle =0, lother =0;
12:
13: # if D1
14: fprintf(stderr, "in putref, fo is %o\n",fo);
15: # endif
16: if (!preserve)
17: fprintf(fo, ".]-%c", sep);
18: else
19: fprintf(fo, ".[%c", sep);
20: # define dsde (macro? "de" : "ds")
21: # define ifnl (macro? sep : ' ')
22: seenstr[0]=0;
23: for (i=0; i<n; i++)
24: {
25: s = tvec[i];
26: if (*s==0) continue;
27: if (control(s[0]) )
28: {
29: if (lastype && macro)
30: fprintf(fo, "..%c", sep);
31: if (control(s[1]))
32: {
33: cch = s[2];
34: tx = s+3;
35: macro=1;
36: }
37: else
38: {
39: cch = s[1];
40: tx = s+2;
41: macro=0;
42: }
43: }
44: else
45: {
46: cch = lastype;
47: tx=s;
48: }
49: # if D1
50: fprintf(stderr, "smallcaps %s cch %c\n",smallcaps, cch);
51: # endif
52: if (preserve)
53: {
54: fprintf(fo, "%s%c", s, sep);
55: continue;
56: }
57: if (mindex (smallcaps, cch))
58: tx = caps(tx, buf1);
59: # if D1
60: fprintf(stderr, " s %o tx %o %s\n",s,tx,tx);
61: # endif
62: if (!control(s[0]) || (index(appfld, s[1]) && seen(s[1]))) /* append to previous item */
63: {
64: if (control(s[0]))
65: lastype = s[1];
66: if (lastype!=0)
67: {
68: if (macro)
69: fprintf(fo, "%s%c", tx, sep);
70: else
71: fprintf(fo, ".as [%c \" %s%c",lastype,tx,sep);
72: if (lastype == 'T')
73: ltitle = (mindex(".;,?", last(tx))!=0);
74: if (lastype == 'A')
75: lauth = last(tx) == '.';
76: if (lastype == 'O')
77: lother = (mindex(".;,?", last(tx)) != 0);
78: }
79: continue;
80: }
81: if (mindex(ignfld, cch)) /* skip XYZ[] */
82: {
83: lastype=0;
84: continue;
85: }
86: else
87: if (cch == 'A')
88: {
89: if (nauth < authrev)
90: tx = revauth(tx, buf2);
91: if (nauth++ ==0)
92: if (macro)
93: fprintf(fo, ".de [%c%c%s%c",cch,sep,tx,sep);
94: else
95: fprintf(fo, ".ds [%c%s%c", cch,tx,sep);
96: else
97: {
98: la = (tvec[i+1][1]!='A');
99: fprintf(fo, ".as [A \"");
100: if (la == 0 || nauth != 2)
101: fprintf(fo, ",");
102: if (la)
103: fprintf(fo,"%s",
104: mindex(smallcaps, 'A')? " \\s-2AND\\s+2" : " and");
105: fprintf(fo, "%s%c", tx, sep);
106: }
107: lauth = last(tx)=='.';
108: }
109: else
110: {
111: if (cch == 'D' && yearonly)
112: {
113: sq = tx+strlen(tx);
114: while (*--sq!=' ' && sq>tx)
115: ;
116: if (sq>tx) tx=sq;
117: }
118: if (macro)
119: fprintf(fo, ".de [%c%c%s%c",cch,sep, tx, sep);
120: else
121: fprintf(fo, ".ds [%c%s%c",cch,tx, sep);
122: }
123: if (cch=='P')
124: fprintf(fo, ".nr [P %d%c", mindex(s, '-')!=0, sep);
125: lastype = cch;
126: if (cch == 'T')
127: ltitle = (mindex(".;,?", last(tx)) != 0);
128: if (cch == 'O')
129: lother = (mindex(".;,?", last(tx)) != 0);
130: }
131: if (lastype && macro)
132: fprintf(fo, "..%c", sep);
133: if (!preserve)
134: {
135: fprintf(fo, ".nr [T %d%c", ltitle, sep);
136: fprintf(fo, ".nr [A %d%c", lauth, sep);
137: fprintf(fo, ".nr [O %d%c", lother, sep);
138: fprintf (fo, ".][ %s%c", class(n, tvec), '\n');
139: }
140: else
141: fprintf(fo, ".]\n");
142: }
143: tabs (sv, line)
144: char *sv[], *line;
145: {
146: char *p;
147: int n = 0;
148: sv[n++] = line;
149: for( p= line; *p; p++)
150: {
151: if (*p == '\n')
152: {
153: *p=0;
154: sv[n++] = p+1;
155: }
156: }
157: return(n-1);
158: }
159: char *
160: class (nt, tv)
161: char *tv[];
162: {
163: if (hastype (nt, tv, 'J'))
164: return("1 journal-article");
165: if (hastype (nt, tv, 'B'))
166: return("3 article-in-book");
167: if (hastype (nt, tv, 'R'))
168: return ("4 tech-report");
169: if (hastype (nt, tv, 'G'))
170: return ("4 tech-report");
171: if (hastype (nt, tv, 'I'))
172: return("2 book");
173: if (hastype (nt, tv,'M'))
174: return ("5 bell-tm");
175: return("0 other");
176: }
177: hastype (nt, tv, c)
178: char *tv[];
179: {
180: int i;
181: for(i=0; i<nt; i++)
182: if ( control(tv[i][0]) && tv[i][1]==c )
183: return(1);
184: return(0);
185: }
186: char *
187: caps(a, b)
188: char *a, *b;
189: {
190: char *p;
191: int c, alph, this;
192: p=b;
193: alph = 0;
194: while (c = *a++)
195: {
196: this = isalpha(c);
197: if (this && alph==1)
198: {
199: *b++ = '\\';
200: *b++ = 's';
201: *b++ = '-';
202: *b++ = '2';
203: }
204: if (!this && alph>1)
205: {
206: *b++ = '\\';
207: *b++ = 's';
208: *b++ = '+';
209: *b++ = '2';
210: }
211: if (this)
212: c &= (~040);
213: *b++ = c;
214: alph = this ? alph+1 : 0;
215: }
216: if (alph>1)
217: {
218: *b++ = '\\';
219: *b++ = 's';
220: *b++ = '+';
221: *b++ = '2';
222: }
223: *b=0;
224: return (p);
225: }
226: char *
227: revauth(s, b)
228: char *s, *b;
229: {
230: char *init, *name, *jr, *p, *bcop;
231: bcop = b;
232: init=name=s;
233: while (*name)name++;
234: jr=name;
235: while (name>init && *name!= ' ')
236: name--;
237: if (name[-1] == ',' || name[-1]== '(' )
238: {
239: jr = --name;
240: while (name>init && *name != ' ')
241: name--;
242: }
243: p=name;
244: while (p<jr)
245: *b++ = *p++;
246: if (init<name && nocomma==0)
247: *b++ = ',';
248: while (init<name)
249: *b++ = *init++;
250: if (*jr)jr++;
251: while(*jr)
252: *b++ = *jr++;
253: *b++ = 0;
254: return(bcop);
255: }
256: last(s)
257: char *s;
258: {
259: while (*s) s++;
260: return(*--s);
261: }
262: seen(c)
263: {
264: char *s, *index();
265: s = index(seenstr,c);
266: if (s!=NULL) return(1);
267: for(s=seenstr; *s; s++)
268: ;
269: *s++ = c;
270: *s=0;
271: return(0);
272: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.