r5948 - trunk/eda/fped
werner at docs.openmoko.org
werner at docs.openmoko.org
Wed Apr 28 02:34:32 CEST 2010
Author: werner
Date: 2010-04-28 02:34:32 +0200 (Wed, 28 Apr 2010)
New Revision: 5948
Modified:
trunk/eda/fped/delete.c
trunk/eda/fped/dump.c
trunk/eda/fped/fpd.y
trunk/eda/fped/gui.c
trunk/eda/fped/gui_frame.c
trunk/eda/fped/gui_inst.c
trunk/eda/fped/gui_meas.c
trunk/eda/fped/inst.c
trunk/eda/fped/meas.c
trunk/eda/fped/obj.c
trunk/eda/fped/obj.h
Log:
Cleaned up the disgusting mess that was the list of frames. The changes:
- removed root_frame. "frames" now takes its place.
- removed frame->prev. In those few cases where we need the previous frame (for
deletion and dumping), we walk the list or recurse.
- the list of frames is now in GUI order, not file order.
- when reading the .fpd file, put the root frame first and leave it there.
- instead of walking the frames list and excluding the root frame by testing
frame->name, just start at frames->next
- likewise, instead of testing !frame->name just use frame == frames
Modified: trunk/eda/fped/delete.c
===================================================================
--- trunk/eda/fped/delete.c 2010-04-27 22:36:46 UTC (rev 5947)
+++ trunk/eda/fped/delete.c 2010-04-28 00:34:32 UTC (rev 5948)
@@ -177,7 +177,12 @@
delete_vecs_by_ref(vec->frame->vecs, vec);
delete_objs_by_ref(&vec->frame->objs, vec);
- delete_objs_by_ref(&root_frame->objs, vec); /* catch measurements */
+ /*
+ * Catch measurements. During final cleanup, we may operate on an empty
+ * list of frames, hence the test.
+ */
+ if (frames)
+ delete_objs_by_ref(&frames->objs, vec);
}
@@ -546,19 +551,18 @@
void delete_frame(struct frame *frame)
{
struct deletion *del;
-
+ struct frame *walk;
groups++;
del = new_deletion(dt_frame);
del->u.frame.ref = frame;
- del->u.frame.prev = frame->prev;
-
- if (frame->next)
- frame->next->prev = frame->prev;
- if (frame->prev)
- frame->prev->next = frame->next;
+ del->u.frame.prev = NULL;
+ for (walk = frames; walk != frame; walk = walk->next)
+ del->u.frame.prev = walk;
+ if (del->u.frame.prev)
+ del->u.frame.prev->next = frame->next;
else
- frames = frame->next;
+ frames = frame->next; /* hmm, deleting the root frame ? */
delete_references(frame);
}
@@ -573,7 +577,6 @@
assert(frame->next == frames);
frames = frame;
}
- frame->next->prev = frame;
}
Modified: trunk/eda/fped/dump.c
===================================================================
--- trunk/eda/fped/dump.c 2010-04-27 22:36:46 UTC (rev 5947)
+++ trunk/eda/fped/dump.c 2010-04-28 00:34:32 UTC (rev 5948)
@@ -394,7 +394,7 @@
const char *name;
name = base_name(base, NULL);
- if (base->frame == root_frame)
+ if (base->frame == frames)
return stralloc(name);
return stralloc_printf("%s.%s", base->frame->name, name);
}
@@ -546,6 +546,15 @@
}
+static void reverse_frames(FILE *file, struct frame *last)
+{
+ if (last) {
+ reverse_frames(file, last->next);
+ dump_frame(file, last, "\t");
+ }
+}
+
+
int dump(FILE *file)
{
struct frame *frame;
@@ -553,15 +562,12 @@
fprintf(file, "%s\n", MACHINE_GENERATED);
for (frame = frames; frame; frame = frame->next)
frame->dumped = 0;
- for (frame = frames; frame; frame = frame->next) {
- if (!frame->name) {
- fprintf(file, "package \"%s\"\n", pkg_name);
- dump_unit(file);
- dump_frame(file, frame, "");
- } else {
- dump_frame(file, frame, "\t");
- }
- }
+
+ reverse_frames(file, frames->next);
+ fprintf(file, "package \"%s\"\n", pkg_name);
+ dump_unit(file);
+ dump_frame(file, frames, "");
+
fflush(file);
return !ferror(file);
}
Modified: trunk/eda/fped/fpd.y
===================================================================
--- trunk/eda/fped/fpd.y 2010-04-27 22:36:46 UTC (rev 5947)
+++ trunk/eda/fped/fpd.y 2010-04-28 00:34:32 UTC (rev 5948)
@@ -35,7 +35,6 @@
static struct table *curr_table;
static struct row *curr_row;
-static struct frame *last_frame = NULL;
static struct vec *last_vec = NULL;
static struct table **next_table;
@@ -54,7 +53,7 @@
{
struct frame *f;
- for (f = frames; f; f = f->next)
+ for (f = frames->next; f; f = f->next)
if (f->name == name)
return f;
return NULL;
@@ -210,8 +209,6 @@
yyerrorf("a frame can't delete itself");
return 0;
}
- if (last_frame == frame)
- last_frame = frame->prev;
delete_frame(frame);
return 1;
}
@@ -317,16 +314,6 @@
}
-static void append_root_frame(void)
-{
- root_frame->prev = last_frame;
- if (last_frame)
- last_frame->next = root_frame;
- else
- frames = root_frame;
-}
-
-
%}
@@ -387,16 +374,13 @@
all:
START_FPD
{
- root_frame = zalloc_type(struct frame);
- set_frame(root_frame);
+ frames = zalloc_type(struct frame);
+ set_frame(frames);
id_sin = unique("sin");
id_cos = unique("cos");
id_sqrt = unique("sqrt");
}
fpd
- {
- append_root_frame();
- }
| START_EXPR expr
{
expr_result = $2;
@@ -471,16 +455,12 @@
curr_frame = zalloc_type(struct frame);
curr_frame->name = $2;
set_frame(curr_frame);
- curr_frame->prev = last_frame;
- if (last_frame)
- last_frame->next = curr_frame;
- else
- frames = curr_frame;
- last_frame = curr_frame;
+ curr_frame->next = frames->next;
+ frames->next = curr_frame;
}
opt_frame_items '}'
{
- set_frame(root_frame);
+ set_frame(frames);
}
;
@@ -535,13 +515,11 @@
debug_item:
TOK_DBG_DEL ID
{
- append_root_frame();
if (!dbg_delete(NULL, $2))
YYABORT;
}
| TOK_DBG_DEL ID '.' ID
{
- append_root_frame();
if (!dbg_delete($2, $4))
YYABORT;
}
@@ -562,13 +540,6 @@
}
| TOK_DBG_DUMP
{
- /*
- * It's okay to do append the root frame multiple
- * times. If more frames are added afterwards, they
- * just replace the root frame until it gets appended a
- * final time when parsing ends.
- */
- append_root_frame();
if (!dump(stdout)) {
perror("stdout");
exit(1);
@@ -929,7 +900,7 @@
qbase:
ID
{
- $$ = find_vec(root_frame, $1);
+ $$ = find_vec(frames, $1);
if (!$$) {
yyerrorf("unknown vector \"%s\"", $1);
YYABORT;
Modified: trunk/eda/fped/gui.c
===================================================================
--- trunk/eda/fped/gui.c 2010-04-27 22:36:46 UTC (rev 5947)
+++ trunk/eda/fped/gui.c 2010-04-28 00:34:32 UTC (rev 5948)
@@ -393,7 +393,7 @@
gui_setup_style(root->window);
init_canvas();
edit_nothing();
- select_frame(root_frame);
+ select_frame(frames);
make_popups();
gtk_main();
Modified: trunk/eda/fped/gui_frame.c
===================================================================
--- trunk/eda/fped/gui_frame.c 2010-04-27 22:36:46 UTC (rev 5947)
+++ trunk/eda/fped/gui_frame.c 2010-04-28 00:34:32 UTC (rev 5948)
@@ -114,13 +114,8 @@
new = zalloc_type(struct frame);
new->name = unique("_");
- new->next = parent;
- new->prev = parent->prev;
- if (parent->prev)
- parent->prev->next = new;
- else
- frames = new;
- parent->prev = new;
+ new->next = parent->next;
+ parent->next = new;
change_world();
}
@@ -129,10 +124,10 @@
{
struct frame *frame = popup_data;
- assert(frame != root_frame);
+ assert(frame != frames);
delete_frame(frame);
if (active_frame == frame)
- select_frame(root_frame);
+ select_frame(frames);
change_world();
}
@@ -166,8 +161,8 @@
{
const struct frame *frame;
- for (frame = frames; frame; frame = frame->next)
- if (frame->name && !strcmp(frame->name, "_"))
+ for (frame = frames->next; frame; frame = frame->next)
+ if (!strcmp(frame->name, "_"))
return FALSE;
return TRUE;
}
@@ -206,7 +201,7 @@
{
gtk_widget_set_sensitive(
gtk_item_factory_get_item(factory_frame, "/Delete frame"),
- frame != root_frame);
+ frame != frames);
gtk_widget_set_sensitive(
gtk_item_factory_get_item(factory_frame, "/Add frame"),
@@ -1638,8 +1633,8 @@
if (!is_id(s))
return 0;
- for (f = frames; f; f = f->next)
- if (f->name && !strcmp(f->name, s))
+ for (f = frames->next; f; f = f->next)
+ if (!strcmp(f->name, s))
return 0;
return 1;
}
@@ -1818,7 +1813,7 @@
gtk_table_attach_defaults(GTK_TABLE(tab), packages, 1, 2, 0, 1);
n = 0;
- for (frame = root_frame; frame; frame = frame->prev) {
+ for (frame = frames; frame; frame = frame->next) {
label = build_frame_label(frame);
gtk_table_attach_defaults(GTK_TABLE(tab), label,
0, 1, n*2+1, n*2+2);
@@ -1830,7 +1825,7 @@
wrap_width -= max_name_width+FRAME_AREA_MISC_WIDTH;
n = 0;
- for (frame = root_frame; frame; frame = frame->prev) {
+ for (frame = frames; frame; frame = frame->next) {
refs = build_frame_refs(frame);
gtk_table_attach_defaults(GTK_TABLE(tab), refs,
1, 2, n*2+1, n*2+2);
@@ -1850,7 +1845,7 @@
}
if (!show_vars) {
- meas = build_meas(root_frame);
+ meas = build_meas(frames);
gtk_table_attach_defaults(GTK_TABLE(tab), meas,
1, 2, n*2+2, n*2+3);
}
Modified: trunk/eda/fped/gui_inst.c
===================================================================
--- trunk/eda/fped/gui_inst.c 2010-04-27 22:36:46 UTC (rev 5947)
+++ trunk/eda/fped/gui_inst.c 2010-04-28 00:34:32 UTC (rev 5948)
@@ -650,7 +650,7 @@
gc = self->u.frame.active ? gc_active_frame : gc_frame[get_mode(self)];
draw_eye(gc, center, FRAME_EYE_R1, FRAME_EYE_R2);
- if (!self->u.frame.ref->name)
+ if (self->u.frame.ref == frames)
return;
corner = translate(corner);
corner.x -= FRAME_CLEARANCE;
Modified: trunk/eda/fped/gui_meas.c
===================================================================
--- trunk/eda/fped/gui_meas.c 2010-04-27 22:36:46 UTC (rev 5947)
+++ trunk/eda/fped/gui_meas.c 2010-04-28 00:34:32 UTC (rev 5948)
@@ -277,7 +277,7 @@
return 0;
/* it's safe to pass "from" here, but we may change it later */
obj = new_obj_unconnected(ot_meas, from);
- connect_obj(root_frame, obj);
+ connect_obj(frames, obj);
meas = &obj->u.meas;
meas->label = NULL;
switch (mode) {
Modified: trunk/eda/fped/inst.c
===================================================================
--- trunk/eda/fped/inst.c 2010-04-27 22:36:46 UTC (rev 5947)
+++ trunk/eda/fped/inst.c 2010-04-28 00:34:32 UTC (rev 5948)
@@ -82,7 +82,7 @@
if (inst->ops == &frame_ops && inst->u.frame.ref == active_frame)
return 1;
if (!inst->outer)
- return active_frame == root_frame;
+ return active_frame == frames;
return inst->outer->u.frame.ref == active_frame;
}
Modified: trunk/eda/fped/meas.c
===================================================================
--- trunk/eda/fped/meas.c 2010-04-27 22:36:46 UTC (rev 5947)
+++ trunk/eda/fped/meas.c 2010-04-28 00:34:32 UTC (rev 5948)
@@ -232,7 +232,7 @@
struct coord a0, b0;
lt_op_type lt;
- for (obj = root_frame->objs; obj; obj = obj->next) {
+ for (obj = frames->objs; obj; obj = obj->next) {
if (obj->type != ot_meas)
continue;
meas = &obj->u.meas;
Modified: trunk/eda/fped/obj.c
===================================================================
--- trunk/eda/fped/obj.c 2010-04-27 22:36:46 UTC (rev 5947)
+++ trunk/eda/fped/obj.c 2010-04-28 00:34:32 UTC (rev 5948)
@@ -34,7 +34,6 @@
char *pkg_name = NULL;
struct frame *frames = NULL;
-struct frame *root_frame = NULL;
struct frame *active_frame = NULL;
void *instantiation_error = NULL;
@@ -255,7 +254,7 @@
goto error;
break;
case ot_meas:
- assert(frame == root_frame);
+ assert(frame == frames);
offset = eval_unit_default(obj->u.meas.offset, frame,
DEFAULT_OFFSET);
if (is_undef(offset))
@@ -278,7 +277,7 @@
char *s;
int ok;
- if (!frame->name) {
+ if (frame == frames) {
s = expand(pkg_name, frame);
inst_select_pkg(s);
free(s);
@@ -471,7 +470,7 @@
reset_found();
found = 0;
search_suspended = 0;
- ok = generate_frame(root_frame, zero, NULL, NULL, 1);
+ ok = generate_frame(frames, zero, NULL, NULL, 1);
if (ok && (find_vec || find_obj) && found)
activate_found();
find_vec = NULL;
Modified: trunk/eda/fped/obj.h
===================================================================
--- trunk/eda/fped/obj.h 2010-04-27 22:36:46 UTC (rev 5947)
+++ trunk/eda/fped/obj.h 2010-04-28 00:34:32 UTC (rev 5948)
@@ -156,7 +156,6 @@
struct vec *vecs;
struct obj *objs;
struct frame *next;
- struct frame *prev; /* for the list of frames in the GUI */
/* used during generation */
const struct frame *curr_parent;
@@ -236,9 +235,8 @@
};
-extern char *pkg_name;
-extern struct frame *frames;
-extern struct frame *root_frame;
+extern char *pkg_name; /* anonymous common package first */
+extern struct frame *frames; /* root frame first */
extern struct frame *active_frame;
extern void *instantiation_error;
More information about the commitlog
mailing list