X-Git-Url: http://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/7231d76fbf4ae0b501af648e1216b88714aa7353..refs/tags/v2.0.0:/src/parse.y diff --git a/src/parse.y b/src/parse.y index 36f9abc..7ad3af5 100644 --- a/src/parse.y +++ b/src/parse.y @@ -31,15 +31,21 @@ #include "main.h" #include "util.h" +/* FIXME: add gettext support */ #define _(x) (x) GList *nodes = NULL; static GList *class_nodes = NULL; Node *class = NULL; +GList *enums = NULL; +static GList *enum_vals = NULL; +static GList *flag_vals = NULL; +static GList *error_vals = NULL; static char *chunk_size = NULL; -static char *bonobo_x_class = NULL; +static char *bonobo_object_class = NULL; +static GList *interfaces = NULL; static GList *typestack = NULL; static GList *funcargs = NULL; static GList *checks = NULL; @@ -343,8 +349,8 @@ set_return_value(char *type, char *val) static void export_accessors (const char *var_name, gboolean do_get, - gboolean do_set, int get_lineno, + gboolean do_set, int set_lineno, Type *type, const char *gtktype, @@ -462,8 +468,8 @@ property_link_and_export (Node *node) } if (strcmp (prop->gtktype, "STRING") == 0) { - set = g_strdup_printf("g_free (%s->%s); " - "%s->%s = g_value_dup_string (VAL);", + set = g_strdup_printf("{ char *old = %s->%s; " + "%s->%s = g_value_dup_string (VAL); g_free (old); }", root, prop->name, root, prop->name); get = g_strdup_printf("g_value_set_string (VAL, %s->%s);", @@ -537,7 +543,7 @@ property_link_and_export (Node *node) if (prop->export) { export_accessors (prop->name, prop->get != NULL, prop->get_line, - prop->set != NULL, prop->get_line, + prop->set != NULL, prop->set_line, prop->ptype, prop->gtktype, prop->line_no); @@ -583,7 +589,7 @@ ensure_property (void) %token CCODE HTCODE PHCODE HCODE ACODE ATCODE STRING %token PUBLIC PRIVATE PROTECTED CLASSWIDE PROPERTY ARGUMENT %token VIRTUAL SIGNAL OVERRIDE -%token NICK BLURB MAXIMUM MINIMUM DEFAULT_VALUE FLAGS TYPE +%token NICK BLURB MAXIMUM MINIMUM DEFAULT_VALUE ERROR FLAGS TYPE %token FLAGS_TYPE ENUM_TYPE PARAM_TYPE BOXED_TYPE OBJECT_TYPE %% @@ -651,7 +657,13 @@ ccode: CCODE { ; ccodes: ccodes ccode { ; } + | ccodes enumcode { ; } + | ccodes flagcode { ; } + | ccodes errorcode { ; } | ccode { ; } + | enumcode { ; } + | flagcode { ; } + | errorcode { ; } ; class: classdec '{' classcode '}' { @@ -670,9 +682,13 @@ classdec: CLASS TYPETOKEN FROM TYPETOKEN classflags { class = node_new (CLASS_NODE, "otype:steal", $2, "ptype:steal", $4, - "bonobo_x_class:steal", bonobo_x_class, + "bonobo_object_class:steal", bonobo_object_class, + "interfaces:steal", interfaces, "chunk_size:steal", chunk_size, NULL); + bonobo_object_class = NULL; + chunk_size = NULL; + interfaces = NULL; } ; @@ -681,9 +697,18 @@ classflags: if(strcmp($2,"chunks") == 0) { g_free (chunk_size); chunk_size = g_strdup($3); - } else if(strcmp($2,"BonoboX") == 0) { - g_free (bonobo_x_class); - bonobo_x_class = g_strdup($3); + } else if(strcmp($2,"BonoboObject") == 0) { + g_free (bonobo_object_class); + bonobo_object_class = g_strdup($3); + } else { + yyerror(_("parse error")); + YYERROR; + } + } + | '(' TOKEN TYPETOKEN ')' classflags { + if (strcmp ($2, "interface") == 0) { + interfaces = g_list_append (interfaces, + g_strdup ($3)); } else { yyerror(_("parse error")); YYERROR; @@ -709,12 +734,25 @@ classcode: classcode thing { ; } thing: method { ; } | TOKEN method { - if (strcmp ($1, "BonoboX") != 0) { - g_free($1); - yyerror(_("parse error")); + if (strcmp ($1, "BonoboObject") != 0) { + g_free ($1); + yyerror (_("parse error")); + YYERROR; + } + g_free ($1); + last_added_method->bonobo_object_func = TRUE; + } + | TOKEN TYPETOKEN method { + if (strcmp ($1, "interface") != 0) { + g_free ($1); + g_free ($2); + yyerror (_("parse error")); YYERROR; } - last_added_method->bonobo_x_func = TRUE; + g_free ($1); + node_set ((Node *)last_added_method, + "interface:steal", $2, + NULL); } | variable { ; } | argument { ; } @@ -1764,7 +1802,118 @@ check: TOKEN { checks = g_list_append(checks,node); } ; - + +enumcode: ENUM TOKEN '{' enumvals '}' TYPETOKEN ';' { + Node *node = node_new (ENUMDEF_NODE, + "etype:steal", $6, + "prefix:steal", $2, + "values:steal", enum_vals, + NULL); + enum_vals = NULL; + nodes = g_list_append (nodes, node); + } + | ENUM TOKEN '{' enumvals ',' '}' TYPETOKEN ';' { + Node *node = node_new (ENUMDEF_NODE, + "etype:steal", $7, + "prefix:steal", $2, + "values:steal", enum_vals, + NULL); + enum_vals = NULL; + nodes = g_list_append (nodes, node); + } + ; + +enumvals: enumvals ',' enumval {;} + | enumval {;} + ; + +enumval: TOKEN '=' numtok { + Node *node; + char *num = $3; + + /* A float value, that's a bad enum */ + if (num[0] >= '0' && + num[0] <= '9' && + strchr (num, '.') != NULL) { + g_free ($1); + g_free (num); + yyerror(_("parse error (enumerator value not integer constant)")); + YYERROR; + } + + node = node_new (ENUMVALUE_NODE, + "name:steal", $1, + "value:steal", num, + NULL); + enum_vals = g_list_append (enum_vals, node); + } + | TOKEN { + Node *node; + + node = node_new (ENUMVALUE_NODE, + "name:steal", $1, + NULL); + enum_vals = g_list_append (enum_vals, node); + } + ; + +flagcode: FLAGS TOKEN '{' flagvals '}' TYPETOKEN ';' { + Node *node = node_new (FLAGS_NODE, + "ftype:steal", $6, + "prefix:steal", $2, + "values:steal", flag_vals, + NULL); + flag_vals = NULL; + nodes = g_list_append (nodes, node); + } + | FLAGS TOKEN '{' flagvals ',' '}' TYPETOKEN ';' { + Node *node = node_new (FLAGS_NODE, + "ftype:steal", $7, + "prefix:steal", $2, + "values:steal", flag_vals, + NULL); + flag_vals = NULL; + nodes = g_list_append (nodes, node); + } + ; + +flagvals: flagvals ',' TOKEN { + flag_vals = g_list_append (flag_vals, $3); + } + | TOKEN { + flag_vals = g_list_append (flag_vals, $1); + } + ; + +errorcode: ERROR TOKEN '{' errorvals '}' TYPETOKEN ';' { + Node *node = node_new (ERROR_NODE, + "etype:steal", $6, + "prefix:steal", $2, + "values:steal", error_vals, + NULL); + error_vals = NULL; + nodes = g_list_append (nodes, node); + } + | ERROR TOKEN '{' errorvals ',' '}' TYPETOKEN ';' { + Node *node = node_new (ERROR_NODE, + "etype:steal", $7, + "prefix:steal", $2, + "values:steal", error_vals, + NULL); + error_vals = NULL; + nodes = g_list_append (nodes, node); + } + ; + +errorvals: errorvals ',' TOKEN { + error_vals = g_list_append (error_vals, $3); + } + | TOKEN { + error_vals = g_list_append (error_vals, $1); + } + ; + + numtok: NUMBER { $$ = $1; } | '-' NUMBER { $$ = g_strconcat("-",$2,NULL);