r5715 - trunk/eda/fped
werner at docs.openmoko.org
werner at docs.openmoko.org
Fri Nov 27 20:55:25 CET 2009
Author: werner
Date: 2009-11-27 20:55:25 +0100 (Fri, 27 Nov 2009)
New Revision: 5715
Modified:
trunk/eda/fped/dump.c
trunk/eda/fped/dump.h
trunk/eda/fped/gui_frame.c
Log:
Vector name generation could produce duplicates if vectors were moved or
deleted. The new algorithm checks for collisions and also reduces the number
of allocations.
- dump.c (generate_name): store the name in the vector being named
- dump.c (generate_name): compare the new name against all names in use
- dump.c (base_name, obj_base_name, print_label): don't allocate the name
- dump.c: changed all users of the above functions accordingly
Modified: trunk/eda/fped/dump.c
===================================================================
--- trunk/eda/fped/dump.c 2009-11-27 19:18:44 UTC (rev 5714)
+++ trunk/eda/fped/dump.c 2009-11-27 19:55:25 UTC (rev 5715)
@@ -260,41 +260,51 @@
/* ----- vectors and objects ----------------------------------------------- */
-static char *generate_name(const struct vec *base)
+static void generate_name(struct vec *base)
{
- const struct vec *walk;
- int n;
+ char tmp[10]; /* plenty */
+ const char *s;
+ struct vec *walk;
+ int n = 0;
- n = 0;
- for (walk = base->frame->vecs; walk != base; walk = walk->next)
+ while (1) {
+ sprintf(tmp, "__%d", n);
+ s = unique(tmp);
+ for (walk = base->frame->vecs; walk; walk = walk->next)
+ if (walk->name == s)
+ break;
+ if (!walk)
+ break;
n++;
- return stralloc_printf("__%d", n);
+ }
+ base->name = s;
}
-static char *base_name(const struct vec *base, const struct vec *next)
+static const char *base_name(struct vec *base, const struct vec *next)
{
if (!base)
- return stralloc("@");
+ return "@";
if (next && base->next == next)
- return stralloc(".");
- if (base->name)
- return stralloc(base->name);
- return generate_name(base);
+ return ".";
+ if (!base->name)
+ generate_name(base);
+ return base->name;
}
-static char *obj_base_name(const struct vec *base, const struct vec *prev)
+static const char *obj_base_name(struct vec *base, const struct vec *prev)
{
if (base && base == prev)
- return stralloc(".");
+ return ".";
return base_name(base, NULL);
}
char *print_obj(const struct obj *obj, const struct vec *prev)
{
- char *base, *s, *s1, *s2, *s3;
+ const char *base, *s1, *s3;
+ char *s, *s2;
base = obj_base_name(obj->base, prev);
switch (obj->type) {
@@ -306,14 +316,12 @@
s1 = obj_base_name(obj->u.line.other, prev);
s2 = unparse(obj->u.line.width);
s = stralloc_printf("line %s %s %s", base, s1, s2);
- free(s1);
free(s2);
break;
case ot_rect:
s1 = obj_base_name(obj->u.rect.other, prev);
s2 = unparse(obj->u.rect.width);
s = stralloc_printf("rect %s %s %s", base, s1, s2);
- free(s1);
free(s2);
break;
case ot_pad:
@@ -337,26 +345,23 @@
s = stralloc_printf("%spad \"%s\" %s %s%s",
obj->u.pad.rounded ? "r" : "",
obj->u.pad.name, base, s1, s2);
- free(s1);
break;
case ot_arc:
s1 = obj_base_name(obj->u.arc.start, prev);
- s3 = unparse(obj->u.arc.width);
+ s2 = unparse(obj->u.arc.width);
if (obj->u.arc.start == obj->u.arc.end) {
- s = stralloc_printf("circ %s %s %s", base, s1, s3);
+ s = stralloc_printf("circ %s %s %s", base, s1, s2);
} else {
- s2 = obj_base_name(obj->u.arc.end, prev);
+ s3 = obj_base_name(obj->u.arc.end, prev);
s = stralloc_printf("arc %s %s %s %s",
- base, s1, s2, s3);
+ base, s1, s3, s2);
free(s2);
}
- free(s1);
- free(s3);
+ free(s2);
break;
default:
abort();
}
- free(base);
return s;
}
@@ -373,14 +378,12 @@
static char *print_meas_base(struct vec *base)
{
- char *name, *res;
+ const char *name;
name = base_name(base, NULL);
if (base->frame == root_frame)
- return name;
- res = stralloc_printf("%s.%s", base->frame->name, name);
- free(name);
- return res;
+ return stralloc(name);
+ return stralloc_printf("%s.%s", base->frame->name, name);
}
@@ -423,18 +426,18 @@
/* ----- print vector ------------------------------------------------------ */
-char *print_label(const struct vec *vec)
+const char *print_label(struct vec *vec)
{
- if (vec->name)
- return stralloc(vec->name);
- else
- return generate_name(vec);
+ if (!vec->name)
+ generate_name(vec);
+ return vec->name;
}
char *print_vec(const struct vec *vec)
{
- char *base, *x, *y, *s;
+ const char *base;
+ char *x, *y, *s;
base = base_name(vec->base, vec);
x = unparse(vec->x);
@@ -444,7 +447,6 @@
else {
s = stralloc_printf("vec %s(%s, %s)", base, x, y);
}
- free(base);
free(x);
free(y);
return s;
@@ -461,7 +463,8 @@
struct obj *obj;
struct order *order;
const struct order *item;
- char *s, *s1;
+ char *s;
+ const char *s1;
if (frame->dumped)
return;
Modified: trunk/eda/fped/dump.h
===================================================================
--- trunk/eda/fped/dump.h 2009-11-27 19:18:44 UTC (rev 5714)
+++ trunk/eda/fped/dump.h 2009-11-27 19:55:25 UTC (rev 5715)
@@ -34,7 +34,7 @@
};
-char *print_label(const struct vec *vec);
+const char *print_label(struct vec *vec);
char *print_vec(const struct vec *vec);
char *print_obj(const struct obj *obj, const struct vec *prev);
char *print_meas(const struct obj *obj);
Modified: trunk/eda/fped/gui_frame.c
===================================================================
--- trunk/eda/fped/gui_frame.c 2009-11-27 19:18:44 UTC (rev 5714)
+++ trunk/eda/fped/gui_frame.c 2009-11-27 19:55:25 UTC (rev 5715)
@@ -1167,9 +1167,7 @@
label_in_box_fg(item->obj->list_widget,
COLOR_ITEM_ERROR);
} else {
- s = print_label(item->vec);
- t = stralloc_printf("%s: ", s);
- free(s);
+ t = stralloc_printf("%s: ", print_label(item->vec));
item_label(tab, t, 0, n, NULL, NULL);
s = print_vec(item->vec);
More information about the commitlog
mailing list