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