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 }