18 static struct attr_name attr_names[]={
19 #define ATTR2(x,y) ATTR(y)
20 #define ATTR(x) { attr_##x, #x },
27 attr_from_name(const char *name)
31 for (i=0 ; i < sizeof(attr_names)/sizeof(struct attr_name) ; i++) {
32 if (! strcmp(attr_names[i].name, name))
33 return attr_names[i].attr;
39 attr_to_name(enum attr_type attr)
43 for (i=0 ; i < sizeof(attr_names)/sizeof(struct attr_name) ; i++) {
44 if (attr_names[i].attr == attr)
45 return attr_names[i].name;
51 attr_new_from_text(const char *name, const char *value)
58 ret=g_new0(struct attr, 1);
59 dbg(1,"enter name='%s' value='%s'\n", name, value);
60 attr=attr_from_name(name);
64 ret->u.item_type=item_from_name(value);
66 case attr_position_coord_geo:
67 g=g_new(struct coord_geo, 1);
69 coord_parse(value, projection_mg, &c);
70 transform_to_geo(projection_mg, &c, g);
73 if (attr >= attr_type_string_begin && attr <= attr_type_string_end) {
74 ret->u.str=(char *)value;
77 if (attr >= attr_type_int_begin && attr <= attr_type_int_end) {
78 ret->u.num=atoi(value);
81 if (attr >= attr_type_color_begin && attr <= attr_type_color_end) {
82 struct color *color=g_new0(struct color, 1);
86 sscanf(value,"#%02x%02x%02x", &r, &g, &b);
87 color->r = (r << 8) | r;
88 color->g = (g << 8) | g;
89 color->b = (b << 8) | b;
91 } else if(strlen(value)==9){
92 sscanf(value,"#%02x%02x%02x%02x", &r, &g, &b, &a);
93 color->r = (r << 8) | r;
94 color->g = (g << 8) | g;
95 color->b = (b << 8) | b;
96 color->a = (a << 8) | a;
98 dbg(0,"color %s has unknown format\n",value);
110 attr_search(struct attr **attrs, struct attr *last, enum attr_type attr)
112 dbg(1, "enter attrs=%p\n", attrs);
114 dbg(1,"*attrs=%p\n", *attrs);
115 if ((*attrs)->type == attr) {
124 attr_data_size(struct attr *attr)
126 if (attr->type >= attr_type_string_begin && attr->type <= attr_type_string_end) {
127 return strlen(attr->u.str)+1;
129 if (attr->type >= attr_type_int_begin && attr->type <= attr_type_int_end) {
130 return sizeof(attr->u.num);
136 attr_data_get(struct attr *attr)
138 if (attr->type >= attr_type_string_begin && attr->type <= attr_type_string_end) {
141 if (attr->type >= attr_type_int_begin && attr->type <= attr_type_int_end) {
148 attr_data_set(struct attr *attr, void *data)
150 if (attr->type >= attr_type_string_begin && attr->type <= attr_type_string_end) {
153 if (attr->type >= attr_type_int_begin && attr->type <= attr_type_int_end) {
154 attr->u.num=*((int *)data);
159 attr_free(struct attr *attr)
161 if (attr->type == attr_position_coord_geo)
162 g_free(attr->u.coord_geo);
163 if (attr->type >= attr_type_color_begin && attr->type <= attr_type_color_end)
164 g_free(attr->u.color);