API proposal: g_list_foreach_data, g_slist_foreach_data
Submitted by Jochen Baier
Link to original bug (#429358)
Description
the following example code will show the use of g_(s)list_foreach_data, easy to use perl like syntax to loop over all list data or list pointers.
#include <gtk/gtk.h>
#define g_list_foreach_data(list,value,type)
if (list) for (list=g_list_first(list),value=(type)list->data;
(list->next==list)?(list->next=NULL,list=g_list_first(list),FALSE):TRUE;
value=(list->next!=NULL)?(type)list->next->data:value,
list=((list->next!=NULL)?list->next:(list->next=list,list)))
#define g_slist_foreach_data(list,value,type)
if (list) for (value=(type)list->data;
(list->next==list)?(list->next=NULL,list=NULL,FALSE):TRUE;
value=(list->next!=NULL)?(type)list->next->data:value,
list=((list->next!=NULL)?list->next:(list->next=list,list)))
int main (int argc, char *argv[]) { gtk_init (&argc, &argv);
GList *list=NULL; list=g_list_append (list, "one"); list=g_list_append (list, (gpointer) NULL); list=g_list_append (list, "two"); list=g_list_append (list, "three");
gchar my_value=NULL; g_list_foreach_data (list, my_value, gchar) printf ("my_value: %s\n", my_value);
gchar my_value2=NULL; g_list_foreach_data (list, my_value, gchar) printf ("my_value2: %s\n", my_value);
GList *list2=NULL; list2=g_list_append (list2, GINT_TO_POINTER(1)); list2=g_list_append (list2, GINT_TO_POINTER(2)); list2=g_list_append (list2, GINT_TO_POINTER(3)); list2=g_list_append (list2, GINT_TO_POINTER(4));
gint *number; g_list_foreach_data (list2, number, gpointer) { printf ("number %d\n", GPOINTER_TO_INT (number)); if (GPOINTER_TO_INT(number) == 2) break; } printf ("last_number was: %d\n", number);
GList *labels=NULL; GtkWidget *label1=gtk_label_new ("label1"); GtkWidget *label2=gtk_label_new ("label2"); labels=g_list_append (labels, (gpointer) label1 ); labels=g_list_append (labels, (gpointer) label2 );
GtkWidget label=NULL; g_list_foreach_data (labels, label, GtkWidget) { printf ("label_text: %s\n", gtk_label_get_text (GTK_LABEL(label))); }
GSList *slist=NULL; slist=g_slist_append (slist, "s-one"); slist=g_slist_append (slist, "s-two"); slist=g_slist_append (slist, "s-three");
GSList *tmp_list=slist; gchar svalue=NULL; g_slist_foreach_data (tmp_list, svalue, gchar) printf ("s1 value: %s\n", svalue);
GSList *tmp_list2=slist; gchar svalue2=NULL; g_slist_foreach_data (tmp_list2, svalue2, gchar) printf ("s2 value: %s\n", svalue2);
return 0; }