Send commitlog mailing list submissions to
        commitlog@lists.openmoko.org

To subscribe or unsubscribe via the World Wide Web, visit
        http://lists.openmoko.org/mailman/listinfo/commitlog
or, via email, send a message with subject or body 'help' to
        commitlog-requ...@lists.openmoko.org

You can reach the person managing the list at
        commitlog-ow...@lists.openmoko.org

When replying, please edit your Subject line so it is more specific
than "Re: Contents of commitlog digest..."
Today's Topics:

   1. r5333 - developers/werner/fped (wer...@docs.openmoko.org)
   2. r5334 - developers/werner/fped (wer...@docs.openmoko.org)
--- Begin Message ---
Author: werner
Date: 2009-07-29 03:53:01 +0200 (Wed, 29 Jul 2009)
New Revision: 5333

Modified:
   developers/werner/fped/gui.c
   developers/werner/fped/gui_canvas.c
   developers/werner/fped/gui_canvas.h
   developers/werner/fped/inst.c
   developers/werner/fped/inst.h
   developers/werner/fped/obj.c
Log:
- store pointer to object of model in instances
- added area for operating on variables (on-going)



Modified: developers/werner/fped/gui.c
===================================================================
--- developers/werner/fped/gui.c        2009-07-28 21:50:48 UTC (rev 5332)
+++ developers/werner/fped/gui.c        2009-07-29 01:53:01 UTC (rev 5333)
@@ -67,36 +67,92 @@
 }
 
 
-static void show_vars(GtkWidget *var_list)
+static void add_sep(GtkWidget *box, int size)
 {
-       GtkListStore *list;
+       GtkWidget *sep;
+       GdkColor black = { 0, 0, 0, 0 };
 
-       list = gtk_list_store_new(1, G_TYPE_STRING);
+       sep = gtk_drawing_area_new();
+       gtk_box_pack_start(GTK_BOX(box), sep, FALSE, TRUE, size);
+       gtk_widget_modify_bg(sep, GTK_STATE_NORMAL, &black);
+}
 
-       gtk_tree_view_set_model(GTK_TREE_VIEW(var_list),
-           GTK_TREE_MODEL(list));
-       g_object_unref(list);
+
+/*static*/ GdkColor get_color(GdkColormap *cmap, const char *spec)
+;
+static void build_table(GtkWidget *vbox, struct frame *frame,
+     struct table *table)
+{
+       GtkWidget *tab, *field;
+       struct var *var;
+       struct row *row;
+       struct value *value;
+       int n_vars = 0, n_rows = 0;
+
+       for (var = table->vars; var; var = var->next)
+               n_vars++;
+       for (row = table->rows; row; row = row->next)
+               n_rows++;
+
+       tab = gtk_table_new(n_rows+1, n_vars, FALSE);
+       gtk_table_set_row_spacings(GTK_TABLE(tab), 1);
+       gtk_table_set_col_spacings(GTK_TABLE(tab), 1);
+       gtk_box_pack_start(GTK_BOX(vbox), tab, FALSE, FALSE, 0);
+
+       n_vars = 0;
+       for (var = table->vars; var; var = var->next) {
+               field = gtk_label_new(var->name);
+               gtk_table_attach_defaults(GTK_TABLE(tab), field,
+                   n_vars, n_vars+1, 0, 1);
+               n_vars++;
+       }
+       n_rows = 0;
+       for (row = table->rows; row; row = row->next) {
+               n_vars = 0;
+               for (value = row->values; value; value = value->next) {
+                       field = gtk_label_new("???");
+                       gtk_table_attach_defaults(GTK_TABLE(tab), field,
+                           n_vars, n_vars+1,
+                           n_rows+1, n_rows+2);
+                       n_vars++;
+               }
+               n_rows++;
+       }
 }
 
 
-static void show_rows(GtkWidget *row_list)
+static void build_loop(GtkWidget *vbox, struct frame *frame,
+     struct loop *loop)
 {
-       GtkListStore *list;
+}
 
