}
static void
-print_signal_marsal_args(Method *m)
+print_signal_marsal_args_gtk1 (Method *m)
{
if(strcmp(m->gtktypes->next->data, "NONE")!=0) {
GList *li;
out_printf(out, ",\n\t\tfunc_data);\n}\n\n");
}
+static void
+add_marshal_gtk1 (Method *m, const char *mname)
+{
+ out_printf(out, "\nstatic void\n"
+ "___marshal_%s (GtkObject * object,\n"
+ "\tGtkSignalFunc func,\n"
+ "\tgpointer func_data,\n"
+ "\tGtkArg * args)\n"
+ "{\n", mname);
+
+ if(strcmp(m->gtktypes->data, "NONE")==0) {
+ out_printf(out, "\t___%s rfunc;\n\n"
+ "\trfunc = (___%s)func;\n\n"
+ "\t(*rfunc)((%s *)object", mname, mname, typebase);
+ } else {
+ const char *retcast = get_cast(m->gtktypes->data, FALSE);
+ gboolean is_none = (strcmp(m->gtktypes->next->data, "NONE")==0);
+ out_printf(out,
+ "\t___%s rfunc;\n\t"
+ "%s *retval;\n\n"
+ "\trfunc = (___%s)func;\n\n"
+ "\tretval = GTK_RETLOC_%s(args[%d]);\n\n"
+ "\t*retval = (*rfunc)((%s *)object",
+ mname, retcast, mname,
+ (char *)m->gtktypes->data,
+ g_list_length(m->gtktypes) - (is_none ? 2 : 1),
+ typebase);
+ }
+ print_signal_marsal_args_gtk1 (m);
+}
+
+static const char *
+gtk2_debool (const char *s)
+{
+ if (strcmp (s, "BOOL") == 0)
+ return "BOOLEAN";
+ else
+ return s;
+}
+
+static void
+print_signal_marsal_args_gtk2 (Method *m)
+{
+ if (strcmp (m->gtktypes->next->data, "NONE") != 0) {
+ GList *li;
+ int i;
+ for (i = 0, li = m->gtktypes->next;
+ li != NULL;
+ i++, li = li->next) {
+ char *get_func = g_strdup_printf
+ ("g_value_get_%s",
+ (char *)gtk2_debool (li->data));
+ g_strdown (get_func);
+ out_printf (out, ",\n\t\t(%s) "
+ "%s (param_values + %d)",
+ get_cast (li->data, FALSE),
+ get_func, i + 1);
+ g_free (get_func);
+ }
+ }
+ out_printf (out, ",\n\t\tdata2);\n");
+}
+
+static void
+add_marshal_gtk2 (Method *m, const char *mname)
+{
+ gboolean ret_none;
+ gboolean arglist_none;
+ const char *retcast;
+
+ ret_none = strcmp (m->gtktypes->data, "NONE") == 0;
+ arglist_none = strcmp (m->gtktypes->next->data, "NONE") == 0;
+
+ if (ret_none)
+ retcast = NULL;
+ else
+ retcast = get_cast (m->gtktypes->data, FALSE);
+
+ out_printf (out, "\nstatic void\n"
+ "___marshal_%s (GClosure *closure,\n"
+ "\tGValue *return_value,\n"
+ "\tguint n_param_values,\n"
+ "\tconst GValue *param_values,\n"
+ "\tgpointer invocation_hint,\n"
+ "\tgpointer marshal_data)\n"
+ "{\n", mname);
+
+ if ( ! ret_none)
+ out_printf (out, "\t%s v_return;\n", retcast);
+
+ out_printf (out, "\tregister ___%s callback;\n"
+ "\tregister GCClosure *cc = (GCClosure*) closure;\n"
+ "\tregister gpointer data1, data2;\n\n",
+ mname);
+
+ out_printf (out, "\tg_return_if_fail (n_param_values == %d);\n\n",
+ arglist_none ? 1 : g_list_length (m->gtktypes));
+
+ out_printf (out,
+ "\tif (G_CCLOSURE_SWAP_DATA (closure)) {\n"
+ "\t\tdata1 = closure->data;\n"
+ "\t\tdata2 = g_value_peek_pointer (param_values + 0);\n"
+ "\t} else {\n"
+ "\t\tdata1 = g_value_peek_pointer (param_values + 0);\n"
+ "\t\tdata2 = closure->data;\n"
+ "\t}\n\n");
+
+ out_printf (out, "\tcallback = (___%s) "
+ "(marshal_data != NULL ? marshal_data : cc->callback);"
+ "\n\n", mname);
+
+ if (ret_none) {
+ out_printf (out, "\tcallback ((%s *)data1", typebase);
+ } else {
+ out_printf (out, "\tv_return = callback ((%s *)data1",
+ typebase);
+ }
+
+ print_signal_marsal_args_gtk2 (m);
+
+ if ( ! ret_none) {
+ /* FIXME: This code is so fucking ugly it hurts */
+ gboolean take_ownership =
+ (strcmp ((char *)m->gtktypes->data, "STRING") == 0 ||
+ strcmp ((char *)m->gtktypes->data, "BOXED") == 0);
+ char *set_func = g_strdup_printf ("g_value_set_%s%s",
+ (char *)gtk2_debool (m->gtktypes->data),
+ take_ownership ?
+ "_take_ownership" : "");
+ g_strdown (set_func);
+
+ out_printf (out, "\n\t%s (return_value, v_return);\n",
+ set_func);
+
+ g_free (set_func);
+ }
+ out_printf (out, "}\n\n");
+}
+
+
static void
add_signal_prots(Method *m)
g_hash_table_insert(marsh, m, s);
eq_signal_methods = g_list_prepend(eq_signal_methods, m);
-
+
/* we know that we'll know all the gtktypes (so get_cast can't fail) */
out_printf(out, "\ntypedef %s (*___%s) (%s *, ",
get_cast(m->gtktypes->data, FALSE), s, typebase);
- if(strcmp(m->gtktypes->next->data, "NONE")!=0) {
- for(li=m->gtktypes->next; li; li=g_list_next(li))
+ if (strcmp (m->gtktypes->next->data, "NONE") != 0) {
+ for (li = m->gtktypes->next; li != NULL; li = li->next)
out_printf(out, "%s, ", get_cast(li->data, FALSE));
}
- out_printf(out, "gpointer);\n");
+ out_printf (out, "gpointer);\n");
- out_printf(out, "\nstatic void\n"
- "___marshal_%s (GtkObject * object,\n"
- "\tGtkSignalFunc func,\n"
- "\tgpointer func_data,\n"
- "\tGtkArg * args)\n"
- "{\n", s);
-
- if(strcmp(m->gtktypes->data, "NONE")==0) {
- out_printf(out, "\t___%s rfunc;\n\n"
- "\trfunc = (___%s)func;\n\n"
- "\t(*rfunc)((%s *)object", s, s, typebase);
- } else {
- const char *retcast = get_cast(m->gtktypes->data, FALSE);
- gboolean is_none = (strcmp(m->gtktypes->next->data, "NONE")==0);
- out_printf(out,
- "\t___%s rfunc;\n\t"
- "%s *retval;\n\n"
- "\trfunc = (___%s)func;\n\n"
- "\tretval = GTK_RETLOC_%s(args[%d]);\n\n"
- "\t*retval = (*rfunc)((%s *)object",
- s, retcast, s,
- (char *)m->gtktypes->data,
- g_list_length(m->gtktypes) - (is_none ? 2 : 1),
- typebase);
- }
- print_signal_marsal_args(m);
+ out_printf (out, "\n#ifdef G_OBJECT_CLASS\n");
+ add_marshal_gtk2 (m, s);
+ out_printf (out, "#else /* ! G_OBJECT_CLASS */\n");
+ add_marshal_gtk1 (m, s);
+ out_printf (out, "#endif /* G_OBJECT_CLASS */\n\n");
}
static void
}
}
- out_printf(out, "\tgtk_object_class_add_signals (gtk_object_class,\n"
- "\t\tobject_signals, LAST_SIGNAL);\n\n");
+ out_printf (out, "#ifndef G_OBJECT_CLASS\n");
+ out_printf (out, "\tgtk_object_class_add_signals (gtk_object_class,\n"
+ "\t\tobject_signals, LAST_SIGNAL);\n");
+ out_printf (out, "#endif /* ! G_OBJECT_CLASS */\n\n");
}
static void
}
static void
-export_accessors (char *var_name,
- GString *get_cbuf,
+export_accessors (const char *var_name,
+ const char *get_cbuf,
int get_lineno,
- GString *set_cbuf,
+ const char *set_cbuf,
int set_lineno,
Type *type,
+ const char *gtktype,
int lineno)
{
- if (get_cbuf) {
+ 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->str);
+ GString *get_cbuf_copy = g_string_new (get_cbuf);
char *tmp;
- Node *node1 = new_type (type->name, type->pointer, type->postfix);
- Node *node3 = new_type (class->class.otype, "*", NULL);
+ 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,
lineno, FALSE, NULL);
}
- if (set_cbuf) {
+ if (set_cbuf != NULL) {
char *set_id = g_strdup_printf ("set_%s", var_name);
- GString *set_cbuf_copy = g_string_new (set_cbuf->str);
- Node *node1 = new_type (type->name, type->pointer, type->postfix);
- Node *node2 = new_type ("void", NULL, NULL);
- Node *node3 = new_type (class->class.otype, "*", NULL);
+ 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);
}
-#line 355 "parse.y"
+#line 379 "parse.y"
typedef union {
char *id;
GString *cbuf;
#if YYDEBUG != 0
static const short yyrline[] = { 0,
- 373, 374, 375, 376, 379, 385, 391, 397, 403, 409,
- 417, 418, 421, 426, 433, 439, 440, 452, 466, 467,
- 470, 471, 479, 480, 481, 484, 485, 486, 487, 490,
- 503, 519, 523, 531, 532, 533, 534, 535, 541, 544,
- 549, 600, 648, 731, 739, 741, 750, 756, 757, 760,
- 763, 769, 773, 780, 783, 786, 790, 794, 798, 803,
- 811, 815, 820, 824, 827, 831, 834, 839, 840, 841,
- 842, 843, 844, 845, 846, 847, 850, 851, 852, 855,
- 856, 857, 861, 868, 880, 886, 898, 910, 913, 919,
- 924, 927, 932, 933, 937, 953, 969, 985, 1001, 1012,
- 1018, 1028, 1051, 1062, 1081, 1087, 1088, 1094, 1095, 1106,
- 1117, 1128, 1138, 1148, 1158, 1161, 1162, 1165, 1166, 1169,
- 1172, 1175, 1183, 1193, 1194, 1197, 1210, 1214, 1218, 1222,
- 1226, 1230, 1236, 1237, 1241
+ 397, 398, 399, 400, 403, 409, 415, 421, 427, 433,
+ 441, 442, 445, 450, 457, 463, 464, 476, 490, 491,
+ 494, 495, 503, 504, 505, 508, 509, 510, 511, 514,
+ 527, 543, 547, 555, 556, 557, 558, 559, 565, 568,
+ 573, 637, 689, 775, 783, 785, 794, 800, 801, 804,
+ 807, 813, 817, 824, 827, 830, 834, 838, 842, 847,
+ 855, 859, 864, 868, 871, 875, 878, 883, 884, 885,
+ 886, 887, 888, 889, 890, 891, 894, 895, 896, 899,
+ 900, 901, 905, 912, 924, 930, 942, 954, 957, 963,
+ 968, 971, 976, 977, 981, 997, 1013, 1029, 1045, 1056,
+ 1062, 1072, 1095, 1106, 1125, 1131, 1132, 1138, 1139, 1150,
+ 1161, 1172, 1182, 1192, 1202, 1205, 1206, 1209, 1210, 1213,
+ 1216, 1219, 1227, 1237, 1238, 1241, 1254, 1258, 1262, 1266,
+ 1270, 1274, 1280, 1281, 1285
};
#endif
switch (yyn) {
case 1:
-#line 373 "parse.y"
+#line 397 "parse.y"
{ ; ;
break;}
case 2:
-#line 374 "parse.y"
+#line 398 "parse.y"
{ ; ;
break;}
case 3:
-#line 375 "parse.y"
+#line 399 "parse.y"
{ ; ;
break;}
case 4:
-#line 376 "parse.y"
+#line 400 "parse.y"
{ ; ;
break;}
case 5:
-#line 379 "parse.y"
+#line 403 "parse.y"
{
Node *node = new_ccode(C_CCODE,(yyvsp[0].cbuf)->str,
ccode_line);
;
break;}
case 6:
-#line 385 "parse.y"
+#line 409 "parse.y"
{
Node *node = new_ccode(H_CCODE,(yyvsp[0].cbuf)->str,
ccode_line);
;
break;}
case 7:
-#line 391 "parse.y"
+#line 415 "parse.y"
{
Node *node = new_ccode(HT_CCODE,(yyvsp[0].cbuf)->str,
ccode_line);
;
break;}
case 8:
-#line 397 "parse.y"
+#line 421 "parse.y"
{
Node *node = new_ccode(PH_CCODE,(yyvsp[0].cbuf)->str,
ccode_line);
;
break;}
case 9:
-#line 403 "parse.y"
+#line 427 "parse.y"
{
Node *node = new_ccode(A_CCODE,(yyvsp[0].cbuf)->str,
ccode_line);
;
break;}
case 10:
-#line 409 "parse.y"
+#line 433 "parse.y"
{
Node *node = new_ccode(AT_CCODE,(yyvsp[0].cbuf)->str,
ccode_line);
;
break;}
case 11:
-#line 417 "parse.y"
+#line 441 "parse.y"
{ ; ;
break;}
case 12:
-#line 418 "parse.y"
+#line 442 "parse.y"
{ ; ;
break;}
case 13:
-#line 421 "parse.y"
+#line 445 "parse.y"
{
((Class *)class)->nodes = class_nodes;
class_nodes = NULL;
;
break;}
case 14:
-#line 426 "parse.y"
+#line 450 "parse.y"
{
((Class *)class)->nodes = NULL;
class_nodes = NULL;
;
break;}
case 15:
-#line 433 "parse.y"
+#line 457 "parse.y"
{
class = new_class (yyvsp[-3].id, yyvsp[-1].id,
bonobo_x_class, chunk_size, NULL);
;
break;}
case 17:
-#line 440 "parse.y"
+#line 464 "parse.y"
{
if(strcmp(yyvsp[-3].id,"chunks") == 0) {
g_free (chunk_size);
;
break;}
case 18:
-#line 452 "parse.y"
+#line 476 "parse.y"
{
if(strcmp(yyvsp[-3].id,"chunks") == 0) {
g_free (chunk_size);
;
break;}
case 19:
-#line 466 "parse.y"
+#line 490 "parse.y"
{ ; ;
break;}
case 20:
-#line 467 "parse.y"
+#line 491 "parse.y"
{ ; ;
break;}
case 21:
-#line 470 "parse.y"
+#line 494 "parse.y"
{ ; ;
break;}
case 22:
-#line 471 "parse.y"
+#line 495 "parse.y"
{
if (strcmp (yyvsp[-1].id, "BonoboX") != 0) {
g_free(yyvsp[-1].id);
;
break;}
case 23:
-#line 479 "parse.y"
+#line 503 "parse.y"
{ ; ;
break;}
case 24:
-#line 480 "parse.y"
+#line 504 "parse.y"
{ ; ;
break;}
case 25:
-#line 481 "parse.y"
+#line 505 "parse.y"
{ ; ;
break;}
case 26:
-#line 484 "parse.y"
+#line 508 "parse.y"
{ the_scope = PUBLIC_SCOPE; ;
break;}
case 27:
-#line 485 "parse.y"
+#line 509 "parse.y"
{ the_scope = PRIVATE_SCOPE; ;
break;}
case 28:
-#line 486 "parse.y"
+#line 510 "parse.y"
{ the_scope = PROTECTED_SCOPE; ;
break;}
case 29:
-#line 487 "parse.y"
+#line 511 "parse.y"
{ the_scope = CLASS_SCOPE; ;
break;}
case 30:
-#line 490 "parse.y"
+#line 514 "parse.y"
{
if(strcmp(yyvsp[-1].id, "destroywith")==0) {
g_free(yyvsp[-1].id);
;
break;}
case 31:
-#line 503 "parse.y"
+#line 527 "parse.y"
{
if(strcmp(yyvsp[-2].id, "destroy")==0) {
g_free(yyvsp[-2].id);
;
break;}
case 32:
-#line 519 "parse.y"
+#line 543 "parse.y"
{
initializer = yyvsp[0].id;
initializer_line = ccode_line;
;
break;}
case 33:
-#line 523 "parse.y"
+#line 547 "parse.y"
{
initializer = (yyvsp[0].cbuf)->str;
initializer_line = ccode_line;
;
break;}
case 34:
-#line 531 "parse.y"
+#line 555 "parse.y"
{ ; ;
break;}
case 35:
-#line 532 "parse.y"
+#line 556 "parse.y"
{ ; ;
break;}
case 36:
-#line 533 "parse.y"
+#line 557 "parse.y"
{ destructor = NULL; ;
break;}
case 37:
-#line 534 "parse.y"
+#line 558 "parse.y"
{ initializer = NULL; ;
break;}
case 38:
-#line 535 "parse.y"
+#line 559 "parse.y"
{
destructor = NULL;
initializer = NULL;
;
break;}
case 39:
-#line 541 "parse.y"
+#line 565 "parse.y"
{
push_variable(yyvsp[-2].id, the_scope,yyvsp[-4].line, NULL);
;
break;}
case 40:
-#line 544 "parse.y"
+#line 568 "parse.y"
{
push_variable(yyvsp[-3].id, the_scope, yyvsp[-5].line, yyvsp[-2].id);
;
break;}
case 41:
-#line 549 "parse.y"
+#line 573 "parse.y"
{
if(strcmp(yyvsp[-6].id,"get")==0 &&
strcmp(yyvsp[-3].id,"set")==0) {
if (yyvsp[-7].id) {
export_accessors (yyvsp[-8].id,
- yyvsp[-4].cbuf, yyvsp[-5].line,
- yyvsp[-1].cbuf, yyvsp[-2].line,
+ (yyvsp[-4].cbuf)->str, yyvsp[-5].line,
+ (yyvsp[-1].cbuf)->str, yyvsp[-2].line,
type,
+ yyvsp[-9].id,
yyvsp[-11].line);
+ g_free (yyvsp[-7].id);
}
g_string_free (yyvsp[-4].cbuf, FALSE);
(yyvsp[-1].cbuf)->str,yyvsp[-2].line,
(yyvsp[-4].cbuf)->str,yyvsp[-5].line,
yyvsp[-11].line);
+
+ if (yyvsp[-7].id) {
+ export_accessors (yyvsp[-8].id,
+ (yyvsp[-1].cbuf)->str, yyvsp[-2].line,
+ (yyvsp[-4].cbuf)->str, yyvsp[-5].line,
+ type,
+ yyvsp[-9].id,
+ yyvsp[-11].line);
+ g_free (yyvsp[-7].id);
+ }
+
g_string_free (yyvsp[-1].cbuf, FALSE);
g_string_free (yyvsp[-4].cbuf, FALSE);
class_nodes = g_list_append(class_nodes,node);
;
break;}
case 42:
-#line 600 "parse.y"
+#line 637 "parse.y"
{
if(strcmp(yyvsp[-3].id, "get") == 0) {
Node *node;
yyvsp[-8].line);
if (yyvsp[-4].id) {
export_accessors (yyvsp[-5].id,
- yyvsp[-1].cbuf, yyvsp[-2].line,
+ (yyvsp[-1].cbuf)->str, yyvsp[-2].line,
NULL, 0,
type,
+ yyvsp[-6].id,
yyvsp[-8].line);
+ g_free (yyvsp[-4].id);
}
g_string_free (yyvsp[-1].cbuf, FALSE);
if (yyvsp[-4].id) {
export_accessors (yyvsp[-5].id,
NULL, 0,
- yyvsp[-1].cbuf, yyvsp[-2].line,
+ (yyvsp[-1].cbuf)->str, yyvsp[-2].line,
type,
+ yyvsp[-6].id,
yyvsp[-8].line);
+ g_free (yyvsp[-4].id);
}
g_string_free (yyvsp[-1].cbuf, FALSE);
;
break;}
case 43:
-#line 648 "parse.y"
+#line 689 "parse.y"
{
Node *node;
char *get, *set = NULL;
g_assert_not_reached();
}
- if(strcmp (yyvsp[0].id, "stringlink")==0) {
+ if (strcmp (yyvsp[0].id, "stringlink")==0) {
get = g_strdup_printf("ARG = g_strdup(%s->%s);", root, yyvsp[-2].id);
- } else
+ } else {
/* For everything else, get is just straight assignment */
get = g_strdup_printf("ARG = %s->%s;", root, yyvsp[-2].id);
+ }
g_free (yyvsp[0].id);
yyvsp[-5].line);
if (yyvsp[-1].id) {
export_accessors (yyvsp[-2].id,
- g_string_new (get), yyvsp[-5].line,
- g_string_new (set), yyvsp[-5].line,
+ get, yyvsp[-5].line,
+ set, yyvsp[-5].line,
type,
+ yyvsp[-3].id,
yyvsp[-5].line);
+ g_free (yyvsp[-1].id);
}
class_nodes = g_list_append(class_nodes,node);
;
break;}
case 44:
-#line 731 "parse.y"
+#line 775 "parse.y"
{
if (strcmp (yyvsp[-1].id, "export")!=0) {
g_free (yyvsp[-1].id);
;
break;}
case 45:
-#line 739 "parse.y"
+#line 783 "parse.y"
{ yyval.id = NULL; ;
break;}
case 46:
-#line 741 "parse.y"
+#line 785 "parse.y"
{
if(strcmp(yyvsp[-2].id,"type")!=0) {
g_free(yyvsp[-4].id);
;
break;}
case 47:
-#line 750 "parse.y"
+#line 794 "parse.y"
{
yyval.id = yyvsp[0].id;
typestack = g_list_prepend(typestack,NULL);
;
break;}
case 48:
-#line 756 "parse.y"
+#line 800 "parse.y"
{ yyval.list = yyvsp[-1].list; ;
break;}
case 49:
-#line 757 "parse.y"
+#line 801 "parse.y"
{ yyval.list = NULL; ;
break;}
case 50:
-#line 760 "parse.y"
+#line 804 "parse.y"
{
yyval.list = g_list_append(yyvsp[0].list,yyvsp[-2].id);
;
break;}
case 51:
-#line 763 "parse.y"
+#line 807 "parse.y"
{
yyval.list = g_list_append(NULL,yyvsp[0].id);
;
break;}
case 52:
-#line 769 "parse.y"
+#line 813 "parse.y"
{
Node *node = new_type(yyvsp[-1].id, yyvsp[0].id, NULL);
typestack = g_list_prepend(typestack,node);
;
break;}
case 53:
-#line 773 "parse.y"
+#line 817 "parse.y"
{
Node *node = new_type(yyvsp[0].id, NULL, NULL);
typestack = g_list_prepend(typestack,node);
;
break;}
case 54:
-#line 780 "parse.y"
+#line 824 "parse.y"
{
yyval.id = yyvsp[0].id;
;
break;}
case 55:
-#line 783 "parse.y"
+#line 827 "parse.y"
{
yyval.id = yyvsp[0].id;
;
break;}
case 56:
-#line 786 "parse.y"
+#line 830 "parse.y"
{
yyval.id = g_strconcat("const ", yyvsp[0].id, NULL);
g_free(yyvsp[0].id);
;
break;}
case 57:
-#line 790 "parse.y"
+#line 834 "parse.y"
{
yyval.id = g_strconcat(yyvsp[-1].id, " const", NULL);
g_free(yyvsp[-1].id);
;
break;}
case 58:
-#line 794 "parse.y"
+#line 838 "parse.y"
{
yyval.id = g_strconcat(yyvsp[-1].id, " ", yyvsp[0].id, NULL);
g_free(yyvsp[0].id);
;
break;}
case 59:
-#line 798 "parse.y"
+#line 842 "parse.y"
{
yyval.id = g_strconcat("const ", yyvsp[-1].id, " ",
yyvsp[0].id, NULL);
;
break;}
case 60:
-#line 803 "parse.y"
+#line 847 "parse.y"
{
yyval.id = g_strconcat(yyvsp[-2].id, " ",
yyvsp[-1].id, " const", NULL);
;
break;}
case 61:
-#line 811 "parse.y"
+#line 855 "parse.y"
{
yyval.id = g_strconcat(yyvsp[-1].id, " ", yyvsp[0].id, NULL);
g_free(yyvsp[0].id);
;
break;}
case 62:
-#line 815 "parse.y"
+#line 859 "parse.y"
{
yyval.id = g_strconcat(yyvsp[-1].id, " ", yyvsp[0].id, NULL);
g_free(yyvsp[-1].id);
;
break;}
case 63:
-#line 820 "parse.y"
+#line 864 "parse.y"
{
yyval.id = g_strconcat("const ", yyvsp[0].id, NULL);
g_free(yyvsp[0].id);
;
break;}
case 64:
-#line 824 "parse.y"
+#line 868 "parse.y"
{
yyval.id = yyvsp[0].id;
;
break;}
case 65:
-#line 827 "parse.y"
+#line 871 "parse.y"
{
yyval.id = g_strconcat(yyvsp[-1].id, " const", NULL);
g_free(yyvsp[-1].id);
;
break;}
case 66:
-#line 831 "parse.y"
+#line 875 "parse.y"
{
yyval.id = g_strdup(yyvsp[0].id);
;
break;}
case 67:
-#line 834 "parse.y"
+#line 878 "parse.y"
{
yyval.id = g_strconcat(yyvsp[-1].id, " const", NULL);
;
break;}
case 68:
-#line 839 "parse.y"
+#line 883 "parse.y"
{ yyval.id = "void"; ;
break;}
case 69:
-#line 840 "parse.y"
+#line 884 "parse.y"
{ yyval.id = "char"; ;
break;}
case 70:
-#line 841 "parse.y"
+#line 885 "parse.y"
{ yyval.id = "short"; ;
break;}
case 71:
-#line 842 "parse.y"
+#line 886 "parse.y"
{ yyval.id = "int"; ;
break;}
case 72:
-#line 843 "parse.y"
+#line 887 "parse.y"
{ yyval.id = "long"; ;
break;}
case 73:
-#line 844 "parse.y"
+#line 888 "parse.y"
{ yyval.id = "float"; ;
break;}
case 74:
-#line 845 "parse.y"
+#line 889 "parse.y"
{ yyval.id = "double"; ;
break;}
case 75:
-#line 846 "parse.y"
+#line 890 "parse.y"
{ yyval.id = "signed"; ;
break;}
case 76:
-#line 847 "parse.y"
+#line 891 "parse.y"
{ yyval.id = "unsigned"; ;
break;}
case 77:
-#line 850 "parse.y"
+#line 894 "parse.y"
{ yyval.id = "struct"; ;
break;}
case 78:
-#line 851 "parse.y"
+#line 895 "parse.y"
{ yyval.id = "union"; ;
break;}
case 79:
-#line 852 "parse.y"
+#line 896 "parse.y"
{ yyval.id = "enum"; ;
break;}
case 80:
-#line 855 "parse.y"
+#line 899 "parse.y"
{ yyval.id = g_strdup("*"); ;
break;}
case 81:
-#line 856 "parse.y"
+#line 900 "parse.y"
{ yyval.id = g_strdup("* const"); ;
break;}
case 82:
-#line 857 "parse.y"
+#line 901 "parse.y"
{
yyval.id = g_strconcat("*", yyvsp[0].id, NULL);
g_free(yyvsp[0].id);
;
break;}
case 83:
-#line 861 "parse.y"
+#line 905 "parse.y"
{
yyval.id = g_strconcat("* const", yyvsp[0].id, NULL);
g_free(yyvsp[0].id);
;
break;}
case 84:
-#line 868 "parse.y"
+#line 912 "parse.y"
{
if(strcmp(yyvsp[-1].id, "first")==0)
yyval.sigtype = SIGNAL_FIRST_METHOD;
;
break;}
case 85:
-#line 880 "parse.y"
+#line 924 "parse.y"
{
yyval.sigtype = SIGNAL_LAST_METHOD;
;
break;}
case 86:
-#line 886 "parse.y"
+#line 930 "parse.y"
{
if(strcmp(yyvsp[-1].id,"first")==0)
yyval.sigtype = SIGNAL_FIRST_METHOD;
;
break;}
case 87:
-#line 898 "parse.y"
+#line 942 "parse.y"
{
if(strcmp(yyvsp[-2].id,"first")==0)
yyval.sigtype = SIGNAL_FIRST_METHOD;
;
break;}
case 88:
-#line 910 "parse.y"
+#line 954 "parse.y"
{
yyval.sigtype = SIGNAL_LAST_METHOD;
;
break;}
case 89:
-#line 913 "parse.y"
+#line 957 "parse.y"
{
/* the_scope was default thus public */
the_scope = PUBLIC_SCOPE;
;
break;}
case 90:
-#line 919 "parse.y"
+#line 963 "parse.y"
{
gtktypes = g_list_prepend(gtktypes, yyvsp[-3].id);
;
break;}
case 91:
-#line 924 "parse.y"
+#line 968 "parse.y"
{
gtktypes = g_list_append(gtktypes, yyvsp[0].id);
;
break;}
case 92:
-#line 927 "parse.y"
+#line 971 "parse.y"
{
gtktypes = g_list_append(gtktypes, yyvsp[0].id);
;
break;}
case 93:
-#line 932 "parse.y"
+#line 976 "parse.y"
{ yyval.cbuf = yyvsp[0].cbuf; ;
break;}
case 94:
-#line 933 "parse.y"
+#line 977 "parse.y"
{ yyval.cbuf = NULL; ;
break;}
case 95:
-#line 937 "parse.y"
+#line 981 "parse.y"
{
if(!has_self) {
yyerror(_("signal without 'self' as "
;
break;}
case 96:
-#line 953 "parse.y"
+#line 997 "parse.y"
{
if(!has_self) {
yyerror(_("signal without 'self' as "
;
break;}
case 97:
-#line 969 "parse.y"
+#line 1013 "parse.y"
{
if(!has_self) {
yyerror(_("virtual method without 'self' as "
;
break;}
case 98:
-#line 985 "parse.y"
+#line 1029 "parse.y"
{
if(!has_self) {
yyerror(_("virtual method without 'self' as "
;
break;}
case 99:
-#line 1001 "parse.y"
+#line 1045 "parse.y"
{
if(!has_self) {
yyerror(_("virtual method without 'self' as "
;
break;}
case 100:
-#line 1012 "parse.y"
+#line 1056 "parse.y"
{
push_function(NO_SCOPE, OVERRIDE_METHOD, yyvsp[-8].id,
yyvsp[-5].id, yyvsp[0].cbuf,
;
break;}
case 101:
-#line 1018 "parse.y"
+#line 1062 "parse.y"
{
if(the_scope == CLASS_SCOPE) {
yyerror(_("a method cannot be of class scope"));
;
break;}
case 102:
-#line 1028 "parse.y"
+#line 1072 "parse.y"
{
if(strcmp(yyvsp[-4].id, "init")==0) {
push_init_arg(yyvsp[-2].id,FALSE);
;
break;}
case 103:
-#line 1051 "parse.y"
+#line 1095 "parse.y"
{
g_free(onerror); onerror = NULL;
g_free(defreturn); defreturn = NULL;
;
break;}
case 104:
-#line 1062 "parse.y"
+#line 1106 "parse.y"
{
g_free(onerror); onerror = NULL;
g_free(defreturn); defreturn = NULL;
;
break;}
case 105:
-#line 1081 "parse.y"
+#line 1125 "parse.y"
{
g_free(onerror); onerror = NULL;
g_free(defreturn); defreturn = NULL;
;
break;}
case 106:
-#line 1087 "parse.y"
+#line 1131 "parse.y"
{ yyval.id = yyvsp[0].id; ;
break;}
case 107:
-#line 1088 "parse.y"
+#line 1132 "parse.y"
{
yyval.id = (yyvsp[1].cbuf)->str;
g_string_free(yyvsp[1].cbuf, FALSE);
;
break;}
case 108:
-#line 1094 "parse.y"
+#line 1138 "parse.y"
{ vararg = FALSE; has_self = FALSE; ;
break;}
case 109:
-#line 1095 "parse.y"
+#line 1139 "parse.y"
{
vararg = FALSE;
has_self = TRUE;
;
break;}
case 110:
-#line 1106 "parse.y"
+#line 1150 "parse.y"
{
vararg = FALSE;
has_self = TRUE;
;
break;}
case 111:
-#line 1117 "parse.y"
+#line 1161 "parse.y"
{
vararg = FALSE;
has_self = TRUE;
;
break;}
case 112:
-#line 1128 "parse.y"
+#line 1172 "parse.y"
{
has_self = TRUE;
if(strcmp(yyvsp[-2].id,"self")==0)
;
break;}
case 113:
-#line 1138 "parse.y"
+#line 1182 "parse.y"
{
has_self = TRUE;
if(strcmp(yyvsp[-3].id,"self")==0)
;
break;}
case 114:
-#line 1148 "parse.y"
+#line 1192 "parse.y"
{
has_self = TRUE;
if(strcmp(yyvsp[-2].id,"self")==0)
;
break;}
case 115:
-#line 1158 "parse.y"
+#line 1202 "parse.y"
{ has_self = FALSE; ;
break;}
case 116:
-#line 1161 "parse.y"
+#line 1205 "parse.y"
{ vararg = TRUE; ;
break;}
case 117:
-#line 1162 "parse.y"
+#line 1206 "parse.y"
{ vararg = FALSE; ;
break;}
case 118:
-#line 1165 "parse.y"
+#line 1209 "parse.y"
{ ; ;
break;}
case 119:
-#line 1166 "parse.y"
+#line 1210 "parse.y"
{ ; ;
break;}
case 120:
-#line 1169 "parse.y"
+#line 1213 "parse.y"
{
push_funcarg(yyvsp[0].id,NULL);
;
break;}
case 121:
-#line 1172 "parse.y"
+#line 1216 "parse.y"
{
push_funcarg(yyvsp[-1].id,yyvsp[0].id);
;
break;}
case 122:
-#line 1175 "parse.y"
+#line 1219 "parse.y"
{
if(strcmp(yyvsp[-2].id,"check")!=0) {
yyerror(_("parse error"));
;
break;}
case 123:
-#line 1183 "parse.y"
+#line 1227 "parse.y"
{
if(strcmp(yyvsp[-2].id,"check")!=0) {
yyerror(_("parse error"));
;
break;}
case 124:
-#line 1193 "parse.y"
+#line 1237 "parse.y"
{ ; ;
break;}
case 125:
-#line 1194 "parse.y"
+#line 1238 "parse.y"
{ ; ;
break;}
case 126:
-#line 1197 "parse.y"
+#line 1241 "parse.y"
{
if(strcmp(yyvsp[0].id,"type")==0) {
Node *node = new_check(TYPE_CHECK,NULL);
;
break;}
case 127:
-#line 1210 "parse.y"
+#line 1254 "parse.y"
{
Node *node = new_check(GT_CHECK,yyvsp[0].id);
checks = g_list_append(checks,node);
;
break;}
case 128:
-#line 1214 "parse.y"
+#line 1258 "parse.y"
{
Node *node = new_check(LT_CHECK,yyvsp[0].id);
checks = g_list_append(checks,node);
;
break;}
case 129:
-#line 1218 "parse.y"
+#line 1262 "parse.y"
{
Node *node = new_check(GE_CHECK,yyvsp[0].id);
checks = g_list_append(checks,node);
;
break;}
case 130:
-#line 1222 "parse.y"
+#line 1266 "parse.y"
{
Node *node = new_check(LE_CHECK,yyvsp[0].id);
checks = g_list_append(checks,node);
;
break;}
case 131:
-#line 1226 "parse.y"
+#line 1270 "parse.y"
{
Node *node = new_check(EQ_CHECK,yyvsp[0].id);
checks = g_list_append(checks,node);
;
break;}
case 132:
-#line 1230 "parse.y"
+#line 1274 "parse.y"
{
Node *node = new_check(NE_CHECK,yyvsp[0].id);
checks = g_list_append(checks,node);
;
break;}
case 133:
-#line 1236 "parse.y"
+#line 1280 "parse.y"
{ yyval.id = yyvsp[0].id; ;
break;}
case 134:
-#line 1237 "parse.y"
+#line 1281 "parse.y"
{
yyval.id = g_strconcat("-",yyvsp[0].id,NULL);
g_free(yyvsp[0].id);
;
break;}
case 135:
-#line 1241 "parse.y"
+#line 1285 "parse.y"
{ yyval.id = yyvsp[0].id; ;
break;}
}
}
return 1;
}
-#line 1244 "parse.y"
+#line 1288 "parse.y"
}
static void
-export_accessors (char *var_name,
- GString *get_cbuf,
+export_accessors (const char *var_name,
+ const char *get_cbuf,
int get_lineno,
- GString *set_cbuf,
+ const char *set_cbuf,
int set_lineno,
Type *type,
+ const char *gtktype,
int lineno)
{
- if (get_cbuf) {
+ 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->str);
+ GString *get_cbuf_copy = g_string_new (get_cbuf);
char *tmp;
- Node *node1 = new_type (type->name, type->pointer, type->postfix);
- Node *node3 = new_type (class->class.otype, "*", NULL);
+ 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,
lineno, FALSE, NULL);
}
- if (set_cbuf) {
+ if (set_cbuf != NULL) {
char *set_id = g_strdup_printf ("set_%s", var_name);
- GString *set_cbuf_copy = g_string_new (set_cbuf->str);
- Node *node1 = new_type (type->name, type->pointer, type->postfix);
- Node *node2 = new_type ("void", NULL, NULL);
- Node *node3 = new_type (class->class.otype, "*", NULL);
+ 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);
if ($<id>5) {
export_accessors ($<id>4,
- $<cbuf>8, $<line>7,
- $<cbuf>11, $<line>10,
+ ($<cbuf>8)->str, $<line>7,
+ ($<cbuf>11)->str, $<line>10,
type,
+ $<id>3,
$<line>1);
+ g_free ($<id>5);
}
g_string_free ($<cbuf>8, FALSE);
($<cbuf>11)->str,$<line>10,
($<cbuf>8)->str,$<line>7,
$<line>1);
+
+ if ($<id>5) {
+ export_accessors ($<id>4,
+ ($<cbuf>11)->str, $<line>10,
+ ($<cbuf>8)->str, $<line>7,
+ type,
+ $<id>3,
+ $<line>1);
+ g_free ($<id>5);
+ }
+
g_string_free ($<cbuf>11, FALSE);
g_string_free ($<cbuf>8, FALSE);
class_nodes = g_list_append(class_nodes,node);
$<line>1);
if ($<id>5) {
export_accessors ($<id>4,
- $<cbuf>8, $<line>7,
+ ($<cbuf>8)->str, $<line>7,
NULL, 0,
type,
+ $<id>3,
$<line>1);
+ g_free ($<id>5);
}
g_string_free ($<cbuf>8, FALSE);
if ($<id>5) {
export_accessors ($<id>4,
NULL, 0,
- $<cbuf>8, $<line>7,
+ ($<cbuf>8)->str, $<line>7,
type,
+ $<id>3,
$<line>1);
+ g_free ($<id>5);
}
g_string_free ($<cbuf>8, FALSE);
g_assert_not_reached();
}
- if(strcmp ($<id>6, "stringlink")==0) {
+ if (strcmp ($<id>6, "stringlink")==0) {
get = g_strdup_printf("ARG = g_strdup(%s->%s);", root, $<id>4);
- } else
+ } else {
/* For everything else, get is just straight assignment */
get = g_strdup_printf("ARG = %s->%s;", root, $<id>4);
+ }
g_free ($<id>6);
$<line>1);
if ($<id>5) {
export_accessors ($<id>4,
- g_string_new (get), $<line>1,
- g_string_new (set), $<line>1,
+ get, $<line>1,
+ set, $<line>1,
type,
+ $<id>3,
$<line>1);
+ g_free ($<id>5);
}
class_nodes = g_list_append(class_nodes,node);