r5334 - developers/werner/fped

werner at docs.openmoko.org werner at docs.openmoko.org
Wed Jul 29 05:31:56 CEST 2009


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 */




More information about the commitlog mailing list