-       list = gtk_list_store_new(1, G_TYPE_STRING);
 
-       gtk_tree_view_set_model(GTK_TREE_VIEW(row_list),
-           GTK_TREE_MODEL(list));
-       g_object_unref(list);
+static void build_vars(GtkWidget *vbox, struct frame *frame)
+{
+       struct table *table;
+       struct loop *loop;
+
+{
+       GtkWidget *field;
+                       field = gtk_label_new("XXX");
+       gtk_box_pack_start(GTK_BOX(vbox), field, FALSE, FALSE, 0);
 }
+       for (table = frame->tables; table; table = table->next) {
+               add_sep(vbox, 3);
+               build_table(vbox, frame, table);
+       }
+       for (loop = frame->loops; loop; loop = loop->next) {
+               add_sep(vbox, 3);
+               build_loop(vbox, frame, loop);
+       }
+}
 
 
 static void make_center_area(GtkWidget *vbox)
 {
-       GtkWidget *hbox;
-       GtkWidget *frame_list, *var_list, *row_list;
-       GtkWidget *sep;
-       GdkColor black = { 0, 0, 0, 0 };
+       GtkWidget *hbox, *vars, *paned, *v2box;
+       GtkWidget *frame_list;
+       GtkTreeSelection *sel;
 
        hbox = gtk_hbox_new(FALSE, 0);
        gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
@@ -106,54 +162,30 @@
        frame_list = gtk_tree_view_new();
        gtk_box_pack_start(GTK_BOX(hbox), frame_list, FALSE, TRUE, 0);
 
+       sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(frame_list));
+       gtk_tree_selection_set_mode(sel, GTK_SELECTION_BROWSE);
        gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(frame_list),
            -1, "Frame", gtk_cell_renderer_text_new(), "text", 0, NULL);
 
        show_frames(frame_list);
 
-       sep = gtk_drawing_area_new();
-       gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, TRUE, 2);
-       gtk_widget_modify_bg(sep, GTK_STATE_NORMAL, &black);
+       add_sep(hbox, 2);
 
-       /*
-        * @@@ is this really a good way to present variables ?
-        *
-        * a way to show entire tables may be preferable. also, showing all
-        * tables of a frame at the same time may be more convenient than such
-        * a "peephole" access.
-        */
+       paned = gtk_hpaned_new();
+       gtk_box_pack_start(GTK_BOX(hbox), paned, TRUE, TRUE, 0);
+       
+       /* Variables */
 
-       /* Variable list */
+       vars = gtk_scrolled_window_new(NULL, NULL);
+       gtk_paned_add1(GTK_PANED(paned), vars);
+       gtk_widget_set_size_request(vars, 100, 100);
+       v2box = gtk_vbox_new(FALSE, 0);
+       gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(vars), v2box);
+       build_vars(v2box, frames);
 
-       var_list = gtk_tree_view_new();
-       gtk_box_pack_start(GTK_BOX(hbox), var_list, FALSE, TRUE, 0);
-
-       gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(var_list),
-           -1, "Variable", gtk_cell_renderer_text_new(), "text", 0, NULL);
-
-       show_vars(var_list);
-
-       sep = gtk_drawing_area_new();
-       gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, TRUE, 2);
-       gtk_widget_modify_bg(sep, GTK_STATE_NORMAL, &black);
-
-       /* Row list */
-
-       row_list = gtk_tree_view_new();
-       gtk_box_pack_start(GTK_BOX(hbox), row_list, FALSE, TRUE, 0);
-
-       gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(row_list),
-           -1, "Row", gtk_cell_renderer_text_new(), "text", 0, NULL);
-
-       show_rows(row_list);
-
-       sep = gtk_drawing_area_new();
-       gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, TRUE, 2);
-       gtk_widget_modify_bg(sep, GTK_STATE_NORMAL, &black);
-
        /* Canvas */
 
-       make_canvas(hbox);
+       gtk_paned_add2(GTK_PANED(paned), make_canvas());
 }
 
 

