wc.c - 9base - revived minimalist port of Plan 9 userland to Unix
 (HTM) git clone git://git.suckless.org/9base
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       wc.c (15163B)
       ---
            1 /*
            2  * wc -- count things in utf-encoded text files
            3  * Bugs:
            4  *        The only white space characters recognized are ' ', '\t' and '\n', even though
            5  *        ISO 10646 has many more blanks scattered through it.
            6  *        Should count characters that cannot occur in any rune (hex f0-ff) separately.
            7  *        Should count non-canonical runes (e.g. hex c1,80 instead of hex 40).
            8  */
            9 #include <u.h>
           10 #include <libc.h>
           11 #define        NBUF        (8*1024)
           12 uvlong nline, tnline, pline;
           13 uvlong nword, tnword, pword;
           14 uvlong nrune, tnrune, prune;
           15 uvlong nbadr, tnbadr, pbadr;
           16 uvlong nchar, tnchar, pchar;
           17 void count(int, char *);
           18 void report(uvlong, uvlong, uvlong, uvlong, uvlong, char *);
           19 void
           20 main(int argc, char *argv[])
           21 {
           22         char *status="";
           23         int i, f;
           24         ARGBEGIN {
           25         case 'l': pline++; break;
           26         case 'w': pword++; break;
           27         case 'r': prune++; break;
           28         case 'b': pbadr++; break;
           29         case 'c': pchar++; break;
           30         default:
           31                 fprint(2, "Usage: %s [-lwrbc] [file ...]\n", argv0);
           32                 exits("usage");
           33         } ARGEND
           34         if(pline+pword+prune+pbadr+pchar == 0) {
           35                 pline = 1;
           36                 pword = 1;
           37                 pchar = 1;
           38         }
           39         if(argc==0)
           40                 count(0, 0);
           41         else{
           42                 for(i=0;i<argc;i++){
           43                         f=open(argv[i], OREAD);
           44                         if(f<0){
           45                                 perror(argv[i]);
           46                                 status="can't open";
           47                         }
           48                         else{
           49                                 count(f, argv[i]);
           50                                 tnline+=nline;
           51                                 tnword+=nword;
           52                                 tnrune+=nrune;
           53                                 tnbadr+=nbadr;
           54                                 tnchar+=nchar;
           55                                 close(f);
           56                         }
           57                 }
           58                 if(argc>1)
           59                         report(tnline, tnword, tnrune, tnbadr, tnchar, "total");
           60         }
           61         exits(status);
           62 }
           63 void
           64 report(uvlong nline, uvlong nword, uvlong nrune, uvlong nbadr, uvlong nchar, char *fname)
           65 {
           66         char line[1024], word[128];
           67         line[0] = '\0';
           68         if(pline){
           69                 sprint(word, " %7llud", nline);
           70                 strcat(line, word);
           71         }
           72         if(pword){
           73                 sprint(word, " %7llud", nword);
           74                 strcat(line, word);
           75         }
           76         if(prune){
           77                 sprint(word, " %7llud", nrune);
           78                 strcat(line, word);
           79         }
           80         if(pbadr){
           81                 sprint(word, " %7llud", nbadr);
           82                 strcat(line, word);
           83         }
           84         if(pchar){
           85                 sprint(word, " %7llud", nchar);
           86                 strcat(line, word);
           87         }
           88         if(fname){
           89                 sprint(word, " %s",   fname);
           90                 strcat(line, word);
           91         }
           92         print("%s\n", line+1);
           93 }
           94 /*
           95  * How it works.  Start in statesp.  Each time we read a character,
           96  * increment various counts, and do state transitions according to the
           97  * following table.  If we're not in statesp or statewd when done, the
           98  * file ends with a partial rune.
           99  *        |                character
          100  *  state |09,20| 0a  |00-7f|80-bf|c0-df|e0-ef|f0-f7|f8-ff
          101  * -------+-----+-----+-----+-----+-----+-----+-----+-----
          102  * statesp|ASP  |ASPN |AWDW |AWDWX|AC2W |AC3W |AC4W |AWDWX
          103  * statewd|ASP  |ASPN |AWD  |AWDX |AC2  |AC3  |AC4  |AWDX
          104  * statec2|ASPX |ASPNX|AWDX |AWDR |AC2X |AC3X |AC4X |AWDX
          105  * statec3|ASPX |ASPNX|AWDX |AC2R |AC2X |AC3X |AC4X |AWDX
          106  * statec4|ASPX |ASPNX|AWDX |AC3R |AC2X |AC3X |AC4X |AWDX        f4 8f bf bf
          107  */
          108 enum{                        /* actions */
          109         AC2,                /* enter statec2 */
          110         AC2R,                /* enter statec2, don't count a rune */
          111         AC2W,                /* enter statec2, count a word */
          112         AC2X,                /* enter statec2, count a bad rune */
          113         AC3,                /* enter statec3 */
          114         AC3R,                /* enter statec3, don't count a rune */
          115         AC3W,                /* enter statec3, count a word */
          116         AC3X,                /* enter statec3, count a bad rune */
          117         AC4,                /* enter statec4 */
          118         AC4W,                /* enter statec4, count a word */
          119         AC4X,                /* enter statec4, count a bad rune */
          120         ASP,                /* enter statesp */
          121         ASPN,                /* enter statesp, count a newline */
          122         ASPNX,                /* enter statesp, count a newline, count a bad rune */
          123         ASPX,                /* enter statesp, count a bad rune */
          124         AWD,                /* enter statewd */
          125         AWDR,                /* enter statewd, don't count a rune */
          126         AWDW,                /* enter statewd, count a word */
          127         AWDWX,                /* enter statewd, count a word, count a bad rune */
          128         AWDX,                /* enter statewd, count a bad rune */
          129 };
          130 uchar statesp[256]={        /* looking for the start of a word */
          131 AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,        /* 00-07 */
          132 AWDW, ASP,  ASPN, AWDW, AWDW, AWDW, AWDW, AWDW,        /* 08-0f */
          133 AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,        /* 10-17 */
          134 AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,        /* 18-1f */
          135 ASP,  AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,        /* 20-27 */
          136 AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,        /* 28-2f */
          137 AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,        /* 30-37 */
          138 AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,        /* 38-3f */
          139 AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,        /* 40-47 */
          140 AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,        /* 48-4f */
          141 AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,        /* 50-57 */
          142 AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,        /* 58-5f */
          143 AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,        /* 60-67 */
          144 AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,        /* 68-6f */
          145 AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,        /* 70-77 */
          146 AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,        /* 78-7f */
          147 AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,/* 80-87 */
          148 AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,/* 88-8f */
          149 AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,/* 90-97 */
          150 AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,/* 98-9f */
          151 AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,/* a0-a7 */
          152 AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,/* a8-af */
          153 AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,/* b0-b7 */
          154 AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,/* b8-bf */
          155 AC2W, AC2W, AC2W, AC2W, AC2W, AC2W, AC2W, AC2W,        /* c0-c7 */
          156 AC2W, AC2W, AC2W, AC2W, AC2W, AC2W, AC2W, AC2W,        /* c8-cf */
          157 AC2W, AC2W, AC2W, AC2W, AC2W, AC2W, AC2W, AC2W,        /* d0-d7 */
          158 AC2W, AC2W, AC2W, AC2W, AC2W, AC2W, AC2W, AC2W,        /* d8-df */
          159 AC3W, AC3W, AC3W, AC3W, AC3W, AC3W, AC3W, AC3W,        /* e0-e7 */
          160 AC3W, AC3W, AC3W, AC3W, AC3W, AC3W, AC3W, AC3W,        /* e8-ef */
          161 AC4W, AC4W, AC4W, AC4W, AC4W, AC4W, AC4W, AC4W, /* f0-f7 */
          162 AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,/* f8-ff */
          163 };
          164 uchar statewd[256]={        /* looking for the next character in a word */
          165 AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,        /* 00-07 */
          166 AWD,  ASP,  ASPN, AWD,  AWD,  AWD,  AWD,  AWD,        /* 08-0f */
          167 AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,        /* 10-17 */
          168 AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,        /* 18-1f */
          169 ASP,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,        /* 20-27 */
          170 AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,        /* 28-2f */
          171 AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,        /* 30-37 */
          172 AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,        /* 38-3f */
          173 AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,        /* 40-47 */
          174 AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,        /* 48-4f */
          175 AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,        /* 50-57 */
          176 AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,        /* 58-5f */
          177 AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,        /* 60-67 */
          178 AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,        /* 68-6f */
          179 AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,        /* 70-77 */
          180 AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,        /* 78-7f */
          181 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 80-87 */
          182 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 88-8f */
          183 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 90-97 */
          184 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 98-9f */
          185 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* a0-a7 */
          186 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* a8-af */
          187 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* b0-b7 */
          188 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* b8-bf */
          189 AC2,  AC2,  AC2,  AC2,  AC2,  AC2,  AC2,  AC2,        /* c0-c7 */
          190 AC2,  AC2,  AC2,  AC2,  AC2,  AC2,  AC2,  AC2,        /* c8-cf */
          191 AC2,  AC2,  AC2,  AC2,  AC2,  AC2,  AC2,  AC2,        /* d0-d7 */
          192 AC2,  AC2,  AC2,  AC2,  AC2,  AC2,  AC2,  AC2,        /* d8-df */
          193 AC3,  AC3,  AC3,  AC3,  AC3,  AC3,  AC3,  AC3,        /* e0-e7 */
          194 AC3,  AC3,  AC3,  AC3,  AC3,  AC3,  AC3,  AC3,        /* e8-ef */
          195 AC4,  AC4,  AC4,  AC4,  AC4,  AC4,  AC4,  AC4,        /* f0-f7 */
          196 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* f8-ff */
          197 };
          198 uchar statec2[256]={        /* looking for 10xxxxxx to complete a rune */
          199 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 00-07 */
          200 AWDX, ASPX, ASPNX,AWDX, AWDX, AWDX, AWDX, AWDX,        /* 08-0f */
          201 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 10-17 */
          202 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 18-1f */
          203 ASPX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 20-27 */
          204 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 28-2f */
          205 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 30-37 */
          206 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 38-3f */
          207 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 40-47 */
          208 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 48-4f */
          209 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 50-57 */
          210 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 58-5f */
          211 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 60-67 */
          212 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 68-6f */
          213 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 70-77 */
          214 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 78-7f */
          215 AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR,        /* 80-87 */
          216 AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR,        /* 88-8f */
          217 AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR,        /* 90-97 */
          218 AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR,        /* 98-9f */
          219 AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR,        /* a0-a7 */
          220 AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR,        /* a8-af */
          221 AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR,        /* b0-b7 */
          222 AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR,        /* b8-bf */
          223 AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X,        /* c0-c7 */
          224 AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X,        /* c8-cf */
          225 AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X,        /* d0-d7 */
          226 AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X,        /* d8-df */
          227 AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X,        /* e0-e7 */
          228 AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X,        /* e8-ef */
          229 AC4X, AC4X, AC4X, AC4X, AC4X, AC4X, AC4X, AC4X,        /* f0-f7 */
          230 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* f8-ff */
          231 };
          232 uchar statec3[256]={        /* looking for 10xxxxxx,10xxxxxx to complete a rune */
          233 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 00-07 */
          234 AWDX, ASPX, ASPNX,AWDX, AWDX, AWDX, AWDX, AWDX,        /* 08-0f */
          235 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 10-17 */
          236 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 18-1f */
          237 ASPX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 20-27 */
          238 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 28-2f */
          239 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 30-37 */
          240 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 38-3f */
          241 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 40-47 */
          242 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 48-4f */
          243 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 50-57 */
          244 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 58-5f */
          245 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 60-67 */
          246 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 68-6f */
          247 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 70-77 */
          248 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 78-7f */
          249 AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R,        /* 80-87 */
          250 AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R,        /* 88-8f */
          251 AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R,        /* 90-97 */
          252 AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R,        /* 98-9f */
          253 AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R,        /* a0-a7 */
          254 AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R,        /* a8-af */
          255 AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R,        /* b0-b7 */
          256 AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R,        /* b8-bf */
          257 AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X,        /* c0-c7 */
          258 AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X,        /* c8-cf */
          259 AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X,        /* d0-d7 */
          260 AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X,        /* d8-df */
          261 AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X,        /* e0-e7 */
          262 AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X,        /* e8-ef */
          263 AC4X, AC4X, AC4X, AC4X, AC4X, AC4X, AC4X, AC4X,        /* f0-f7 */
          264 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* f8-ff */
          265 };
          266 uchar statec4[256]={        /* looking for 10xxxxxx,10xxxxxx,10xxxxxx to complete a rune */
          267 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 00-07 */
          268 AWDX, ASPX, ASPNX,AWDX, AWDX, AWDX, AWDX, AWDX,        /* 08-0f */
          269 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 10-17 */
          270 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 18-1f */
          271 ASPX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 20-27 */
          272 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 28-2f */
          273 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 30-37 */
          274 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 38-3f */
          275 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 40-47 */
          276 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 48-4f */
          277 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 50-57 */
          278 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 58-5f */
          279 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 60-67 */
          280 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 68-6f */
          281 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 70-77 */
          282 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 78-7f */
          283 AC3R, AC3R, AC3R, AC3R, AC3R, AC3R, AC3R, AC3R,        /* 80-87 */
          284 AC3R, AC3R, AC3R, AC3R, AC3R, AC3R, AC3R, AC3R,        /* 88-8f */
          285 AC3R, AC3R, AC3R, AC3R, AC3R, AC3R, AC3R, AC3R,        /* 90-97 */
          286 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* 98-9f */
          287 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* a0-a7 */
          288 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* a8-af */
          289 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* b0-b7 */
          290 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* b8-bf */
          291 AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X,        /* c0-c7 */
          292 AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X,        /* c8-cf */
          293 AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X,        /* d0-d7 */
          294 AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X,        /* d8-df */
          295 AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X,        /* e0-e7 */
          296 AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X,        /* e8-ef */
          297 AC4X, AC4X, AC4X, AC4X, AC4X, AC4X, AC4X, AC4X,        /* f0-f7 */
          298 AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,        /* f8-ff */
          299 };
          300 void
          301 count(int f, char *name)
          302 {
          303         int n;
          304         uchar buf[NBUF];
          305         uchar *bufp, *ebuf;
          306         uchar *state=statesp;
          307 
          308         nline = 0;
          309         nword = 0;
          310         nrune = 0;
          311         nbadr = 0;
          312         nchar = 0;
          313 
          314         for(;;){
          315                 n=read(f, buf, NBUF);
          316                 if(n<=0)
          317                         break;
          318                 nchar+=n;
          319                 nrune+=n;        /* might be too large, gets decreased later */
          320                 bufp=buf;
          321                 ebuf=buf+n;
          322                 do{
          323                         switch(state[*bufp]){
          324                         case AC2:   state=statec2;                   break;
          325                         case AC2R:  state=statec2; --nrune;          break;
          326                         case AC2W:  state=statec2; nword++;          break;
          327                         case AC2X:  state=statec2;          nbadr++; break;
          328                         case AC3:   state=statec3;                   break;
          329                         case AC3R:  state=statec3; --nrune;          break;
          330                         case AC3W:  state=statec3; nword++;          break;
          331                         case AC3X:  state=statec3;          nbadr++; break;
          332                         case AC4:   state=statec4;                   break;
          333                         case AC4W:  state=statec4; nword++;          break;
          334                         case AC4X:  state=statec4;          nbadr++; break;
          335                         case ASP:   state=statesp;                   break;
          336                         case ASPN:  state=statesp; nline++;          break;
          337                         case ASPNX: state=statesp; nline++; nbadr++; break;
          338                         case ASPX:  state=statesp;          nbadr++; break;
          339                         case AWD:   state=statewd;                   break;
          340                         case AWDR:  state=statewd; --nrune;          break;
          341                         case AWDW:  state=statewd; nword++;          break;
          342                         case AWDWX: state=statewd; nword++; nbadr++; break;
          343                         case AWDX:  state=statewd;          nbadr++; break;
          344                         }
          345                 }while(++bufp!=ebuf);
          346         }
          347         if(state!=statesp && state!=statewd)
          348                 nbadr++;
          349         if(n<0)
          350                 fprint(2, "%s: %r\n", name);
          351         report(nline, nword, nrune, nbadr, nchar, name);
          352 }