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

##### Functions

    equal             X
    gline             X
    main              X
    pline             X
    printe            X
    skip              X

##### Variables

    fields            X
    letters           X
    linec             X
    mode              X
    uniq              X

       1: static char *sccsid = "@(#)uniq.c	4.1 (Berkeley) 10/1/80";
       2: /*
       3:  * Deal with duplicated lines in a file
       4:  */
       5: #include <stdio.h>
       6: #include <ctype.h>
       7: int fields;
       8: int letters;
       9: int linec;
      10: char    mode;
      11: int uniq;
      12: char    *skip();
      13:
      14: main(argc, argv)
      15: int argc;
      16: char *argv[];
      17: {
      18:     static char b1[1000], b2[1000];
      19:
      20:     while(argc > 1) {
      21:         if(*argv[1] == '-') {
      22:             if (isdigit(argv[1][1]))
      23:                 fields = atoi(&argv[1][1]);
      24:             else mode = argv[1][1];
      25:             argc--;
      26:             argv++;
      27:             continue;
      28:         }
      29:         if(*argv[1] == '+') {
      30:             letters = atoi(&argv[1][1]);
      31:             argc--;
      32:             argv++;
      33:             continue;
      34:         }
      35:         if (freopen(argv[1], "r", stdin) == NULL)
      36:             printe("cannot open %s\n", argv[1]);
      37:         break;
      38:     }
      39:     if(argc > 2 && freopen(argv[2], "w", stdout) == NULL)
      40:         printe("cannot create %s\n", argv[2]);
      41:
      42:     if(gline(b1))
      43:         exit(0);
      44:     for(;;) {
      45:         linec++;
      46:         if(gline(b2)) {
      47:             pline(b1);
      48:             exit(0);
      49:         }
      50:         if(!equal(b1, b2)) {
      51:             pline(b1);
      52:             linec = 0;
      53:             do {
      54:                 linec++;
      55:                 if(gline(b1)) {
      56:                     pline(b2);
      57:                     exit(0);
      58:                 }
      59:             } while(equal(b1, b2));
      60:             pline(b2);
      61:             linec = 0;
      62:         }
      63:     }
      64: }
      65:
      66: gline(buf)
      67: register char buf[];
      68: {
      69:     register c;
      70:
      71:     while((c = getchar()) != '\n') {
      72:         if(c == EOF)
      73:             return(1);
      74:         *buf++ = c;
      75:     }
      76:     *buf = 0;
      77:     return(0);
      78: }
      79:
      80: pline(buf)
      81: register char buf[];
      82: {
      83:
      84:     switch(mode) {
      85:
      86:     case 'u':
      87:         if(uniq) {
      88:             uniq = 0;
      89:             return;
      90:         }
      91:         break;
      92:
      93:     case 'd':
      94:         if(uniq) break;
      95:         return;
      96:
      97:     case 'c':
      98:         printf("%4d ", linec);
      99:     }
     100:     uniq = 0;
     101:     fputs(buf, stdout);
     102:     putchar('\n');
     103: }
     104:
     105: equal(b1, b2)
     106: register char b1[], b2[];
     107: {
     108:     register char c;
     109:
     110:     b1 = skip(b1);
     111:     b2 = skip(b2);
     112:     while((c = *b1++) != 0)
     113:         if(c != *b2++) return(0);
     114:     if(*b2 != 0)
     115:         return(0);
     116:     uniq++;
     117:     return(1);
     118: }
     119:
     120: char *
     121: skip(s)
     122: register char *s;
     123: {
     124:     register nf, nl;
     125:
     126:     nf = nl = 0;
     127:     while(nf++ < fields) {
     128:         while(*s == ' ' || *s == '\t')
     129:             s++;
     130:         while( !(*s == ' ' || *s == '\t' || *s == 0) )
     131:             s++;
     132:     }
     133:     while(nl++ < letters && *s != 0)
     134:             s++;
     135:     return(s);
     136: }
     137:
     138: printe(p,s)
     139: char *p,*s;
     140: {
     141:     fprintf(stderr, p, s);
     142:     exit(1);
     143: }

#### Defined functions

equal defined in line 105; used 2 times

- in line 50, 59

gline defined in line 66; used 3 times

- in line 42-46(2), 55

main defined in line 14; never used
pline defined in line 80; used 4 times

- in line 47-60(4)

printe defined in line 138; used 2 times

- in line 36-40(2)

skip defined in line 120; used 3 times

- in line 12, 110-111(2)

#### Defined variables

fields defined in line 7; used 2 times

- in line 23, 127

letters defined in line 8; used 2 times

- in line 30, 133

linec defined in line 9; used 5 times

- in line 45, 52-54(2), 61, 98

mode defined in line 10; used 2 times

- in line 24, 84

sccsid defined in line 1; never used
uniq defined in line 11; used 5 times

- in line 87-88(2), 94, 100, 116

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