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