BSD 3 development
[unix-history] / usr / src / cmd / refer / kaiser.c
CommitLineData
42d6e430
BJ
1# include "stdio.h"
2# include "ctype.h"
3char *months[] {"Jan", "Feb", "Mar", "Apr", "May",
4 "Jun", "Jul", "Aug", "Sep","Oct", "Nov", "Dec",0};
5main()
6{
7int state 1000, i, book, volume, corp, report;
8int na;
9char *v[20], **vv, **rr;
10char ubuff[1000], *up;
11char line[100];
12char *p, *s, *r, *q;
13while (gets(line))
14 {
15 if (line[1]>'9' || line[1]<'0') continue;
16 switch(line[0])
17 {
18 case 'T':
19 if (state > 'T')
20 {
21 book=0;
22 report=0;
23 printf("\n%%T ");
24 }
25 printf("%s\n", line+18);
26 state='T';
27 na = getargs(line+18, v);
28 for(i=0;i<na;i++)
29 if (strcmp(v[i], "(Book)")==0)
30 book=1;
31 continue;
32 case 'A':
33 state = 'A';
34 na=getargs(line+18, vv=v);
35 if (na<=0) continue;
36 while (na>0)
37 {
38 printf("%%A ");
39 corp=0;
40 for(p=vv[1]; *p; p++)
41 if (islower(*p))
42 corp=1;
43 if (corp==0)
44 {
45 for(p=vv[1]; *p; p++)
46 printf("%c. ", *p);
47 if (na>2 &&strcmp(vv[2], "+"))
48 {
49 printf("%s", vv[0]);
50 if (strcmp(vv[2], "Jr.")==0)
51 printf(",");
52 printf(" %s\n",vv[2]);
53 vv++;na--;
54 }
55 else
56 printf("%s\n", vv[0]);
57 }
58 else
59 printf("%s %s\n",vv[0],vv[1]);
60 vv+=2;
61 na-=2;
62 if (strcmp(vv[0], "+")==0)
63 {
64 vv++;na--;
65 }
66 }
67 continue;
68 case 'U':
69 if (state!='U')
70 ubuff[0]=0;
71 else
72 strcat(ubuff, " ");
73 state = 'U';
74 strcat(ubuff, line+18);
75 if (line[2]=='.')
76 { /* end of item */
77 p=ubuff; /*start*/
78 volume=0;
79 for(s=ubuff; *s; s++)
80 if (s[-1]==' ' && prefix("Vol", s))
81 {
82 for(q=s-1; q>ubuff; q--)
83 {
84 if (*q==' ' || *q==',') *q=0;
85 else break;
86 }
87 volume=1;
88 break;
89 }
90 if (*s==0)
91 for(s=ubuff; *s && (*s!=',' || sprefix("Inc", s+1)); s++)
92 ;
93 else
94 s++;
95 if (*s==',')*s++=0;
96 if (book)
97 printf("%%I %s\n",ubuff);
98 else if (volume)
99 printf("%%J %s\n", ubuff);
100 else if (substr(ubuff, "Report")!=0)
101 {
102 report=1;
103 printf("%%R %s\n", ubuff);
104 }
105 else
106 printf("%%J %s\n", ubuff);
107 if (volume)
108 {
109 s += 3; /* Vol */
110 if (*s=='.') s++;
111 while (*s==' ')s++;
112 printf("%%V ");
113 while (*s && *s != ' ' && *s!=',' && *s!=';' && *s!= ':')
114 putchar(*s++);
115 putchar('\n');
116 if (*s==':')
117 {
118 printf("%%N ");
119 while (*s==' ')s++;
120 while (isdigit(*s))
121 putchar(*s++);
122 putchar('\n');
123 }
124 *s++=0;
125 while (*s==' ')*s++=0;
126 if (s[0]=='N' && s[1]=='o' && (s[2]==' '||s[2]=='.'))
127 {
128 s+=2;
129 while (*s==' '||*s=='.')s++;
130 printf("%%N ");
131 while (isdigit(*s)||*s=='-')
132 putchar(*s++);
133 putchar('\n');
134 }
135 if (*s==',') *s++=0;
136 }
137 for(rr=months; *rr; rr++)
138 {
139 q= substr(s, *rr);
140 if (q)
141 {
142 for(r=q; *r; r++);
143 r--;
144 if (*r=='.')*r=0;
145 printf("%%D %s\n",q);
146 *(q-1)=0;
147 break;
148 }
149 }
150 if (*rr==0)
151 {
152 for(q=s; *q; q++)
153 {
154 if (q[0]=='1' && q[1]=='9' && (q[4]==0 || (q[4]=='.' && q[5]==0)))
155 {
156 if (q[4]=='.') q[4]=0;
157 printf("%%D %s\n",q);
158 rr=months;
159 q[-1]=0;
160 if (q==s) q[0]=0;
161 break;
162 }
163 }
164 }
165 if (*rr==0) /* no date */
166 printf("%%D 19xx\n");
167 /* if book bite off next field for city, if report for issuer */
168 if (book)
169 {
170 for(q=s; *q && *q != ','; q++)
171 ;
172 if (*q==',')
173 {
174 r=q;
175 r++;
176 while (*r==' ')r++;
177 if (isupper(r[0]) && isupper(r[1]))
178 {
179 r+=2;
180 *r++=0;
181 while (*r==' ')r++;
182 }
183 else
184 *q=0;
185 printf("%%C %s\n", s);
186 s=r;
187 }
188 }
189 for(q=s; *q; q++)
190 {
191 if (q[0]==' ' && q[1]=='p' && (q[2]=='p'||q[2]==0))
192 {
193 for(r=q; r>s; r--)
194 {
195 if (*r==' ' || *r==',')
196 *r=0;
197 }
198 *q=0;
199 q+=2;
200 if (q[0]=='p')q++;
201 while (*q==' '||*q=='.')q++;
202 r=q;
203 while (isdigit(*q)||*q=='.'||*q=='-'||isalpha(*q))q++;
204 *q++=0;
205 while (*q==' ')q++;
206 printf("%%P %s\n",r);
207 break;
208 }
209 }
210 s=ispp(s);
211 while (*s==' ')s++;
212 while (*q==' ')q++;
213 if (*s||*q)
214 printf("%%O %s %s\n", *s?s:"", *q?q:"");
215 }
216 continue;
217 }
218 }
219}
220getargs(s, arps)
221 char *s, *arps[];
222{
223 int i;
224i = 0;
225while (1)
226 {
227 arps[i++]=s;
228 while (*s != 0 && *s!=' '&& *s != '\t')s++;
229 if (*s==0) break;
230 *s++ =0;
231 while (*s==' ' || *s=='\t')s++;
232 if (*s==0)break;
233 }
234return(i);
235}
236prefix(small, big)
237 char *small, *big;
238{
239int c;
240while ((c= *small++) == *big++)
241 if (c==0) return(1);
242return(c==0);
243}
244substr(big, small)
245 char *small, *big;
246{
247while (*big)
248 if (prefix(small, big))
249 return(big);
250 else
251 big++;
252return(0);
253}
254sprefix(small, big)
255 char *small, *big;
256{
257while (*big==' ') big++;
258return(prefix(small,big));
259}
260ispp(s)
261 char *s;
262{
263static char buff[50];
264char *p, *t;
265p=s;
266while (*p==' ') p++;
267if (!isdigit(*p)) return(s);
268t=p;
269while (isdigit(*p))p++;
270if (p[0]!='p' || p[1]!='p') return(s);
271*p=0;
272sprintf(buff, "%spp.", t);
273return(buff);
274}