+ }
+
+ *idx_ge=i;
+ return found;
+}
+
+bool gr_stylespec_add(GrStyleSpec *spec, GrAttr a, uint score)
+{
+ static const uint sz=sizeof(GrAttrScore);
+ GrAttrScore *idsn;
+ int idx_ge;
+
+ if(a==GRATTR_NONE || score==0)
+ return TRUE;
+
+ if(gr_stylespec_find_(spec, a, &idx_ge)){
+ spec->attrs[idx_ge].score+=score;
+ return TRUE;
+ }
+
+ idsn=(GrAttrScore*)realloc(spec->attrs, (spec->n+1)*sz);
+
+ if(idsn==NULL)
+ return FALSE;
+
+ stringstore_ref(a);
+
+ memmove(idsn+idx_ge+1, idsn+idx_ge, (spec->n-idx_ge)*sz);
+
+ idsn[idx_ge].attr=a;
+ idsn[idx_ge].score=score;
+ spec->attrs=idsn;
+ spec->n++;
+
+ return TRUE;
+}
+
+
+bool gr_stylespec_set(GrStyleSpec *spec, GrAttr a)
+{
+ return gr_stylespec_add(spec, a, 1);
+}
+
+
+void gr_stylespec_unset(GrStyleSpec *spec, GrAttr a)
+{
+ static const uint sz=sizeof(GrAttrScore);
+ GrAttrScore *idsn;
+ int idx_ge;
+
+ if(a==GRATTR_NONE)
+ return;
+
+ if(!gr_stylespec_find_(spec, a, &idx_ge))
+ return;
+
+ stringstore_free(spec->attrs[idx_ge].attr);
+
+ memmove(spec->attrs+idx_ge, spec->attrs+idx_ge+1,
+ (spec->n-idx_ge-1)*sz);
+
+ spec->n--;
+
+ idsn=(GrAttrScore*)realloc(spec->attrs, (spec->n)*sz);
+
+ if(idsn!=NULL || spec->n==0)
+ spec->attrs=idsn;
+}
+