# 2.11BSD#431 - /usr/src/usr.bin/tr.c

##### Functions

    main              X
    next              X
    nextc             X

##### Variables

    cflag             X
    code              X
    dflag             X
    save              X
    sflag             X
    squeez            X
    string1           X
    string2           X
    vect              X

##### struct's

    string            X

       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

- in line 51, 64-66(2), 72

nextc defined in line 119; used 3 times

- in line 104-105(2), 116

#### Defined variables

cflag defined in line 7; used 3 times

- in line 33, 50, 63

code defined in line 9; used 6 times

- in line 49, 70, 76-77(3), 83

dflag defined in line 5; used 3 times

- in line 36, 70, 77

save defined in line 8; used 2 times

- in line 84-85(2)

sccsid defined in line 1; never used
sflag defined in line 6; used 2 times

- in line 39, 84

squeez defined in line 10; used 5 times

- in line 60, 69-74(3), 84

string1 defined in line 12; used 6 times

- in line 23-25(3), 46-51(2), 64

string2 defined in line 12; used 6 times

- in line 23-25(3), 47, 66, 72

vect defined in line 11; used 6 times

- in line 49-57(6)

#### Defined struct's

string defined in line 12; used 4 times

- in line 94(2), 120(2)

Last modified: 1987-02-17 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 1145 |