r5397 - trunk/eda/fped

werner at docs.openmoko.org werner at docs.openmoko.org
Thu Aug 6 23:57:19 CEST 2009


Author: werner
Date: 2009-08-06 23:57:18 +0200 (Thu, 06 Aug 2009)
New Revision: 5397

Modified:
   trunk/eda/fped/delete.c
   trunk/eda/fped/expr.c
   trunk/eda/fped/expr.h
   trunk/eda/fped/fpd.y
   trunk/eda/fped/gui.c
Log:
- tables no longer try to fill the available space in the variables area
- added string-valued expressions (on-going)
- loops, tables, and rows can now be deleted/undeleted (still need columns)



Modified: trunk/eda/fped/delete.c
===================================================================
--- trunk/eda/fped/delete.c	2009-08-06 20:19:00 UTC (rev 5396)
+++ trunk/eda/fped/delete.c	2009-08-06 21:57:18 UTC (rev 5397)
@@ -26,6 +26,10 @@
 		dt_vec,
 		dt_obj,
 		dt_frame,
+		dt_table,
+		dt_row,
+		dt_column,
+		dt_loop,
 	} type;
 	union {
 		struct {
@@ -40,6 +44,24 @@
 			struct obj *ref;
 			struct obj *prev;
 		} obj;
+		struct {
+			struct table *ref;
+			struct table *prev;
+		} table;
+		struct {
+			struct row *ref;
+			struct row *prev;
+		} row;
+		struct {
+			struct var *var;
+			struct value *values;
+			struct table *table;
+			int n;
+		} col;
+		struct {
+			struct loop *ref;
+			struct loop *prev;
+		} loop;
 	} u;
 	int group;
 	struct deletion *next;
@@ -225,32 +247,125 @@
 	}
 }
 
-/* ----- tables ------------------------------------------------------------ */
 
 
+/* ----- rows -------------------------------------------------------------- */
+
+
 void delete_row(struct row *row)
 {
+	struct deletion *del;
+	struct row *walk, *prev;
+
+	groups++;
+	prev = NULL;
+	for (walk = row->table->rows; walk != row; walk = walk->next)
+		prev = walk;
+	if (prev)
+		prev->next = row->next;
+	else
+		row->table->rows = row->next;
+	del = new_deletion(dt_row);
+	del->u.row.ref = row;
+	del->u.row.prev = prev;
 }
 
 
+static void undelete_row(struct row *row, struct row *prev)
+{
+	if (prev) {
+		assert(row->next == prev->next);
+		prev->next = row;
+	} else {
+		assert(row->next == row->table->rows);
+		row->table->rows = row;
+	}
+}
+
+
+/* ----- columns ----------------------------------------------------------- */
+
+
 void delete_column(struct table *table, int n)
 {
+	groups++;
 }
 
 
+/* ----- tables ------------------------------------------------------------ */
+
+
 void delete_table(struct table *table)
 {
+	struct frame *frame = table->vars->frame;
+	struct deletion *del;
+	struct table *walk, *prev;
+
+	groups++;
+	prev = NULL;
+	for (walk = frame->tables; walk != table; walk = walk->next)
+		prev = walk;
+	if (prev)
+		prev->next = table->next;
+	else
+		frame->tables = table->next;
+	del = new_deletion(dt_table);
+	del->u.table.ref = table;
+	del->u.table.prev = prev;
 }
 
 
+static void undelete_table(struct table *table, struct table *prev)
+{
+	struct frame *frame = table->vars->frame;
+
+	if (prev) {
+		assert(table->next == prev->next);
+		prev->next = table;
+	} else {
+		assert(table->next == frame->tables);
+		frame->tables = table;
+	}
+}
+
+
 /* ----- loops ------------------------------------------------------------- */
 
 
 void delete_loop(struct loop *loop)
 {
+	struct frame *frame = loop->var.frame;
+	struct deletion *del;
+	struct loop *walk, *prev;
+
+	groups++;
+	prev = NULL;
+	for (walk = frame->loops; walk != loop; walk = walk->next)
+		prev = walk;
+	if (prev)
+		prev->next = loop->next;
+	else
+		frame->loops = loop->next;
+	del = new_deletion(dt_loop);
+	del->u.loop.ref = loop;
+	del->u.loop.prev = prev;
 }
 
 
