Commit 02a871bc authored by Tim Janik's avatar Tim Janik Committed by Tim Janik
Browse files

begin the parameter elipsis (...) after the first argument name. this

Mon Aug 24 02:36:53 1998  Tim Janik  <timj@gtk.org>

        * gtk/gtkarg.h:
        * gtk/gtkarg.c:
        * gtk/gtkwidget.h:
        * gtk/gtkwidget.c:
        * gtk/gtkobject.h:
        * gtk/gtkobject.c:
        * gtk/gtkcontainer.h:
        * gtk/gtkcontainer.c:
        (gtk_object_new):
        (gtk_object_set):
        (gtk_widget_new):
        (gtk_widget_set):
        (gtk_container_add_with_args):
        (gtk_container_child_set):
        begin the parameter elipsis (...) after the first argument name. this
        change is source compatible, since it was always required, even as NULL.
        (gtk_args_collect):
        (gtk_object_args_collect):
        (gtk_container_child_args_collect):
        changed prototypes to pass first_arg_name, also, pass va_list variable
        by value (portability concerns). callers changed.

        * gtk/gtkargcollector.c: implemented gtk_arg_collect_value() as
        a huge macro GTK_ARG_COLLECT_VALUE() <shrug>. this is needed because we
        can't pass va_list variables by reference for portability reasons.
