1*48291Sbostic /*-
2*48291Sbostic * %sccs.include.proprietary.c%
3*48291Sbostic */
4*48291Sbostic
512297Stut #ifndef lint
6*48291Sbostic static char sccsid[] = "@(#)kaiser.c 4.2 (Berkeley) 04/18/91";
7*48291Sbostic #endif /* not lint */
812297Stut
912297Stut #include <stdio.h>
1012297Stut #include <ctype.h>
1112297Stut
1212297Stut char *months[] {
1312297Stut "Jan", "Feb", "Mar", "Apr", "May", "Jun",
1412297Stut "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", 0};
1512297Stut
main()1612297Stut main()
1712297Stut {
1812297Stut int state 1000, i, book, volume, corp, report;
1912297Stut int na;
2012297Stut char *v[20], **vv, **rr;
2112297Stut char ubuff[1000], *up;
2212297Stut char line[100];
2312297Stut char *p, *s, *r, *q;
2412297Stut while (gets(line))
2512297Stut {
2612297Stut if (line[1]>'9' || line[1]<'0') continue;
2712297Stut switch(line[0])
2812297Stut {
2912297Stut case 'T':
3012297Stut if (state > 'T')
3112297Stut {
3212297Stut book=0;
3312297Stut report=0;
3412297Stut printf("\n%%T ");
3512297Stut }
3612297Stut printf("%s\n", line+18);
3712297Stut state='T';
3812297Stut na = getargs(line+18, v);
3912297Stut for(i=0;i<na;i++)
4012297Stut if (strcmp(v[i], "(Book)")==0)
4112297Stut book=1;
4212297Stut continue;
4312297Stut case 'A':
4412297Stut state = 'A';
4512297Stut na=getargs(line+18, vv=v);
4612297Stut if (na<=0) continue;
4712297Stut while (na>0)
4812297Stut {
4912297Stut printf("%%A ");
5012297Stut corp=0;
5112297Stut for(p=vv[1]; *p; p++)
5212297Stut if (islower(*p))
5312297Stut corp=1;
5412297Stut if (corp==0)
5512297Stut {
5612297Stut for(p=vv[1]; *p; p++)
5712297Stut printf("%c. ", *p);
5812297Stut if (na>2 &&strcmp(vv[2], "+"))
5912297Stut {
6012297Stut printf("%s", vv[0]);
6112297Stut if (strcmp(vv[2], "Jr.")==0)
6212297Stut printf(",");
6312297Stut printf(" %s\n",vv[2]);
6412297Stut vv++;
6512297Stut na--;
6612297Stut }
6712297Stut else
6812297Stut printf("%s\n", vv[0]);
6912297Stut }
7012297Stut else
7112297Stut printf("%s %s\n",vv[0],vv[1]);
7212297Stut vv+=2;
7312297Stut na-=2;
7412297Stut if (strcmp(vv[0], "+")==0)
7512297Stut {
7612297Stut vv++;
7712297Stut na--;
7812297Stut }
7912297Stut }
8012297Stut continue;
8112297Stut case 'U':
8212297Stut if (state!='U')
8312297Stut ubuff[0]=0;
8412297Stut else
8512297Stut strcat(ubuff, " ");
8612297Stut state = 'U';
8712297Stut strcat(ubuff, line+18);
8812297Stut if (line[2]=='.')
8912297Stut { /* end of item */
9012297Stut p=ubuff; /*start*/
9112297Stut volume=0;
9212297Stut for(s=ubuff; *s; s++)
9312297Stut if (s[-1]==' ' && prefix("Vol", s))
9412297Stut {
9512297Stut for(q=s-1; q>ubuff; q--)
9612297Stut {
9712297Stut if (*q==' ' || *q==',') *q=0;
9812297Stut else break;
9912297Stut }
10012297Stut volume=1;
10112297Stut break;
10212297Stut }
10312297Stut if (*s==0)
10412297Stut for(s=ubuff; *s && (*s!=',' || sprefix("Inc", s+1)); s++)
10512297Stut ;
10612297Stut else
10712297Stut s++;
10812297Stut if (*s==',')*s++=0;
10912297Stut if (book)
11012297Stut printf("%%I %s\n",ubuff);
11112297Stut else if (volume)
11212297Stut printf("%%J %s\n", ubuff);
11312297Stut else if (substr(ubuff, "Report")!=0)
11412297Stut {
11512297Stut report=1;
11612297Stut printf("%%R %s\n", ubuff);
11712297Stut }
11812297Stut else
11912297Stut printf("%%J %s\n", ubuff);
12012297Stut if (volume)
12112297Stut {
12212297Stut s += 3; /* Vol */
12312297Stut if (*s=='.') s++;
12412297Stut while (*s==' ')s++;
12512297Stut printf("%%V ");
12612297Stut while (*s && *s != ' ' && *s!=',' && *s!=';' && *s!= ':')
12712297Stut putchar(*s++);
12812297Stut putchar('\n');
12912297Stut if (*s==':')
13012297Stut {
13112297Stut printf("%%N ");
13212297Stut while (*s==' ')s++;
13312297Stut while (isdigit(*s))
13412297Stut putchar(*s++);
13512297Stut putchar('\n');
13612297Stut }
13712297Stut *s++=0;
13812297Stut while (*s==' ')*s++=0;
13912297Stut if (s[0]=='N' && s[1]=='o' && (s[2]==' '||s[2]=='.'))
14012297Stut {
14112297Stut s+=2;
14212297Stut while (*s==' '||*s=='.')s++;
14312297Stut printf("%%N ");
14412297Stut while (isdigit(*s)||*s=='-')
14512297Stut putchar(*s++);
14612297Stut putchar('\n');
14712297Stut }
14812297Stut if (*s==',') *s++=0;
14912297Stut }
15012297Stut for(rr=months; *rr; rr++)
15112297Stut {
15212297Stut q= substr(s, *rr);
15312297Stut if (q)
15412297Stut {
15512297Stut for(r=q; *r; r++);
15612297Stut r--;
15712297Stut if (*r=='.')*r=0;
15812297Stut printf("%%D %s\n",q);
15912297Stut *(q-1)=0;
16012297Stut break;
16112297Stut }
16212297Stut }
16312297Stut if (*rr==0)
16412297Stut {
16512297Stut for(q=s; *q; q++)
16612297Stut {
16712297Stut if (q[0]=='1' && q[1]=='9' && (q[4]==0 || (q[4]=='.' && q[5]==0)))
16812297Stut {
16912297Stut if (q[4]=='.') q[4]=0;
17012297Stut printf("%%D %s\n",q);
17112297Stut rr=months;
17212297Stut q[-1]=0;
17312297Stut if (q==s) q[0]=0;
17412297Stut break;
17512297Stut }
17612297Stut }
17712297Stut }
17812297Stut if (*rr==0) /* no date */
17912297Stut printf("%%D 19xx\n");
18012297Stut /* if book bite off next field for city, if report for issuer */
18112297Stut if (book)
18212297Stut {
18312297Stut for(q=s; *q && *q != ','; q++)
18412297Stut ;
18512297Stut if (*q==',')
18612297Stut {
18712297Stut r=q;
18812297Stut r++;
18912297Stut while (*r==' ')r++;
19012297Stut if (isupper(r[0]) && isupper(r[1]))
19112297Stut {
19212297Stut r+=2;
19312297Stut *r++=0;
19412297Stut while (*r==' ')r++;
19512297Stut }
19612297Stut else
19712297Stut *q=0;
19812297Stut printf("%%C %s\n", s);
19912297Stut s=r;
20012297Stut }
20112297Stut }
20212297Stut for(q=s; *q; q++)
20312297Stut {
20412297Stut if (q[0]==' ' && q[1]=='p' && (q[2]=='p'||q[2]==0))
20512297Stut {
20612297Stut for(r=q; r>s; r--)
20712297Stut {
20812297Stut if (*r==' ' || *r==',')
20912297Stut *r=0;
21012297Stut }
21112297Stut *q=0;
21212297Stut q+=2;
21312297Stut if (q[0]=='p')q++;
21412297Stut while (*q==' '||*q=='.')q++;
21512297Stut r=q;
21612297Stut while (isdigit(*q)||*q=='.'||*q=='-'||isalpha(*q))q++;
21712297Stut *q++=0;
21812297Stut while (*q==' ')q++;
21912297Stut printf("%%P %s\n",r);
22012297Stut break;
22112297Stut }
22212297Stut }
22312297Stut s=ispp(s);
22412297Stut while (*s==' ')s++;
22512297Stut while (*q==' ')q++;
22612297Stut if (*s||*q)
22712297Stut printf("%%O %s %s\n", *s?s:"", *q?q:"");
22812297Stut }
22912297Stut continue;
23012297Stut }
23112297Stut }
23212297Stut }
23312297Stut
getargs(s,arps)23412297Stut getargs(s, arps)
23512297Stut char *s, *arps[];
23612297Stut {
23712297Stut int i;
23812297Stut i = 0;
23912297Stut while (1)
24012297Stut {
24112297Stut arps[i++]=s;
24212297Stut while (*s != 0 && *s!=' '&& *s != '\t')s++;
24312297Stut if (*s==0) break;
24412297Stut *s++ =0;
24512297Stut while (*s==' ' || *s=='\t')s++;
24612297Stut if (*s==0)break;
24712297Stut }
24812297Stut return(i);
24912297Stut }
25012297Stut
prefix(small,big)25112297Stut prefix(small, big)
25212297Stut char *small, *big;
25312297Stut {
25412297Stut int c;
25512297Stut while ((c= *small++) == *big++)
25612297Stut if (c==0) return(1);
25712297Stut return(c==0);
25812297Stut }
25912297Stut
substr(big,small)26012297Stut substr(big, small)
26112297Stut char *small, *big;
26212297Stut {
26312297Stut while (*big)
26412297Stut if (prefix(small, big))
26512297Stut return(big);
26612297Stut else
26712297Stut big++;
26812297Stut return(0);
26912297Stut }
27012297Stut
sprefix(small,big)27112297Stut sprefix(small, big)
27212297Stut char *small, *big;
27312297Stut {
27412297Stut while (*big==' ') big++;
27512297Stut return(prefix(small,big));
27612297Stut }
27712297Stut
ispp(s)27812297Stut ispp(s)
27912297Stut char *s;
28012297Stut {
28112297Stut static char buff[50];
28212297Stut char *p, *t;
28312297Stut p=s;
28412297Stut while (*p==' ') p++;
28512297Stut if (!isdigit(*p)) return(s);
28612297Stut t=p;
28712297Stut while (isdigit(*p))p++;
28812297Stut if (p[0]!='p' || p[1]!='p') return(s);
28912297Stut *p=0;
29012297Stut sprintf(buff, "%spp.", t);
29112297Stut return(buff);
29212297Stut }
293