lineruler.c - randomcrap - random crap programs of varying quality
 (HTM) git clone git://git.codemadness.org/randomcrap
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       lineruler.c (903B)
       ---
            1 #include <stdio.h>
            2 #include <stdlib.h>
            3 #include <string.h>
            4 #include <wchar.h>
            5 
            6 size_t
            7 colw(const char *s)
            8 {
            9         wchar_t wc;
           10         size_t col = 0, i, slen;
           11         int rl, w;
           12 
           13         slen = strlen(s);
           14         for (i = 0; i < slen; i += rl) {
           15                 if ((rl = mbtowc(&wc, &s[i], slen - i < 4 ? slen - i : 4)) <= 0)
           16                         break;
           17                 if (wc == '\t') {
           18                         col += 8; /* tab size */
           19                         continue;
           20                 }
           21                 if ((w = wcwidth(wc)) == -1)
           22                         continue;
           23                 col += w;
           24         }
           25         return col;
           26 }
           27 
           28 int
           29 main(int argc, char *argv[])
           30 {
           31         char *line = NULL;
           32         size_t linesiz = 0, linenr = 1, w;
           33         ssize_t n;
           34         long maxlen = 80;
           35         int status = 0;
           36 
           37         if (argc > 1)
           38                 maxlen = strtol(argv[1], NULL, 10);
           39 
           40         while ((n = getline(&line, &linesiz, stdin)) > 0) {
           41                 if (line[n - 1] == '\n')
           42                         line[--n] = '\0';
           43                 w = colw(line);
           44                 if (w > maxlen) {
           45                         status = 1;
           46                         printf("STOP RIGHT THERE CRIMINAL SCUM, YOU HAVE VIOLATED THE LINE %zu\n", linenr);
           47                 }
           48                 linenr++;
           49         }
           50 
           51         return status;
           52 }