BSD 4 release
[unix-history] / usr / src / cmd / struct / 1.form.c
#include <stdio.h>
#include "1.defs.h"
#include "def.h"
extern int linechar, errflag, debug;
extern int (*input)(), (*unput)();
uptolow(c) /*translates upper to lower case */
int c;
{
if ('A' <= c && c <= 'Z')
return(c+'a'-'A');
else
return(c);
}
rdfree(func)
int (*func)();
{
int c;
while ( (c = (*input)()) != '\n')
{
(*func)(c);
}
}
rdstand(func)
int (*func)();
{
int c;
while ( (c=(*input)()) != '\n')
{
(*func)(c);
}
}
labfree(func) /* labels in freeform input */
int (*func)();
{
int c;
int temp[6];
int j;
for (j = 0; j < 5; ++j)
{
while ( (c = (*input)()) == ' ' || c == '\t' );
if (c == '\n')
{
if (j != 0)
{
temp[j] = '\0';
error("label without code - ignored:","","");
}
}
if (c < '0' || c > '9')
{
(*unput)(c);
break;
}
else
{
temp[j] = c;
(*func)(c);
}
}
for ( ; j < 5; ++j)
(*func)(' ');
}
labstand(func) /* labels in standard form input */
int (*func)();
{
int c;
int j;
for (j = 0; j < 5; ++j)
{
c = (*input)();
if (c == '\n')
{
error("line shorter than 5 characters","","");
errflag = 1;
(*unput)('\n');
}
if (c == '\t' || c == '\n')
{
for ( ;j<5; ++j)
(*func)(' ');
return;
}
(*func)(c);
}
(*input)(); /* throw away continuation char */
}
contfree() /* identify continuation lines in free-form input */
{
return(nonblchar(_diglet,0)); /* any non-alpha non-digit */
}
nonblchar(class,yesno)
int class,yesno;
{
#define CARDSIZE 121
int temp[CARDSIZE];
int j;
for (j=0; (temp[j]=(*input)()) == ' ' || temp[j] == '\t'; ++j)
if (j>=CARDSIZE-1)
{
temp[CARDSIZE-1] = '\0';
error ("line unexpectedly long","","");
break;
}
if (temp[j]!=EOF && classmatch(temp[j],class)==yesno)
return(1);
else
{
for ( ; j >= 0; --j)
(*unput)(temp[j]);
return(0);
}
}
contstand() /* continuation lines in standard form input */
{
int temp[6];
int i;
for (i = 0; i < 6; ++i)
{
temp[i] = (*input)();
if (temp[i] == '\t' || temp[i] == '\n' || temp[i] == '\0' || temp[i] == EOF)
{
for ( ;i >= 0; --i)
(*unput)(temp[i]);
return(0);
}
}
if (temp[5] != '0' && temp[5] != ' ')
return(1);
else
{
for ( i = 5 ; i >= 0; --i)
(*unput)(temp[i]);
return(0);
}
}
comstand(posafter) /* standard form comments */
int posafter;
{
int c;
c = (*input)();
if (!posafter)
(*unput)(c);
if (c == 'c' || c == '*' || c== '#')
return(1);
else
return(0);
}
comfree(posafter)
int posafter;
{
return(comstand(posafter));
}
int (*rline[])() = {rdfree,rdstand};
int (*comment[])() = {comfree,comstand};
int (*getlabel[])() = {labfree, labstand};
int (*chkcont[])() = {contfree,contstand};
blankline()
{
if ( nonblchar(_nl,1) ) /* first non-blank is nl */
{
(*unput) ('\n');
return(1);
}
else return(0);
}
#define maxunbp 80
char unbuf[maxunbp+1];
int unbp;
empseek(linebeg)
int linebeg;
{
unbp = 0;
if (fseek(infd,(long)(linebeg+rtnbeg),0) == -1)
faterr("in disk seek","","");
}
inchar()
{
if (unbp > 0)
return( unbuf[--unbp] );
else
{
return( uptolow(getc(infd)) );
}
}
unchar(c)
int c;
{
if (unbp >= maxunbp)
faterr("dec.rat: unbuf size exceeded","","");
if(c!=EOF)unbuf[unbp++] = c;
}