1 #ifndef lint 2 static char sccsid[] = "@(#)io.c 1.4 (CWI) 86/11/13"; 3 #endif lint 4 5 6 /* 7 * error message control 8 * input 9 * line count 10 */ 11 12 #include "defs.h" 13 #include "ext.h" 14 15 error(s) 16 char *s; 17 { 18 fprintf(stderr, "\n%s: line %d: %s\n", ifile, iline, s); 19 fprintf(stderr, "tbl quits\n"); 20 exit(1); 21 } 22 23 /* 24 * get a line from the input 25 */ 26 char * 27 gets1(s) 28 char *s; 29 { 30 char *p; 31 register int nbl = 0; 32 33 next: 34 iline++; 35 p = fgets(s, BUFSIZ, tabin); 36 /* 37 * Undocumented feature: tables can be arbitrarily split in 38 * various files 39 */ 40 while(p == NULL){ 41 if(swapin() == 0) 42 return(0); 43 p = fgets(s, BUFSIZ, tabin); 44 } 45 46 /* 47 * Clumsy support for .lf request (jna) 48 */ 49 if(p[0] == '.' && p[1] == 'l' && p[2] == 'f'){ 50 sscanf(p+3, "%d %s", &iline, oldname); 51 printf(".lf %d %s\n", iline, strlen(oldname) ? oldname: ifile); 52 goto next; 53 } 54 55 while(*s) 56 57 s++; 58 s--; 59 60 /* 61 * remove \n fom input 62 */ 63 if(*s == '\n') 64 *s-- = 0; 65 66 /* 67 * is last character a \ ? 68 */ 69 for(nbl = 0; *s == '\\' && s > p; s--) 70 nbl++; 71 72 /* 73 * Then fold escaped nl if in table 74 */ 75 if(linstart && nbl % 2) 76 (void) gets1(s + 1); 77 return(p); 78 } 79 80 #define BACKMAX 500 81 static char backup[BACKMAX]; 82 static char *backp = backup; 83 84 un1getc(c){ 85 if(c == '\n') 86 iline--; 87 *backp++ = c; 88 if(backp >= backup + BACKMAX) 89 error("too much backup"); 90 } 91 92 get1char(){ 93 register int c; 94 if(backp > backup) 95 c = *--backp; 96 else 97 c = getc(tabin); 98 if(c == EOF){ 99 if(swapin() == 0) 100 error("unexpected EOF"); 101 c = getc(tabin); 102 } 103 if(c == '\n') 104 iline++; 105 return(c); 106 } 107 108 backrest(cp) 109 char *cp; 110 { 111 register char *s; 112 for(s=cp; *s; s++) 113 ; 114 un1getc('\n'); 115 while (s>cp) 116 un1getc(*--s); 117 } 118