+static void undelete_loop(struct loop *loop, struct loop *prev)
+{
+	struct frame *frame = loop->var.frame;
+
+	if (prev) {
+		assert(loop->next == prev->next);
+		prev->next = loop;
+	} else {
+		assert(loop->next == frame->loops);
+		frame->loops = loop;
+	}
+}
+
+
 /* ----- frames ------------------------------------------------------------ */
 
 
@@ -347,6 +462,15 @@
 	case dt_frame:
 		undelete_frame(del->u.frame.ref, del->u.frame.prev);
 		break;
+	case dt_loop:
+		undelete_loop(del->u.loop.ref, del->u.loop.prev);
+		break;
+	case dt_table:
+		undelete_table(del->u.table.ref, del->u.table.prev);
+		break;
+	case dt_row:
+		undelete_row(del->u.row.ref, del->u.row.prev);
+		break;
 	default:
 		abort();
 	}

Modified: trunk/eda/fped/expr.c
===================================================================
--- trunk/eda/fped/expr.c	2009-08-06 20:19:00 UTC (rev 5396)
+++ trunk/eda/fped/expr.c	2009-08-06 21:57:18 UTC (rev 5397)
@@ -101,6 +101,13 @@
 /* ----- primary expressions ----------------------------------------------- */
 
 
+struct num op_string(const struct expr *self, const struct frame *frame)
+{
+	fail("cannot evaluate string");
+	return undef;
+}
+
+
 struct num op_num(const struct expr *self, const struct frame *frame)
 {
 	return self->u.num;

Modified: trunk/eda/fped/expr.h
===================================================================
--- trunk/eda/fped/expr.h	2009-08-06 20:19:00 UTC (rev 5396)
+++ trunk/eda/fped/expr.h	2009-08-06 21:57:18 UTC (rev 5397)
@@ -43,6 +43,7 @@
 	union {
 		struct num num;
 		const char *var;
+		char *str;
 		struct {
 			struct expr *a;
 			struct expr *b;
@@ -107,6 +108,7 @@
 
 struct num op_num(const struct expr *self, const struct frame *frame);
 struct num op_var(const struct expr *self, const struct frame *frame);
+struct num op_string(const struct expr *self, const struct frame *frame);
 
 struct num op_minus(const struct expr *self, const struct frame *frame);
 

Modified: trunk/eda/fped/fpd.y
===================================================================
--- trunk/eda/fped/fpd.y	2009-08-06 20:19:00 UTC (rev 5396)
+++ trunk/eda/fped/fpd.y	2009-08-06 21:57:18 UTC (rev 5397)
@@ -530,6 +530,11 @@
 			$$ = new_op(op_var);
 			$$->u.var = $1;
 		}
+	| STRING
+		{
+			$$ = new_op(op_string);
+			$$->u.str = $1;
+		}
 	| '(' expr ')'
 		{
 			$$ = $2;

Modified: trunk/eda/fped/gui.c
===================================================================
--- trunk/eda/fped/gui.c	2009-08-06 20:19:00 UTC (rev 5396)
+++ trunk/eda/fped/gui.c	2009-08-06 21:57:18 UTC (rev 5397)
@@ -712,7 +712,7 @@
     struct table *table)
 {
 	GtkWidget *tab, *field;
-	GtkWidget *evbox;
+	GtkWidget *evbox, *align;
 	struct var *var;
 	struct row *row;
 	struct value *value;
@@ -729,7 +729,9 @@
 		return;
 
 	evbox = gtk_event_box_new();
-	gtk_box_pack_start(GTK_BOX(vbox), evbox, FALSE, FALSE, 0);
+	align = gtk_alignment_new(0, 0, 0, 0);
+	gtk_container_add(GTK_CONTAINER(align), evbox);
+	gtk_box_pack_start(GTK_BOX(vbox), align, FALSE, FALSE, 0);
 
 	tab = gtk_table_new(n_rows+1, n_vars, FALSE);
 	gtk_container_add(GTK_CONTAINER(evbox), tab);




More information about the commitlog mailing list