$NetBSD: patch-al,v 1.2 2013/03/28 21:25:52 joerg Exp $ --- libs/gib/gib_classes.c.orig 2003-11-29 02:01:31.000000000 +0000 +++ libs/gib/gib_classes.c @@ -184,26 +184,32 @@ Object_Class_New_f (gib_object_t *obj, g return 0; } +struct child_data { + const char **reply; + unsigned i; +}; + +static qboolean +iterator (void *data_, gib_class_t *class, void *unused) +{ + struct child_data *data = data_; + data->reply[data->i++] = class->name; + return false; +} + static int Object_Class_Children_f (gib_object_t *obj, gib_method_t *method, void *data, gib_object_t *sender, gib_message_t mesg) { - const char **reply; + struct child_data cb_data; unsigned int size; - unsigned int i = 0; - - static qboolean - iterator (gib_class_t *class, void *unused) - { - reply[i++] = class->name; - return false; - } - + size = llist_size (obj->class->children); if (size) { - reply = malloc (sizeof (char *) * size); - llist_iterate (obj->class->children, LLIST_ICAST (iterator)); - GIB_Reply (obj, mesg, size, reply); + cb_data.reply = malloc (sizeof (char *) * size); + cb_data.i = 0; + llist_iterate (obj->class->children, iterator, &cb_data); + GIB_Reply (obj, mesg, size, cb_data.reply); } else GIB_Reply (obj, mesg, 0, NULL); return 0; @@ -600,6 +606,12 @@ Scrobj_Method_f (gib_object_t *obj, gib_ return 0; } +static void +mtabfree (void *mtab, void *unused) +{ + free (mtab); +} + void GIB_Classes_Build_Scripted (const char *name, const char *parentname, gib_tree_t *tree, gib_script_t *script) @@ -610,21 +622,6 @@ GIB_Classes_Build_Scripted (const char * gib_classdesc_t desc; enum {CLASS, INSTANCE} mode = INSTANCE; - static void - mtabfree (void *mtab, void *unused) - { - free (mtab); - } - - static const char * - fname (const char *str) - { - if (mode == INSTANCE) - return va ("__%s_%s__", name, str); - else - return va ("%s::%s", name, str); - } - methods = llist_new (mtabfree, NULL, NULL); cmethods = llist_new (mtabfree, NULL, NULL); @@ -640,6 +637,7 @@ GIB_Classes_Build_Scripted (const char * if (!strcmp (line->children->str, "function")) { gib_tree_t *cur, *last; + char *fname; gib_methodtab_t *new = malloc (sizeof (gib_methodtab_t)); Scrobj_method_t *data = malloc (sizeof @@ -648,9 +646,13 @@ GIB_Classes_Build_Scripted (const char * line->children->next->next; last->next; last = last->next); + + if (mode == INSTANCE) + fname = va("__%s_%s__", name, line->children->next->str); + else + fname = va("%s::%s", name, line->children->next->str); data->func = GIB_Function_Define - (fname - (line->children->next->str), + (fname, last->str, last->children, script, NULL);