source: subversion/utils/planet.osm/C/UTF8sanitizer.c @ 1938

Last change on this file since 1938 was 1321, checked in by joerg, 13 years ago

first Version

File size: 2.2 KB
Line 
1#include <stdio.h>
2
3int 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}
Note: See TracBrowser for help on using the repository browser.