Modified: developers/werner/fped/gui_canvas.c
===================================================================
--- developers/werner/fped/gui_canvas.c 2009-07-28 21:50:48 UTC (rev 5332)
+++ developers/werner/fped/gui_canvas.c 2009-07-29 01:53:01 UTC (rev 5333)
@@ -270,7 +270,7 @@
 /* ----- canvas setup ------------------------------------------------------ */
 
 
-void make_canvas(GtkWidget *hbox)
+GtkWidget *make_canvas(void)
 {
        GtkWidget *canvas;
        GdkColor black = { 0, 0, 0, 0 };
@@ -278,7 +278,6 @@
        /* Canvas */
 
        canvas = gtk_drawing_area_new();
-       gtk_box_pack_start(GTK_BOX(hbox), canvas, TRUE, TRUE, 0);
        gtk_widget_modify_bg(canvas, GTK_STATE_NORMAL, &black);
 
        g_signal_connect(G_OBJECT(canvas), "motion_notify_event",
@@ -310,4 +309,6 @@
            GDK_POINTER_MOTION_MASK);
 
        ctx.widget = canvas;
+
+       return canvas;
 }

Modified: developers/werner/fped/gui_canvas.h
===================================================================
--- developers/werner/fped/gui_canvas.h 2009-07-28 21:50:48 UTC (rev 5332)
+++ developers/werner/fped/gui_canvas.h 2009-07-29 01:53:01 UTC (rev 5333)
@@ -17,6 +17,6 @@
 #include <gtk/gtk.h>
 
 
-void make_canvas(GtkWidget *vbox) ;
+GtkWidget *make_canvas(void);
 
 #endif /* !GUI_CANVAS_H */

Modified: developers/werner/fped/inst.c
===================================================================
--- developers/werner/fped/inst.c       2009-07-28 21:50:48 UTC (rev 5332)
+++ developers/werner/fped/inst.c       2009-07-29 01:53:01 UTC (rev 5333)
@@ -53,6 +53,7 @@
        inst = alloc_type(struct inst);
        inst->ops = ops;
        inst->base = inst->bbox.min = inst->bbox.max = base;
+       inst->outer = curr_frame;
        inst->next = NULL;
        *next_inst = inst;
        next_inst = &inst->next;
@@ -82,6 +83,7 @@
        struct inst *inst;
 
        inst = add_inst(&vec_ops, base);
+       inst->vec = vec;
        inst->u.end = vec->pos;
        update_bbox(&inst->bbox, vec->pos);
        propagate_bbox(inst);
@@ -106,11 +108,12 @@
 };
 
 
-int inst_line(struct coord a, struct coord b)
+int inst_line(struct obj *obj, struct coord a, struct coord b)
 {
        struct inst *inst;
 
        inst = add_inst(&line_ops, a);
+       inst->obj = obj;
        inst->u.end = b;
        update_bbox(&inst->bbox, b);
        propagate_bbox(inst);
@@ -135,11 +138,12 @@
 };
 
 
-int inst_rect(struct coord a, struct coord b)
+int inst_rect(struct obj *obj, struct coord a, struct coord b)
 {
        struct inst *inst;
 
        inst = add_inst(&rect_ops, a);
+       inst->obj = obj;
        inst->u.end = b;
        update_bbox(&inst->bbox, b);
        propagate_bbox(inst);
@@ -164,11 +168,12 @@
 };
 
 
-int inst_pad(const char *name, struct coord a, struct coord b)
+int inst_pad(struct obj *obj, const char *name, struct coord a, struct coord b)
 {
        struct inst *inst;
 
        inst = add_inst(&pad_ops, a);
+       inst->obj = obj;
        inst->u.name = stralloc(name);
        update_bbox(&inst->bbox, b);
        propagate_bbox(inst);
@@ -193,12 +198,14 @@
 };
 
 
