X-Git-Url: https://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/4f09fcd75bb0057d90c7431f7db57ca2c5a6c028..refs/tags/v1.0.11:/src/parse.y diff --git a/src/parse.y b/src/parse.y index 47fdcf2..0bc9836 100644 --- a/src/parse.y +++ b/src/parse.y @@ -293,6 +293,87 @@ set_return_value(char *type, char *val) return FALSE; } +static void +export_accessors (const char *var_name, + const char *get_cbuf, + int get_lineno, + const char *set_cbuf, + int set_lineno, + Type *type, + const char *gtktype, + int lineno) +{ + if (type == NULL) { + char *cast = g_strdup (get_cast (gtktype, FALSE)); + char *p = strchr (cast, ' '); + if (p != NULL) { + *p = '\0'; + p++; + } + /* leak, but we don't really care any more */ + type = (Type *)new_type (cast, + g_strdup (p), + NULL); + } + + if (get_cbuf != NULL) { + char *get_id = g_strdup_printf ("get_%s", var_name); + GString *get_cbuf_copy = g_string_new (get_cbuf); + char *tmp; + Node *node1 = new_type (g_strdup (type->name), + g_strdup (type->pointer), + g_strdup (type->postfix)); + Node *node3 = new_type (g_strdup (class->class.otype), + g_strdup ("*"), + NULL); + + tmp = g_strdup_printf ("\t%s%s ARG;\n", + type->name, + type->pointer ? type->pointer : ""); + get_cbuf_copy = g_string_prepend (get_cbuf_copy, tmp); + g_free (tmp); + + tmp = g_strdup_printf ("\n\t\treturn ARG;\n"); + get_cbuf_copy = g_string_append (get_cbuf_copy, tmp); + g_free (tmp); + + typestack = g_list_prepend (typestack, node1); + typestack = g_list_prepend (typestack, node3); + + push_funcarg ("self", FALSE); + + push_function (PUBLIC_SCOPE, REGULAR_METHOD, NULL, + get_id, get_cbuf_copy, get_lineno, + lineno, FALSE, NULL); + } + + if (set_cbuf != NULL) { + char *set_id = g_strdup_printf ("set_%s", var_name); + GString *set_cbuf_copy = g_string_new (set_cbuf); + Node *node1 = new_type (g_strdup (type->name), + g_strdup (type->pointer), + g_strdup (type->postfix)); + Node *node2 = new_type (g_strdup ("void"), + NULL, + NULL); + Node *node3 = new_type (g_strdup (class->class.otype), + g_strdup ("*"), + NULL); + + typestack = g_list_prepend (typestack, node2); + typestack = g_list_prepend (typestack, node1); + typestack = g_list_prepend (typestack, node3); + + push_funcarg ("self", FALSE); + push_funcarg ("ARG", FALSE); + + typestack = g_list_prepend (typestack, node2); + push_function (PUBLIC_SCOPE, REGULAR_METHOD, NULL, + set_id, set_cbuf_copy, set_lineno, + lineno, FALSE, NULL); + } +} + %} %union { @@ -488,82 +569,135 @@ variable: scope type TOKEN varoptions ';' { push_variable($3, the_scope, $1, $4); } ; -argument: ARGUMENT flags argtype TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' { - if(strcmp($5,"get")==0 && - strcmp($8,"set")==0) { + +argument: ARGUMENT flags argtype TOKEN export TOKEN '{' CCODE TOKEN '{' CCODE ';' { + if(strcmp($6,"get")==0 && + strcmp($9,"set")==0) { Node *node; Type *type = pop_type(); - g_free($5); g_free($8); - node = new_argument($3,type,$2,$4, - ($7)->str,$6, - ($10)->str,$9, - $1); - g_string_free($7,FALSE); - g_string_free($10,FALSE); + g_free ($6); + g_free ($9); + node = new_argument ($3, type, $2, $4, + ($8)->str, $7, + ($11)->str,$10, + $1); + class_nodes = g_list_append(class_nodes,node); - } else if(strcmp($5,"set")==0 && - strcmp($8,"get")==0) { + + if ($5) { + export_accessors ($4, + ($8)->str, $7, + ($11)->str, $10, + type, + $3, + $1); + g_free ($5); + } + + g_string_free ($8, FALSE); + g_string_free ($11, FALSE); + + } else if(strcmp($6,"set")==0 && + strcmp($9,"get")==0) { Node *node; Type *type = pop_type(); - g_free($5); g_free($8); - node = new_argument($3,type,$2,$4, - ($10)->str,$9, - ($7)->str,$6, - $1); - g_string_free($10,FALSE); - g_string_free($7,FALSE); + g_free ($6); + g_free ($9); + node = new_argument ($3, type, $2, $4, + ($11)->str,$10, + ($8)->str,$7, + $1); + + if ($5) { + export_accessors ($4, + ($11)->str, $10, + ($8)->str, $7, + type, + $3, + $1); + g_free ($5); + } + + g_string_free ($11, FALSE); + g_string_free ($8, FALSE); class_nodes = g_list_append(class_nodes,node); } else { - g_free($3); g_free($4); - g_free($5); g_free($8); - g_list_foreach($2,(GFunc)g_free,NULL); - g_list_free($2); - g_string_free($10,TRUE); - g_string_free($7,TRUE); - yyerror(_("parse error")); + g_free ($3); + g_free ($4); + g_free ($6); + g_free ($9); + g_list_foreach ($2, (GFunc)g_free, NULL); + g_list_free ($2); + g_string_free ($11, TRUE); + g_string_free ($8, TRUE); + yyerror (_("parse error")); YYERROR; } } - | ARGUMENT flags argtype TOKEN TOKEN '{' CCODE ';' { - if(strcmp($5, "get") == 0) { + | ARGUMENT flags argtype TOKEN export TOKEN '{' CCODE ';' { + if(strcmp($6, "get") == 0) { Node *node; Type *type = pop_type(); - g_free($5); - node = new_argument($3, type, $2, $4, - ($7)->str, $6, - NULL, 0, $1); - g_string_free($7, FALSE); + g_free ($6); + node = new_argument ($3, type, $2, $4, + ($8)->str, $7, + NULL, 0, + $1); + if ($5) { + export_accessors ($4, + ($8)->str, $7, + NULL, 0, + type, + $3, + $1); + g_free ($5); + } + + g_string_free ($8, FALSE); class_nodes = g_list_append(class_nodes, node); - } else if(strcmp($5, "set") == 0) { + } else if(strcmp($6, "set") == 0) { Node *node; Type *type = pop_type(); - g_free($5); - node = new_argument($3, type, $2, $4, - NULL, 0, ($7)->str, - $6, $1); - g_string_free($7, FALSE); - class_nodes = g_list_append(class_nodes, node); + g_free ($6); + node = new_argument ($3, type, $2, $4, + NULL, 0, + ($8)->str, $7, + $1); + if ($5) { + export_accessors ($4, + NULL, 0, + ($8)->str, $7, + type, + $3, + $1); + g_free ($5); + } + + g_string_free ($8, FALSE); + class_nodes = g_list_append (class_nodes, node); } else { - g_free($5); g_free($3); - g_free($4); - g_list_foreach($2, (GFunc)g_free, NULL); - g_list_free($2); - g_string_free($7, TRUE); + g_free ($6); + g_free ($3); + g_free ($4); + g_list_foreach ($2, (GFunc)g_free, NULL); + g_list_free ($2); + g_string_free ($8, TRUE); yyerror(_("parse error")); YYERROR; } } - | ARGUMENT flags argtype TOKEN TOKEN { + | ARGUMENT flags argtype TOKEN export TOKEN { Node *node; char *get, *set = NULL; Variable *var; Type *type; char *root; - if(strcmp($5, "link")!=0 && - strcmp($5, "stringlink")!=0 && - strcmp($5, "objectlink")!=0) { - g_free($5); g_free($3); + if(strcmp($6, "link")!=0 && + strcmp($6, "stringlink")!=0 && + strcmp($6, "objectlink")!=0) { + g_free($6); + g_free($3); g_free($4); g_list_foreach($2,(GFunc)g_free,NULL); g_list_free($2); @@ -584,15 +718,15 @@ argument: ARGUMENT flags argtype TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' { } else root = "self"; - if(strcmp($5, "link")==0) { + if(strcmp($6, "link")==0) { set = g_strdup_printf("%s->%s = ARG;", root, $4); - } else if(strcmp($5, "stringlink")==0) { + } else if(strcmp ($6, "stringlink")==0) { set = g_strdup_printf("g_free(%s->%s); " "%s->%s = g_strdup(ARG);", root, $4, root, $4); - } else if(strcmp($5, "objectlink")==0) { + } else if(strcmp ($6, "objectlink")==0) { set = g_strdup_printf( "if (ARG != NULL) " "gtk_object_ref (GTK_OBJECT (ARG)); " @@ -606,25 +740,48 @@ argument: ARGUMENT flags argtype TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' { g_assert_not_reached(); } - if(strcmp($5, "stringlink")==0) { + if (strcmp ($6, "stringlink")==0) { get = g_strdup_printf("ARG = g_strdup(%s->%s);", root, $4); - } else + } else { /* For everything else, get is just straight assignment */ get = g_strdup_printf("ARG = %s->%s;", root, $4); + } - g_free($5); + g_free ($6); if(!type) type = copy_type(var->vtype); - node = new_argument($3, type, $2, - $4, get, $1, - set, $1, $1); + node = new_argument ($3, type, $2, + $4, + get, $1, + set, $1, + $1); + if ($5) { + export_accessors ($4, + get, $1, + set, $1, + type, + $3, + $1); + g_free ($5); + } + class_nodes = g_list_append(class_nodes,node); } ; +export: '(' TOKEN ')' { + if (strcmp ($2, "export")!=0) { + g_free ($2); + yyerror (_("parse error")); + YYERROR; + } + $$ = $2; + } + | { $$ = NULL; } + argtype: TOKEN '(' TOKEN type ')' { if(strcmp($3,"type")!=0) { g_free($1);