13e12c5d1SDavid du Colombier /* 23e12c5d1SDavid du Colombier * wc -- count things in utf-encoded text files 33e12c5d1SDavid du Colombier * Bugs: 43e12c5d1SDavid du Colombier * The only white space characters recognized are ' ', '\t' and '\n', even though 5bd389b36SDavid du Colombier * ISO 10646 has many more blanks scattered through it. 6bd389b36SDavid du Colombier * Should count characters that cannot occur in any rune (hex f0-ff) separately. 7bd389b36SDavid du Colombier * Should count non-canonical runes (e.g. hex c1,80 instead of hex 40). 83e12c5d1SDavid du Colombier */ 93e12c5d1SDavid du Colombier #include <u.h> 103e12c5d1SDavid du Colombier #include <libc.h> 113e12c5d1SDavid du Colombier #define NBUF (8*1024) 12*80ee5cbfSDavid du Colombier uvlong nline, tnline, pline; 13*80ee5cbfSDavid du Colombier uvlong nword, tnword, pword; 14*80ee5cbfSDavid du Colombier uvlong nrune, tnrune, prune; 15*80ee5cbfSDavid du Colombier uvlong nbadr, tnbadr, pbadr; 16*80ee5cbfSDavid du Colombier uvlong nchar, tnchar, pchar; 173e12c5d1SDavid du Colombier void count(int, char *); 18*80ee5cbfSDavid du Colombier void report(uvlong, uvlong, uvlong, uvlong, uvlong, char *); 193e12c5d1SDavid du Colombier void 203e12c5d1SDavid du Colombier main(int argc, char *argv[]) 213e12c5d1SDavid du Colombier { 223e12c5d1SDavid du Colombier char *status=""; 233e12c5d1SDavid du Colombier int i, f; 243e12c5d1SDavid du Colombier ARGBEGIN { 25bd389b36SDavid du Colombier case 'l': pline++; break; 26bd389b36SDavid du Colombier case 'w': pword++; break; 27bd389b36SDavid du Colombier case 'r': prune++; break; 28bd389b36SDavid du Colombier case 'b': pbadr++; break; 29bd389b36SDavid du Colombier case 'c': pchar++; break; 303e12c5d1SDavid du Colombier default: 313e12c5d1SDavid du Colombier fprint(2, "Usage: %s [-lwrbc] [file ...]\n", argv0); 323e12c5d1SDavid du Colombier exits("usage"); 333e12c5d1SDavid du Colombier } ARGEND 34*80ee5cbfSDavid du Colombier if(pline+pword+prune+pbadr+pchar == 0) { 35*80ee5cbfSDavid du Colombier pline = 1; 36*80ee5cbfSDavid du Colombier pword = 1; 37*80ee5cbfSDavid du Colombier pchar = 1; 38*80ee5cbfSDavid du Colombier } 393e12c5d1SDavid du Colombier if(argc==0) 403e12c5d1SDavid du Colombier count(0, 0); 413e12c5d1SDavid du Colombier else{ 423e12c5d1SDavid du Colombier for(i=0;i<argc;i++){ 433e12c5d1SDavid du Colombier f=open(argv[i], OREAD); 443e12c5d1SDavid du Colombier if(f<0){ 453e12c5d1SDavid du Colombier perror(argv[i]); 463e12c5d1SDavid du Colombier status="can't open"; 47bd389b36SDavid du Colombier } 48bd389b36SDavid du Colombier else{ 493e12c5d1SDavid du Colombier count(f, argv[i]); 503e12c5d1SDavid du Colombier tnline+=nline; 513e12c5d1SDavid du Colombier tnword+=nword; 523e12c5d1SDavid du Colombier tnrune+=nrune; 533e12c5d1SDavid du Colombier tnbadr+=nbadr; 543e12c5d1SDavid du Colombier tnchar+=nchar; 553e12c5d1SDavid du Colombier close(f); 563e12c5d1SDavid du Colombier } 573e12c5d1SDavid du Colombier } 583e12c5d1SDavid du Colombier if(argc>1) 593e12c5d1SDavid du Colombier report(tnline, tnword, tnrune, tnbadr, tnchar, "total"); 603e12c5d1SDavid du Colombier } 613e12c5d1SDavid du Colombier exits(status); 623e12c5d1SDavid du Colombier } 633e12c5d1SDavid du Colombier void 64*80ee5cbfSDavid du Colombier report(uvlong nline, uvlong nword, uvlong nrune, uvlong nbadr, uvlong nchar, char *fname) 653e12c5d1SDavid du Colombier { 663e12c5d1SDavid du Colombier char line[1024], word[128]; 673e12c5d1SDavid du Colombier line[0] = '\0'; 683e12c5d1SDavid du Colombier if(pline){ 69*80ee5cbfSDavid du Colombier sprint(word, " %7llud", nline); 703e12c5d1SDavid du Colombier strcat(line, word); 713e12c5d1SDavid du Colombier } 723e12c5d1SDavid du Colombier if(pword){ 73*80ee5cbfSDavid du Colombier sprint(word, " %7llud", nword); 743e12c5d1SDavid du Colombier strcat(line, word); 753e12c5d1SDavid du Colombier } 763e12c5d1SDavid du Colombier if(prune){ 77*80ee5cbfSDavid du Colombier sprint(word, " %7llud", nrune); 783e12c5d1SDavid du Colombier strcat(line, word); 793e12c5d1SDavid du Colombier } 803e12c5d1SDavid du Colombier if(pbadr){ 81*80ee5cbfSDavid du Colombier sprint(word, " %7llud", nbadr); 823e12c5d1SDavid du Colombier strcat(line, word); 833e12c5d1SDavid du Colombier } 843e12c5d1SDavid du Colombier if(pchar){ 85*80ee5cbfSDavid du Colombier sprint(word, " %7llud", nchar); 863e12c5d1SDavid du Colombier strcat(line, word); 873e12c5d1SDavid du Colombier } 883e12c5d1SDavid du Colombier if(fname){ 893e12c5d1SDavid du Colombier sprint(word, " %s", fname); 903e12c5d1SDavid du Colombier strcat(line, word); 913e12c5d1SDavid du Colombier } 923e12c5d1SDavid du Colombier print("%s\n", line+1); 933e12c5d1SDavid du Colombier } 94bd389b36SDavid du Colombier /* 95bd389b36SDavid du Colombier * How it works. Start in statesp. Each time we read a character, 96bd389b36SDavid du Colombier * increment various counts, and do state transitions according to the 97bd389b36SDavid du Colombier * following table. If we're not in statesp or statewd when done, the 98bd389b36SDavid du Colombier * file ends with a partial rune. 99bd389b36SDavid du Colombier * | character 100bd389b36SDavid du Colombier * state |09,20| 0a |00-7f|80-bf|c0-df|e0-ef|f0-ff 101bd389b36SDavid du Colombier * -------+-----+-----+-----+-----+-----+-----+----- 102bd389b36SDavid du Colombier * statesp|ASP |ASPN |AWDW |AWDWX|AC2W |AC3W |AWDWX 103bd389b36SDavid du Colombier * statewd|ASP |ASPN |AWD |AWDX |AC2 |AC3 |AWDX 104bd389b36SDavid du Colombier * statec2|ASPX |ASPNX|AWDX |AWDR |AC2X |AC3X |AWDX 105bd389b36SDavid du Colombier * statec3|ASPX |ASPNX|AWDX |AC2R |AC2X |AC3X |AWDX 106bd389b36SDavid du Colombier */ 107bd389b36SDavid du Colombier enum{ /* actions */ 108bd389b36SDavid du Colombier AC2, /* enter statec2 */ 109bd389b36SDavid du Colombier AC2R, /* enter statec2, don't count a rune */ 110bd389b36SDavid du Colombier AC2W, /* enter statec2, count a word */ 111bd389b36SDavid du Colombier AC2X, /* enter statec2, count a bad rune */ 112bd389b36SDavid du Colombier AC3, /* enter statec3 */ 113bd389b36SDavid du Colombier AC3W, /* enter statec3, count a word */ 114bd389b36SDavid du Colombier AC3X, /* enter statec3, count a bad rune */ 115bd389b36SDavid du Colombier ASP, /* enter statesp */ 116bd389b36SDavid du Colombier ASPN, /* enter statesp, count a newline */ 117bd389b36SDavid du Colombier ASPNX, /* enter statesp, count a newline, count a bad rune */ 118bd389b36SDavid du Colombier ASPX, /* enter statesp, count a bad rune */ 119bd389b36SDavid du Colombier AWD, /* enter statewd */ 120bd389b36SDavid du Colombier AWDR, /* enter statewd, don't count a rune */ 121bd389b36SDavid du Colombier AWDW, /* enter statewd, count a word */ 122bd389b36SDavid du Colombier AWDWX, /* enter statewd, count a word, count a bad rune */ 123bd389b36SDavid du Colombier AWDX, /* enter statewd, count a bad rune */ 1243e12c5d1SDavid du Colombier }; 125bd389b36SDavid du Colombier uchar statesp[256]={ /* looking for the start of a word */ 126bd389b36SDavid du Colombier AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, /* 00-07 */ 127bd389b36SDavid du Colombier AWDW, ASP, ASPN, AWDW, AWDW, AWDW, AWDW, AWDW, /* 08-0f */ 128bd389b36SDavid du Colombier AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, /* 10-17 */ 129bd389b36SDavid du Colombier AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, /* 18-1f */ 130bd389b36SDavid du Colombier ASP, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, /* 20-27 */ 131bd389b36SDavid du Colombier AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, /* 28-2f */ 132bd389b36SDavid du Colombier AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, /* 30-37 */ 133bd389b36SDavid du Colombier AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, /* 38-3f */ 134bd389b36SDavid du Colombier AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, /* 40-47 */ 135bd389b36SDavid du Colombier AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, /* 48-4f */ 136bd389b36SDavid du Colombier AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, /* 50-57 */ 137bd389b36SDavid du Colombier AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, /* 58-5f */ 138bd389b36SDavid du Colombier AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, /* 60-67 */ 139bd389b36SDavid du Colombier AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, /* 68-6f */ 140bd389b36SDavid du Colombier AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, /* 70-77 */ 141bd389b36SDavid du Colombier AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, /* 78-7f */ 142bd389b36SDavid du Colombier AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,/* 80-87 */ 143bd389b36SDavid du Colombier AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,/* 88-8f */ 144bd389b36SDavid du Colombier AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,/* 90-97 */ 145bd389b36SDavid du Colombier AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,/* 98-9f */ 146bd389b36SDavid du Colombier AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,/* a0-a7 */ 147bd389b36SDavid du Colombier AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,/* a8-af */ 148bd389b36SDavid du Colombier AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,/* b0-b7 */ 149bd389b36SDavid du Colombier AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,/* b8-bf */ 150bd389b36SDavid du Colombier AC2W, AC2W, AC2W, AC2W, AC2W, AC2W, AC2W, AC2W, /* c0-c7 */ 151bd389b36SDavid du Colombier AC2W, AC2W, AC2W, AC2W, AC2W, AC2W, AC2W, AC2W, /* c8-cf */ 152bd389b36SDavid du Colombier AC2W, AC2W, AC2W, AC2W, AC2W, AC2W, AC2W, AC2W, /* d0-d7 */ 153bd389b36SDavid du Colombier AC2W, AC2W, AC2W, AC2W, AC2W, AC2W, AC2W, AC2W, /* d8-df */ 154bd389b36SDavid du Colombier AC3W, AC3W, AC3W, AC3W, AC3W, AC3W, AC3W, AC3W, /* e0-e7 */ 155bd389b36SDavid du Colombier AC3W, AC3W, AC3W, AC3W, AC3W, AC3W, AC3W, AC3W, /* e8-ef */ 156bd389b36SDavid du Colombier AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,/* f0-f7 */ 157bd389b36SDavid du Colombier AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,/* f8-ff */ 1583e12c5d1SDavid du Colombier }; 159bd389b36SDavid du Colombier uchar statewd[256]={ /* looking for the next character in a word */ 160bd389b36SDavid du Colombier AWD, AWD, AWD, AWD, AWD, AWD, AWD, AWD, /* 00-07 */ 161bd389b36SDavid du Colombier AWD, ASP, ASPN, AWD, AWD, AWD, AWD, AWD, /* 08-0f */ 162bd389b36SDavid du Colombier AWD, AWD, AWD, AWD, AWD, AWD, AWD, AWD, /* 10-17 */ 163bd389b36SDavid du Colombier AWD, AWD, AWD, AWD, AWD, AWD, AWD, AWD, /* 18-1f */ 164bd389b36SDavid du Colombier ASP, AWD, AWD, AWD, AWD, AWD, AWD, AWD, /* 20-27 */ 165bd389b36SDavid du Colombier AWD, AWD, AWD, AWD, AWD, AWD, AWD, AWD, /* 28-2f */ 166bd389b36SDavid du Colombier AWD, AWD, AWD, AWD, AWD, AWD, AWD, AWD, /* 30-37 */ 167bd389b36SDavid du Colombier AWD, AWD, AWD, AWD, AWD, AWD, AWD, AWD, /* 38-3f */ 168bd389b36SDavid du Colombier AWD, AWD, AWD, AWD, AWD, AWD, AWD, AWD, /* 40-47 */ 169bd389b36SDavid du Colombier AWD, AWD, AWD, AWD, AWD, AWD, AWD, AWD, /* 48-4f */ 170bd389b36SDavid du Colombier AWD, AWD, AWD, AWD, AWD, AWD, AWD, AWD, /* 50-57 */ 171bd389b36SDavid du Colombier AWD, AWD, AWD, AWD, AWD, AWD, AWD, AWD, /* 58-5f */ 172bd389b36SDavid du Colombier AWD, AWD, AWD, AWD, AWD, AWD, AWD, AWD, /* 60-67 */ 173bd389b36SDavid du Colombier AWD, AWD, AWD, AWD, AWD, AWD, AWD, AWD, /* 68-6f */ 174bd389b36SDavid du Colombier AWD, AWD, AWD, AWD, AWD, AWD, AWD, AWD, /* 70-77 */ 175bd389b36SDavid du Colombier AWD, AWD, AWD, AWD, AWD, AWD, AWD, AWD, /* 78-7f */ 176bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 80-87 */ 177bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 88-8f */ 178bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 90-97 */ 179bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 98-9f */ 180bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* a0-a7 */ 181bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* a8-af */ 182bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* b0-b7 */ 183bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* b8-bf */ 184bd389b36SDavid du Colombier AC2, AC2, AC2, AC2, AC2, AC2, AC2, AC2, /* c0-c7 */ 185bd389b36SDavid du Colombier AC2, AC2, AC2, AC2, AC2, AC2, AC2, AC2, /* c8-cf */ 186bd389b36SDavid du Colombier AC2, AC2, AC2, AC2, AC2, AC2, AC2, AC2, /* d0-d7 */ 187bd389b36SDavid du Colombier AC2, AC2, AC2, AC2, AC2, AC2, AC2, AC2, /* d8-df */ 188bd389b36SDavid du Colombier AC3, AC3, AC3, AC3, AC3, AC3, AC3, AC3, /* e0-e7 */ 189bd389b36SDavid du Colombier AC3, AC3, AC3, AC3, AC3, AC3, AC3, AC3, /* e8-ef */ 190bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* f0-f7 */ 191bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* f8-ff */ 1923e12c5d1SDavid du Colombier }; 193bd389b36SDavid du Colombier uchar statec2[256]={ /* looking for 10xxxxxx to complete a rune */ 194bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 00-07 */ 195bd389b36SDavid du Colombier AWDX, ASPX, ASPNX,AWDX, AWDX, AWDX, AWDX, AWDX, /* 08-0f */ 196bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 10-17 */ 197bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 18-1f */ 198bd389b36SDavid du Colombier ASPX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 20-27 */ 199bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 28-2f */ 200bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 30-37 */ 201bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 38-3f */ 202bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 40-47 */ 203bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 48-4f */ 204bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 50-57 */ 205bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 58-5f */ 206bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 60-67 */ 207bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 68-6f */ 208bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 70-77 */ 209bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 78-7f */ 210bd389b36SDavid du Colombier AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, /* 80-87 */ 211bd389b36SDavid du Colombier AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, /* 88-8f */ 212bd389b36SDavid du Colombier AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, /* 90-97 */ 213bd389b36SDavid du Colombier AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, /* 98-9f */ 214bd389b36SDavid du Colombier AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, /* a0-a7 */ 215bd389b36SDavid du Colombier AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, /* a8-af */ 216bd389b36SDavid du Colombier AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, /* b0-b7 */ 217bd389b36SDavid du Colombier AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, /* b8-bf */ 218bd389b36SDavid du Colombier AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, /* c0-c7 */ 219bd389b36SDavid du Colombier AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, /* c8-cf */ 220bd389b36SDavid du Colombier AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, /* d0-d7 */ 221bd389b36SDavid du Colombier AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, /* d8-df */ 222bd389b36SDavid du Colombier AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, /* e0-e7 */ 223bd389b36SDavid du Colombier AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, /* e8-ef */ 224bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* f0-f7 */ 225bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* f8-ff */ 2263e12c5d1SDavid du Colombier }; 227bd389b36SDavid du Colombier uchar statec3[256]={ /* looking for 10xxxxxx,10xxxxxx to complete a rune */ 228bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 00-07 */ 229bd389b36SDavid du Colombier AWDX, ASPX, ASPNX,AWDX, AWDX, AWDX, AWDX, AWDX, /* 08-0f */ 230bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 10-17 */ 231bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 18-1f */ 232bd389b36SDavid du Colombier ASPX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 20-27 */ 233bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 28-2f */ 234bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 30-37 */ 235bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 38-3f */ 236bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 40-47 */ 237bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 48-4f */ 238bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 50-57 */ 239bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 58-5f */ 240bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 60-67 */ 241bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 68-6f */ 242bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 70-77 */ 243bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* 78-7f */ 244bd389b36SDavid du Colombier AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, /* 80-87 */ 245bd389b36SDavid du Colombier AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, /* 88-8f */ 246bd389b36SDavid du Colombier AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, /* 90-97 */ 247bd389b36SDavid du Colombier AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, /* 98-9f */ 248bd389b36SDavid du Colombier AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, /* a0-a7 */ 249bd389b36SDavid du Colombier AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, /* a8-af */ 250bd389b36SDavid du Colombier AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, /* b0-b7 */ 251bd389b36SDavid du Colombier AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, /* b8-bf */ 252bd389b36SDavid du Colombier AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, /* c0-c7 */ 253bd389b36SDavid du Colombier AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, /* c8-cf */ 254bd389b36SDavid du Colombier AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, /* d0-d7 */ 255bd389b36SDavid du Colombier AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, /* d8-df */ 256bd389b36SDavid du Colombier AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, /* e0-e7 */ 257bd389b36SDavid du Colombier AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, /* e8-ef */ 258bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* f0-f7 */ 259bd389b36SDavid du Colombier AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, /* f8-ff */ 2603e12c5d1SDavid du Colombier }; 2613e12c5d1SDavid du Colombier void 2623e12c5d1SDavid du Colombier count(int f, char *name) 2633e12c5d1SDavid du Colombier { 2643e12c5d1SDavid du Colombier int n; 2653e12c5d1SDavid du Colombier uchar buf[NBUF]; 2663e12c5d1SDavid du Colombier uchar *bufp, *ebuf; 267bd389b36SDavid du Colombier uchar *state=statesp; 268*80ee5cbfSDavid du Colombier 269*80ee5cbfSDavid du Colombier nline = 0; 270*80ee5cbfSDavid du Colombier nword = 0; 271*80ee5cbfSDavid du Colombier nrune = 0; 272*80ee5cbfSDavid du Colombier nbadr = 0; 273*80ee5cbfSDavid du Colombier nchar = 0; 274*80ee5cbfSDavid du Colombier 2753e12c5d1SDavid du Colombier for(;;){ 2763e12c5d1SDavid du Colombier n=read(f, buf, NBUF); 2773e12c5d1SDavid du Colombier if(n<=0) 2783e12c5d1SDavid du Colombier break; 2793e12c5d1SDavid du Colombier nchar+=n; 2803e12c5d1SDavid du Colombier nrune+=n; /* might be too large, gets decreased later */ 2813e12c5d1SDavid du Colombier bufp=buf; 2823e12c5d1SDavid du Colombier ebuf=buf+n; 2833e12c5d1SDavid du Colombier do{ 2843e12c5d1SDavid du Colombier switch(state[*bufp]){ 285bd389b36SDavid du Colombier case AC2: state=statec2; break; 286bd389b36SDavid du Colombier case AC2R: state=statec2; --nrune; break; 287bd389b36SDavid du Colombier case AC2W: state=statec2; nword++; break; 288bd389b36SDavid du Colombier case AC2X: state=statec2; nbadr++; break; 289bd389b36SDavid du Colombier case AC3: state=statec3; break; 290bd389b36SDavid du Colombier case AC3W: state=statec3; nword++; break; 291bd389b36SDavid du Colombier case AC3X: state=statec3; nbadr++; break; 292bd389b36SDavid du Colombier case ASP: state=statesp; break; 293bd389b36SDavid du Colombier case ASPN: state=statesp; nline++; break; 294bd389b36SDavid du Colombier case ASPNX: state=statesp; nline++; nbadr++; break; 295bd389b36SDavid du Colombier case ASPX: state=statesp; nbadr++; break; 296bd389b36SDavid du Colombier case AWD: state=statewd; break; 297bd389b36SDavid du Colombier case AWDR: state=statewd; --nrune; break; 298bd389b36SDavid du Colombier case AWDW: state=statewd; nword++; break; 299bd389b36SDavid du Colombier case AWDWX: state=statewd; nword++; nbadr++; break; 300bd389b36SDavid du Colombier case AWDX: state=statewd; nbadr++; break; 3013e12c5d1SDavid du Colombier } 3023e12c5d1SDavid du Colombier }while(++bufp!=ebuf); 3033e12c5d1SDavid du Colombier } 304bd389b36SDavid du Colombier if(state!=statesp && state!=statewd) 3053e12c5d1SDavid du Colombier nbadr++; 3063e12c5d1SDavid du Colombier if(n<0) 3073e12c5d1SDavid du Colombier perror(name); 3083e12c5d1SDavid du Colombier report(nline, nword, nrune, nbadr, nchar, name); 3093e12c5d1SDavid du Colombier } 310