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