| 1 |  | 
|---|
| 2 |  | 
|---|
| 3 | #define FBSIZE  sizeof(FILE) | 
|---|
| 4 | #define NFILES  16 | 
|---|
| 5 |  | 
|---|
| 6 | #define NULL    0 | 
|---|
| 7 | #define EOF     (-1) | 
|---|
| 8 |  | 
|---|
| 9 | #define stdin   _fptbl[0] | 
|---|
| 10 | #define stdout  _fptbl[1] | 
|---|
| 11 | #define stderr  _fptbl[2] | 
|---|
| 12 |  | 
|---|
| 13 | #define STDIN   0xffff | 
|---|
| 14 | #define STDOUT  0xfffe | 
|---|
| 15 | #define STDERR  0xfffd | 
|---|
| 16 |  | 
|---|
| 17 | typedef struct { | 
|---|
| 18 |         int _fcb[FCBSIZE]; | 
|---|
| 19 |         int _fbp; | 
|---|
| 20 |         char _fbuf[1024]; | 
|---|
| 21 |         } FILE; | 
|---|
| 22 |  | 
|---|
| 23 | FILE *_fptbl[NFILES]; | 
|---|
| 24 |  | 
|---|
| 25 | char _ch; | 
|---|
| 26 | int _fch = 0; | 
|---|
| 27 |  | 
|---|
| 28 | _main(argc,argv) | 
|---|
| 29 | int argc; | 
|---|
| 30 | char **argv; | 
|---|
| 31 | {int i; | 
|---|
| 32 |         initheap(); | 
|---|
| 33 |         stdin = STDIN; | 
|---|
| 34 |         stdout = STDOUT; | 
|---|
| 35 |         stderr = STDERR; | 
|---|
| 36 |         for (i = 3; i < NFILES; ++i) _fptbl[i] = NULL; | 
|---|
| 37 |         main(argc,argv); | 
|---|
| 38 |         for (i = 0; i < NFILES; ++i) fflush(_fptbl[i]); | 
|---|
| 39 | } | 
|---|
| 40 |  | 
|---|
| 41 | ungetc(c,fp) | 
|---|
| 42 | char c; | 
|---|
| 43 | FILE *fp; | 
|---|
| 44 | {       if (fp == STDIN) | 
|---|
| 45 |         {       _fch = 1; | 
|---|
| 46 |                 return _ch = c; | 
|---|
| 47 |         } | 
|---|
| 48 |         fp->_fcb[62] = 1; | 
|---|
| 49 |         return fp->_fcb[61] = c; | 
|---|
| 50 | } | 
|---|
| 51 |  | 
|---|
| 52 | getc(fp) | 
|---|
| 53 | FILE *fp; | 
|---|
| 54 | { | 
|---|
| 55 |         switch ( fp ) { | 
|---|
| 56 |         case STDIN: | 
|---|
| 57 |                 if (_fch) { _fch = 0; return _ch; } | 
|---|
| 58 |                 return GETCH(); | 
|---|
| 59 |         case STDOUT: | 
|---|
| 60 |         case STDERR: | 
|---|
| 61 |                 return EOF; | 
|---|
| 62 |         default: | 
|---|
| 63 |                 if (fp->_fcb[2] != 1) return EOF; | 
|---|
| 64 |                 if (fp->_fcb[62]) { fp->_fcb[62] = 0; return fp->_fcb[61]; } | 
|---|
| 65 |                 return FMS(fp->_fcb,0); | 
|---|
| 66 |         } | 
|---|
| 67 | } | 
|---|
| 68 |  | 
|---|
| 69 | putc(c,fp) | 
|---|
| 70 | char c; | 
|---|
| 71 | FILE *fp; | 
|---|
| 72 | {       switch ( fp ) { | 
|---|
| 73 |         case STDIN: | 
|---|
| 74 |                 return EOF; | 
|---|
| 75 |         case STDOUT: | 
|---|
| 76 |                 return PUTCH(c); | 
|---|
| 77 |         case STDERR: | 
|---|
| 78 |                 return PUTCH2(c); | 
|---|
| 79 |         default: | 
|---|
| 80 |                 if (fp->_fcb[2] != 2) return EOF; | 
|---|
| 81 |                 if (FMS(fp->_fcb,0,c) < 0) return EOF; | 
|---|
| 82 |                 return c; | 
|---|
| 83 |         } | 
|---|
| 84 | } | 
|---|
| 85 |  | 
|---|
| 86 | ugetch(c) | 
|---|
| 87 | char c; | 
|---|
| 88 | {       return ungetc(c,stdin); | 
|---|
| 89 | } | 
|---|
| 90 |  | 
|---|
| 91 | getchar() | 
|---|
| 92 | {       return getc(stdin); | 
|---|
| 93 | } | 
|---|
| 94 |  | 
|---|
| 95 | putchar(c) | 
|---|
| 96 | char c; | 
|---|
| 97 | {       return putc(c,stdout); | 
|---|
| 98 | } | 
|---|
| 99 |  | 
|---|
| 100 | printf(s) | 
|---|
| 101 | char *s; | 
|---|
| 102 | {       _fprintf(stdout,s,(int *)&s+1); | 
|---|
| 103 | } | 
|---|
| 104 |  | 
|---|
| 105 | fprintf(fp,s) | 
|---|
| 106 | FILE *fp; | 
|---|
| 107 | char *s; | 
|---|
| 108 | {       _fprintf(fp,s,(int *)&s+1); | 
|---|
| 109 | } | 
|---|
| 110 |  | 
|---|
| 111 | _fprintf(fp,s,p) | 
|---|
| 112 | FILE *fp; | 
|---|
| 113 | char *s; | 
|---|
| 114 | int *p; | 
|---|
| 115 | {int l,m,n; | 
|---|
| 116 |  char c,buf[8]; | 
|---|
| 117 |         while(c = *s++) | 
|---|
| 118 |                 if (c != '%') putc(c,fp); | 
|---|
| 119 |                 else | 
|---|
| 120 |                 {       if (l=(*s == '-')) ++s; | 
|---|
| 121 |                         if (isdigit(*s)) s += _getint(&m,s); | 
|---|
| 122 |                         else m = 0; | 
|---|
| 123 |                         if (*s == '.') ++s; | 
|---|
| 124 |                         if (isdigit(*s)) s += _getint(&n,s); | 
|---|
| 125 |                         else n = 32767; | 
|---|
| 126 |                         switch(c = *s++) | 
|---|
| 127 |                         {case 'd': | 
|---|
| 128 |                                 itoa(*p++,buf); | 
|---|
| 129 |                                 break; | 
|---|
| 130 |                         case 'o': | 
|---|
| 131 |                                 itooa(*p++,buf); | 
|---|
| 132 |                                 break; | 
|---|
| 133 |                         case 'x': | 
|---|
| 134 |                                 itoxa(*p++,buf); | 
|---|
| 135 |                                 break; | 
|---|
| 136 |                         case 'u': | 
|---|
| 137 |                                 itoua(*p++,buf); | 
|---|
| 138 |                                 break; | 
|---|
| 139 |                         case 'c': | 
|---|
| 140 |                                 ctos(*p++,buf); | 
|---|
| 141 |                                 break; | 
|---|
| 142 |                         case 's': | 
|---|
| 143 |                                 _putstr(fp,*p++,l,m,n); | 
|---|
| 144 |                                 continue; | 
|---|
| 145 |                         case '\0': | 
|---|
| 146 |                                 return; | 
|---|
| 147 |                         default: | 
|---|
| 148 |                                 ctos(c,buf); | 
|---|
| 149 |                                 break; | 
|---|
| 150 |                         } | 
|---|
| 151 |                         _putstr(fp,buf,l,m,n); | 
|---|
| 152 |                 } | 
|---|
| 153 | } | 
|---|
| 154 |  | 
|---|
| 155 | _getint(p,s) | 
|---|
| 156 | int *p; | 
|---|
| 157 | char *s; | 
|---|
| 158 | {int i; | 
|---|
| 159 |         for(*p = i = 0; isdigit(*s); ++i) *p = *p * 10 + *s++ - '0'; | 
|---|
| 160 |         return i; | 
|---|
| 161 | } | 
|---|
| 162 |  | 
|---|
| 163 | _putstr(fp,s,l,m,n) | 
|---|
| 164 | FILE fp; | 
|---|
| 165 | char *s; | 
|---|
| 166 | int l,m,n; | 
|---|
| 167 | {int k; | 
|---|
| 168 |         k = (strlen(s) < n ? strlen(s) : n); | 
|---|
| 169 |         m = (k < m ? m - k : 0); | 
|---|
| 170 |         if (l) | 
|---|
| 171 |         {       _putsn(fp,s,n); | 
|---|
| 172 |                 _putspc(fp,m); | 
|---|
| 173 |         } | 
|---|
| 174 |         else | 
|---|
| 175 |         {       _putspc(fp,m); | 
|---|
| 176 |                 _putsn(fp,s,n); | 
|---|
| 177 |         } | 
|---|
| 178 | } | 
|---|
| 179 |          | 
|---|
| 180 | _putsn(fp,s,n) | 
|---|
| 181 | FILE fp; | 
|---|
| 182 | char *s; | 
|---|
| 183 | int n; | 
|---|
| 184 | {       while(*s) | 
|---|
| 185 |                 if (--n >= 0) putc(*s++,fp); | 
|---|
| 186 |                 else break; | 
|---|
| 187 | } | 
|---|
| 188 |  | 
|---|
| 189 | _putspc(fp,n) | 
|---|
| 190 | FILE *fp; | 
|---|
| 191 | int n; | 
|---|
| 192 | {       while(--n >= 0) putc(' ',fp); | 
|---|
| 193 | } | 
|---|
| 194 |  | 
|---|
| 195 | itoa(n,s) | 
|---|
| 196 | int n; | 
|---|
| 197 | char *s; | 
|---|
| 198 | {       if (n < 0) | 
|---|
| 199 |         {       *s++ = '-'; | 
|---|
| 200 |                 return (itoua(-n,s) + 1); | 
|---|
| 201 |         } | 
|---|
| 202 |         return itoua(n,s); | 
|---|
| 203 | } | 
|---|
| 204 |  | 
|---|
| 205 | itoua(n,s) | 
|---|
| 206 | int n; | 
|---|
| 207 | char *s; | 
|---|
| 208 | {       return _itoda(n,s,10); | 
|---|
| 209 | } | 
|---|
| 210 |  | 
|---|
| 211 | ctos(c,s) | 
|---|
| 212 | char c,*s; | 
|---|
| 213 | {       s[0] = c; | 
|---|
| 214 |         s[1] = '\0'; | 
|---|
| 215 |         return s; | 
|---|
| 216 | } | 
|---|
| 217 |  | 
|---|
| 218 | itooa(n,s) | 
|---|
| 219 | int n; | 
|---|
| 220 | char *s; | 
|---|
| 221 | {       return _itoda(n,s,8); | 
|---|
| 222 | } | 
|---|
| 223 |  | 
|---|
| 224 | itoxa(n,s) | 
|---|
| 225 | int n; | 
|---|
| 226 | char *s; | 
|---|
| 227 | {       return _itoda(n,s,16); | 
|---|
| 228 | } | 
|---|
| 229 |  | 
|---|
| 230 | _itoac(n); | 
|---|
| 231 | int n; | 
|---|
| 232 | {       return (n + ((n < 10) ? '0' : ('A'-10))); | 
|---|
| 233 | } | 
|---|
| 234 |  | 
|---|
| 235 | _itoda(n,s,r) | 
|---|
| 236 | unsigned n; | 
|---|
| 237 | int r; | 
|---|
| 238 | char *s; | 
|---|
| 239 | {int i; | 
|---|
| 240 |  char t[8],*u; | 
|---|
| 241 |         u = t; | 
|---|
| 242 |         *u++ = '\0'; | 
|---|
| 243 |         do *u++ = _itoac(n % r); while(n /= r); | 
|---|
| 244 |         for (i=0; *s++ = *--u; ++i); | 
|---|
| 245 |         return i; | 
|---|
| 246 | } | 
|---|
| 247 |  | 
|---|
| 248 | isdigit(c) | 
|---|
| 249 | char c; | 
|---|
| 250 | {       return ('0' <= c && c <= '9'); | 
|---|
| 251 | } | 
|---|
| 252 |  | 
|---|
| 253 | isspace(c) | 
|---|
| 254 | char c; | 
|---|
| 255 | {       return (c == ' ' || c == '\t' || c == '\n'); | 
|---|
| 256 | } | 
|---|
| 257 |  | 
|---|
| 258 | isalpha(c) | 
|---|
| 259 | char c; | 
|---|
| 260 | {       return (isupper(c) || islower(c) || c == '_'); | 
|---|
| 261 | } | 
|---|
| 262 |  | 
|---|
| 263 | isupper(c) | 
|---|
| 264 | char c; | 
|---|
| 265 | {       return ('A' <= c && c <= 'Z'); | 
|---|
| 266 | } | 
|---|
| 267 |  | 
|---|
| 268 | islower(c) | 
|---|
| 269 | char c; | 
|---|
| 270 | {       return ('a' <= c && c <= 'z'); | 
|---|
| 271 | } | 
|---|
| 272 |  | 
|---|
| 273 | toupper(c) | 
|---|
| 274 | char c; | 
|---|
| 275 | {       return (islower(c) ? c + ('A'-'a') : c); | 
|---|
| 276 | } | 
|---|
| 277 |  | 
|---|
| 278 | tolower(c) | 
|---|
| 279 | char c; | 
|---|
| 280 | {       return (isupper(c) ? c + ('a'-'A') : c); | 
|---|
| 281 | } | 
|---|
| 282 |  | 
|---|
| 283 | atoi(s) | 
|---|
| 284 | char *s; | 
|---|
| 285 | {int i,m; | 
|---|
| 286 |         while (isspace(*s)) ++s; | 
|---|
| 287 |         if (m = (*s == '-')) ++s; | 
|---|
| 288 |         for (i = 0; isdigit(*s);) i = i * 10 + *s++ - '0'; | 
|---|
| 289 |         return (m ? -i : i); | 
|---|
| 290 | } | 
|---|
| 291 | strlen(s) | 
|---|
| 292 | char *s; | 
|---|
| 293 | {int i; | 
|---|
| 294 |         for (i = 0; *s++; ++i); | 
|---|
| 295 |         return i; | 
|---|
| 296 | } | 
|---|