-int inst_arc(struct coord center, struct coord start, struct coord end)
+int inst_arc(struct obj *obj, struct coord center, struct coord start,
+    struct coord end)
 {
        struct inst *inst;
        double r, a1, a2;
 
        inst = add_inst(&arc_ops, center);
+       inst->obj = obj;
        r = hypot(start.x-center.x, start.y-center.y);
        a1 = atan2(start.y-center.y, start.x-center.x)/M_PI*180.0;
        a2 = atan2(end.y-center.y, end.x-center.x)/M_PI*180.0;
@@ -241,7 +248,6 @@
 
        inst = add_inst(&frame_ops, base);
        inst->u.frame.ref = frame;
-       inst->u.frame.outer = curr_frame;
        curr_frame = inst;
 }
 
@@ -250,7 +256,7 @@
 {
        struct inst *inst = curr_frame;
 
-       curr_frame = curr_frame->u.frame.outer;
+       curr_frame = curr_frame->outer;
        if (curr_frame)
                propagate_bbox(inst);
 }

Modified: developers/werner/fped/inst.h
===================================================================
--- developers/werner/fped/inst.h       2009-07-28 21:50:48 UTC (rev 5332)
+++ developers/werner/fped/inst.h       2009-07-29 01:53:01 UTC (rev 5333)
@@ -38,10 +38,12 @@
        const struct inst_ops *ops;
        struct coord base;
        struct bbox bbox;
