16 static struct attr_name attr_names[]={
17 #define ATTR2(x,y) ATTR(y)
18 #define ATTR(x) { attr_##x, #x },
25 attr_from_name(const char *name)
29 for (i=0 ; i < sizeof(attr_names)/sizeof(struct attr_name) ; i++) {
30 if (! strcmp(attr_names[i].name, name))
31 return attr_names[i].attr;
37 attr_to_name(enum attr_type attr)
41 for (i=0 ; i < sizeof(attr_names)/sizeof(struct attr_name) ; i++) {
42 if (attr_names[i].attr == attr)
43 return attr_names[i].name;
49 attr_new_from_text(const char *name, const char *value)
54 ret=g_new0(struct attr, 1);
55 dbg(1,"enter name='%s' value='%s'\n", name, value);
56 attr=attr_from_name(name);
60 ret->u.item_type=item_from_name(value);
63 if (attr >= attr_type_string_begin && attr <= attr_type_string_end) {
64 ret->u.str=(char *)value;
67 if (attr >= attr_type_int_begin && attr <= attr_type_int_end) {
68 ret->u.num=atoi(value);
71 if (attr >= attr_type_color_begin && attr <= attr_type_color_end) {
72 struct color *color=g_new0(struct color, 1);
76 sscanf(value,"#%02x%02x%02x", &r, &g, &b);
77 color->r = (r << 8) | r;
78 color->g = (g << 8) | g;
79 color->b = (b << 8) | b;
81 } else if(strlen(value)==9){
82 sscanf(value,"#%02x%02x%02x%02x", &r, &g, &b, &a);
83 color->r = (r << 8) | r;
84 color->g = (g << 8) | g;
85 color->b = (b << 8) | b;
86 color->a = (a << 8) | a;
88 dbg(0,"color %s has unknown format\n",value);
100 attr_search(struct attr **attrs, struct attr *last, enum attr_type attr)
102 dbg(1, "enter attrs=%p\n", attrs);
104 dbg(1,"*attrs=%p\n", *attrs);
105 if ((*attrs)->type == attr) {
114 attr_data_size(struct attr *attr)
116 if (attr->type >= attr_type_string_begin && attr->type <= attr_type_string_end) {
117 return strlen(attr->u.str)+1;
119 if (attr->type >= attr_type_int_begin && attr->type <= attr_type_int_end) {
120 return sizeof(attr->u.num);
126 attr_data_get(struct attr *attr)
128 if (attr->type >= attr_type_string_begin && attr->type <= attr_type_string_end) {
131 if (attr->type >= attr_type_int_begin && attr->type <= attr_type_int_end) {
138 attr_data_set(struct attr *attr, void *data)
140 if (attr->type >= attr_type_string_begin && attr->type <= attr_type_string_end) {
143 if (attr->type >= attr_type_int_begin && attr->type <= attr_type_int_end) {
144 attr->u.num=*((int *)data);
149 attr_free(struct attr *attr)
151 if (attr->type >= attr_type_color_begin && attr->type <= attr_type_color_end)
152 g_free(attr->u.color);