Code

UnicodeRange class implementation.
[inkscape.git] / src / unicoderange.cpp
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 }