r5357 - developers/werner/fped

werner at docs.openmoko.org werner at docs.openmoko.org
Sat Aug 1 02:56:58 CEST 2009


Author: werner
Date: 2009-08-01 02:56:58 +0200 (Sat, 01 Aug 2009)
New Revision: 5357

Modified:
   developers/werner/fped/TODO
   developers/werner/fped/error.c
   developers/werner/fped/error.h
   developers/werner/fped/expr.c
   developers/werner/fped/fpd.l
   developers/werner/fped/fpd.y
   developers/werner/fped/fped.c
   developers/werner/fped/gui.c
   developers/werner/fped/gui_status.c
   developers/werner/fped/gui_status.h
   developers/werner/fped/obj.c
   developers/werner/fped/obj.h
   developers/werner/fped/util.c
Log:
- stralloc_vprintf didn't reset the argument pointer before the second pass
- changed "from" and "to" of loop from expression to value for better code 
  reuse
- completed parse_expr
- values in variables, tables, and loops can now be edited



Modified: developers/werner/fped/TODO
===================================================================
--- developers/werner/fped/TODO	2009-07-31 23:24:00 UTC (rev 5356)
+++ developers/werner/fped/TODO	2009-08-01 00:56:58 UTC (rev 5357)
@@ -3,7 +3,7 @@
 - populate input area (still needed: mm/mil, rezoom)
 - add vec editor
 - add obj editor
-- add table/var/loop editor
+- add table/var/loop editor (missing: add col/row, add/del var/table/loop)
 - add incremental expression parser (for editor)
 - add default unit (combine with grid unit selection ?)
 - consider adding auto/mm/mil selection for each dimension

Modified: developers/werner/fped/error.c
===================================================================
--- developers/werner/fped/error.c	2009-07-31 23:24:00 UTC (rev 5356)
+++ developers/werner/fped/error.c	2009-08-01 00:56:58 UTC (rev 5357)
@@ -25,28 +25,41 @@
 void (*reporter)(const char *s) = report_to_stderr;
 
 
-void __attribute__((noreturn)) yyerrorf(const char *fmt, ...)
+void yyerrorf(const char *fmt, ...)
 {
 	va_list ap;
+	char *buf;
+	int n;
 
-	fprintf(stderr, "%d: ", lineno);
 	va_start(ap, fmt);
-	vfprintf(stderr, fmt, ap);
+	n = vsnprintf(NULL, 0, fmt, ap);
 	va_end(ap);
-	fprintf(stderr, " near \"%s\"\n", yytext);
-	exit(1);
+	buf = alloc_size(n+1);
+	va_start(ap, fmt);
+	vsnprintf(buf, n+1, fmt, ap);
+	va_end(ap);
+	fail(buf);
+	free(buf);
 }
 
 
-void __attribute__((noreturn)) yyerror(const char *s)
+void yyerror(const char *s)
 {
 	yyerrorf("%s", s);
 }
 
 
+void report_parse_error(const char *s)
+{
+	fprintf(stderr, "%d: %s near \"%s\" ", lineno, s, yytext);
+	exit(1);
+}
+
+
 void report_to_stderr(const char *s)
 {
 	fprintf(stderr, "%s\n", s);
+	exit(1);
 }
 
 

Modified: developers/werner/fped/error.h
===================================================================
--- developers/werner/fped/error.h	2009-07-31 23:24:00 UTC (rev 5356)
+++ developers/werner/fped/error.h	2009-08-01 00:56:58 UTC (rev 5357)
@@ -20,10 +20,11 @@
 extern void (*reporter)(const char *s);
 
 
-void __attribute__((noreturn)) yyerrorf(const char *fmt, ...);
-void __attribute__((noreturn)) yyerror(const char *s);
+void yyerrorf(const char *fmt, ...);
+void yyerror(const char *s);
 
 void report_to_stderr(const char *s);
+void report_parse_error(const char *s);
 void fail(const char *fmt, ...);
 
 #endif /* !ERROR_H */

Modified: developers/werner/fped/expr.c
===================================================================
--- developers/werner/fped/expr.c	2009-07-31 23:24:00 UTC (rev 5356)
+++ developers/werner/fped/expr.c	2009-08-01 00:56:58 UTC (rev 5357)
@@ -369,9 +369,16 @@
 /* ----- expression-only parser -------------------------------------------- */
 
 
+void scan_expr(const char *s);
+int yyparse(void);
+
+struct expr *expr_result;
+
+
 struct expr *parse_expr(const char *s)
 {
-	return NULL;
+	scan_expr(s);
+	return yyparse() ? NULL : expr_result;
 }
 
 

