comparison finch/libgnt/gntutils.c @ 18583:cf7297803a73

Guard against possible weird crashes.
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Sat, 21 Jul 2007 05:53:05 +0000
parents 7ee0e0597a26
children 85b155a574a3
comparison
equal deleted inserted replaced
18582:882ea30935a9 18583:cf7297803a73
232 return tree; 232 return tree;
233 } 233 }
234 234
235 #ifndef NO_LIBXML 235 #ifndef NO_LIBXML
236 static GntWidget * 236 static GntWidget *
237 gnt_widget_from_xmlnode(xmlNode *node, GntWidget **data[]) 237 gnt_widget_from_xmlnode(xmlNode *node, GntWidget **data[], int max)
238 { 238 {
239 GntWidget *widget = NULL; 239 GntWidget *widget = NULL;
240 char *name; 240 char *name;
241 char *id, *prop, *content; 241 char *id, *prop, *content;
242 int val; 242 int val;
282 gnt_box_set_pad(GNT_BOX(widget), val); 282 gnt_box_set_pad(GNT_BOX(widget), val);
283 xmlFree(prop); 283 xmlFree(prop);
284 } 284 }
285 285
286 for (ch = node->children; ch; ch=ch->next) 286 for (ch = node->children; ch; ch=ch->next)
287 gnt_box_add_widget(GNT_BOX(widget), gnt_widget_from_xmlnode(ch, data)); 287 gnt_box_add_widget(GNT_BOX(widget), gnt_widget_from_xmlnode(ch, data, max));
288 } else if (strcmp(name, "button") == 0) { 288 } else if (strcmp(name, "button") == 0) {
289 widget = gnt_button_new(content); 289 widget = gnt_button_new(content);
290 } else if (strcmp(name, "label") == 0) { 290 } else if (strcmp(name, "label") == 0) {
291 widget = gnt_label_new(content); 291 widget = gnt_label_new(content);
292 } else if (strcmp(name, "entry") == 0) { 292 } else if (strcmp(name, "entry") == 0) {
311 } 311 }
312 312
313 id = (char*)xmlGetProp(node, (xmlChar*)"id"); 313 id = (char*)xmlGetProp(node, (xmlChar*)"id");
314 if (id) { 314 if (id) {
315 int i; 315 int i;
316 sscanf(id, "%d", &i); 316 if (sscanf(id, "%d", &i) == 1 && i >= 0 && i < max) {
317 *data[i] = widget; 317 *data[i] = widget;
318 xmlFree(id); 318 xmlFree(id);
319 }
319 } 320 }
320 321
321 prop = (char*)xmlGetProp(node, (xmlChar*)"border"); 322 prop = (char*)xmlGetProp(node, (xmlChar*)"border");
322 if (prop) { 323 if (prop) {
323 int val; 324 int val;
364 va_start(list, num); 365 va_start(list, num);
365 for (id = 0; id < num; id++) 366 for (id = 0; id < num; id++)
366 data[id] = va_arg(list, gpointer); 367 data[id] = va_arg(list, gpointer);
367 368
368 node = xmlDocGetRootElement(doc); 369 node = xmlDocGetRootElement(doc);
369 gnt_widget_from_xmlnode(node, data); 370 gnt_widget_from_xmlnode(node, data, num);
370 371
371 xmlFreeDoc(doc); 372 xmlFreeDoc(doc);
372 xmlCleanupParser(); 373 xmlCleanupParser();
373 va_end(list); 374 va_end(list);
374 g_free(data); 375 g_free(data);