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