Modified: developers/werner/fped/fpd.l
===================================================================
--- developers/werner/fped/fpd.l	2009-07-31 23:24:00 UTC (rev 5356)
+++ developers/werner/fped/fpd.l	2009-08-01 00:56:58 UTC (rev 5357)
@@ -22,9 +22,18 @@
 #include "y.tab.h"
 
 
+int start_token = START_FPD;
+
 static int disable_keywords = 0;
 static int is_table = 0;
 
+
+void scan_expr(const char *s)
+{
+	start_token = START_EXPR;
+	yy_scan_string(s);
+}
+
 %}
 
 
@@ -37,7 +46,22 @@
 
 %%
 
+%{
+	/*
+	 * Nice hack:
+	 *
+	 * http://www.gnu.org/software/bison/manual/bison.html#
+	 *   Multiple-start_002dsymbols
+	 */
 
+	if (start_token) {
+		int tmp = start_token;
+		start_token = 0;
+		return tmp;
+	}
+%}
+
+
 <INITIAL>"set"			{ BEGIN(NOKEYWORD);
 				  return TOK_SET; }
 <INITIAL>"loop"			{ BEGIN(NOKEYWORD);

Modified: developers/werner/fped/fpd.y
===================================================================
--- developers/werner/fped/fpd.y	2009-07-31 23:24:00 UTC (rev 5356)
+++ developers/werner/fped/fpd.y	2009-08-01 00:56:58 UTC (rev 5357)
@@ -20,6 +20,8 @@
 #include "obj.h"
 
 
+extern struct expr *expr_result;
+
 static struct frame *curr_frame;
 static struct table *curr_table;
 static struct row *curr_row;
@@ -93,8 +95,12 @@
 	loop->var.name = id;
 	loop->var.next = NULL;
 	loop->var.frame = curr_frame;
-	loop->from = from;
-	loop->to = to;
+	loop->from.expr = from;
+	loop->from.row = NULL;
+	loop->from.next = NULL;
+	loop->to.expr = to;
+	loop->to.row = NULL;
+	loop->to.next = NULL;
 	loop->next = NULL;
 	loop->active = 0;
 	*next_loop = loop;
@@ -131,6 +137,7 @@
 };
 
 
+%token		START_FPD START_EXPR
 %token		TOK_SET TOK_LOOP TOK_FRAME TOK_TABLE TOK_VEC
 %token		TOK_PAD TOK_RECT TOK_LINE TOK_CIRC TOK_ARC
 
@@ -149,7 +156,15 @@
 %%
 
 all:
+	START_FPD fpd
+	| START_EXPR expr
 		{
+			expr_result = $2;
+		}
+	;
+
+fpd:
+		{
 			root_frame = zalloc_type(struct frame);
 			set_frame(root_frame);
 		}
@@ -170,8 +185,10 @@
 frame_def:
 	TOK_FRAME ID '{'
 		{
-			if (find_frame($2))
+			if (find_frame($2)) {
 				yyerrorf("duplicate frame \"%s\"", $2);
+				YYABORT;
+			}
 			curr_frame = zalloc_type(struct frame);
 			curr_frame->name = $2;
 			set_frame(curr_frame);
@@ -205,8 +222,10 @@
 	| vec
 	| LABEL vec
 		{
-			if (find_vec($1))
+			if (find_vec($1)) {
 				yyerrorf("duplicate vector \"%s\"", $1);
+				YYABORT;
+			}
 			$2->name = $1;
 		}
 	| obj
@@ -274,9 +293,11 @@
 		}
 	    row '}'
 		{
-			if (n_vars != n_values)
+			if (n_vars != n_values) {
 				yyerrorf("table has %d variables but row has "
 				    "%d values", n_vars, n_values);
+				YYABORT;
+			}
 			$<row>2->values = $3;
 		}
 	    rows
@@ -338,14 +359,18 @@
 	| '.'
 		{
 			$$ = last_vec;
-			if (!$$)
+			if (!$$) {
 				yyerrorf(". without predecessor");
+				YYABORT;
+			}
 		}
 	| ID
 		{
 			$$ = find_vec($1);
-			if (!$$)
+			if (!$$) {
 				yyerrorf("unknown vector \"%s\"", $1);
+				YYABORT;
+			}
 		}
 	;
 
@@ -388,8 +413,10 @@
 			$$ = new_obj(ot_frame);
 			$$->base = $3;
 			$$->u.frame = find_frame($2);
