1 #include<unicoderange.h>
3 static unsigned int hex2int(char* s){
4 int res=0;
5 int i=0, mul=1;
6 while(s[i+1]!='\0') i++;
8 while(i>=0){
9 if (s[i] > '9') res += mul * (s[i]-'A'+10);
10 else res += mul * (s[i]-'0');
11 i--;
12 mul*=16;
13 }
14 return res;
15 }
17 UnicodeRange::UnicodeRange(const gchar* value){
18 gchar* val = (gchar*) value;
19 while(val[0] != '\0'){
20 if (val[0]=='U' && val[1]=='+'){
21 val += add_range(val);
22 } else {
23 // g_warning("adding unichar. unichar=%c", g_utf8_get_char(&val[0]));
24 this->unichars.push_back(g_utf8_get_char(&val[0]));
25 val++;
26 }
27 //skip spaces or commas
28 while(val[0]==' ' || val[0]==',') val++;
29 }
30 }
32 int
33 UnicodeRange::add_range(gchar* val){
34 Urange r;
35 //U+
36 val+=2;
37 int i=0, count=2;
38 while(val[i]!='\0' && val[i]!='-' && val[i]!=' ' && val[i]!=',') i++;
39 r.start = (gchar*) malloc((i+1)*sizeof(gchar*));
40 strncpy(r.start, val, i);
41 r.start[i] = '\0';
42 val+=i;
43 count+=i;
44 i=0;
45 if (val[0]=='-'){
46 val++;
47 while(val[i]!='\0' && val[i]!='-' && val[i]!=' ' && val[i]!=',') i++;
48 r.end = (gchar*) malloc((i+1)*sizeof(gchar*));
49 strncpy(r.end, val, i);
50 r.end[i] = '\0';
51 val+=i;
52 count+=i;
53 } else {
54 r.end=NULL;
55 }
56 // g_warning("adding range. from %s to %s", r.start, r.end);
57 this->range.push_back(r);
58 return count+1;
59 }
61 bool UnicodeRange::contains(gchar unicode){
62 for(unsigned int i=0;i<this->unichars.size();i++){
63 if ((gunichar) unicode == this->unichars[i]) return true;
64 }
66 unsigned int unival;
67 unival = g_utf8_get_char (&unicode);
68 g_warning("unival=%d", unival);
69 char uni[9] = "00000000";
70 uni[8]= '\0';
71 unsigned char val;
72 for (unsigned int i=7; unival>0; i--){
73 val = unival & 0xf;
74 unival = unival >> 4;
75 if (val < 10) uni[i] = '0' + val;
76 else uni[i] = 'A'+ val - 10;
77 }
78 // g_warning("uni=%s", uni);
80 bool found;
81 for(unsigned int i=0;i<this->range.size();i++){
82 Urange r = this->range[i];
83 if (r.end){
84 // g_warning("hex2int: start=%d", hex2int(r.start));
85 // g_warning("hex2int: end=%d", hex2int(r.end));
86 if (unival >= hex2int(r.start) && unival <= hex2int(r.end)) return true;
87 } else {
88 found = true;
89 for (int pos=0;pos<8;pos++){
90 if (uni[pos]!='?' && uni[pos]!=r.start[pos]) found = false;
91 }
92 if (found) return true;
93 }
94 }
95 return false;
96 }