+       struct vec *vec; /* undefined if not vector */
+       struct obj *obj; /* undefined if not object */
+       struct inst *outer; /* frame containing this item */
        union {
                struct {
                        const struct frame *ref;
-                       struct inst *outer;
                } frame;
                const char *name;
                struct coord end;
@@ -55,13 +57,17 @@
 
 
 int inst_vec(struct vec *vec, struct coord base);
-int inst_line(struct coord a, struct coord b);
-int inst_rect(struct coord a, struct coord b);
-int inst_pad(const char *name, struct coord a, struct coord b);
-int inst_arc(struct coord center, struct coord start, struct coord stop);
+int inst_line(struct obj *obj, struct coord a, struct coord b);
+int inst_rect(struct obj *obj, struct coord a, struct coord b);
+int inst_pad(struct obj *obj, const char *name, struct coord a, struct coord 
b);
+int inst_arc(struct obj *obj, struct coord center, struct coord start,
+    struct coord stop);
+
 void inst_begin_frame(const struct frame *frame, struct coord base); 
 void inst_end_frame(const struct frame *frame);
+
 struct bbox inst_get_bbox(void);
+
 void inst_reset(void);
 void inst_draw(struct draw_ctx *ctx);
 void inst_debug(void);

Modified: developers/werner/fped/obj.c
===================================================================
--- developers/werner/fped/obj.c        2009-07-28 21:50:48 UTC (rev 5332)
+++ developers/werner/fped/obj.c        2009-07-29 01:53:01 UTC (rev 5333)
@@ -131,12 +131,12 @@
                                return 0;
                        break;
                case ot_line:
-                       if (!inst_line(obj->base ? obj->base->pos : base,
+                       if (!inst_line(obj, obj->base ? obj->base->pos : base,
                            obj->u.line.other ? obj->u.line.other->pos : base))
                                return 0;
                        break;
                case ot_rect:
-                       if (!inst_rect(obj->base ? obj->base->pos : base,
+                       if (!inst_rect(obj, obj->base ? obj->base->pos : base,
                            obj->u.rect.other ? obj->u.rect.other->pos : base))
                                return 0;
                        break;
@@ -144,7 +144,7 @@
                        name = expand(obj->u.pad.name, frame);
                        if (!name)
                                return 0;
-                       res = inst_pad(name,
+                       res = inst_pad(obj, name,
                            obj->base ? obj->base->pos : base,
                            obj->u.pad.other ? obj->u.pad.other->pos : base);
                        free(name);
@@ -152,7 +152,7 @@
                                return 0;
                        break;
                case ot_arc:
-                       if (!inst_arc(obj->base ? obj->base->pos : base,
+                       if (!inst_arc(obj, obj->base ? obj->base->pos : base,
                            obj->u.arc.start ? obj->u.arc.start->pos : base,
                            obj->u.arc.end ? obj->u.arc.end->pos : base))
                                return 0;




--- End Message ---
--- Begin Message ---
Author: werner
Date: 2009-07-29 05:31:56 +0200 (Wed, 29 Jul 2009)
New Revision: 5334

Added:
   developers/werner/fped/unparse.c
   developers/werner/fped/unparse.h
Modified:
   developers/werner/fped/Makefile
   developers/werner/fped/gui.c
   developers/werner/fped/qfn.fpd
Log:
Added unparse() function to dump an expression into a string.



Modified: developers/werner/fped/Makefile
===================================================================
--- developers/werner/fped/Makefile     2009-07-29 01:53:01 UTC (rev 5333)
+++ developers/werner/fped/Makefile     2009-07-29 03:31:56 UTC (rev 5334)
@@ -11,6 +11,7 @@
 #
 
 OBJS = fped.o expr.o coord.o obj.o inst.o util.o error.o \
+       unparse.o \
        cpp.o lex.yy.o y.tab.o \
        gui.o gui_style.o gui_inst.o gui_status.o gui_canvas.o
 

Modified: developers/werner/fped/gui.c
===================================================================
--- developers/werner/fped/gui.c        2009-07-29 01:53:01 UTC (rev 5333)
+++ developers/werner/fped/gui.c        2009-07-29 03:31:56 UTC (rev 5334)
@@ -11,10 +11,12 @@
  */
 
 
+#include <stdlib.h>
 #include <math.h>
 #include <gtk/gtk.h>
 
 #include "obj.h"
+#include "unparse.h"
 #include "gui_status.h"
 #include "gui_canvas.h"
 #include "gui.h"
@@ -78,8 +80,6 @@
 }
 
 
-/*static*/ GdkColor get_color(GdkColormap *cmap, const char *spec)
-;
 static void build_table(GtkWidget *vbox, struct frame *frame,
      struct table *table)
 {
@@ -88,6 +88,7 @@
        struct row *row;
        struct value *value;
        int n_vars = 0, n_rows = 0;
+       char *expr;
 
        for (var = table->vars; var; var = var->next)
                n_vars++;
@@ -110,7 +111,9 @@
        for (row = table->rows; row; row = row->next) {
                n_vars = 0;
                for (value = row->values; value; value = value->next) {
-                       field = gtk_label_new("???");
+                       expr = unparse(value->expr);
+                       field = gtk_label_new(expr);
+                       free(expr);
                        gtk_table_attach_defaults(GTK_TABLE(tab), field,
                            n_vars, n_vars+1,
                            n_rows+1, n_rows+2);
@@ -124,6 +127,8 @@
 static void build_loop(GtkWidget *vbox, struct frame *frame,
      struct loop *loop)
 {
+       gtk_box_pack_start(GTK_BOX(vbox), gtk_label_new(loop->var),
+           FALSE, FALSE, 0);
 }
 
 
@@ -132,11 +137,6 @@
        struct table *table;
        struct loop *loop;
 
-{
-       GtkWidget *field;
-                       field = gtk_label_new("XXX");
-       gtk_box_pack_start(GTK_BOX(vbox), field, FALSE, FALSE, 0);
-}
        for (table = frame->tables; table; table = table->next) {
                add_sep(vbox, 3);
                build_table(vbox, frame, table);

Modified: developers/werner/fped/qfn.fpd
===================================================================
--- developers/werner/fped/qfn.fpd      2009-07-29 01:53:01 UTC (rev 5333)
+++ developers/werner/fped/qfn.fpd      2009-07-29 03:31:56 UTC (rev 5334)
@@ -36,3 +36,9 @@
 
 r2 = .vec c 0mm, 0.8mm
 .arc c r2
+
+/*
+x1 = 1+2*3
+x2 = (1+2)*3
+x3 = 1-(2+3)
+*/

Added: developers/werner/fped/unparse.c
===================================================================
--- developers/werner/fped/unparse.c                            (rev 0)
+++ developers/werner/fped/unparse.c    2009-07-29 03:31:56 UTC (rev 5334)
@@ -0,0 +1,110 @@
+/*
+ * unparse.c - Dump an expression tree into a string
+ *
+ * Written 2009 by Werner Almesberger
+ * Copyright 2009 by Werner Almesberger
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+/*
+ * This is crazily inefficient but who cares :-)
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "util.h"
+#include "expr.h"
+#include "unparse.h"
+
+
+enum prec {
+       prec_add,
+       prec_mult,
+       prec_unary,
+       prec_primary,
+};
+
+
+static int precedence(op_type op)
+{
+       if (op == op_add || op == op_sub)
+               return prec_add;
+       if (op == op_mult || op == op_div)
+               return prec_mult;
+       if (op == op_minus)
+               return prec_unary;
+       if (op == op_num || op == op_var)
+               return prec_primary;
+       abort();
+}
+
+
+static char *merge3(char *a, const char *op, char *b)
+{
+       char *buf;
+
+       buf = alloc_size(strlen(op)+strlen(a)+strlen(b)+1);
+       sprintf(buf, "%s%s%s", a, op, b);
+       free(a);
+       free(b);
+       return buf;
+}
+
+
+static char *merge2(const char *op, char *a)
+{
+       char *buf;
+
+       buf = alloc_size(strlen(op)+strlen(a)+1);
+       sprintf(buf, "%s%s", op, a);
+       free(a);
+       return buf;
+}
+
+
+static char *unparse_op(const struct expr *expr, enum prec prec)
+{
+       char tmp[100];
+       char *buf, *temp;
+
+       
+       if (prec > precedence(expr->op)) {
+               temp = unparse_op(expr, prec_add);
+               buf = alloc_size(strlen(temp)+3);
+               sprintf(buf, "(%s)", temp);
+               free(temp);
+               return buf;
+       }
+       if (expr->op == op_num) {
+               snprintf(tmp, sizeof(tmp), "%lg", expr->u.num);
+               return stralloc(tmp);
+       }
+       if (expr->op == op_var)
+               return stralloc(expr->u.var);
+       if (expr->op == op_minus)
+               return merge2("-", unparse_op(expr->u.op.a, prec_add));
+       if (expr->op == op_add)
+               return merge3(unparse_op(expr->u.op.a, prec_add), "+",
+                   unparse_op(expr->u.op.b, prec_add));
+       if (expr->op == op_sub)
+               return merge3(unparse_op(expr->u.op.a, prec_add), "-",
+                   unparse_op(expr->u.op.b, prec_mult));
+       if (expr->op == op_mult)
+               return merge3(unparse_op(expr->u.op.a, prec_mult), "*",
+                   unparse_op(expr->u.op.b, prec_mult));
+       if (expr->op == op_div)
+               return merge3(unparse_op(expr->u.op.a, prec_mult), "/",
+                   unparse_op(expr->u.op.b, prec_primary));
+       abort();
+}
+
+
+char *unparse(const struct expr *expr)
+{
+       return expr ? unparse_op(expr, prec_add) : stralloc("");
+}

Added: developers/werner/fped/unparse.h
===================================================================
--- developers/werner/fped/unparse.h                            (rev 0)
+++ developers/werner/fped/unparse.h    2009-07-29 03:31:56 UTC (rev 5334)
@@ -0,0 +1,9 @@
+#ifndef UNPARSE_H
+#define UNPARSE_H
+
+#include "expr.h"
+
+
+char *unparse(const struct expr *expr);
+
+#endif /* !UNPARSE_H */




--- End Message ---
_______________________________________________
commitlog mailing list
commitlog@lists.openmoko.org
http://lists.openmoko.org/mailman/listinfo/commitlog

Reply via email to