6
6
static unsigned int hex2int(char* s){
9
while(s[i+1]!='\0') i++;
9
while(s[i+1]!='\0') i++;
12
if (s[i] >= 'A' && s[i] <= 'F') res += mul * (s[i]-'A'+10);
13
if (s[i] >= 'a' && s[i] <= 'f') res += mul * (s[i]-'a'+10);
14
if (s[i] >= '0' && s[i] <= '9') res += mul * (s[i]-'0');
12
if (s[i] >= 'A' && s[i] <= 'F') res += mul * (s[i]-'A'+10);
13
if (s[i] >= 'a' && s[i] <= 'f') res += mul * (s[i]-'a'+10);
14
if (s[i] >= '0' && s[i] <= '9') res += mul * (s[i]-'0');
21
21
UnicodeRange::UnicodeRange(const gchar* value){
23
gchar* val = (gchar*) value;
24
while(val[0] != '\0'){
25
if (val[0]=='U' && val[1]=='+'){
26
val += add_range(val+2);
28
this->unichars.push_back(g_utf8_get_char(&val[0]));
31
//skip spaces or commas
32
while(val[0]==' ' || val[0]==',') val++;
23
gchar* val = (gchar*) value;
24
while(val[0] != '\0'){
25
if (val[0]=='U' && val[1]=='+'){
26
val += add_range(val+2);
28
this->unichars.push_back(g_utf8_get_char(&val[0]));
31
//skip spaces or commas
32
while(val[0]==' ' || val[0]==',') val++;
36
int UnicodeRange::add_range(gchar* val){
39
while(val[i]!='\0' && val[i]!='-' && val[i]!=' ' && val[i]!=','){
42
r.start = (gchar*) malloc((i+1)*sizeof(gchar));
43
strncpy(r.start, val, i);
50
while(val[i]!='\0' && val[i]!='-' && val[i]!=' ' && val[i]!=',') i++;
51
r.end = (gchar*) malloc((i+1)*sizeof(gchar));
52
strncpy(r.end, val, i);
59
this->range.push_back(r);
37
UnicodeRange::add_range(gchar* val){
40
while(val[i]!='\0' && val[i]!='-' && val[i]!=' ' && val[i]!=',') i++;
41
r.start = (gchar*) malloc((i+1)*sizeof(gchar*));
42
strncpy(r.start, val, i);
49
while(val[i]!='\0' && val[i]!='-' && val[i]!=' ' && val[i]!=',') i++;
50
r.end = (gchar*) malloc((i+1)*sizeof(gchar*));
51
strncpy(r.end, val, i);
58
this->range.push_back(r);
63
62
bool UnicodeRange::contains(gchar unicode){
64
for(unsigned int i=0;i<this->unichars.size();i++){
65
if (static_cast<gunichar>(unicode) == this->unichars[i]){
71
unival = g_utf8_get_char (&unicode);
72
char uni[9] = "00000000";
74
for (unsigned int i=7; unival>0; i--){
75
unsigned char val = unival & 0xf;
77
if (val < 10) uni[i] = '0' + val;
78
else uni[i] = 'A'+ val - 10;
82
for(unsigned int i=0;i<this->range.size();i++){
83
Urange r = this->range[i];
85
if (unival >= hex2int(r.start) && unival <= hex2int(r.end)) return true;
90
while (r.start[p]!='\0') p++;
93
for (int pos=8;p>=0;pos--,p--){
94
if (uni[pos]!='?' && uni[pos]!=r.start[p]) found = false;
96
if (found) return true;
63
for(unsigned int i=0;i<this->unichars.size();i++){
64
if ((gunichar) unicode == this->unichars[i]) return true;
68
unival = g_utf8_get_char (&unicode);
69
char uni[9] = "00000000";
72
for (unsigned int i=7; unival>0; i--){
75
if (val < 10) uni[i] = '0' + val;
76
else uni[i] = 'A'+ val - 10;
80
for(unsigned int i=0;i<this->range.size();i++){
81
Urange r = this->range[i];
83
if (unival >= hex2int(r.start) && unival <= hex2int(r.end)) return true;
88
while (r.start[p]!='\0') p++;
91
for (int pos=8;p>=0;pos--,p--){
92
if (uni[pos]!='?' && uni[pos]!=r.start[p]) found = false;
94
if (found) return true;
102
100
Glib::ustring UnicodeRange::attribute_string(){
103
Glib::ustring result;
105
for(i=0; i<this->unichars.size(); i++){
106
result += this->unichars[i];
107
if (i!=this->unichars.size()-1) result += ",";
110
for(i=0; i<this->range.size(); i++){
111
result += "U+" + Glib::ustring(this->range[i].start);
112
if (this->range[i].end) result += "-" + Glib::ustring(this->range[i].end);
113
if (i!=this->range.size()-1) result += ", ";
101
Glib::ustring result;
103
for(i=0; i<this->unichars.size(); i++){
104
result += this->unichars[i];
105
if (i!=this->unichars.size()-1) result += ",";
108
for(i=0; i<this->range.size(); i++){
109
result += "U+" + Glib::ustring(this->range[i].start);
110
if (this->range[i].end) result += "-" + Glib::ustring(this->range[i].end);
111
if (i!=this->range.size()-1) result += ", ";
119
117
gunichar UnicodeRange::sample_glyph(){
120
//This could be better
121
if (!unichars.empty())
124
return hex2int(range[0].start);
125
return (gunichar) ' ';
118
//This could be better
122
return hex2int(range[0].start);
123
return (gunichar) ' ';