-			if (!$$->u.frame)
+			if (!$$->u.frame) {
 				yyerrorf("unknown frame \"%s\"", $2);
+				YYABORT;
+			}
 		}
 	;
 

Modified: developers/werner/fped/fped.c
===================================================================
--- developers/werner/fped/fped.c	2009-07-31 23:24:00 UTC (rev 5356)
+++ developers/werner/fped/fped.c	2009-08-01 00:56:58 UTC (rev 5357)
@@ -13,6 +13,7 @@
 
 
 #include "cpp.h"
+#include "error.h"
 #include "obj.h"
 #include "inst.h"
 #include "gui.h"
@@ -24,6 +25,7 @@
 static void load_file(const char *name)
 {
 	run_cpp_on_file(name);
+	reporter = report_parse_error;
 	(void) yyparse();
 }
 
@@ -40,6 +42,7 @@
 		argc--;
 		argv++;
 	}
+	reporter = report_to_stderr;
 	if (!instantiate())
 		return 1;
 //	inst_debug();

Modified: developers/werner/fped/gui.c
===================================================================
--- developers/werner/fped/gui.c	2009-07-31 23:24:00 UTC (rev 5356)
+++ developers/werner/fped/gui.c	2009-08-01 00:56:58 UTC (rev 5357)
@@ -132,6 +132,28 @@
 }
 
 
+/* ----- value editor ------------------------------------------------------ */
+
+
+static void unselect_value(void *data)
+{
+	struct value *value = data;
+
+        label_in_box_bg(value->widget,
+	    value->row && value->row->table && value->row->table->curr_row ==
+	     value->row ? COLOR_CHOICE_SELECTED : COLOR_EXPR_PASSIVE);
+}
+
+
+static void edit_value(struct value *value)
+{
+	inst_select_outside(value, unselect_value);
+        label_in_box_bg(value->widget, COLOR_EXPR_EDITING);
+	edit_expr(&value->expr);
+}
+
+
+
 /* ----- assignments ------------------------------------------------------- */
 
 
@@ -146,6 +168,7 @@
 static gboolean assignment_value_select_event(GtkWidget *widget,
      GdkEventButton *event, gpointer data)
 {
+	edit_value(data);
 	return TRUE;
 }
 
@@ -201,6 +224,7 @@
 static gboolean table_value_select_event(GtkWidget *widget,
      GdkEventButton *event, gpointer data)
 {
+	edit_value(data);
 	return TRUE;
 }
 
@@ -271,7 +295,9 @@
 static gboolean loop_var_select_event(GtkWidget *widget,
      GdkEventButton *event, gpointer data)
 {
-	edit_var(data);
+	struct loop *loop = data;
+
+	edit_var(&loop->var);
 	return TRUE;
 }
 
@@ -279,6 +305,9 @@
 static gboolean loop_from_select_event(GtkWidget *widget,
      GdkEventButton *event, gpointer data)
 {
+	struct loop *loop = data;
+
+	edit_value(&loop->from);
 	return TRUE;
 }
 
@@ -286,6 +315,9 @@
 static gboolean loop_to_select_event(GtkWidget *widget,
      GdkEventButton *event, gpointer data)
 {
+	struct loop *loop = data;
+
+	edit_value(&loop->to);
 	return TRUE;
 }
 
@@ -310,7 +342,7 @@
 	gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(" = "),
 	    FALSE, FALSE, 0);
 
-	expr = unparse(loop->from);
+	expr = unparse(loop->from.expr);
 	field = label_in_box_new(expr);
 	free(expr);
 	gtk_box_pack_start(GTK_BOX(hbox), box_of_label(field), FALSE, FALSE, 0);
@@ -318,11 +350,12 @@
 	g_signal_connect(G_OBJECT(box_of_label(field)),
 	    "button_press_event",
 	    G_CALLBACK(loop_from_select_event), loop);
+	loop->from.widget = field;
 
 	gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(" ... "),
 	    FALSE, FALSE, 0);
 
-	expr = unparse(loop->to);
+	expr = unparse(loop->to.expr);
 	field = label_in_box_new(expr);
 	free(expr);
 	gtk_box_pack_start(GTK_BOX(hbox), box_of_label(field), FALSE, FALSE, 0);
@@ -330,6 +363,7 @@
 	g_signal_connect(G_OBJECT(box_of_label(field)),
 	    "button_press_event",
 	    G_CALLBACK(loop_to_select_event), loop);
+	loop->to.widget = field;
 }
 
 

