1 #ifndef lint 2 static char sccsid[] = "@(#)1.line.c 4.1 (Berkeley) 02/11/83"; 3 #endif not lint 4 5 #include <stdio.h> 6 # 7 #include "def.h" 8 #define bufsize 1601 9 char buffer[bufsize]; 10 int bufcount; 11 extern int errflag; 12 long stchars; /* counts number of chars at most recent \n read */ 13 #ifndef unix 14 long ostchars; 15 extern long ftell(); 16 #endif 17 int newline; /* counts number of lines read so far in file */ 18 extern int rdfree(), comfree(),labfree(), contfree(); 19 extern int rdstand(), comstand(), labstand(), contstand(); 20 extern int (*rline[])(); 21 extern int (*comment[])(); 22 extern int (*getlabel[])(); 23 extern int (*chkcont[])(); 24 25 26 27 flush() 28 {bufcount = 0; } 29 30 addchar(c) 31 { 32 buffer[bufcount++] = c; 33 } 34 35 getline(lastline,lastchar,linecom,charcom) 36 int *lastline, *linecom; 37 long *lastchar, *charcom; 38 /* set *lastline to number of last line of statement, 39 set *lastchar to number of last char of statement, 40 set *linecom to number of last line of comment preceding statement */ 41 { 42 43 int i; 44 flush(); 45 while ( unput1(input1()) != EOF) 46 { 47 while ( (*comment[inputform])(0) || blankline() ) 48 { 49 (*rline[inputform])(addchar); 50 flush(); 51 } 52 *linecom = newline; 53 /* set charcom to number of last char of comment, starting at 0 54 if at start of file and no comment, will be -1 */ 55 *charcom = stchars - 1; 56 if (unput1(input1()) == EOF) break; 57 (*getlabel[inputform])(addchar); 58 (*rline[inputform])(addchar); 59 60 while ( blankline() || ( !(*comment[inputform])(0) && (*chkcont[inputform])() )) 61 (*rline[inputform])(addchar); 62 63 addchar('\0'); 64 *lastline = newline; 65 *lastchar = stchars - 1; 66 if (debug == 40) 67 fprintf(stderr,"line %d; bufcount: %d\n",newline,bufcount); 68 69 for (i = 5; i < bufcount; ++i) 70 if (buffer[i] == ' ' || buffer[i] == '\t' || buffer[i] == '\n') 71 buffer[i] = '~'; 72 return(bufcount); 73 } 74 return(-1); 75 } 76 77 78 int linechars; /* counts number of chars read so far in current line */ 79 long newchar; /* counts number of chars read so far in file */ 80 81 82 input1() 83 { 84 static int c; 85 if (c == '\n') linechars = 0; 86 c = inchar(); 87 ++linechars; 88 ++newchar; 89 if (c == '\n') 90 { 91 ++newline; 92 #ifdef unix 93 stchars = newchar; 94 #else 95 ostchars=stchars; stchars=ftell(infd); 96 #endif 97 } 98 return(c); 99 } 100 101 unput1(c) 102 { 103 --linechars; 104 --newchar; 105 unchar(c); 106 if (c == '\n') 107 { 108 #ifdef unix 109 stchars = newchar; 110 #else 111 stchars=ostchars; 112 #endif 113 --newline; 114 } 115 return(c); 116 } 117 118 119 120 121