1: static char *sccsid = "@(#)tr.c	4.2 (Berkeley) 4/22/85";
   2: #include <stdio.h>
   3: 
   4: /* tr - transliterate data stream */
   5: int dflag   = 0;
   6: int sflag   = 0;
   7: int cflag = 0;
   8: int save    = 0;
   9: char    code[256];
  10: char    squeez[256];
  11: char    vect[256];
  12: struct string { int last, max; char *p; } string1, string2;
  13: 
  14: main(argc,argv)
  15: char **argv;
  16: {
  17:     register i;
  18:     int j;
  19:     register c, d;
  20:     char *compl;
  21:     int lastd;
  22: 
  23:     string1.last = string2.last = 0;
  24:     string1.max = string2.max = 0;
  25:     string1.p = string2.p = "";
  26: 
  27:     if(--argc>0) {
  28:         argv++;
  29:         if(*argv[0]=='-'&&argv[0][1]!=0) {
  30:             while(*++argv[0])
  31:                 switch(*argv[0]) {
  32:                 case 'c':
  33:                     cflag++;
  34:                     continue;
  35:                 case 'd':
  36:                     dflag++;
  37:                     continue;
  38:                 case 's':
  39:                     sflag++;
  40:                     continue;
  41:                 }
  42:             argc--;
  43:             argv++;
  44:         }
  45:     }
  46:     if(argc>0) string1.p = argv[0];
  47:     if(argc>1) string2.p = argv[1];
  48:     for(i=0; i<256; i++)
  49:         code[i] = vect[i] = 0;
  50:     if(cflag) {
  51:         while(c = next(&string1))
  52:             vect[c&0377] = 1;
  53:         j = 0;
  54:         for(i=1; i<256; i++)
  55:             if(vect[i]==0) vect[j++] = i;
  56:         vect[j] = 0;
  57:         compl = vect;
  58:     }
  59:     for(i=0; i<256; i++)
  60:         squeez[i] = 0;
  61:     lastd = 0;
  62:     for(;;){
  63:         if(cflag) c = *compl++;
  64:         else c = next(&string1);
  65:         if(c==0) break;
  66:         d = next(&string2);
  67:         if(d==0) d = lastd;
  68:         else lastd = d;
  69:         squeez[d&0377] = 1;
  70:         code[c&0377] = dflag?1:d;
  71:     }
  72:     while(d = next(&string2))
  73:         squeez[d&0377] = 1;
  74:     squeez[0] = 1;
  75:     for(i=0;i<256;i++) {
  76:         if(code[i]==0) code[i] = i;
  77:         else if(dflag) code[i] = 0;
  78:     }
  79: 
  80:     clearerr(stdout);
  81:     while((c=getc(stdin)) != EOF ) {
  82:         if(c == 0) continue;
  83:         if(c = code[c&0377]&0377)
  84:             if(!sflag || c!=save || !squeez[c&0377]) {
  85:                 putchar(save = c);
  86:                 if(ferror(stdout))
  87:                     exit(1);
  88:             }
  89:     }
  90:     exit(0);
  91: }
  92: 
  93: next(s)
  94: struct string *s;
  95: {
  96: 
  97: again:
  98:     if(s->max) {
  99:         if(s->last++ < s->max)
 100:             return(s->last);
 101:         s->max = s->last = 0;
 102:     }
 103:     if(s->last && *s->p=='-') {
 104:         nextc(s);
 105:         s->max = nextc(s);
 106:         if(s->max==0) {
 107:             s->p--;
 108:             return('-');
 109:         }
 110:         if(s->max < s->last)  {
 111:             s->last = s->max-1;
 112:             return('-');
 113:         }
 114:         goto again;
 115:     }
 116:     return(s->last = nextc(s));
 117: }
 118: 
 119: nextc(s)
 120: struct string *s;
 121: {
 122:     register c, i, n;
 123: 
 124:     c = *s->p++;
 125:     if(c=='\\') {
 126:         i = n = 0;
 127:         while(i<3 && (c = *s->p)>='0' && c<='7') {
 128:             n = n*8 + c - '0';
 129:             i++;
 130:             s->p++;
 131:         }
 132:         if(i>0) c = n;
 133:         else c = *s->p++;
 134:     }
 135:     if(c==0) *--s->p = 0;
 136:     return(c&0377);
 137: }

Defined functions

main defined in line 14; never used
next defined in line 93; used 4 times
nextc defined in line 119; used 3 times

Defined variables

cflag defined in line 7; used 3 times
code defined in line 9; used 6 times
dflag defined in line 5; used 3 times
save defined in line 8; used 2 times
sccsid defined in line 1; never used
sflag defined in line 6; used 2 times
squeez defined in line 10; used 5 times
string1 defined in line 12; used 6 times
string2 defined in line 12; used 6 times
vect defined in line 11; used 6 times

Defined struct's

string defined in line 12; used 4 times
Last modified: 1987-02-17
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 2308
Valid CSS Valid XHTML 1.0 Strict