Commit | Line | Data |
---|---|---|
52960f2f ML |
1 | # include "stdio.h" |
2 | # include "ctype.h" | |
3 | char *months[] {"Jan", "Feb", "Mar", "Apr", "May", | |
4 | "Jun", "Jul", "Aug", "Sep","Oct", "Nov", "Dec",0}; | |
5 | main() | |
6 | { | |
7 | int state 1000, i, book, volume, corp, report; | |
8 | int na; | |
9 | char *v[20], **vv, **rr; | |
10 | char ubuff[1000], *up; | |
11 | char line[100]; | |
12 | char *p, *s, *r, *q; | |
13 | while (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 | } | |
220 | getargs(s, arps) | |
221 | char *s, *arps[]; | |
222 | { | |
223 | int i; | |
224 | i = 0; | |
225 | while (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 | } | |
234 | return(i); | |
235 | } | |
236 | prefix(small, big) | |
237 | char *small, *big; | |
238 | { | |
239 | int c; | |
240 | while ((c= *small++) == *big++) | |
241 | if (c==0) return(1); | |
242 | return(c==0); | |
243 | } | |
244 | substr(big, small) | |
245 | char *small, *big; | |
246 | { | |
247 | while (*big) | |
248 | if (prefix(small, big)) | |
249 | return(big); | |
250 | else | |
251 | big++; | |
252 | return(0); | |
253 | } | |
254 | sprefix(small, big) | |
255 | char *small, *big; | |
256 | { | |
257 | while (*big==' ') big++; | |
258 | return(prefix(small,big)); | |
259 | } | |
260 | ispp(s) | |
261 | char *s; | |
262 | { | |
263 | static char buff[50]; | |
264 | char *p, *t; | |
265 | p=s; | |
266 | while (*p==' ') p++; | |
267 | if (!isdigit(*p)) return(s); | |
268 | t=p; | |
269 | while (isdigit(*p))p++; | |
270 | if (p[0]!='p' || p[1]!='p') return(s); | |
271 | *p=0; | |
272 | sprintf(buff, "%spp.", t); | |
273 | return(buff); | |
274 | } |