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