Modified: developers/werner/fped/gui_status.c
===================================================================
--- developers/werner/fped/gui_status.c	2009-07-31 23:24:00 UTC (rev 5356)
+++ developers/werner/fped/gui_status.c	2009-08-01 00:56:58 UTC (rev 5357)
@@ -219,16 +219,23 @@
 /* ----- expression fields ------------------------------------------------- */
 
 
+static struct expr *try_parse_expr(const char *s)
+{
+	status_begin_reporting();
+	return parse_expr(s);
+}
+
+
 static int expr_changed(GtkWidget *widget, const char *s, void *ctx)
 {
 	struct expr *expr;
 
-	expr = parse_expr(s);
+	expr = try_parse_expr(s);
 	if (!expr) {
 		entry_color(COLOR_EDIT_BAD);
 		return 0;
 	}
-	entry_color(COLOR_EDIT_BAD);
+	entry_color(COLOR_EDIT_GOOD);
 	free_expr(expr);
 	return 1;
 }
@@ -239,7 +246,7 @@
 	struct expr **anchor = ctx;
 	struct expr *expr;
 
-	expr = parse_expr(s);
+	expr = try_parse_expr(s);
 	if (!expr)
 		return 0;
 	free_expr(*anchor);
@@ -255,7 +262,7 @@
 };
 
 
-void edit_expression(struct expr **expr)
+void edit_expr(struct expr **expr)
 {
 	char *s;
 

Modified: developers/werner/fped/gui_status.h
===================================================================
--- developers/werner/fped/gui_status.h	2009-07-31 23:24:00 UTC (rev 5356)
+++ developers/werner/fped/gui_status.h	2009-08-01 00:56:58 UTC (rev 5357)
@@ -23,7 +23,7 @@
 void edit_unique(const char **s, int (*validate)(const char *s, void *ctx),
     void *ctx);
 void edit_name(char **s, int (*validate)(const char *s, void *ctx), void *ctx);
-void edit_expression(struct expr **expr);
+void edit_expr(struct expr **expr);
 void edit_nothing(void);
 
 void status_set_name(const char *fmt, ...);

Modified: developers/werner/fped/obj.c
===================================================================
--- developers/werner/fped/obj.c	2009-07-31 23:24:00 UTC (rev 5356)
+++ developers/werner/fped/obj.c	2009-08-01 00:56:58 UTC (rev 5357)
@@ -127,24 +127,24 @@
 
 	if (!loop)
 		return generate_items(frame, base, active);
-	from = eval_num(loop->from, frame);
+	from = eval_num(loop->from.expr, frame);
 	if (is_undef(from)) {
-		fail_expr(loop->from);
+		fail_expr(loop->from.expr);
 		return 0;
 	}
 	if (!is_dimensionless(from)) {
 		fail("incompatible type for start value");
-		fail_expr(loop->from);
+		fail_expr(loop->from.expr);
 		return 0;
 	}
-	to = eval_num(loop->to, frame);
+	to = eval_num(loop->to.expr, frame);
 	if (is_undef(to)) {
-		fail_expr(loop->to);
+		fail_expr(loop->to.expr);
 		return 0;
 	}
 	if (!is_dimensionless(to)) {
 		fail("incompatible type for end value");
-		fail_expr(loop->to);
+		fail_expr(loop->to.expr);
 		return 0;
 	}
 	n = 0;

Modified: developers/werner/fped/obj.h
===================================================================
--- developers/werner/fped/obj.h	2009-07-31 23:24:00 UTC (rev 5356)
+++ developers/werner/fped/obj.h	2009-08-01 00:56:58 UTC (rev 5357)
@@ -64,8 +64,8 @@
 
 struct loop {
 	struct var var;
-	struct expr *from;
-	struct expr *to;
+	struct value from;
+	struct value to;
 	struct loop *next;
 
 	/* used during generation */

Modified: developers/werner/fped/util.c
===================================================================
--- developers/werner/fped/util.c	2009-07-31 23:24:00 UTC (rev 5356)
+++ developers/werner/fped/util.c	2009-08-01 00:56:58 UTC (rev 5357)
@@ -24,10 +24,13 @@
 
 char *stralloc_vprintf(const char *fmt, va_list ap)
 {
+	va_list aq;
 	char *buf;
 	int n;
 
-	n = snprintf(NULL, 0, fmt, ap);
+	va_copy(aq, ap);
+	n = snprintf(NULL, 0, fmt, aq);
+	va_end(aq);
 	buf = alloc_size(n+1);
 	vsnprintf(buf, n+1, fmt, ap);
 	return buf;




More information about the commitlog mailing list