1: #define LCASE   01
   2: #define UCASE   02
   3: #define SWAB    04
   4: #define NERR    010
   5: #define SYNC    020
   6: int cflag;
   7: int fflag;
   8: int skip;
   9: int count;
  10: char    *string;
  11: char    *ifile;
  12: char    *ofile;
  13: char    *ibuf;
  14: char    *obuf;
  15: char    *ibs    512;
  16: char    *obs    512;
  17: char    *bs;
  18: char    *cbs;
  19: char    *ibc;
  20: char    *obc;
  21: char    *cbc;
  22: int nifr;
  23: int nipr;
  24: int nofr;
  25: int nopr;
  26: int ntrunc;
  27: int ibf;
  28: int obf;
  29: char    *op;
  30: int nspace;
  31: char    etoa[]
  32: {
  33:     0000,0001,0002,0003,0234,0011,0206,0177,
  34:     0227,0215,0216,0013,0014,0015,0016,0017,
  35:     0020,0021,0022,0023,0235,0205,0010,0207,
  36:     0030,0031,0222,0217,0034,0035,0036,0037,
  37:     0200,0201,0202,0203,0204,0012,0027,0033,
  38:     0210,0211,0212,0213,0214,0005,0006,0007,
  39:     0220,0221,0026,0223,0224,0225,0226,0004,
  40:     0230,0231,0232,0233,0024,0025,0236,0032,
  41:     0040,0240,0241,0242,0243,0244,0245,0246,
  42:     0247,0250,0133,0056,0074,0050,0053,0041,
  43:     0046,0251,0252,0253,0254,0255,0256,0257,
  44:     0260,0261,0135,0044,0052,0051,0073,0136,
  45:     0055,0057,0262,0263,0264,0265,0266,0267,
  46:     0270,0271,0174,0054,0045,0137,0076,0077,
  47:     0272,0273,0274,0275,0276,0277,0300,0301,
  48:     0302,0140,0072,0043,0100,0047,0075,0042,
  49:     0303,0141,0142,0143,0144,0145,0146,0147,
  50:     0150,0151,0304,0305,0306,0307,0310,0311,
  51:     0312,0152,0153,0154,0155,0156,0157,0160,
  52:     0161,0162,0313,0314,0315,0316,0317,0320,
  53:     0321,0176,0163,0164,0165,0166,0167,0170,
  54:     0171,0172,0322,0323,0324,0325,0326,0327,
  55:     0330,0331,0332,0333,0334,0335,0336,0337,
  56:     0340,0341,0342,0343,0344,0345,0346,0347,
  57:     0173,0101,0102,0103,0104,0105,0106,0107,
  58:     0110,0111,0350,0351,0352,0353,0354,0355,
  59:     0175,0112,0113,0114,0115,0116,0117,0120,
  60:     0121,0122,0356,0357,0360,0361,0362,0363,
  61:     0134,0237,0123,0124,0125,0126,0127,0130,
  62:     0131,0132,0364,0365,0366,0367,0370,0371,
  63:     0060,0061,0062,0063,0064,0065,0066,0067,
  64:     0070,0071,0372,0373,0374,0375,0376,0377,
  65: };
  66: char    atoe[]
  67: {
  68:     0000,0001,0002,0003,0067,0055,0056,0057,
  69:     0026,0005,0045,0013,0014,0015,0016,0017,
  70:     0020,0021,0022,0023,0074,0075,0062,0046,
  71:     0030,0031,0077,0047,0034,0035,0036,0037,
  72:     0100,0117,0177,0173,0133,0154,0120,0175,
  73:     0115,0135,0134,0116,0153,0140,0113,0141,
  74:     0360,0361,0362,0363,0364,0365,0366,0367,
  75:     0370,0371,0172,0136,0114,0176,0156,0157,
  76:     0174,0301,0302,0303,0304,0305,0306,0307,
  77:     0310,0311,0321,0322,0323,0324,0325,0326,
  78:     0327,0330,0331,0342,0343,0344,0345,0346,
  79:     0347,0350,0351,0112,0340,0132,0137,0155,
  80:     0171,0201,0202,0203,0204,0205,0206,0207,
  81:     0210,0211,0221,0222,0223,0224,0225,0226,
  82:     0227,0230,0231,0242,0243,0244,0245,0246,
  83:     0247,0250,0251,0300,0152,0320,0241,0007,
  84:     0040,0041,0042,0043,0044,0025,0006,0027,
  85:     0050,0051,0052,0053,0054,0011,0012,0033,
  86:     0060,0061,0032,0063,0064,0065,0066,0010,
  87:     0070,0071,0072,0073,0004,0024,0076,0341,
  88:     0101,0102,0103,0104,0105,0106,0107,0110,
  89:     0111,0121,0122,0123,0124,0125,0126,0127,
  90:     0130,0131,0142,0143,0144,0145,0146,0147,
  91:     0150,0151,0160,0161,0162,0163,0164,0165,
  92:     0166,0167,0170,0200,0212,0213,0214,0215,
  93:     0216,0217,0220,0232,0233,0234,0235,0236,
  94:     0237,0240,0252,0253,0254,0255,0256,0257,
  95:     0260,0261,0262,0263,0264,0265,0266,0267,
  96:     0270,0271,0272,0273,0274,0275,0276,0277,
  97:     0312,0313,0314,0315,0316,0317,0332,0333,
  98:     0334,0335,0336,0337,0352,0353,0354,0355,
  99:     0356,0357,0372,0373,0374,0375,0376,0377,
 100: };
 101: 
 102: 
 103: main(argc, argv)
 104: int argc;
 105: char    **argv;
 106: {
 107:     register (*conv)();
 108:     register char *ip;
 109:     register c;
 110:     int ebcdic(), ascii(), null(), cnull(), term();
 111:     int a;
 112: 
 113:     conv = null;
 114:     for(c=1; c<argc; c++) {
 115:         string = argv[c];
 116:         if(match("ibs=")) {
 117:             ibs = number();
 118:             continue;
 119:         }
 120:         if(match("obs=")) {
 121:             obs = number();
 122:             continue;
 123:         }
 124:         if(match("cbs=")) {
 125:             cbs = number();
 126:             continue;
 127:         }
 128:         if (match("bs=")) {
 129:             bs = number();
 130:             continue;
 131:         }
 132:         if(match("if=")) {
 133:             ifile = string;
 134:             continue;
 135:         }
 136:         if(match("of=")) {
 137:             ofile = string;
 138:             continue;
 139:         }
 140:         if(match("skip=")) {
 141:             skip = number();
 142:             continue;
 143:         }
 144:         if(match("count=")) {
 145:             count = number();
 146:             continue;
 147:         }
 148:         if(match("conv=")) {
 149:         cloop:
 150:             if(match(","))
 151:                 goto cloop;
 152:             if(*string == '\0')
 153:                 continue;
 154:             if(match("ebcdic")) {
 155:                 conv = ebcdic;
 156:                 goto cloop;
 157:             }
 158:             if(match("ascii")) {
 159:                 conv = ascii;
 160:                 goto cloop;
 161:             }
 162:             if(match("lcase")) {
 163:                 cflag =| LCASE;
 164:                 goto cloop;
 165:             }
 166:             if(match("ucase")) {
 167:                 cflag =| UCASE;
 168:                 goto cloop;
 169:             }
 170:             if(match("swab")) {
 171:                 cflag =| SWAB;
 172:                 goto cloop;
 173:             }
 174:             if(match("noerror")) {
 175:                 cflag =| NERR;
 176:                 goto cloop;
 177:             }
 178:             if(match("sync")) {
 179:                 cflag =| SYNC;
 180:                 goto cloop;
 181:             }
 182:         }
 183:         printf("bad arg: %s\n", string);
 184:         exit();
 185:     }
 186:     if(conv == null && cflag&(LCASE|UCASE))
 187:         conv = cnull;
 188:     if (ifile)
 189:         ibf = open(ifile, 0);
 190:     else
 191:         ibf = dup(0);
 192:     if(ibf < 0) {
 193:         printf("cannot open: %s\n", ifile);
 194:         exit();
 195:     }
 196:     if (ofile)
 197:         obf = creat(ofile, 0666);
 198:     else
 199:         obf = dup(1);
 200:     if(obf < 0) {
 201:         printf("cannot create: %s\n", ofile);
 202:         exit();
 203:     }
 204:     if (bs) {
 205:         ibs = obs = bs;
 206:         if (conv == null)
 207:             fflag++;
 208:     }
 209:     if(ibs == 0 || obs == 0) {
 210:         printf("counts: cannot be zero\n");
 211:         exit();
 212:     }
 213:     ibuf = sbrk(ibs);
 214:     if (fflag)
 215:         obuf = ibuf;
 216:     else
 217:         obuf = sbrk(obs);
 218:     if(ibuf == -1 || obuf == -1) {
 219:         printf("not enough memory\n");
 220:         exit();
 221:     }
 222:     ibc = 0;
 223:     obc = 0;
 224:     cbc = 0;
 225:     op = obuf;
 226: 
 227:     if ((signal(2, 1) & 01) == 0)
 228:         signal(2, term);
 229:     while(skip) {
 230:         read(ibf, ibuf, ibs);
 231:         skip--;
 232:     }
 233: 
 234: loop:
 235:     if(ibc-- == 0) {
 236:         ibc = 0;
 237:         if(count==0 || nifr+nipr!=count) {
 238:             if(cflag&(NERR|SYNC))
 239:             for(ip=ibuf+ibs; ip>ibuf;)
 240:                 *--ip = 0;
 241:             ibc = read(ibf, ibuf, ibs);
 242:         }
 243:         if(ibc == -1) {
 244:             perror("read");
 245:             if((cflag&NERR) == 0) {
 246:                 flsh();
 247:                 term();
 248:             }
 249:             ibc = 0;
 250:             for(c=0; c<ibs; c++)
 251:                 if(ibuf[c] != 0)
 252:                     ibc = c;
 253:             stats();
 254:         }
 255:         if(ibc == 0) {
 256:             flsh();
 257:             term();
 258:         }
 259:         if(ibc != ibs) {
 260:             nipr++;
 261:             if(cflag&SYNC)
 262:                 ibc = ibs;
 263:         } else
 264:             nifr++;
 265:         ip = ibuf;
 266:         c = (ibc>>1) & ~1;
 267:         if(cflag&SWAB && c)
 268:         do {
 269:             a = *ip++;
 270:             ip[-1] = *ip;
 271:             *ip++ = a;
 272:         } while(--c);
 273:         ip = ibuf;
 274:         if (fflag) {
 275:             obc = ibc;
 276:             flsh();
 277:             ibc = 0;
 278:         }
 279:         goto loop;
 280:     }
 281:     c = 0;
 282:     c =| *ip++;
 283:     (*conv)(c);
 284:     goto loop;
 285: }
 286: 
 287: flsh()
 288: {
 289:     register c;
 290: 
 291:     if(obc) {
 292:         if(obc == obs)
 293:             nofr++; else
 294:             nopr++;
 295:         c = write(obf, obuf, obc);
 296:         if(c != obc) {
 297:             perror("write");
 298:             term();
 299:         }
 300:         obc = 0;
 301:     }
 302: }
 303: 
 304: match(s)
 305: char *s;
 306: {
 307:     register char *cs;
 308: 
 309:     cs = string;
 310:     while(*cs++ == *s)
 311:         if(*s++ == '\0')
 312:             goto true;
 313:     if(*s != '\0')
 314:         return(0);
 315: 
 316: true:
 317:     cs--;
 318:     string = cs;
 319:     return(1);
 320: }
 321: 
 322: number()
 323: {
 324:     register char *cs;
 325:     register n;
 326: 
 327:     cs = string;
 328:     n = 0;
 329:     while(*cs >= '0' && *cs <= '9')
 330:         n = n*10 + *cs++ - '0';
 331:     for(;;)
 332:     switch(*cs++) {
 333: 
 334:     case 'k':
 335:         n =* 1024;
 336:         continue;
 337: 
 338:     case 'w':
 339:         n =* 2;
 340:         continue;
 341: 
 342:     case 'b':
 343:         n =* 512;
 344:         continue;
 345: 
 346:     case '*':
 347:     case 'x':
 348:         string = cs;
 349:         n =* number();
 350: 
 351:     case '\0':
 352:         return(n);
 353:     }
 354:     printf("not a number: %s\n", string);
 355:     exit();
 356: }
 357: 
 358: cnull(cc)
 359: {
 360:     register c;
 361: 
 362:     c = cc;
 363:     if(cflag&UCASE && c>='a' && c<='z')
 364:         c =+ 'A'-'a';
 365:     if(cflag&LCASE && c>='A' && c<='Z')
 366:         c =+ 'a'-'A';
 367:     null(c);
 368: }
 369: 
 370: null(c)
 371: {
 372: 
 373:     *op = c;
 374:     op++;
 375:     if(++obc >= obs) {
 376:         flsh();
 377:         op = obuf;
 378:     }
 379: }
 380: 
 381: ascii(cc)
 382: {
 383:     register c;
 384: 
 385:     c = 0;
 386:     c =| etoa[cc];
 387:     if(cbs == 0) {
 388:         cnull(c);
 389:         return;
 390:     }
 391:     if(c == ' ') {
 392:         nspace++;
 393:         goto out;
 394:     }
 395:     while(nspace > 0) {
 396:         null(' ');
 397:         nspace--;
 398:     }
 399:     cnull(c);
 400: 
 401: out:
 402:     if(++cbc >= cbs) {
 403:         null('\n');
 404:         cbc = 0;
 405:         nspace = 0;
 406:     }
 407: }
 408: 
 409: ebcdic(cc)
 410: {
 411:     register c;
 412: 
 413:     c = cc;
 414:     if(cflag&UCASE && c>='a' && c<='z')
 415:         c =+ 'A'-'a';
 416:     if(cflag&LCASE && c>='A' && c<='Z')
 417:         c =+ 'a'-'A';
 418:     c = atoe[c] & 0377;
 419:     if(cbs == 0) {
 420:         null(c);
 421:         return;
 422:     }
 423:     if(cc == '\n') {
 424:         while(cbc < cbs) {
 425:             null(atoe[' ']);
 426:             cbc++;
 427:         }
 428:         cbc = 0;
 429:         return;
 430:     }
 431:     if(cbc == cbs)
 432:         ntrunc++;
 433:     cbc++;
 434:     if(cbc <= cbs)
 435:         null(c);
 436: }
 437: 
 438: term()
 439: {
 440: 
 441:     stats();
 442:     exit();
 443: }
 444: 
 445: stats()
 446: {
 447: 
 448:     printf("%l+%l records in\n", nifr, nipr);
 449:     printf("%l+%l records out\n", nofr, nopr);
 450:     if(ntrunc)
 451:         printf("%l truncated records\n", ntrunc);
 452: }
 453: 
 454: putchar(c)
 455: {
 456: 
 457:     write(2, &c, 1);
 458: }

