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