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