Defined functions

ascii defined in line 381; used 2 times
cnull defined in line 358; used 4 times
ebcdic defined in line 409; used 2 times
flsh defined in line 287; used 4 times
main defined in line 103; never used
match defined in line 304; used 17 times
null defined in line 370; used 10 times
number defined in line 322; used 7 times
putchar defined in line 454; never used
stats defined in line 445; used 2 times
term defined in line 438; used 5 times

Defined variables

atoe defined in line 66; used 2 times
bs defined in line 17; used 3 times
cbc defined in line 21; used 9 times
cbs defined in line 18; used 7 times
cflag defined in line 6; used 14 times
count defined in line 9; used 3 times
etoa defined in line 31; used 1 times
fflag defined in line 7; used 3 times
ibc defined in line 19; used 13 times
ibf defined in line 27; used 5 times
ibs defined in line 15; used 10 times
ibuf defined in line 13; used 10 times
ifile defined in line 11; used 4 times
nifr defined in line 22; used 3 times
nipr defined in line 23; used 3 times
nofr defined in line 24; used 2 times
nopr defined in line 25; used 2 times
nspace defined in line 30; used 4 times
ntrunc defined in line 26; used 3 times
obc defined in line 20; used 8 times
obf defined in line 28; used 4 times
obs defined in line 16; used 6 times
obuf defined in line 14; used 6 times
ofile defined in line 12; used 4 times
op defined in line 29; used 4 times
skip defined in line 8; used 3 times
string defined in line 10; used 10 times

Defined macros

LCASE defined in line 1; used 4 times
NERR defined in line 4; used 3 times
SWAB defined in line 3; used 2 times
SYNC defined in line 5; used 3 times
UCASE defined in line 2; used 4 times
Last modified: 1975-05-14
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 2072
Valid CSS Valid XHTML 1.0 Strict