|
|
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.