parent db10ace6
Mon Aug 24 02:36:53 1998 Tim Janik <timj@gtk.org>
* gtk/gtkarg.h:
* gtk/gtkarg.c:
* gtk/gtkwidget.h:
* gtk/gtkwidget.c:
* gtk/gtkobject.h:
* gtk/gtkobject.c:
* gtk/gtkcontainer.h:
* gtk/gtkcontainer.c:
(gtk_object_new):
(gtk_object_set):
(gtk_widget_new):
(gtk_widget_set):
(gtk_container_add_with_args):
(gtk_container_child_set):
begin the parameter elipsis (...) after the first argument name. this
change is source compatible, since it was always required, even as NULL.
(gtk_args_collect):
(gtk_object_args_collect):
(gtk_container_child_args_collect):
changed prototypes to pass first_arg_name, also, pass va_list variable
by value (portability concerns). callers changed.
* gtk/gtkargcollector.c: implemented gtk_arg_collect_value() as
a huge macro GTK_ARG_COLLECT_VALUE() <shrug>. this is needed because we
can't pass va_list variables by reference for portability reasons.
Fri Aug 21 22:40:00 Raph Levien <raph@gtk.org>
* gdk/gdkrgb.c: added calls to gdk_rgb_init in the get_cmap and
......
Mon Aug 24 02:36:53 1998 Tim Janik <timj@gtk.org>
* gtk/gtkarg.h:
* gtk/gtkarg.c:
* gtk/gtkwidget.h:
* gtk/gtkwidget.c:
* gtk/gtkobject.h:
* gtk/gtkobject.c:
* gtk/gtkcontainer.h:
* gtk/gtkcontainer.c:
(gtk_object_new):
(gtk_object_set):
(gtk_widget_new):
(gtk_widget_set):
(gtk_container_add_with_args):
(gtk_container_child_set):
begin the parameter elipsis (...) after the first argument name. this
change is source compatible, since it was always required, even as NULL.
(gtk_args_collect):
(gtk_object_args_collect):
(gtk_container_child_args_collect):
changed prototypes to pass first_arg_name, also, pass va_list variable
by value (portability concerns). callers changed.
* gtk/gtkargcollector.c: implemented gtk_arg_collect_value() as
a huge macro GTK_ARG_COLLECT_VALUE() <shrug>. this is needed because we
can't pass va_list variables by reference for portability reasons.
Fri Aug 21 22:40:00 Raph Levien <raph@gtk.org>
* gdk/gdkrgb.c: added calls to gdk_rgb_init in the get_cmap and
......
Mon Aug 24 02:36:53 1998 Tim Janik <timj@gtk.org>
* gtk/gtkarg.h:
* gtk/gtkarg.c:
* gtk/gtkwidget.h:
* gtk/gtkwidget.c:
* gtk/gtkobject.h:
* gtk/gtkobject.c:
* gtk/gtkcontainer.h:
* gtk/gtkcontainer.c:
(gtk_object_new):
(gtk_object_set):
(gtk_widget_new):
(gtk_widget_set):
(gtk_container_add_with_args):
(gtk_container_child_set):
begin the parameter elipsis (...) after the first argument name. this
change is source compatible, since it was always required, even as NULL.
(gtk_args_collect):
(gtk_object_args_collect):
(gtk_container_child_args_collect):
changed prototypes to pass first_arg_name, also, pass va_list variable
by value (portability concerns). callers changed.
* gtk/gtkargcollector.c: implemented gtk_arg_collect_value() as
a huge macro GTK_ARG_COLLECT_VALUE() <shrug>. this is needed because we
can't pass va_list variables by reference for portability reasons.
Fri Aug 21 22:40:00 Raph Levien <raph@gtk.org>
* gdk/gdkrgb.c: added calls to gdk_rgb_init in the get_cmap and
......
Mon Aug 24 02:36:53 1998 Tim Janik <timj@gtk.org>
* gtk/gtkarg.h:
* gtk/gtkarg.c:
* gtk/gtkwidget.h:
* gtk/gtkwidget.c:
* gtk/gtkobject.h:
* gtk/gtkobject.c:
* gtk/gtkcontainer.h:
* gtk/gtkcontainer.c:
(gtk_object_new):
(gtk_object_set):
(gtk_widget_new):
(gtk_widget_set):
(gtk_container_add_with_args):
(gtk_container_child_set):
begin the parameter elipsis (...) after the first argument name. this
change is source compatible, since it was always required, even as NULL.
(gtk_args_collect):
(gtk_object_args_collect):
(gtk_container_child_args_collect):
changed prototypes to pass first_arg_name, also, pass va_list variable
by value (portability concerns). callers changed.
* gtk/gtkargcollector.c: implemented gtk_arg_collect_value() as
a huge macro GTK_ARG_COLLECT_VALUE() <shrug>. this is needed because we
can't pass va_list variables by reference for portability reasons.
Fri Aug 21 22:40:00 Raph Levien <raph@gtk.org>
* gdk/gdkrgb.c: added calls to gdk_rgb_init in the get_cmap and
......
Mon Aug 24 02:36:53 1998 Tim Janik <timj@gtk.org>
* gtk/gtkarg.h:
* gtk/gtkarg.c:
* gtk/gtkwidget.h:
* gtk/gtkwidget.c:
* gtk/gtkobject.h:
* gtk/gtkobject.c:
* gtk/gtkcontainer.h:
* gtk/gtkcontainer.c:
(gtk_object_new):
(gtk_object_set):
(gtk_widget_new):
(gtk_widget_set):
(gtk_container_add_with_args):
(gtk_container_child_set):
begin the parameter elipsis (...) after the first argument name. this
change is source compatible, since it was always required, even as NULL.
(gtk_args_collect):
(gtk_object_args_collect):
(gtk_container_child_args_collect):
changed prototypes to pass first_arg_name, also, pass va_list variable
by value (portability concerns). callers changed.
* gtk/gtkargcollector.c: implemented gtk_arg_collect_value() as
a huge macro GTK_ARG_COLLECT_VALUE() <shrug>. this is needed because we
can't pass va_list variables by reference for portability reasons.
Fri Aug 21 22:40:00 Raph Levien <raph@gtk.org>
* gdk/gdkrgb.c: added calls to gdk_rgb_init in the get_cmap and
......
Mon Aug 24 02:36:53 1998 Tim Janik <timj@gtk.org>
* gtk/gtkarg.h:
* gtk/gtkarg.c:
* gtk/gtkwidget.h:
* gtk/gtkwidget.c:
* gtk/gtkobject.h:
* gtk/gtkobject.c:
* gtk/gtkcontainer.h:
* gtk/gtkcontainer.c:
(gtk_object_new):
(gtk_object_set):
(gtk_widget_new):
(gtk_widget_set):
(gtk_container_add_with_args):
(gtk_container_child_set):
begin the parameter elipsis (...) after the first argument name. this
change is source compatible, since it was always required, even as NULL.
(gtk_args_collect):
(gtk_object_args_collect):
(gtk_container_child_args_collect):
changed prototypes to pass first_arg_name, also, pass va_list variable
by value (portability concerns). callers changed.
* gtk/gtkargcollector.c: implemented gtk_arg_collect_value() as
a huge macro GTK_ARG_COLLECT_VALUE() <shrug>. this is needed because we
can't pass va_list variables by reference for portability reasons.
Fri Aug 21 22:40:00 Raph Levien <raph@gtk.org>
* gdk/gdkrgb.c: added calls to gdk_rgb_init in the get_cmap and
......
Mon Aug 24 02:36:53 1998 Tim Janik <timj@gtk.org>
* gtk/gtkarg.h:
* gtk/gtkarg.c:
* gtk/gtkwidget.h:
* gtk/gtkwidget.c:
* gtk/gtkobject.h:
* gtk/gtkobject.c:
* gtk/gtkcontainer.h:
* gtk/gtkcontainer.c:
(gtk_object_new):
(gtk_object_set):
(gtk_widget_new):
(gtk_widget_set):
(gtk_container_add_with_args):
(gtk_container_child_set):
begin the parameter elipsis (...) after the first argument name. this
change is source compatible, since it was always required, even as NULL.
(gtk_args_collect):
(gtk_object_args_collect):
(gtk_container_child_args_collect):
changed prototypes to pass first_arg_name, also, pass va_list variable
by value (portability concerns). callers changed.
* gtk/gtkargcollector.c: implemented gtk_arg_collect_value() as
a huge macro GTK_ARG_COLLECT_VALUE() <shrug>. this is needed because we
can't pass va_list variables by reference for portability reasons.
Fri Aug 21 22:40:00 Raph Levien <raph@gtk.org>
* gdk/gdkrgb.c: added calls to gdk_rgb_init in the get_cmap and
......
......@@ -233,12 +233,12 @@ gtk_args_collect (GtkType object_type,
GHashTable *arg_info_hash_table,
GSList **arg_list_p,
GSList **info_list_p,
gpointer var_args_p)
const gchar *first_arg_name,
va_list var_args)
{
GSList *arg_list;
GSList *info_list;
gchar *arg_name;
va_list *var_args = var_args_p;
const gchar *arg_name;
g_return_val_if_fail (arg_list_p != NULL, NULL);
*arg_list_p = NULL;
......@@ -248,7 +248,7 @@ gtk_args_collect (GtkType object_type,
arg_list = NULL;
info_list = NULL;
arg_name = va_arg (*var_args, gchar*);
arg_name = first_arg_name;
while (arg_name)
{
GtkArgInfo *info = NULL;
......@@ -262,8 +262,8 @@ gtk_args_collect (GtkType object_type,
info_list = g_slist_prepend (info_list, info);
arg = gtk_arg_new (info->type);
arg->name = arg_name;
error = gtk_arg_collect_value (GTK_FUNDAMENTAL_TYPE (arg->type), arg, var_args);
arg->name = (gchar*) arg_name;
GTK_ARG_COLLECT_VALUE (GTK_FUNDAMENTAL_TYPE (arg->type), arg, var_args, error);
arg_list = g_slist_prepend (arg_list, arg);
}
if (error)
......@@ -273,7 +273,7 @@ gtk_args_collect (GtkType object_type,
return error;
}
arg_name = va_arg (*var_args, gchar*);
arg_name = va_arg (var_args, gchar*);
}
*arg_list_p = g_slist_reverse (arg_list);
......
......@@ -60,7 +60,8 @@ gchar* gtk_args_collect (GtkType object_type,
GHashTable *arg_info_hash_table,
GSList **arg_list_p,
GSList **info_list_p,
gpointer var_args_p);
const gchar *first_arg_name,
va_list var_args);
void gtk_args_collect_cleanup (GSList *arg_list,
GSList *info_list);
gchar* gtk_arg_get_info (GtkType object_type,
......
......@@ -17,144 +17,149 @@
* Boston, MA 02111-1307, USA.
*/
/* collect a single argument value from a va_list
/* collect a single argument value from a va_list.
* this is implemented as a huge macro <shrug>, because we can't
* pass va_list variables by reference on some systems.
* the former prototype was:
* static inline gchar*
* gtk_arg_collect_value (GtkType fundamental_type,
* GtkArg *arg,
* va_list var_args);
*/
static inline gchar*
gtk_arg_collect_value (GtkType fundamental_type,
GtkArg *arg,
va_list *var_args)
{
gchar *error_msg;
error_msg = NULL;
switch (fundamental_type)
{
case GTK_TYPE_INVALID:
error_msg = g_strdup ("invalid untyped argument");
break;
case GTK_TYPE_NONE:
/* we just ignore this type, since it arithmetically just requires
* us to not move the var_args pointer any further. callers need to
* check for the validity of GTK_TYPE_NONE themselves.
*
* error_msg = g_strdup ("invalid argument type `void'");
*/
break;
/* everything smaller than an int is guarranteed to be
* passed as an int
*/
case GTK_TYPE_CHAR:
GTK_VALUE_CHAR (*arg) = va_arg (*var_args, gint);
break;
case GTK_TYPE_UCHAR:
GTK_VALUE_UCHAR (*arg) = va_arg (*var_args, guint);
break;
case GTK_TYPE_BOOL:
GTK_VALUE_BOOL (*arg) = va_arg (*var_args, gint);
break;
case GTK_TYPE_INT:
GTK_VALUE_INT (*arg) = va_arg (*var_args, gint);
break;
case GTK_TYPE_UINT:
GTK_VALUE_UINT (*arg) = va_arg (*var_args, guint);
break;
case GTK_TYPE_ENUM:
GTK_VALUE_ENUM (*arg) = va_arg (*var_args, gint);
break;
case GTK_TYPE_FLAGS:
GTK_VALUE_FLAGS (*arg) = va_arg (*var_args, guint);
break;
/* we collect longs as glongs since they differ in size with
* integers on some platforms
*/
case GTK_TYPE_LONG:
GTK_VALUE_LONG (*arg) = va_arg (*var_args, glong);
break;
case GTK_TYPE_ULONG:
GTK_VALUE_ULONG (*arg) = va_arg (*var_args, gulong);
break;
/* floats are always passed as doubles
*/
case GTK_TYPE_FLOAT:
/* GTK_VALUE_FLOAT (*arg) = va_arg (*var_args, gfloat); */
GTK_VALUE_FLOAT (*arg) = va_arg (*var_args, gdouble);
break;
case GTK_TYPE_DOUBLE:
GTK_VALUE_DOUBLE (*arg) = va_arg (*var_args, gdouble);
break;
/* collect pointer values
*/
case GTK_TYPE_STRING:
GTK_VALUE_STRING (*arg) = va_arg (*var_args, gchar*);
break;
case GTK_TYPE_POINTER:
GTK_VALUE_POINTER (*arg) = va_arg (*var_args, gpointer);
break;
case GTK_TYPE_BOXED:
GTK_VALUE_BOXED (*arg) = va_arg (*var_args, gpointer);
break;
/* structured types
*/
case GTK_TYPE_SIGNAL:
GTK_VALUE_SIGNAL (*arg).f = va_arg (*var_args, GtkSignalFunc);
GTK_VALUE_SIGNAL (*arg).d = va_arg (*var_args, gpointer);
break;
case GTK_TYPE_ARGS:
GTK_VALUE_ARGS (*arg).n_args = va_arg (*var_args, gint);
GTK_VALUE_ARGS (*arg).args = va_arg (*var_args, GtkArg*);
break;
case GTK_TYPE_FOREIGN:
GTK_VALUE_FOREIGN (*arg).data = va_arg (*var_args, gpointer);
GTK_VALUE_FOREIGN (*arg).notify = va_arg (*var_args, GtkDestroyNotify);
break;
case GTK_TYPE_CALLBACK:
GTK_VALUE_CALLBACK (*arg).marshal = va_arg (*var_args, GtkCallbackMarshal);
GTK_VALUE_CALLBACK (*arg).data = va_arg (*var_args, gpointer);
GTK_VALUE_CALLBACK (*arg).notify = va_arg (*var_args, GtkDestroyNotify);
break;
case GTK_TYPE_C_CALLBACK:
GTK_VALUE_C_CALLBACK (*arg).func = va_arg (*var_args, GtkFunction);
GTK_VALUE_C_CALLBACK (*arg).func_data = va_arg (*var_args, gpointer);
break;
/* we do some extra sanity checking when collecting objects,
* i.e. if the object pointer is not NULL, we check whether we
* actually got an object pointer within the desired class branch.
*/
case GTK_TYPE_OBJECT:
GTK_VALUE_OBJECT (*arg) = va_arg (*var_args, GtkObject*);
if (GTK_VALUE_OBJECT (*arg) != NULL)
{
register GtkObject *object = GTK_VALUE_OBJECT (*arg);
if (object->klass == NULL)
error_msg = g_strconcat ("invalid unclassed object pointer for argument type `",
gtk_type_name (arg->type),
"'",
NULL);
else if (!gtk_type_is_a (GTK_OBJECT_TYPE (object), arg->type))
error_msg = g_strconcat ("invalid object `",
gtk_type_name (GTK_OBJECT_TYPE (object)),
"' for argument type `",
gtk_type_name (arg->type),
"'",
NULL);
}
break;
default:
error_msg = g_strconcat ("unsupported argument type `",
gtk_type_name (arg->type),
"'",
NULL);
break;
}
return error_msg;
}
#define GTK_ARG_COLLECT_VALUE(_ft, arg, var_args, _error) \
G_STMT_START { \
GtkType fundamental_type = _ft; \
gchar *error_msg; \
\
error_msg = NULL; \
switch (fundamental_type) \
{ \
case GTK_TYPE_INVALID: \
error_msg = g_strdup ("invalid untyped argument"); \
break; \
\
case GTK_TYPE_NONE: \
/* we just ignore this type, since it arithmetically just requires \
* us to not move the var_args pointer any further. callers need to \
* check for the validity of GTK_TYPE_NONE themselves. \
* \
* error_msg = g_strdup ("invalid argument type `void'"); \
*/ \
break; \
\
/* everything smaller than an int is guarranteed to be \
* passed as an int \
*/ \
case GTK_TYPE_CHAR: \
GTK_VALUE_CHAR (*arg) = va_arg (var_args, gint); \
break; \
case GTK_TYPE_UCHAR: \
GTK_VALUE_UCHAR (*arg) = va_arg (var_args, guint); \
break; \
case GTK_TYPE_BOOL: \
GTK_VALUE_BOOL (*arg) = va_arg (var_args, gint); \
break; \
case GTK_TYPE_INT: \
GTK_VALUE_INT (*arg) = va_arg (var_args, gint); \
break; \
case GTK_TYPE_UINT: \
GTK_VALUE_UINT (*arg) = va_arg (var_args, guint); \
break; \
case GTK_TYPE_ENUM: \
GTK_VALUE_ENUM (*arg) = va_arg (var_args, gint); \
break; \
case GTK_TYPE_FLAGS: \
GTK_VALUE_FLAGS (*arg) = va_arg (var_args, guint); \
break; \
\
/* we collect longs as glongs since they differ in size with \
* integers on some platforms \
*/ \
case GTK_TYPE_LONG: \
GTK_VALUE_LONG (*arg) = va_arg (var_args, glong); \
break; \
case GTK_TYPE_ULONG: \
GTK_VALUE_ULONG (*arg) = va_arg (var_args, gulong); \
break; \
\
/* floats are always passed as doubles \
*/ \
case GTK_TYPE_FLOAT: \
/* GTK_VALUE_FLOAT (*arg) = va_arg (var_args, gfloat); */ \
GTK_VALUE_FLOAT (*arg) = va_arg (var_args, gdouble); \
break; \
case GTK_TYPE_DOUBLE: \
GTK_VALUE_DOUBLE (*arg) = va_arg (var_args, gdouble); \
break; \
\
/* collect pointer values \
*/ \
case GTK_TYPE_STRING: \
GTK_VALUE_STRING (*arg) = va_arg (var_args, gchar*); \
break; \
case GTK_TYPE_POINTER: \
GTK_VALUE_POINTER (*arg) = va_arg (var_args, gpointer); \
break; \
case GTK_TYPE_BOXED: \
GTK_VALUE_BOXED (*arg) = va_arg (var_args, gpointer); \
break; \
\
/* structured types \
*/ \
case GTK_TYPE_SIGNAL: \
GTK_VALUE_SIGNAL (*arg).f = va_arg (var_args, GtkSignalFunc); \
GTK_VALUE_SIGNAL (*arg).d = va_arg (var_args, gpointer); \
break; \
case GTK_TYPE_ARGS: \
GTK_VALUE_ARGS (*arg).n_args = va_arg (var_args, gint); \
GTK_VALUE_ARGS (*arg).args = va_arg (var_args, GtkArg*); \
break; \
case GTK_TYPE_FOREIGN: \
GTK_VALUE_FOREIGN (*arg).data = va_arg (var_args, gpointer); \
GTK_VALUE_FOREIGN (*arg).notify = va_arg (var_args, GtkDestroyNotify); \
break; \
case GTK_TYPE_CALLBACK: \
GTK_VALUE_CALLBACK (*arg).marshal = va_arg (var_args, GtkCallbackMarshal); \
GTK_VALUE_CALLBACK (*arg).data = va_arg (var_args, gpointer); \
GTK_VALUE_CALLBACK (*arg).notify = va_arg (var_args, GtkDestroyNotify); \
break; \
case GTK_TYPE_C_CALLBACK: \
GTK_VALUE_C_CALLBACK (*arg).func = va_arg (var_args, GtkFunction); \
GTK_VALUE_C_CALLBACK (*arg).func_data = va_arg (var_args, gpointer); \
break; \
\
/* we do some extra sanity checking when collecting objects, \
* i.e. if the object pointer is not NULL, we check whether we \
* actually got an object pointer within the desired class branch. \
*/ \
case GTK_TYPE_OBJECT: \
GTK_VALUE_OBJECT (*arg) = va_arg (var_args, GtkObject*); \
if (GTK_VALUE_OBJECT (*arg) != NULL) \
{ \
register GtkObject *object = GTK_VALUE_OBJECT (*arg); \
\
if (object->klass == NULL) \
error_msg = g_strconcat ("invalid unclassed object pointer for argument type `", \
gtk_type_name (arg->type), \
"'", \
NULL); \
else if (!gtk_type_is_a (GTK_OBJECT_TYPE (object), arg->type)) \
error_msg = g_strconcat ("invalid object `", \
gtk_type_name (GTK_OBJECT_TYPE (object)), \
"' for argument type `", \
gtk_type_name (arg->type), \
"'", \
NULL); \
} \
break; \
\
default: \
error_msg = g_strconcat ("unsupported argument type `", \
gtk_type_name (arg->type), \
"'", \
NULL); \
break; \
} \
\
_error = error_msg; /* return error_msg; */ \
} G_STMT_END
......@@ -250,6 +250,7 @@ gtk_container_child_type (GtkContainer *container)
void
gtk_container_add_with_args (GtkContainer *container,
GtkWidget *widget,
const gchar *first_arg_name,
...)
{
g_return_if_fail (container != NULL);
......@@ -270,11 +271,12 @@ gtk_container_add_with_args (GtkContainer *container,
GSList *info_list = NULL;
gchar *error;
va_start (var_args, widget);
va_start (var_args, first_arg_name);
error = gtk_container_child_args_collect (GTK_OBJECT_TYPE (container),
&arg_list,
&info_list,
&var_args);
first_arg_name,
var_args);
va_end (var_args);
if (error)
......@@ -375,6 +377,7 @@ gtk_container_child_getv (GtkContainer *container,
void
gtk_container_child_set (GtkContainer *container,
GtkWidget *child,
const gchar *first_arg_name,
...)
{
va_list var_args;
......@@ -388,11 +391,12 @@ gtk_container_child_set (GtkContainer *container,
g_return_if_fail (GTK_IS_WIDGET (child));
g_return_if_fail (child->parent != NULL);
va_start (var_args, child);
va_start (var_args, first_arg_name);
error = gtk_container_child_args_collect (GTK_OBJECT_TYPE (container),
&arg_list,
&info_list,
&var_args);
first_arg_name,
var_args);
va_end (var_args);
if (error)
......@@ -541,13 +545,15 @@ gchar*
gtk_container_child_args_collect (GtkType object_type,
GSList **arg_list_p,
GSList **info_list_p,
gpointer var_args_p)
const gchar *first_arg_name,
va_list var_args)
{
return gtk_args_collect (object_type,
container_child_arg_info_ht,
arg_list_p,