|
|
1.1 ! root 1: #include <stdio.h> ! 2: ! 3: #define NL 0 ! 4: #define SP 1 ! 5: #define ORD 2 ! 6: #define JUNK 3 ! 7: #define TOKEN 4 ! 8: ! 9: char type[]={ ! 10: /* 000 nul|001 soh|002 stx|003 etx|004 eot|005 enq|006 ack|007 bel| */ ! 11: JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, ! 12: /* 010 bs |011 ht |012 nl |013 vt |014 np |015 cr |016 so |017 si | */ ! 13: JUNK, SP, NL, JUNK, JUNK, JUNK, JUNK, JUNK, ! 14: /* 020 dle|021 dc1|022 dc2|023 dc3|024 dc4|025 nak|026 syn|027 etb| */ ! 15: JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, ! 16: /* 030 can|031 em |032 sub|033 esc|034 fs |035 gs |036 rs |037 us | */ ! 17: JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, ! 18: /* 040 sp |041 ! |042 " |043 # |044 $ |045 % |046 & |047 ' | */ ! 19: SP, ORD, ORD, ORD, ORD, ORD, ORD, ORD, ! 20: /* 050 ( |051 ) |052 * |053 + |054 , |055 - |056 . |057 / | */ ! 21: ORD, ORD, ORD, ORD, ORD, ORD, ORD, ORD, ! 22: /* 060 0 |061 1 |062 2 |063 3 |064 4 |065 5 |066 6 |067 7 | */ ! 23: ORD, ORD, ORD, ORD, ORD, ORD, ORD, ORD, ! 24: /* 070 8 |071 9 |072 : |073 ; |074 < |075 = |076 > |077 ? | */ ! 25: ORD, ORD, ORD, ORD, ORD, ORD, ORD, ORD, ! 26: /* 100 @ |101 A |102 B |103 C |104 D |105 E |106 F |107 G | */ ! 27: ORD, ORD, ORD, ORD, ORD, ORD, ORD, ORD, ! 28: /* 110 H |111 I |112 J |113 K |114 L |115 M |116 N |117 O | */ ! 29: ORD, ORD, ORD, ORD, ORD, ORD, ORD, ORD, ! 30: /* 120 P |121 Q |122 R |123 S |124 T |125 U |126 V |127 W | */ ! 31: ORD, ORD, ORD, ORD, ORD, ORD, ORD, ORD, ! 32: /* 130 X |131 Y |132 Z |133 [ |134 \ |135 ] |136 ^ |137 _ | */ ! 33: ORD, ORD, ORD, ORD, ORD, ORD, ORD, ORD, ! 34: /* 140 ` |141 a |142 b |143 c |144 d |145 e |146 f |147 g | */ ! 35: ORD, ORD, ORD, ORD, ORD, ORD, ORD, ORD, ! 36: /* 150 h |151 i |152 j |153 k |154 l |155 m |156 n |157 o | */ ! 37: ORD, ORD, ORD, ORD, ORD, ORD, ORD, ORD, ! 38: /* 160 p |161 q |162 r |163 s |164 t |165 u |166 v |167 w | */ ! 39: ORD, ORD, ORD, ORD, ORD, ORD, ORD, ORD, ! 40: /* 170 x |171 y |172 z |173 { |174 | |175 } |176 ~ |177 del| */ ! 41: ORD, ORD, ORD, ORD, ORD, ORD, ORD, JUNK, ! 42: JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, ! 43: JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, ! 44: JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, ! 45: JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, ! 46: JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, ! 47: JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, ! 48: JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, ! 49: JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, ! 50: JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, ! 51: JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, ! 52: JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, ! 53: JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, ! 54: JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, ! 55: JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, ! 56: JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, ! 57: JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, ! 58: }; ! 59: char *opt="lwc"; ! 60: long twords; ! 61: long tlines; ! 62: long tchars; ! 63: main(argc, argv) ! 64: char *argv[]; ! 65: { ! 66: register i, fd, status=0; ! 67: if(argc>1 && argv[1][0]=='-'){ ! 68: opt= ++argv[1]; ! 69: --argc, argv++; ! 70: } ! 71: if(argc==1) ! 72: count(0, (char *)0); ! 73: else for(i=1; i<argc; i++){ ! 74: fd=open(argv[i], 0); ! 75: if(fd<0){ ! 76: fprintf(stderr, "wc: "); ! 77: perror(argv[i]); ! 78: status=1; ! 79: continue; ! 80: } ! 81: count(fd, argv[i]); ! 82: } ! 83: if(argc>2) ! 84: print(tchars, twords, tlines, "total"); ! 85: return status; ! 86: } ! 87: unsigned char buf[BUFSIZ]; ! 88: count(fd, name) ! 89: char *name; ! 90: { ! 91: register token=0, n; ! 92: register unsigned char *cp; ! 93: register long chars=0, lines=0, words=0; ! 94: while((n=read(fd, buf, sizeof buf))>0){ ! 95: chars+=n; ! 96: cp=buf; ! 97: while(--n>=0) ! 98: switch(type[*cp++]|token){ ! 99: case NL: ! 100: lines++; ! 101: break; ! 102: case NL|TOKEN: ! 103: lines++; ! 104: token=0; ! 105: break; ! 106: case SP: ! 107: break; ! 108: case SP|TOKEN: ! 109: token=0; ! 110: break; ! 111: case ORD: ! 112: token=TOKEN; ! 113: words++; ! 114: break; ! 115: case ORD|TOKEN: ! 116: break; ! 117: case JUNK: ! 118: case JUNK|TOKEN: ! 119: break; ! 120: } ! 121: } ! 122: close(fd); ! 123: print(chars, words, lines, name); ! 124: tchars+=chars; ! 125: twords+=words; ! 126: tlines+=lines; ! 127: } ! 128: print(charct, wordct, linect, name) ! 129: long charct, wordct, linect; ! 130: char *name; ! 131: { ! 132: register char *wd=opt; ! 133: while (*wd) switch (*wd++) { ! 134: case 'l': ! 135: printf("%7ld ", linect); ! 136: break; ! 137: ! 138: case 'w': ! 139: printf("%7ld ", wordct); ! 140: break; ! 141: ! 142: case 'c': ! 143: printf("%7ld", charct); ! 144: break; ! 145: } ! 146: if(name) ! 147: printf(" %s\n", name); ! 148: else ! 149: printf("\n"); ! 150: } ! 151:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.