1 #ifndef lint 2 static char sccsid[] = "@(#)1.form.c 4.1 (Berkeley) 02/11/83"; 3 #endif not lint 4 5 #include <stdio.h> 6 #include "1.defs.h" 7 #include "def.h" 8 extern int linechar, errflag, debug; 9 extern int (*input)(), (*unput)(); 10 11 12 13 uptolow(c) /*translates upper to lower case */ 14 int c; 15 { 16 if ('A' <= c && c <= 'Z') 17 return(c+'a'-'A'); 18 else 19 return(c); 20 } 21 22 rdfree(func) 23 int (*func)(); 24 { 25 int c; 26 while ( (c = (*input)()) != '\n') 27 { 28 (*func)(c); 29 } 30 } 31 32 rdstand(func) 33 int (*func)(); 34 { 35 int c; 36 while ( (c=(*input)()) != '\n') 37 { 38 (*func)(c); 39 } 40 } 41 42 labfree(func) /* labels in freeform input */ 43 int (*func)(); 44 { 45 int c; 46 int temp[6]; 47 int j; 48 for (j = 0; j < 5; ++j) 49 { 50 while ( (c = (*input)()) == ' ' || c == '\t' ); 51 if (c == '\n') 52 { 53 if (j != 0) 54 { 55 temp[j] = '\0'; 56 error("label without code - ignored:","",""); 57 } 58 } 59 if (c < '0' || c > '9') 60 { 61 (*unput)(c); 62 break; 63 } 64 else 65 { 66 temp[j] = c; 67 (*func)(c); 68 } 69 } 70 for ( ; j < 5; ++j) 71 (*func)(' '); 72 } 73 74 labstand(func) /* labels in standard form input */ 75 int (*func)(); 76 { 77 int c; 78 int j; 79 80 for (j = 0; j < 5; ++j) 81 { 82 c = (*input)(); 83 if (c == '\n') 84 { 85 error("line shorter than 5 characters","",""); 86 errflag = 1; 87 (*unput)('\n'); 88 } 89 if (c == '\t' || c == '\n') 90 { 91 for ( ;j<5; ++j) 92 (*func)(' '); 93 return; 94 } 95 (*func)(c); 96 } 97 (*input)(); /* throw away continuation char */ 98 } 99 100 101 102 contfree() /* identify continuation lines in free-form input */ 103 { 104 return(nonblchar(_diglet,0)); /* any non-alpha non-digit */ 105 } 106 107 108 nonblchar(class,yesno) 109 int class,yesno; 110 { 111 #define CARDSIZE 121 112 int temp[CARDSIZE]; 113 int j; 114 for (j=0; (temp[j]=(*input)()) == ' ' || temp[j] == '\t'; ++j) 115 if (j>=CARDSIZE-1) 116 { 117 temp[CARDSIZE-1] = '\0'; 118 error ("line unexpectedly long","",""); 119 break; 120 } 121 if (temp[j]!=EOF && classmatch(temp[j],class)==yesno) 122 return(1); 123 else 124 { 125 for ( ; j >= 0; --j) 126 (*unput)(temp[j]); 127 return(0); 128 } 129 } 130 131 132 contstand() /* continuation lines in standard form input */ 133 { 134 int temp[6]; 135 int i; 136 137 for (i = 0; i < 6; ++i) 138 { 139 temp[i] = (*input)(); 140 if (temp[i] == '\t' || temp[i] == '\n' || temp[i] == '\0' || temp[i] == EOF) 141 { 142 for ( ;i >= 0; --i) 143 (*unput)(temp[i]); 144 return(0); 145 } 146 } 147 if (temp[5] != '0' && temp[5] != ' ') 148 return(1); 149 else 150 { 151 for ( i = 5 ; i >= 0; --i) 152 (*unput)(temp[i]); 153 return(0); 154 } 155 } 156 157 158 159 comstand(posafter) /* standard form comments */ 160 int posafter; 161 { 162 int c; 163 c = (*input)(); 164 if (!posafter) 165 (*unput)(c); 166 if (c == 'c' || c == '*' || c== '#') 167 return(1); 168 else 169 return(0); 170 } 171 172 173 comfree(posafter) 174 int posafter; 175 { 176 return(comstand(posafter)); 177 } 178 int (*rline[])() = {rdfree,rdstand}; 179 int (*comment[])() = {comfree,comstand}; 180 int (*getlabel[])() = {labfree, labstand}; 181 int (*chkcont[])() = {contfree,contstand}; 182 183 blankline() 184 { 185 if ( nonblchar(_nl,1) ) /* first non-blank is nl */ 186 { 187 (*unput) ('\n'); 188 return(1); 189 } 190 else return(0); 191 } 192 193 #define maxunbp 80 194 char unbuf[maxunbp+1]; 195 int unbp; 196 197 empseek(linebeg) 198 int linebeg; 199 { 200 unbp = 0; 201 if (fseek(infd,(long)(linebeg+rtnbeg),0) == -1) 202 faterr("in disk seek","",""); 203 } 204 205 inchar() 206 { 207 if (unbp > 0) 208 return( unbuf[--unbp] ); 209 else 210 { 211 return( uptolow(getc(infd)) ); 212 } 213 } 214 215 216 unchar(c) 217 int c; 218 { 219 if (unbp >= maxunbp) 220 faterr("dec.rat: unbuf size exceeded","",""); 221 if(c!=EOF)unbuf[unbp++] = c; 222 } 223