move utils to applications. This way it should be easier to build
[planetdump.git] / UTF8sanitizer.c
1 #include <stdio.h>
2
3 int main(int argc, char** argv) {
4   long long line;
5   long long chars1, chars2, chars3, chars4, chars5, chars6;
6   int state, current_size;
7   int current_char, long_char[6];
8   int i;
9
10   chars1=chars2=chars3=chars4=chars5=chars6=0;
11   line = 0;
12   state = 1;
13   current_size=0;
14   current_char=getchar();
15   while (!feof(stdin)) { //state != 0) {
16     if ((current_char & 128) == 0) {
17       //Handle_ASCII_char();
18       if (current_char == '\n') 
19         line++;
20       else
21         chars1++;
22       if (state != 1) {
23         fprintf(stderr, "Error at line %lld\n", line);
24         putchar('_');
25         state = 1;
26       }
27       putchar(current_char);
28     } else if ((current_char & (128+64)) == 128) {
29       // Handle_continue_char();
30       if(state > 1) {
31         state--;
32         if(state==1) {
33           // long char finished
34           for(i=1; i<current_size; i++) {
35             putchar(long_char[i-1]);
36           }
37           putchar(current_char);
38         }
39       } else {
40         fprintf(stderr, "Error at line %lld\n", line);
41         putchar('_');
42         state=1;
43       }
44     } else if ((current_char & (128+64+32)) == (128+64)) {
45       //Handle_two_bytes();
46       state=2;
47       chars2++;
48       current_size=2;
49     } else if ((current_char & (128+64+32+16)) == (128+64+32)) {
50       //Handle_three_bytes();
51       state=3;
52       chars3++;
53       current_size=3;
54     } else if ((current_char & (128+64+32+16+8)) == (128+64+32+16)) {
55       //Handle_four_bytes();
56       state=4;
57       chars4++;
58       current_size=4;
59     } else if ((current_char & (128+64+32+16+8+4)) == (128+64+32+16+8)) {
60       //Handle_five_bytes();
61       state=5;
62       chars5++;
63       current_size=5;
64     } else if ((current_char & (128+64+32+16+8+4+2)) == (128+64+32+16+8+4)) {
65       //Handle_six_bytes();
66       state=6;
67       chars6++;
68       current_size=6;
69     }
70     if(state>1) {
71       long_char[current_size-state]=current_char;
72     }
73     current_char=getchar();
74   }
75
76   fprintf(stderr, "Summary:\n");
77   fprintf(stderr, "chars1: %lld\n", chars1);
78   fprintf(stderr, "chars2: %lld\n", chars2);
79   fprintf(stderr, "chars3: %lld\n", chars3);
80   fprintf(stderr, "chars4: %lld\n", chars4);
81   fprintf(stderr, "chars5: %lld\n", chars5);
82   fprintf(stderr, "chars6: %lld\n", chars6);
83   fprintf(stderr, "lines : %lld\n", line);
84
85   return 0;
86 }