148123Sbostic /*-
248123Sbostic * %sccs.include.proprietary.c%
348123Sbostic */
448123Sbostic
510950Srrh #ifndef lint
6*62268Sbostic static char sccsid[] = "@(#)1.form.c 8.1 (Berkeley) 06/06/93";
748123Sbostic #endif /* not lint */
810950Srrh
910950Srrh #include <stdio.h>
1010950Srrh #include "1.defs.h"
1110950Srrh #include "def.h"
1243623Sbostic
1343623Sbostic /*
1443623Sbostic * The following are used in <stdio.h> but are defines as constants
1543623Sbostic * in 1.defs.h -- since their values are never used here we simply
1643623Sbostic * discard them. XXX
1743623Sbostic */
1843623Sbostic #undef _r
1943623Sbostic #undef _p
2043623Sbostic
2110950Srrh extern int linechar, errflag, debug;
2210950Srrh extern int (*input)(), (*unput)();
2310950Srrh
2410950Srrh
2510950Srrh
uptolow(c)2610950Srrh uptolow(c) /*translates upper to lower case */
2710950Srrh int c;
2810950Srrh {
2910950Srrh if ('A' <= c && c <= 'Z')
3010950Srrh return(c+'a'-'A');
3110950Srrh else
3210950Srrh return(c);
3310950Srrh }
3410950Srrh
3510950Srrh rdfree(func)
3610950Srrh int (*func)();
3710950Srrh {
3810950Srrh int c;
3910950Srrh while ( (c = (*input)()) != '\n')
4010950Srrh {
4110950Srrh (*func)(c);
4210950Srrh }
4310950Srrh }
4410950Srrh
4510950Srrh rdstand(func)
4610950Srrh int (*func)();
4710950Srrh {
4810950Srrh int c;
4910950Srrh while ( (c=(*input)()) != '\n')
5010950Srrh {
5110950Srrh (*func)(c);
5210950Srrh }
5310950Srrh }
5410950Srrh
5510950Srrh labfree(func) /* labels in freeform input */
5610950Srrh int (*func)();
5710950Srrh {
5810950Srrh int c;
5910950Srrh int temp[6];
6010950Srrh int j;
6110950Srrh for (j = 0; j < 5; ++j)
6210950Srrh {
6310950Srrh while ( (c = (*input)()) == ' ' || c == '\t' );
6410950Srrh if (c == '\n')
6510950Srrh {
6610950Srrh if (j != 0)
6710950Srrh {
6810950Srrh temp[j] = '\0';
6910950Srrh error("label without code - ignored:","","");
7010950Srrh }
7110950Srrh }
7210950Srrh if (c < '0' || c > '9')
7310950Srrh {
7410950Srrh (*unput)(c);
7510950Srrh break;
7610950Srrh }
7710950Srrh else
7810950Srrh {
7910950Srrh temp[j] = c;
8010950Srrh (*func)(c);
8110950Srrh }
8210950Srrh }
8310950Srrh for ( ; j < 5; ++j)
8410950Srrh (*func)(' ');
8510950Srrh }
8610950Srrh
8710950Srrh labstand(func) /* labels in standard form input */
8810950Srrh int (*func)();
8910950Srrh {
9010950Srrh int c;
9110950Srrh int j;
9210950Srrh
9310950Srrh for (j = 0; j < 5; ++j)
9410950Srrh {
9510950Srrh c = (*input)();
9610950Srrh if (c == '\n')
9710950Srrh {
9810950Srrh error("line shorter than 5 characters","","");
9910950Srrh errflag = 1;
10010950Srrh (*unput)('\n');
10110950Srrh }
10210950Srrh if (c == '\t' || c == '\n')
10310950Srrh {
10410950Srrh for ( ;j<5; ++j)
10510950Srrh (*func)(' ');
10610950Srrh return;
10710950Srrh }
10810950Srrh (*func)(c);
10910950Srrh }
11010950Srrh (*input)(); /* throw away continuation char */
11110950Srrh }
11210950Srrh
11310950Srrh
11410950Srrh
contfree()11510950Srrh contfree() /* identify continuation lines in free-form input */
11610950Srrh {
11710950Srrh return(nonblchar(_diglet,0)); /* any non-alpha non-digit */
11810950Srrh }
11910950Srrh
12010950Srrh
nonblchar(class,yesno)12110950Srrh nonblchar(class,yesno)
12210950Srrh int class,yesno;
12310950Srrh {
12410950Srrh #define CARDSIZE 121
12510950Srrh int temp[CARDSIZE];
12610950Srrh int j;
12710950Srrh for (j=0; (temp[j]=(*input)()) == ' ' || temp[j] == '\t'; ++j)
12810950Srrh if (j>=CARDSIZE-1)
12910950Srrh {
13010950Srrh temp[CARDSIZE-1] = '\0';
13110950Srrh error ("line unexpectedly long","","");
13210950Srrh break;
13310950Srrh }
13410950Srrh if (temp[j]!=EOF && classmatch(temp[j],class)==yesno)
13510950Srrh return(1);
13610950Srrh else
13710950Srrh {
13810950Srrh for ( ; j >= 0; --j)
13910950Srrh (*unput)(temp[j]);
14010950Srrh return(0);
14110950Srrh }
14210950Srrh }
14310950Srrh
14410950Srrh
contstand()14510950Srrh contstand() /* continuation lines in standard form input */
14610950Srrh {
14710950Srrh int temp[6];
14810950Srrh int i;
14910950Srrh
15010950Srrh for (i = 0; i < 6; ++i)
15110950Srrh {
15210950Srrh temp[i] = (*input)();
15310950Srrh if (temp[i] == '\t' || temp[i] == '\n' || temp[i] == '\0' || temp[i] == EOF)
15410950Srrh {
15510950Srrh for ( ;i >= 0; --i)
15610950Srrh (*unput)(temp[i]);
15710950Srrh return(0);
15810950Srrh }
15910950Srrh }
16010950Srrh if (temp[5] != '0' && temp[5] != ' ')
16110950Srrh return(1);
16210950Srrh else
16310950Srrh {
16410950Srrh for ( i = 5 ; i >= 0; --i)
16510950Srrh (*unput)(temp[i]);
16610950Srrh return(0);
16710950Srrh }
16810950Srrh }
16910950Srrh
17010950Srrh
17110950Srrh
comstand(posafter)17210950Srrh comstand(posafter) /* standard form comments */
17310950Srrh int posafter;
17410950Srrh {
17510950Srrh int c;
17610950Srrh c = (*input)();
17710950Srrh if (!posafter)
17810950Srrh (*unput)(c);
17910950Srrh if (c == 'c' || c == '*' || c== '#')
18010950Srrh return(1);
18110950Srrh else
18210950Srrh return(0);
18310950Srrh }
18410950Srrh
18510950Srrh
comfree(posafter)18610950Srrh comfree(posafter)
18710950Srrh int posafter;
18810950Srrh {
18910950Srrh return(comstand(posafter));
19010950Srrh }
19110950Srrh int (*rline[])() = {rdfree,rdstand};
19210950Srrh int (*comment[])() = {comfree,comstand};
19310950Srrh int (*getlabel[])() = {labfree, labstand};
19410950Srrh int (*chkcont[])() = {contfree,contstand};
19510950Srrh
blankline()19610950Srrh blankline()
19710950Srrh {
19810950Srrh if ( nonblchar(_nl,1) ) /* first non-blank is nl */
19910950Srrh {
20010950Srrh (*unput) ('\n');
20110950Srrh return(1);
20210950Srrh }
20310950Srrh else return(0);
20410950Srrh }
20510950Srrh
20610950Srrh #define maxunbp 80
20710950Srrh char unbuf[maxunbp+1];
20810950Srrh int unbp;
20910950Srrh
empseek(linebeg)21010950Srrh empseek(linebeg)
21110950Srrh int linebeg;
21210950Srrh {
21310950Srrh unbp = 0;
21410950Srrh if (fseek(infd,(long)(linebeg+rtnbeg),0) == -1)
21510950Srrh faterr("in disk seek","","");
21610950Srrh }
21710950Srrh
inchar()21810950Srrh inchar()
21910950Srrh {
22010950Srrh if (unbp > 0)
22110950Srrh return( unbuf[--unbp] );
22210950Srrh else
22310950Srrh {
22410950Srrh return( uptolow(getc(infd)) );
22510950Srrh }
22610950Srrh }
22710950Srrh
22810950Srrh
unchar(c)22910950Srrh unchar(c)
23010950Srrh int c;
23110950Srrh {
23210950Srrh if (unbp >= maxunbp)
23310950Srrh faterr("dec.rat: unbuf size exceeded","","");
23410950Srrh if(c!=EOF)unbuf[unbp++] = c;
23510950Srrh }
236