diff options
author | Joseph Herlant <herlantj@gmail.com> | 2018-05-25 22:06:51 -0700 |
---|---|---|
committer | Joseph Herlant <aerostitch@users.noreply.github.com> | 2018-05-25 22:17:50 -0700 |
commit | 8a76acb966f7059caf9d72c853175bd923b1e9d7 (patch) | |
tree | 1735178f7a0718831b88d2c36ea18a9955de3224 /navit/xmlconfig.c | |
parent | 032f15287b472f1a4b5349533f3e5b468684b281 (diff) | |
download | navit-8a76acb966f7059caf9d72c853175bd923b1e9d7.tar.gz |
cleanup:global:Use astyle to reformat everything
Diffstat (limited to 'navit/xmlconfig.c')
-rw-r--r-- | navit/xmlconfig.c | 2093 |
1 files changed, 1031 insertions, 1062 deletions
diff --git a/navit/xmlconfig.c b/navit/xmlconfig.c index 56df4c7fa..bacfea390 100644 --- a/navit/xmlconfig.c +++ b/navit/xmlconfig.c @@ -58,112 +58,110 @@ #endif struct xistate { - struct xistate *parent; - struct xistate *child; - const gchar *element; - const gchar **attribute_names; - const gchar **attribute_values; + struct xistate *parent; + struct xistate *child; + const gchar *element; + const gchar **attribute_names; + const gchar **attribute_values; }; struct xmldocument { - const gchar *href; - const gchar *xpointer; - gpointer user_data; - struct xistate *first; - struct xistate *last; - int active; - int level; + const gchar *href; + const gchar *xpointer; + gpointer user_data; + struct xistate *first; + struct xistate *last; + int active; + int level; }; struct xmlstate { - const gchar **attribute_names; - const gchar **attribute_values; - struct xmlstate *parent; - struct attr element_attr; - const gchar *element; - xmlerror **error; - struct element_func *func; - struct object_func *object_func; - struct xmldocument *document; + const gchar **attribute_names; + const gchar **attribute_values; + struct xmlstate *parent; + struct attr element_attr; + const gchar *element; + xmlerror **error; + struct element_func *func; + struct object_func *object_func; + struct xmldocument *document; }; struct attr_fixme { - char *element; - char **attr_fixme; + char *element; + char **attr_fixme; }; -static struct attr ** convert_to_attrs(struct xmlstate *state, struct attr_fixme *fixme) -{ - const gchar **attribute_name=state->attribute_names; - const gchar **attribute_value=state->attribute_values; - const gchar *name; - int count=0; - struct attr **ret; - static int fixme_count; - - while (*attribute_name) { - count++; - attribute_name++; - } - ret=g_new(struct attr *, count+1); - attribute_name=state->attribute_names; - count=0; - while (*attribute_name) { - name=*attribute_name; - if (fixme) { - char **attr_fixme=fixme->attr_fixme; - while (attr_fixme[0]) { - if (! strcmp(name, attr_fixme[0])) { - name=attr_fixme[1]; - if (fixme_count++ < 10) - dbg(lvl_error,"Please change attribute '%s' to '%s' in <%s />", attr_fixme[0], attr_fixme[1], fixme->element); - break; - } - attr_fixme+=2; - } - } - ret[count]=attr_new_from_text(name,*attribute_value); - if (ret[count]) - count++; - else if (strcmp(*attribute_name,"enabled") && strcmp(*attribute_name,"xmlns:xi")) - dbg(lvl_error,"failed to create attribute '%s' with value '%s'", *attribute_name,*attribute_value); - attribute_name++; - attribute_value++; - } - ret[count]=NULL; - dbg(lvl_debug,"ret=%p", ret); - return ret; +static struct attr ** convert_to_attrs(struct xmlstate *state, struct attr_fixme *fixme) { + const gchar **attribute_name=state->attribute_names; + const gchar **attribute_value=state->attribute_values; + const gchar *name; + int count=0; + struct attr **ret; + static int fixme_count; + + while (*attribute_name) { + count++; + attribute_name++; + } + ret=g_new(struct attr *, count+1); + attribute_name=state->attribute_names; + count=0; + while (*attribute_name) { + name=*attribute_name; + if (fixme) { + char **attr_fixme=fixme->attr_fixme; + while (attr_fixme[0]) { + if (! strcmp(name, attr_fixme[0])) { + name=attr_fixme[1]; + if (fixme_count++ < 10) + dbg(lvl_error,"Please change attribute '%s' to '%s' in <%s />", attr_fixme[0], attr_fixme[1], fixme->element); + break; + } + attr_fixme+=2; + } + } + ret[count]=attr_new_from_text(name,*attribute_value); + if (ret[count]) + count++; + else if (strcmp(*attribute_name,"enabled") && strcmp(*attribute_name,"xmlns:xi")) + dbg(lvl_error,"failed to create attribute '%s' with value '%s'", *attribute_name,*attribute_value); + attribute_name++; + attribute_value++; + } + ret[count]=NULL; + dbg(lvl_debug,"ret=%p", ret); + return ret; } -static const char * find_attribute(struct xmlstate *state, const char *attribute, int required) -{ - const gchar **attribute_name=state->attribute_names; - const gchar **attribute_value=state->attribute_values; - while(*attribute_name) { - if(! g_ascii_strcasecmp(attribute,*attribute_name)) - return *attribute_value; - attribute_name++; - attribute_value++; - } - if (required) - g_set_error(state->error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "element '%s' is missing attribute '%s'", state->element, attribute); - return NULL; +static const char * find_attribute(struct xmlstate *state, const char *attribute, int required) { + const gchar **attribute_name=state->attribute_names; + const gchar **attribute_value=state->attribute_values; + while(*attribute_name) { + if(! g_ascii_strcasecmp(attribute,*attribute_name)) + return *attribute_value; + attribute_name++; + attribute_value++; + } + if (required) + g_set_error(state->error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "element '%s' is missing attribute '%s'", + state->element, attribute); + return NULL; } static int -find_boolean(struct xmlstate *state, const char *attribute, int deflt, int required) -{ - const char *value; - - value=find_attribute(state, attribute, required); - if (! value) - return deflt; - if (g_ascii_strcasecmp(value,"no") && g_ascii_strcasecmp(value,"0") && g_ascii_strcasecmp(value,"false")) - return 1; - return 0; +find_boolean(struct xmlstate *state, const char *attribute, int deflt, int required) { + const char *value; + + value=find_attribute(state, attribute, required); + if (! value) + return deflt; + if (g_ascii_strcasecmp(value,"no") && g_ascii_strcasecmp(value,"0") && g_ascii_strcasecmp(value,"false")) + return 1; + return 0; } /** @@ -173,48 +171,46 @@ find_boolean(struct xmlstate *state, const char *attribute, int deflt, int requi * * @returns int value of converted string * */ static int -convert_number(const char *val) -{ - if (val) - return g_ascii_strtoull(val,NULL,0); - else - return 0; +convert_number(const char *val) { + if (val) + return g_ascii_strtoull(val,NULL,0); + else + return 0; } static int -xmlconfig_announce(struct xmlstate *state) -{ - const char *type,*value; - char key[32]; - int level[3]; - int i; - enum item_type itype; - char *tok, *type_str, *str; - - type=find_attribute(state, "type", 1); - if (! type) - return 0; - for (i = 0 ; i < 3 ; i++) { - sprintf(key,"level%d", i); - value=find_attribute(state, key, 0); - if (value) - level[i]=convert_number(value); - else - level[i]=-1; - } - type_str=g_strdup(type); - str=type_str; - while ((tok=strtok(str, ","))) { - itype=item_from_name(tok); - if (itype!=type_none) { - navigation_set_announce(state->parent->element_attr.u.data, itype, level); - } else { - dbg(lvl_error, "Invalid type for announcement: %s",tok); - } - str=NULL; - } - g_free(type_str); - return 1; +xmlconfig_announce(struct xmlstate *state) { + const char *type,*value; + char key[32]; + int level[3]; + int i; + enum item_type itype; + char *tok, *type_str, *str; + + type=find_attribute(state, "type", 1); + if (! type) + return 0; + for (i = 0 ; i < 3 ; i++) { + sprintf(key,"level%d", i); + value=find_attribute(state, key, 0); + if (value) + level[i]=convert_number(value); + else + level[i]=-1; + } + type_str=g_strdup(type); + str=type_str; + while ((tok=strtok(str, ","))) { + itype=item_from_name(tok); + if (itype!=type_none) { + navigation_set_announce(state->parent->element_attr.u.data, itype, level); + } else { + dbg(lvl_error, "Invalid type for announcement: %s",tok); + } + str=NULL; + } + g_free(type_str); + return 1; } /** * * Define the elements in our config @@ -232,329 +228,328 @@ xmlconfig_announce(struct xmlstate *state) #define DESTROY(x) (void (*)(void *))(x) static struct object_func object_funcs[] = { - { attr_announcement,NEW(announcement_new), GET(announcement_get_attr), NULL, NULL, SET(announcement_set_attr), ADD(announcement_add_attr) }, - { attr_arrows, NEW(arrows_new)}, - { attr_circle, NEW(circle_new), NULL, NULL, NULL, NULL, ADD(element_add_attr)}, - { attr_coord, NEW(coord_new_from_attrs)}, - { attr_cursor, NEW(cursor_new), NULL, NULL, NULL, NULL, ADD(cursor_add_attr)}, - { attr_debug, NEW(debug_new)}, - { attr_graphics, NEW(graphics_new), GET(graphics_get_attr)}, - { attr_gui, NEW(gui_new), GET(gui_get_attr), NULL, NULL, SET(gui_set_attr), ADD(gui_add_attr)}, - { attr_icon, NEW(icon_new), NULL, NULL, NULL, NULL, ADD(element_add_attr)}, - { attr_image, NEW(image_new)}, - { attr_itemgra, NEW(itemgra_new), NULL, NULL, NULL, NULL, ADD(itemgra_add_attr)}, - { attr_plugins, NEW(plugins_new), NULL, NULL, NULL, NULL, NULL, NULL, INIT(plugins_init)}, - { attr_plugin, NEW(plugin_new)}, - { attr_polygon, NEW(polygon_new), NULL, NULL, NULL, NULL, ADD(element_add_attr)}, - { attr_polyline, NEW(polyline_new), NULL, NULL, NULL, NULL, ADD(element_add_attr)}, - { attr_text, NEW(text_new)}, + { attr_announcement,NEW(announcement_new), GET(announcement_get_attr), NULL, NULL, SET(announcement_set_attr), ADD(announcement_add_attr) }, + { attr_arrows, NEW(arrows_new)}, + { attr_circle, NEW(circle_new), NULL, NULL, NULL, NULL, ADD(element_add_attr)}, + { attr_coord, NEW(coord_new_from_attrs)}, + { attr_cursor, NEW(cursor_new), NULL, NULL, NULL, NULL, ADD(cursor_add_attr)}, + { attr_debug, NEW(debug_new)}, + { attr_graphics, NEW(graphics_new), GET(graphics_get_attr)}, + { attr_gui, NEW(gui_new), GET(gui_get_attr), NULL, NULL, SET(gui_set_attr), ADD(gui_add_attr)}, + { attr_icon, NEW(icon_new), NULL, NULL, NULL, NULL, ADD(element_add_attr)}, + { attr_image, NEW(image_new)}, + { attr_itemgra, NEW(itemgra_new), NULL, NULL, NULL, NULL, ADD(itemgra_add_attr)}, + { attr_plugins, NEW(plugins_new), NULL, NULL, NULL, NULL, NULL, NULL, INIT(plugins_init)}, + { attr_plugin, NEW(plugin_new)}, + { attr_polygon, NEW(polygon_new), NULL, NULL, NULL, NULL, ADD(element_add_attr)}, + { attr_polyline, NEW(polyline_new), NULL, NULL, NULL, NULL, ADD(element_add_attr)}, + { attr_text, NEW(text_new)}, }; struct object_func * -object_func_lookup(enum attr_type type) -{ - int i; - switch (type) { - case attr_config: - return &config_func; - case attr_layer: - return &layer_func; - case attr_layout: - return &layout_func; - case attr_log: - return &log_func; - case attr_map: - return &map_func; - case attr_maps: - return &maps_func; - case attr_mapset: - return &mapset_func; - case attr_navigation: - return &navigation_func; - case attr_navit: - return &navit_func; - case attr_profile_option: - return &profile_option_func; - case attr_roadprofile: - return &roadprofile_func; - case attr_route: - return &route_func; - case attr_script: - return &script_func; - case attr_osd: - return &osd_func; - case attr_trackingo: - return &tracking_func; - case attr_speech: - return &speech_func; - case attr_vehicle: - return &vehicle_func; - case attr_vehicleprofile: - return &vehicleprofile_func; - default: - for (i = 0 ; i < sizeof(object_funcs)/sizeof(struct object_func); i++) { - if (object_funcs[i].type == type) - return &object_funcs[i]; - } - return NULL; - } +object_func_lookup(enum attr_type type) { + int i; + switch (type) { + case attr_config: + return &config_func; + case attr_layer: + return &layer_func; + case attr_layout: + return &layout_func; + case attr_log: + return &log_func; + case attr_map: + return &map_func; + case attr_maps: + return &maps_func; + case attr_mapset: + return &mapset_func; + case attr_navigation: + return &navigation_func; + case attr_navit: + return &navit_func; + case attr_profile_option: + return &profile_option_func; + case attr_roadprofile: + return &roadprofile_func; + case attr_route: + return &route_func; + case attr_script: + return &script_func; + case attr_osd: + return &osd_func; + case attr_trackingo: + return &tracking_func; + case attr_speech: + return &speech_func; + case attr_vehicle: + return &vehicle_func; + case attr_vehicleprofile: + return &vehicleprofile_func; + default: + for (i = 0 ; i < sizeof(object_funcs)/sizeof(struct object_func); i++) { + if (object_funcs[i].type == type) + return &object_funcs[i]; + } + return NULL; + } } struct element_func { - char *name; - char *parent; - int (*func)(struct xmlstate *state); - enum attr_type type; + char *name; + char *parent; + int (*func)(struct xmlstate *state); + enum attr_type type; }; struct element_func *elements; -static char *attr_fixme_itemgra[]={ - "type","item_types", - NULL,NULL, +static char *attr_fixme_itemgra[]= { + "type","item_types", + NULL,NULL, }; -static char *attr_fixme_text[]={ - "label_size","text_size", - NULL,NULL, +static char *attr_fixme_text[]= { + "label_size","text_size", + NULL,NULL, }; -static char *attr_fixme_circle[]={ - "label_size","text_size", - NULL,NULL, +static char *attr_fixme_circle[]= { + "label_size","text_size", + NULL,NULL, }; -static struct attr_fixme attr_fixmes[]={ - {"item",attr_fixme_itemgra}, - {"itemgra",attr_fixme_itemgra}, - {"text",attr_fixme_text}, - {"label",attr_fixme_text}, - {"circle",attr_fixme_circle}, - {NULL,NULL}, +static struct attr_fixme attr_fixmes[]= { + {"item",attr_fixme_itemgra}, + {"itemgra",attr_fixme_itemgra}, + {"text",attr_fixme_text}, + {"label",attr_fixme_text}, + {"circle",attr_fixme_circle}, + {NULL,NULL}, }; -static char *element_fixmes[]={ - "item","itemgra", - "label","text", - NULL,NULL, +static char *element_fixmes[]= { + "item","itemgra", + "label","text", + NULL,NULL, }; static void initStatic(void) { - elements=g_new0(struct element_func,44); //43 is a number of elements + ending NULL element - - elements[0].name="config"; - elements[0].parent=NULL; - elements[0].func=NULL; - elements[0].type=attr_config; - - elements[1].name="announce"; - elements[1].parent="navigation"; - elements[1].func=xmlconfig_announce; - - elements[2].name="speech"; - elements[2].parent="navit"; - elements[2].func=NULL; - elements[2].type=attr_speech; - - elements[3].name="tracking"; - elements[3].parent="navit"; - elements[3].func=NULL; - elements[3].type=attr_trackingo; - - elements[4].name="route"; - elements[4].parent="navit"; - elements[4].func=NULL; - elements[4].type=attr_route; - - elements[5].name="mapset"; - elements[5].parent="navit"; - elements[5].func=NULL; - elements[5].type=attr_mapset; - - elements[6].name="map"; - elements[6].parent="mapset"; - elements[6].func=NULL; - elements[6].type=attr_map; - - elements[7].name="debug"; - elements[7].parent="config"; - elements[7].func=NULL; - elements[7].type=attr_debug; - - elements[8].name="osd"; - elements[8].parent="navit"; - elements[8].func=NULL; - elements[8].type=attr_osd; - - elements[9].name="navigation"; - elements[9].parent="navit"; - elements[9].func=NULL; - elements[9].type=attr_navigation; - - elements[10].name="navit"; - elements[10].parent="config"; - elements[10].func=NULL; - elements[10].type=attr_navit; - - elements[11].name="graphics"; - elements[11].parent="navit"; - elements[11].func=NULL; - elements[11].type=attr_graphics; - - elements[12].name="gui"; - elements[12].parent="navit"; - elements[12].func=NULL; - elements[12].type=attr_gui; - - elements[13].name="layout"; - elements[13].parent="navit"; - elements[13].func=NULL; - elements[13].type=attr_layout; - - elements[14].name="cursor"; - elements[14].parent="layout"; - elements[14].func=NULL; - elements[14].type=attr_cursor; - - elements[15].name="layer"; - elements[15].parent="layout"; - elements[15].func=NULL; - elements[15].type=attr_layer; - - elements[16].name="itemgra"; - elements[16].parent="layer"; - elements[16].func=NULL; - elements[16].type=attr_itemgra; - - elements[17].name="circle"; - elements[17].parent="itemgra"; - elements[17].func=NULL; - elements[17].type=attr_circle; - - elements[18].name="coord"; - elements[18].parent="circle"; - elements[18].func=NULL; - elements[18].type=attr_coord; - - elements[19].name="icon"; - elements[19].parent="itemgra"; - elements[19].func=NULL; - elements[19].type=attr_icon; - - elements[20].name="coord"; - elements[20].parent="icon"; - elements[20].func=NULL; - elements[20].type=attr_coord; - - elements[21].name="image"; - elements[21].parent="itemgra"; - elements[21].func=NULL; - elements[21].type=attr_image; - - elements[22].name="text"; - elements[22].parent="itemgra"; - elements[22].func=NULL; - elements[22].type=attr_text; - - elements[23].name="polygon"; - elements[23].parent="itemgra"; - elements[23].func=NULL; - elements[23].type=attr_polygon; - - elements[24].name="coord"; - elements[24].parent="polygon"; - elements[24].func=NULL; - elements[24].type=attr_coord; - - elements[25].name="polyline"; - elements[25].parent="itemgra"; - elements[25].func=NULL; - elements[25].type=attr_polyline; - - elements[26].name="coord"; - elements[26].parent="polyline"; - elements[26].func=NULL; - elements[26].type=attr_coord; - - elements[27].name="arrows"; - elements[27].parent="itemgra"; - elements[27].func=NULL; - elements[27].type=attr_arrows; - - elements[28].name="vehicle"; - elements[28].parent="navit"; - elements[28].func=NULL; - elements[28].type=attr_vehicle; - - elements[29].name="vehicleprofile"; - elements[29].parent="navit"; - elements[29].func=NULL; - elements[29].type=attr_vehicleprofile; - - elements[30].name="roadprofile"; - elements[30].parent="vehicleprofile"; - elements[30].func=NULL; - elements[30].type=attr_roadprofile; - - elements[31].name="announcement"; - elements[31].parent="roadprofile"; - elements[31].func=NULL; - elements[31].type=attr_announcement; - - elements[32].name="cursor"; - elements[32].parent="vehicle"; - elements[32].func=NULL; - elements[32].type=attr_cursor; - - elements[33].name="itemgra"; - elements[33].parent="cursor"; - elements[33].func=NULL; - elements[33].type=attr_itemgra; - - elements[34].name="log"; - elements[34].parent="vehicle"; - elements[34].func=NULL; - elements[34].type=attr_log; - - elements[35].name="log"; - elements[35].parent="navit"; - elements[35].func=NULL; - elements[35].type=attr_log; - - elements[36].name="plugins"; - elements[36].parent="config"; - elements[36].func=NULL; - elements[36].type=attr_plugins; - - elements[37].name="plugin"; - elements[37].parent="plugins"; - elements[37].func=NULL; - elements[37].type=attr_plugin; - - elements[38].name="maps"; - elements[38].parent="mapset"; - elements[38].func=NULL; - elements[38].type=attr_maps; - - elements[39].name="layer"; - elements[39].parent="navit"; - elements[39].func=NULL; - elements[39].type=attr_layer; - - elements[40].name="profile_option"; - elements[40].parent="vehicleprofile"; - elements[40].func=NULL; - elements[40].type=attr_profile_option; - - elements[41].name="roadprofile"; - elements[41].parent="profile_option"; - elements[41].func=NULL; - elements[41].type=attr_roadprofile; - - elements[42].name="script"; - elements[42].parent="navit"; - elements[42].func=NULL; - elements[42].type=attr_script; + elements=g_new0(struct element_func,44); //43 is a number of elements + ending NULL element + + elements[0].name="config"; + elements[0].parent=NULL; + elements[0].func=NULL; + elements[0].type=attr_config; + + elements[1].name="announce"; + elements[1].parent="navigation"; + elements[1].func=xmlconfig_announce; + + elements[2].name="speech"; + elements[2].parent="navit"; + elements[2].func=NULL; + elements[2].type=attr_speech; + + elements[3].name="tracking"; + elements[3].parent="navit"; + elements[3].func=NULL; + elements[3].type=attr_trackingo; + + elements[4].name="route"; + elements[4].parent="navit"; + elements[4].func=NULL; + elements[4].type=attr_route; + + elements[5].name="mapset"; + elements[5].parent="navit"; + elements[5].func=NULL; + elements[5].type=attr_mapset; + + elements[6].name="map"; + elements[6].parent="mapset"; + elements[6].func=NULL; + elements[6].type=attr_map; + + elements[7].name="debug"; + elements[7].parent="config"; + elements[7].func=NULL; + elements[7].type=attr_debug; + + elements[8].name="osd"; + elements[8].parent="navit"; + elements[8].func=NULL; + elements[8].type=attr_osd; + + elements[9].name="navigation"; + elements[9].parent="navit"; + elements[9].func=NULL; + elements[9].type=attr_navigation; + + elements[10].name="navit"; + elements[10].parent="config"; + elements[10].func=NULL; + elements[10].type=attr_navit; + + elements[11].name="graphics"; + elements[11].parent="navit"; + elements[11].func=NULL; + elements[11].type=attr_graphics; + + elements[12].name="gui"; + elements[12].parent="navit"; + elements[12].func=NULL; + elements[12].type=attr_gui; + + elements[13].name="layout"; + elements[13].parent="navit"; + elements[13].func=NULL; + elements[13].type=attr_layout; + + elements[14].name="cursor"; + elements[14].parent="layout"; + elements[14].func=NULL; + elements[14].type=attr_cursor; + + elements[15].name="layer"; + elements[15].parent="layout"; + elements[15].func=NULL; + elements[15].type=attr_layer; + + elements[16].name="itemgra"; + elements[16].parent="layer"; + elements[16].func=NULL; + elements[16].type=attr_itemgra; + + elements[17].name="circle"; + elements[17].parent="itemgra"; + elements[17].func=NULL; + elements[17].type=attr_circle; + + elements[18].name="coord"; + elements[18].parent="circle"; + elements[18].func=NULL; + elements[18].type=attr_coord; + + elements[19].name="icon"; + elements[19].parent="itemgra"; + elements[19].func=NULL; + elements[19].type=attr_icon; + + elements[20].name="coord"; + elements[20].parent="icon"; + elements[20].func=NULL; + elements[20].type=attr_coord; + + elements[21].name="image"; + elements[21].parent="itemgra"; + elements[21].func=NULL; + elements[21].type=attr_image; + + elements[22].name="text"; + elements[22].parent="itemgra"; + elements[22].func=NULL; + elements[22].type=attr_text; + + elements[23].name="polygon"; + elements[23].parent="itemgra"; + elements[23].func=NULL; + elements[23].type=attr_polygon; + + elements[24].name="coord"; + elements[24].parent="polygon"; + elements[24].func=NULL; + elements[24].type=attr_coord; + + elements[25].name="polyline"; + elements[25].parent="itemgra"; + elements[25].func=NULL; + elements[25].type=attr_polyline; + + elements[26].name="coord"; + elements[26].parent="polyline"; + elements[26].func=NULL; + elements[26].type=attr_coord; + + elements[27].name="arrows"; + elements[27].parent="itemgra"; + elements[27].func=NULL; + elements[27].type=attr_arrows; + + elements[28].name="vehicle"; + elements[28].parent="navit"; + elements[28].func=NULL; + elements[28].type=attr_vehicle; + + elements[29].name="vehicleprofile"; + elements[29].parent="navit"; + elements[29].func=NULL; + elements[29].type=attr_vehicleprofile; + + elements[30].name="roadprofile"; + elements[30].parent="vehicleprofile"; + elements[30].func=NULL; + elements[30].type=attr_roadprofile; + + elements[31].name="announcement"; + elements[31].parent="roadprofile"; + elements[31].func=NULL; + elements[31].type=attr_announcement; + + elements[32].name="cursor"; + elements[32].parent="vehicle"; + elements[32].func=NULL; + elements[32].type=attr_cursor; + + elements[33].name="itemgra"; + elements[33].parent="cursor"; + elements[33].func=NULL; + elements[33].type=attr_itemgra; + + elements[34].name="log"; + elements[34].parent="vehicle"; + elements[34].func=NULL; + elements[34].type=attr_log; + + elements[35].name="log"; + elements[35].parent="navit"; + elements[35].func=NULL; + elements[35].type=attr_log; + + elements[36].name="plugins"; + elements[36].parent="config"; + elements[36].func=NULL; + elements[36].type=attr_plugins; + + elements[37].name="plugin"; + elements[37].parent="plugins"; + elements[37].func=NULL; + elements[37].type=attr_plugin; + + elements[38].name="maps"; + elements[38].parent="mapset"; + elements[38].func=NULL; + elements[38].type=attr_maps; + + elements[39].name="layer"; + elements[39].parent="navit"; + elements[39].func=NULL; + elements[39].type=attr_layer; + + elements[40].name="profile_option"; + elements[40].parent="vehicleprofile"; + elements[40].func=NULL; + elements[40].type=attr_profile_option; + + elements[41].name="roadprofile"; + elements[41].parent="profile_option"; + elements[41].func=NULL; + elements[41].type=attr_roadprofile; + + elements[42].name="script"; + elements[42].parent="navit"; + elements[42].func=NULL; + elements[42].type=attr_script; } /** @@ -571,380 +566,372 @@ static void initStatic(void) { static void start_element(xml_context *context, - const gchar *element_name, - const gchar **attribute_names, - const gchar **attribute_values, - gpointer user_data, - xmlerror **error) -{ - struct xmlstate *new=NULL, **parent = user_data; - struct element_func *e=elements,*func=NULL; - struct attr_fixme *attr_fixme=attr_fixmes; - char **element_fixme=element_fixmes; - int found=0; - static int fixme_count; - const char *parent_name=NULL; - char *s,*sep="",*possible_parents; - struct attr *parent_attr; - dbg(lvl_info,"name='%s' parent='%s'", element_name, *parent ? (*parent)->element:NULL); - - if (!strcmp(element_name,"xml")) - return; - /* determine if we have to fix any attributes */ - while (attr_fixme[0].element) { - if (!strcmp(element_name,attr_fixme[0].element)) - break; - attr_fixme++; - } - if (!attr_fixme[0].element) - attr_fixme=NULL; - - /* tell user to fix deprecated element names */ - while (element_fixme[0]) { - if (!strcmp(element_name,element_fixme[0])) { - element_name=element_fixme[1]; - if (fixme_count++ < 10) - dbg(lvl_error,"Please change <%s /> to <%s /> in config file", element_fixme[0], element_fixme[1]); - } - element_fixme+=2; - } - /* validate that this element is valid - * and that the element has a valid parent */ - possible_parents=g_strdup(""); - if (*parent) - parent_name=(*parent)->element; - while (e->name) { - if (!g_ascii_strcasecmp(element_name, e->name)) { - found=1; - s=g_strconcat(possible_parents,sep,e->parent,NULL); - g_free(possible_parents); - possible_parents=s; - sep=","; - if ((parent_name && e->parent && !g_ascii_strcasecmp(parent_name, e->parent)) || - (!parent_name && !e->parent)) - func=e; - } - e++; - } - if (! found) { - g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_UNKNOWN_ELEMENT, - "Unknown element '%s'", element_name); - g_free(possible_parents); - return; - } - if (! func) { - g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, - "Element '%s' within unexpected context '%s'. Expected '%s'%s", - element_name, parent_name, possible_parents, ! strcmp(possible_parents, "config") ? "\nPlease add <config> </config> tags at the beginning/end of your navit.xml": ""); - g_free(possible_parents); - return; - } - g_free(possible_parents); - - new=g_new(struct xmlstate, 1); - new->attribute_names=attribute_names; - new->attribute_values=attribute_values; - new->parent=*parent; - new->element_attr.u.data=NULL; - new->element=element_name; - new->error=error; - new->func=func; - new->object_func=NULL; - *parent=new; - if (!find_boolean(new, "enabled", 1, 0)) - return; - if (new->parent && !new->parent->element_attr.u.data) - return; - if (func->func) { - if (!func->func(new)) { - return; - } - } else { - struct attr **attrs; - - new->object_func=object_func_lookup(func->type); - if (! new->object_func) - return; - attrs=convert_to_attrs(new,attr_fixme); - new->element_attr.type=attr_none; - if (!new->parent || new->parent->element_attr.type == attr_none) - parent_attr=NULL; - else - parent_attr=&new->parent->element_attr; - new->element_attr.u.data = new->object_func->create(parent_attr, attrs); - if (! new->element_attr.u.data) - return; - new->element_attr.type=attr_from_name(element_name); - if (new->element_attr.type == attr_none) - dbg(lvl_error,"failed to create object of type '%s'", element_name); - if (new->element_attr.type == attr_tracking) - new->element_attr.type=attr_trackingo; - if (new->parent && new->parent->object_func && new->parent->object_func->add_attr) - new->parent->object_func->add_attr(new->parent->element_attr.u.data, &new->element_attr); - } - return; + const gchar *element_name, + const gchar **attribute_names, + const gchar **attribute_values, + gpointer user_data, + xmlerror **error) { + struct xmlstate *new=NULL, **parent = user_data; + struct element_func *e=elements,*func=NULL; + struct attr_fixme *attr_fixme=attr_fixmes; + char **element_fixme=element_fixmes; + int found=0; + static int fixme_count; + const char *parent_name=NULL; + char *s,*sep="",*possible_parents; + struct attr *parent_attr; + dbg(lvl_info,"name='%s' parent='%s'", element_name, *parent ? (*parent)->element:NULL); + + if (!strcmp(element_name,"xml")) + return; + /* determine if we have to fix any attributes */ + while (attr_fixme[0].element) { + if (!strcmp(element_name,attr_fixme[0].element)) + break; + attr_fixme++; + } + if (!attr_fixme[0].element) + attr_fixme=NULL; + + /* tell user to fix deprecated element names */ + while (element_fixme[0]) { + if (!strcmp(element_name,element_fixme[0])) { + element_name=element_fixme[1]; + if (fixme_count++ < 10) + dbg(lvl_error,"Please change <%s /> to <%s /> in config file", element_fixme[0], element_fixme[1]); + } + element_fixme+=2; + } + /* validate that this element is valid + * and that the element has a valid parent */ + possible_parents=g_strdup(""); + if (*parent) + parent_name=(*parent)->element; + while (e->name) { + if (!g_ascii_strcasecmp(element_name, e->name)) { + found=1; + s=g_strconcat(possible_parents,sep,e->parent,NULL); + g_free(possible_parents); + possible_parents=s; + sep=","; + if ((parent_name && e->parent && !g_ascii_strcasecmp(parent_name, e->parent)) || + (!parent_name && !e->parent)) + func=e; + } + e++; + } + if (! found) { + g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_UNKNOWN_ELEMENT, + "Unknown element '%s'", element_name); + g_free(possible_parents); + return; + } + if (! func) { + g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, + "Element '%s' within unexpected context '%s'. Expected '%s'%s", + element_name, parent_name, possible_parents, ! strcmp(possible_parents, + "config") ? "\nPlease add <config> </config> tags at the beginning/end of your navit.xml": ""); + g_free(possible_parents); + return; + } + g_free(possible_parents); + + new=g_new(struct xmlstate, 1); + new->attribute_names=attribute_names; + new->attribute_values=attribute_values; + new->parent=*parent; + new->element_attr.u.data=NULL; + new->element=element_name; + new->error=error; + new->func=func; + new->object_func=NULL; + *parent=new; + if (!find_boolean(new, "enabled", 1, 0)) + return; + if (new->parent && !new->parent->element_attr.u.data) + return; + if (func->func) { + if (!func->func(new)) { + return; + } + } else { + struct attr **attrs; + + new->object_func=object_func_lookup(func->type); + if (! new->object_func) + return; + attrs=convert_to_attrs(new,attr_fixme); + new->element_attr.type=attr_none; + if (!new->parent || new->parent->element_attr.type == attr_none) + parent_attr=NULL; + else + parent_attr=&new->parent->element_attr; + new->element_attr.u.data = new->object_func->create(parent_attr, attrs); + if (! new->element_attr.u.data) + return; + new->element_attr.type=attr_from_name(element_name); + if (new->element_attr.type == attr_none) + dbg(lvl_error,"failed to create object of type '%s'", element_name); + if (new->element_attr.type == attr_tracking) + new->element_attr.type=attr_trackingo; + if (new->parent && new->parent->object_func && new->parent->object_func->add_attr) + new->parent->object_func->add_attr(new->parent->element_attr.u.data, &new->element_attr); + } + return; } /* Called for close tags </foo> */ static void end_element (xml_context *context, - const gchar *element_name, - gpointer user_data, - xmlerror **error) -{ - struct xmlstate *curr, **state = user_data; - - if (!strcmp(element_name,"xml")) - return; - dbg(lvl_info,"name='%s'", element_name); - curr=*state; - if (curr->object_func && curr->object_func->init) - curr->object_func->init(curr->element_attr.u.data); - if (curr->object_func && curr->object_func->unref) - curr->object_func->unref(curr->element_attr.u.data); - *state=curr->parent; - g_free(curr); + const gchar *element_name, + gpointer user_data, + xmlerror **error) { + struct xmlstate *curr, **state = user_data; + + if (!strcmp(element_name,"xml")) + return; + dbg(lvl_info,"name='%s'", element_name); + curr=*state; + if (curr->object_func && curr->object_func->init) + curr->object_func->init(curr->element_attr.u.data); + if (curr->object_func && curr->object_func->unref) + curr->object_func->unref(curr->element_attr.u.data); + *state=curr->parent; + g_free(curr); } static gboolean parse_file(struct xmldocument *document, xmlerror **error); static void -xinclude(xml_context *context, const gchar **attribute_names, const gchar **attribute_values, struct xmldocument *doc_old, xmlerror **error) -{ - struct xmldocument doc_new; - struct file_wordexp *we; - int i,count; - const char *href=NULL; - char **we_files; - - if (doc_old->level >= 16) { - g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "xi:include recursion too deep"); - return; - } - memset(&doc_new, 0, sizeof(doc_new)); - i=0; - while (attribute_names[i]) { - if(!g_ascii_strcasecmp("href", attribute_names[i])) { - if (!href) - href=attribute_values[i]; - else { - g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "xi:include has more than one href"); - return; - } - } else if(!g_ascii_strcasecmp("xpointer", attribute_names[i])) { - if (!doc_new.xpointer) - doc_new.xpointer=attribute_values[i]; - else { - g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "xi:include has more than one xpointer"); - return; - } - } else { - g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "xi:include has invalid attributes"); - return; - } - i++; - } - if (!doc_new.xpointer && !href) { - g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "xi:include has neither href nor xpointer"); - return; - } - doc_new.level=doc_old->level+1; - doc_new.user_data=doc_old->user_data; - if (! href) { - dbg(lvl_debug,"no href, using '%s'", doc_old->href); - doc_new.href=doc_old->href; - if (file_exists(doc_new.href)) { - parse_file(&doc_new, error); - } else { - dbg(lvl_error,"Unable to include %s",doc_new.href); - } - } else { - dbg(lvl_debug,"expanding '%s'", href); - we=file_wordexp_new(href); - we_files=file_wordexp_get_array(we); - count=file_wordexp_get_count(we); - dbg(lvl_debug,"%d results", count); - if (file_exists(we_files[0])) { - for (i = 0 ; i < count ; i++) { - dbg(lvl_debug,"result[%d]='%s'", i, we_files[i]); - doc_new.href=we_files[i]; - parse_file(&doc_new, error); - } - } else { - dbg(lvl_error,"Unable to include %s",we_files[0]); - } - file_wordexp_destroy(we); - - } +xinclude(xml_context *context, const gchar **attribute_names, const gchar **attribute_values, + struct xmldocument *doc_old, xmlerror **error) { + struct xmldocument doc_new; + struct file_wordexp *we; + int i,count; + const char *href=NULL; + char **we_files; + + if (doc_old->level >= 16) { + g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "xi:include recursion too deep"); + return; + } + memset(&doc_new, 0, sizeof(doc_new)); + i=0; + while (attribute_names[i]) { + if(!g_ascii_strcasecmp("href", attribute_names[i])) { + if (!href) + href=attribute_values[i]; + else { + g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "xi:include has more than one href"); + return; + } + } else if(!g_ascii_strcasecmp("xpointer", attribute_names[i])) { + if (!doc_new.xpointer) + doc_new.xpointer=attribute_values[i]; + else { + g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "xi:include has more than one xpointer"); + return; + } + } else { + g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "xi:include has invalid attributes"); + return; + } + i++; + } + if (!doc_new.xpointer && !href) { + g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "xi:include has neither href nor xpointer"); + return; + } + doc_new.level=doc_old->level+1; + doc_new.user_data=doc_old->user_data; + if (! href) { + dbg(lvl_debug,"no href, using '%s'", doc_old->href); + doc_new.href=doc_old->href; + if (file_exists(doc_new.href)) { + parse_file(&doc_new, error); + } else { + dbg(lvl_error,"Unable to include %s",doc_new.href); + } + } else { + dbg(lvl_debug,"expanding '%s'", href); + we=file_wordexp_new(href); + we_files=file_wordexp_get_array(we); + count=file_wordexp_get_count(we); + dbg(lvl_debug,"%d results", count); + if (file_exists(we_files[0])) { + for (i = 0 ; i < count ; i++) { + dbg(lvl_debug,"result[%d]='%s'", i, we_files[i]); + doc_new.href=we_files[i]; + parse_file(&doc_new, error); + } + } else { + dbg(lvl_error,"Unable to include %s",we_files[0]); + } + file_wordexp_destroy(we); + + } } static int -strncmp_len(const char *s1, int s1len, const char *s2) -{ - int ret; - ret=strncmp(s1, s2, s1len); - if (ret) - return ret; - return strlen(s2)-s1len; +strncmp_len(const char *s1, int s1len, const char *s2) { + int ret; + ret=strncmp(s1, s2, s1len); + if (ret) + return ret; + return strlen(s2)-s1len; } static int -xpointer_value(const char *test, int len, struct xistate *elem, const char **out, int out_len) -{ - int i,ret=0; - if (len <= 0 || out_len <= 0) { - return 0; - } - if (!(strncmp_len(test,len,"name(.)"))) { - out[0]=elem->element; - return 1; - } - if (test[0] == '@') { - i=0; - while (elem->attribute_names[i] && out_len > 0) { - if (!strncmp_len(test+1,len-1,elem->attribute_names[i])) { - out[ret++]=elem->attribute_values[i]; - out_len--; - } - i++; - } - return ret; - } - return 0; +xpointer_value(const char *test, int len, struct xistate *elem, const char **out, int out_len) { + int i,ret=0; + if (len <= 0 || out_len <= 0) { + return 0; + } + if (!(strncmp_len(test,len,"name(.)"))) { + out[0]=elem->element; + return 1; + } + if (test[0] == '@') { + i=0; + while (elem->attribute_names[i] && out_len > 0) { + if (!strncmp_len(test+1,len-1,elem->attribute_names[i])) { + out[ret++]=elem->attribute_values[i]; + out_len--; + } + i++; + } + return ret; + } + return 0; } static int -xpointer_test(const char *test, int len, struct xistate *elem) -{ - int eq,i,count,vlen,cond_req=1,cond=0; - char c; - const char *tmp[16]; - if (!len) - return 0; - c=test[len-1]; - if (c != '\'' && c != '"') - return 0; - eq=strcspn(test, "="); - if (eq >= len || test[eq+1] != c) - return 0; - vlen=eq; - if (eq > 0 && test[eq-1] == '!') { - cond_req=0; - vlen--; - } - count=xpointer_value(test,vlen,elem,tmp,16); - for (i = 0 ; i < count ; i++) { - if (!strncmp_len(test+eq+2,len-eq-3, tmp[i])) - cond=1; - } - if (cond == cond_req) - return 1; - return 0; +xpointer_test(const char *test, int len, struct xistate *elem) { + int eq,i,count,vlen,cond_req=1,cond=0; + char c; + const char *tmp[16]; + if (!len) + return 0; + c=test[len-1]; + if (c != '\'' && c != '"') + return 0; + eq=strcspn(test, "="); + if (eq >= len || test[eq+1] != c) + return 0; + vlen=eq; + if (eq > 0 && test[eq-1] == '!') { + cond_req=0; + vlen--; + } + count=xpointer_value(test,vlen,elem,tmp,16); + for (i = 0 ; i < count ; i++) { + if (!strncmp_len(test+eq+2,len-eq-3, tmp[i])) + cond=1; + } + if (cond == cond_req) + return 1; + return 0; } static int -xpointer_element_match(const char *xpointer, int len, struct xistate *elem) -{ - int start,tlen; - start=strcspn(xpointer, "["); - if (start > len) - start=len; - if (strncmp_len(xpointer, start, elem->element) && (start != 1 || xpointer[0] != '*')) - return 0; - if (start == len) - return 1; - if (xpointer[len-1] != ']') - return 0; - for (;;) { - start++; - tlen=strcspn(xpointer+start,"]"); - if (start + tlen > len) - return 1; - if (!xpointer_test(xpointer+start, tlen, elem)) - return 0; - start+=tlen+1; - } +xpointer_element_match(const char *xpointer, int len, struct xistate *elem) { + int start,tlen; + start=strcspn(xpointer, "["); + if (start > len) + start=len; + if (strncmp_len(xpointer, start, elem->element) && (start != 1 || xpointer[0] != '*')) + return 0; + if (start == len) + return 1; + if (xpointer[len-1] != ']') + return 0; + for (;;) { + start++; + tlen=strcspn(xpointer+start,"]"); + if (start + tlen > len) + return 1; + if (!xpointer_test(xpointer+start, tlen, elem)) + return 0; + start+=tlen+1; + } } static int -xpointer_xpointer_match(const char *xpointer, int len, struct xistate *first) -{ - const char *c; - int s; - dbg(lvl_info,"%s", xpointer); - if (xpointer[0] != '/') - return 0; - c=xpointer+1; - len--; - do { - s=strcspn(c, "/"); - if (s > len) - s=len; - if (! xpointer_element_match(c, s, first)) - return 0; - first=first->child; - c+=s+1; - len-=s+1; - } while (len > 0 && first); - if (len > 0) - return 0; - return 1; +xpointer_xpointer_match(const char *xpointer, int len, struct xistate *first) { + const char *c; + int s; + dbg(lvl_info,"%s", xpointer); + if (xpointer[0] != '/') + return 0; + c=xpointer+1; + len--; + do { + s=strcspn(c, "/"); + if (s > len) + s=len; + if (! xpointer_element_match(c, s, first)) + return 0; + first=first->child; + c+=s+1; + len-=s+1; + } while (len > 0 && first); + if (len > 0) + return 0; + return 1; } static int -xpointer_match(const char *xpointer, struct xistate *first) -{ - char *prefix="xpointer("; - int len; - if (! xpointer) - return 1; - len=strlen(xpointer); - if (strncmp(xpointer,prefix,strlen(prefix))) - return 0; - if (xpointer[len-1] != ')') - return 0; - return xpointer_xpointer_match(xpointer+strlen(prefix), len-strlen(prefix)-1, first); +xpointer_match(const char *xpointer, struct xistate *first) { + char *prefix="xpointer("; + int len; + if (! xpointer) + return 1; + len=strlen(xpointer); + if (strncmp(xpointer,prefix,strlen(prefix))) + return 0; + if (xpointer[len-1] != ')') + return 0; + return xpointer_xpointer_match(xpointer+strlen(prefix), len-strlen(prefix)-1, first); } static void xi_start_element(xml_context *context, - const gchar *element_name, - const gchar **attribute_names, - const gchar **attribute_values, - gpointer user_data, - xmlerror **error) -{ - struct xmldocument *doc=user_data; - struct xistate *xistate; - int i,count=0; - while (attribute_names[count++*XML_ATTR_DISTANCE]); - xistate=g_new0(struct xistate, 1); - xistate->element=element_name; - xistate->attribute_names=g_new0(const char *, count); - xistate->attribute_values=g_new0(const char *, count); - for (i = 0 ; i < count ; i++) { - if (attribute_names[i*XML_ATTR_DISTANCE] && attribute_values[i*XML_ATTR_DISTANCE]) { - xistate->attribute_names[i]=g_strdup(attribute_names[i*XML_ATTR_DISTANCE]); - xistate->attribute_values[i]=g_strdup(attribute_values[i*XML_ATTR_DISTANCE]); - } - } - xistate->parent=doc->last; - - if (doc->last) { - doc->last->child=xistate; - } else - doc->first=xistate; - doc->last=xistate; - if (doc->active > 0 || xpointer_match(doc->xpointer, doc->first)) { - if(!g_ascii_strcasecmp("xi:include", element_name)) { - xinclude(context, xistate->attribute_names, xistate->attribute_values, doc, error); - return; - } - start_element(context, element_name, xistate->attribute_names, xistate->attribute_values, doc->user_data, error); - doc->active++; - } + const gchar *element_name, + const gchar **attribute_names, + const gchar **attribute_values, + gpointer user_data, + xmlerror **error) { + struct xmldocument *doc=user_data; + struct xistate *xistate; + int i,count=0; + while (attribute_names[count++*XML_ATTR_DISTANCE]); + xistate=g_new0(struct xistate, 1); + xistate->element=element_name; + xistate->attribute_names=g_new0(const char *, count); + xistate->attribute_values=g_new0(const char *, count); + for (i = 0 ; i < count ; i++) { + if (attribute_names[i*XML_ATTR_DISTANCE] && attribute_values[i*XML_ATTR_DISTANCE]) { + xistate->attribute_names[i]=g_strdup(attribute_names[i*XML_ATTR_DISTANCE]); + xistate->attribute_values[i]=g_strdup(attribute_values[i*XML_ATTR_DISTANCE]); + } + } + xistate->parent=doc->last; + + if (doc->last) { + doc->last->child=xistate; + } else + doc->first=xistate; + doc->last=xistate; + if (doc->active > 0 || xpointer_match(doc->xpointer, doc->first)) { + if(!g_ascii_strcasecmp("xi:include", element_name)) { + xinclude(context, xistate->attribute_names, xistate->attribute_values, doc, error); + return; + } + start_element(context, element_name, xistate->attribute_names, xistate->attribute_values, doc->user_data, error); + doc->active++; + } } /** @@ -959,115 +946,113 @@ xi_start_element(xml_context *context, static void xi_end_element (xml_context *context, - const gchar *element_name, - gpointer user_data, - xmlerror **error) -{ - struct xmldocument *doc=user_data; - struct xistate *xistate=doc->last; - int i=0; - doc->last=doc->last->parent; - if (! doc->last) - doc->first=NULL; - else - doc->last->child=NULL; - if (doc->active > 0) { - if(!g_ascii_strcasecmp("xi:include", element_name)) { - return; - } - end_element(context, element_name, doc->user_data, error); - doc->active--; - } - while (xistate->attribute_names[i]) { - g_free((char *)(xistate->attribute_names[i])); - g_free((char *)(xistate->attribute_values[i])); - i++; - } - g_free(xistate->attribute_names); - g_free(xistate->attribute_values); - g_free(xistate); + const gchar *element_name, + gpointer user_data, + xmlerror **error) { + struct xmldocument *doc=user_data; + struct xistate *xistate=doc->last; + int i=0; + doc->last=doc->last->parent; + if (! doc->last) + doc->first=NULL; + else + doc->last->child=NULL; + if (doc->active > 0) { + if(!g_ascii_strcasecmp("xi:include", element_name)) { + return; + } + end_element(context, element_name, doc->user_data, error); + doc->active--; + } + while (xistate->attribute_names[i]) { + g_free((char *)(xistate->attribute_names[i])); + g_free((char *)(xistate->attribute_values[i])); + i++; + } + g_free(xistate->attribute_names); + g_free(xistate->attribute_values); + g_free(xistate); } /* Called for character data */ /* text is not nul-terminated */ static void xi_text (xml_context *context, - const gchar *text, - gsize text_len, - gpointer user_data, - xmlerror **error) -{ - struct xmldocument *doc=user_data; - int i; - if (doc->active) { - for (i = 0 ; i < text_len ; i++) { - if (!isspace(text[i])) { - struct xmldocument *doc=user_data; - struct xmlstate *curr, **state = doc->user_data; - struct attr attr; - - curr=*state; - char *text_dup = g_strndup(text, text_len); - attr.type=attr_xml_text; - attr.u.str=text_dup; - if (curr->object_func && curr->object_func->add_attr && curr->element_attr.u.data) - curr->object_func->add_attr(curr->element_attr.u.data, &attr); - g_free(text_dup); - return; - } - } - } + const gchar *text, + gsize text_len, + gpointer user_data, + xmlerror **error) { + struct xmldocument *doc=user_data; + int i; + if (doc->active) { + for (i = 0 ; i < text_len ; i++) { + if (!isspace(text[i])) { + struct xmldocument *doc=user_data; + struct xmlstate *curr, **state = doc->user_data; + struct attr attr; + + curr=*state; + char *text_dup = g_strndup(text, text_len); + attr.type=attr_xml_text; + attr.u.str=text_dup; + if (curr->object_func && curr->object_func->add_attr && curr->element_attr.u.data) + curr->object_func->add_attr(curr->element_attr.u.data, &attr); + g_free(text_dup); + return; + } + } + } } #if USE_EZXML static void -parse_node_text(ezxml_t node, void *data, void (*start)(void *, const char *, const char **, const char **, void *, void *), - void (*end)(void *, const char *, void *, void *), - void (*text)(void *, const char *, int, void *, void *)) -{ - while (node) { - if (start) - start(NULL, node->name, (const char **)node->attr, (const char **)(node->attr+1), data, NULL); - if (text && node->txt) - text(NULL, node->txt, strlen(node->txt), data, NULL); - if (node->child) - parse_node_text(node->child, data, start, end, text); - if (end) - end(NULL, node->name, data, NULL); - node=node->ordered; - } +parse_node_text(ezxml_t node, void *data, void (*start)(void *, const char *, const char **, const char **, void *, + void *), + void (*end)(void *, const char *, void *, void *), + void (*text)(void *, const char *, int, void *, void *)) { + while (node) { + if (start) + start(NULL, node->name, (const char **)node->attr, (const char **)(node->attr+1), data, NULL); + if (text && node->txt) + text(NULL, node->txt, strlen(node->txt), data, NULL); + if (node->child) + parse_node_text(node->child, data, start, end, text); + if (end) + end(NULL, node->name, data, NULL); + node=node->ordered; + } } #endif void xml_parse_text(const char *document, void *data, - void (*start)(xml_context *, const char *, const char **, const char **, void *, GError **), - void (*end)(xml_context *, const char *, void *, GError **), - void (*text)(xml_context *, const char *, gsize, void *, GError **)) { + void (*start)(xml_context *, const char *, const char **, const char **, void *, GError **), + void (*end)(xml_context *, const char *, void *, GError **), + void (*text)(xml_context *, const char *, gsize, void *, GError **)) { #if !USE_EZXML - GMarkupParser parser = { start, end, text, NULL, NULL}; - xml_context *context; - gboolean result; - - context = g_markup_parse_context_new (&parser, 0, data, NULL); - if (!document){ - dbg(lvl_error, "FATAL: No XML data supplied (looks like incorrect configuration for internal GUI)."); - exit(1); - } - result = g_markup_parse_context_parse (context, document, strlen(document), NULL); - if (!result){ - dbg(lvl_error, "FATAL: Cannot parse data as XML: '%s'", document); - exit(1); - } - g_markup_parse_context_free (context); + GMarkupParser parser = { start, end, text, NULL, NULL}; + xml_context *context; + gboolean result; + + context = g_markup_parse_context_new (&parser, 0, data, NULL); + if (!document) { + dbg(lvl_error, "FATAL: No XML data supplied (looks like incorrect configuration for internal GUI)."); + exit(1); + } + result = g_markup_parse_context_parse (context, document, strlen(document), NULL); + if (!result) { + dbg(lvl_error, "FATAL: Cannot parse data as XML: '%s'", document); + exit(1); + } + g_markup_parse_context_free (context); #else - char *str=g_strdup(document); - ezxml_t root = ezxml_parse_str(str, strlen(str)); - if (!root) - return; - parse_node_text(root, data, start, end, text); - ezxml_free(root); - g_free(str); + char *str=g_strdup(document); + ezxml_t root = ezxml_parse_str(str, strlen(str)); + if (!root) + return; + parse_node_text(root, data, start, end, text); + ezxml_free(root); + g_free(str); #endif } @@ -1075,11 +1060,11 @@ xml_parse_text(const char *document, void *data, #if !USE_EZXML static const GMarkupParser parser = { - xi_start_element, - xi_end_element, - xi_text, - NULL, - NULL + xi_start_element, + xi_end_element, + xi_text, + NULL, + NULL }; /** * * Parse the contents of the configuration file @@ -1090,98 +1075,95 @@ static const GMarkupParser parser = { * */ static gboolean -parse_file(struct xmldocument *document, xmlerror **error) -{ - xml_context *context; - gchar *contents, *message; - gsize len; - gint line, chr; - gboolean result; - char *xmldir,*newxmldir,*xmlfile,*newxmlfile,*sep; - - dbg(lvl_debug,"enter filename='%s'", document->href); +parse_file(struct xmldocument *document, xmlerror **error) { + xml_context *context; + gchar *contents, *message; + gsize len; + gint line, chr; + gboolean result; + char *xmldir,*newxmldir,*xmlfile,*newxmlfile,*sep; + + dbg(lvl_debug,"enter filename='%s'", document->href); #if GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION < 12 #define G_MARKUP_TREAT_CDATA_AS_TEXT 0 #endif - context = g_markup_parse_context_new (&parser, G_MARKUP_TREAT_CDATA_AS_TEXT, document, NULL); - - if (!g_file_get_contents (document->href, &contents, &len, error)) { - g_markup_parse_context_free (context); - return FALSE; - } - xmldir=getenv("XMLDIR"); - xmlfile=getenv("XMLFILE"); - newxmlfile=g_strdup(document->href); - newxmldir=g_strdup(document->href); - if ((sep=strrchr(newxmldir,'/'))) - *sep='\0'; - else { - g_free(newxmldir); - newxmldir=g_strdup("."); - } - setenv("XMLDIR",newxmldir,1); - setenv("XMLFILE",newxmlfile,1); - document->active=document->xpointer ? 0:1; - document->first=NULL; - document->last=NULL; - result = g_markup_parse_context_parse (context, contents, len, error); - if (!result && error && *error) { - g_markup_parse_context_get_position(context, &line, &chr); - message=g_strdup_printf("%s at line %d, char %d\n", (*error)->message, line, chr); - g_free((*error)->message); - (*error)->message=message; - } - g_markup_parse_context_free (context); - g_free (contents); - if (xmldir) - setenv("XMLDIR",xmldir,1); - else - unsetenv("XMLDIR"); - if (xmlfile) - setenv("XMLFILE",xmlfile,1); - else - unsetenv("XMLFILE"); - g_free(newxmldir); - g_free(newxmlfile); - dbg(lvl_debug,"return %d", result); - - return result; + context = g_markup_parse_context_new (&parser, G_MARKUP_TREAT_CDATA_AS_TEXT, document, NULL); + + if (!g_file_get_contents (document->href, &contents, &len, error)) { + g_markup_parse_context_free (context); + return FALSE; + } + xmldir=getenv("XMLDIR"); + xmlfile=getenv("XMLFILE"); + newxmlfile=g_strdup(document->href); + newxmldir=g_strdup(document->href); + if ((sep=strrchr(newxmldir,'/'))) + *sep='\0'; + else { + g_free(newxmldir); + newxmldir=g_strdup("."); + } + setenv("XMLDIR",newxmldir,1); + setenv("XMLFILE",newxmlfile,1); + document->active=document->xpointer ? 0:1; + document->first=NULL; + document->last=NULL; + result = g_markup_parse_context_parse (context, contents, len, error); + if (!result && error && *error) { + g_markup_parse_context_get_position(context, &line, &chr); + message=g_strdup_printf("%s at line %d, char %d\n", (*error)->message, line, chr); + g_free((*error)->message); + (*error)->message=message; + } + g_markup_parse_context_free (context); + g_free (contents); + if (xmldir) + setenv("XMLDIR",xmldir,1); + else + unsetenv("XMLDIR"); + if (xmlfile) + setenv("XMLFILE",xmlfile,1); + else + unsetenv("XMLFILE"); + g_free(newxmldir); + g_free(newxmlfile); + dbg(lvl_debug,"return %d", result); + + return result; } #else static void -parse_node(struct xmldocument *document, ezxml_t node) -{ - while (node) { - xi_start_element(NULL,node->name, node->attr, node->attr+1, document, NULL); - if (node->txt) - xi_text(NULL,node->txt,strlen(node->txt),document,NULL); - if (node->child) - parse_node(document, node->child); - xi_end_element (NULL,node->name,document,NULL); - node=node->ordered; - } +parse_node(struct xmldocument *document, ezxml_t node) { + while (node) { + xi_start_element(NULL,node->name, node->attr, node->attr+1, document, NULL); + if (node->txt) + xi_text(NULL,node->txt,strlen(node->txt),document,NULL); + if (node->child) + parse_node(document, node->child); + xi_end_element (NULL,node->name,document,NULL); + node=node->ordered; + } } static gboolean -parse_file(struct xmldocument *document, xmlerror **error) -{ - FILE *f; - ezxml_t root; - - f=fopen(document->href,"rb"); - if (!f) - return FALSE; - root = ezxml_parse_fp(f); - fclose(f); - if (!root) - return FALSE; - document->active=document->xpointer ? 0:1; - document->first=NULL; - document->last=NULL; - - parse_node(document, root); - - return TRUE; +parse_file(struct xmldocument *document, xmlerror **error) { + FILE *f; + ezxml_t root; + + f=fopen(document->href,"rb"); + if (!f) + return FALSE; + root = ezxml_parse_fp(f); + fclose(f); + if (!root) + return FALSE; + document->active=document->xpointer ? 0:1; + document->first=NULL; + document->last=NULL; + + parse_node(document, root); + + return TRUE; } #endif @@ -1193,90 +1175,83 @@ parse_file(struct xmldocument *document, xmlerror **error) * * @returns boolean TRUE or FALSE (if error detected) * */ -gboolean config_load(const char *filename, xmlerror **error) -{ - struct xmldocument document; - struct xmlstate *curr=NULL; - gboolean result; - - attr_create_hash(); - item_create_hash(); - initStatic(); - - dbg(lvl_debug,"enter filename='%s'", filename); - memset(&document, 0, sizeof(document)); - document.href=filename; - document.user_data=&curr; - result=parse_file(&document, error); - if (result && curr) { - g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_PARSE, "element '%s' not closed", curr->element); - result=FALSE; - } - attr_destroy_hash(); - item_destroy_hash(); - dbg(lvl_debug,"return %d", result); - return result; +gboolean config_load(const char *filename, xmlerror **error) { + struct xmldocument document; + struct xmlstate *curr=NULL; + gboolean result; + + attr_create_hash(); + item_create_hash(); + initStatic(); + + dbg(lvl_debug,"enter filename='%s'", filename); + memset(&document, 0, sizeof(document)); + document.href=filename; + document.user_data=&curr; + result=parse_file(&document, error); + if (result && curr) { + g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_PARSE, "element '%s' not closed", curr->element); + result=FALSE; + } + attr_destroy_hash(); + item_destroy_hash(); + dbg(lvl_debug,"return %d", result); + return result; } int -navit_object_set_methods(void *in, int in_size, void *out, int out_size) -{ - int ret,size=out_size; - if (out_size > in_size) { - ret=-1; - size=in_size; - memset((char *)out+in_size, 0, out_size-in_size); - } else if (in_size == out_size) - ret=0; - else - ret=1; - memcpy(out, in, size); - return ret; +navit_object_set_methods(void *in, int in_size, void *out, int out_size) { + int ret,size=out_size; + if (out_size > in_size) { + ret=-1; + size=in_size; + memset((char *)out+in_size, 0, out_size-in_size); + } else if (in_size == out_size) + ret=0; + else + ret=1; + memcpy(out, in, size); + return ret; } struct navit_object * -navit_object_new(struct attr **attrs, struct object_func *func, int size) -{ - struct navit_object *ret=g_malloc0(size); - ret->func=func; - ret->attrs=attr_list_dup(attrs); - navit_object_ref(ret); - return ret; +navit_object_new(struct attr **attrs, struct object_func *func, int size) { + struct navit_object *ret=g_malloc0(size); + ret->func=func; + ret->attrs=attr_list_dup(attrs); + navit_object_ref(ret); + return ret; } struct navit_object * -navit_object_ref(struct navit_object *obj) -{ - obj->refcount++; - dbg(lvl_debug,"refcount %s %p %d",attr_to_name(obj->func->type),obj,obj->refcount); - return obj; +navit_object_ref(struct navit_object *obj) { + obj->refcount++; + dbg(lvl_debug,"refcount %s %p %d",attr_to_name(obj->func->type),obj,obj->refcount); + return obj; } void -navit_object_unref(struct navit_object *obj) -{ - if (obj) { - obj->refcount--; - dbg(lvl_debug,"refcount %s %p %d",attr_to_name(obj->func->type),obj,obj->refcount); - if (obj->refcount <= 0 && obj->func && obj->func->destroy) - obj->func->destroy(obj); - } +navit_object_unref(struct navit_object *obj) { + if (obj) { + obj->refcount--; + dbg(lvl_debug,"refcount %s %p %d",attr_to_name(obj->func->type),obj,obj->refcount); + if (obj->refcount <= 0 && obj->func && obj->func->destroy) + obj->func->destroy(obj); + } } struct attr_iter { - void *last; + void *last; }; struct attr_iter * -navit_object_attr_iter_new(void) -{ - return g_new0(struct attr_iter, 1); +navit_object_attr_iter_new(void) { + return g_new0(struct attr_iter, 1); } void -navit_object_attr_iter_destroy(struct attr_iter *iter) -{ - g_free(iter); +navit_object_attr_iter_destroy(struct attr_iter *iter) { + g_free(iter); } /** @@ -1305,70 +1280,64 @@ navit_object_attr_iter_destroy(struct attr_iter *iter) * @return True if a matching attribute was found, false if not. */ int -navit_object_get_attr(struct navit_object *obj, enum attr_type type, struct attr *attr, struct attr_iter *iter) -{ - return attr_generic_get_attr(obj->attrs, NULL, type, attr, iter); +navit_object_get_attr(struct navit_object *obj, enum attr_type type, struct attr *attr, struct attr_iter *iter) { + return attr_generic_get_attr(obj->attrs, NULL, type, attr, iter); } void -navit_object_callbacks(struct navit_object *obj, struct attr *attr) -{ - if (obj->attrs && obj->attrs[0] && obj->attrs[0]->type == attr_callback_list) - callback_list_call_attr_2(obj->attrs[0]->u.callback_list, attr->type, attr->u.data, 0); +navit_object_callbacks(struct navit_object *obj, struct attr *attr) { + if (obj->attrs && obj->attrs[0] && obj->attrs[0]->type == attr_callback_list) + callback_list_call_attr_2(obj->attrs[0]->u.callback_list, attr->type, attr->u.data, 0); } int -navit_object_set_attr(struct navit_object *obj, struct attr *attr) -{ - dbg(lvl_debug, "enter, obj=%p, attr=%p (%s)", obj, attr, attr_to_name(attr->type)); - obj->attrs=attr_generic_set_attr(obj->attrs, attr); - navit_object_callbacks(obj, attr); - return 1; +navit_object_set_attr(struct navit_object *obj, struct attr *attr) { + dbg(lvl_debug, "enter, obj=%p, attr=%p (%s)", obj, attr, attr_to_name(attr->type)); + obj->attrs=attr_generic_set_attr(obj->attrs, attr); + navit_object_callbacks(obj, attr); + return 1; } int -navit_object_add_attr(struct navit_object *obj, struct attr *attr) -{ - dbg(lvl_debug, "enter, obj=%p, attr=%p (%s)", obj, attr, attr_to_name(attr->type)); - if (attr->type == attr_callback) { - struct callback_list *cbl; - if (obj->attrs && obj->attrs[0] && obj->attrs[0]->type == attr_callback_list) - cbl=obj->attrs[0]->u.callback_list; - else { - struct attr attr; - cbl=callback_list_new(); - attr.type=attr_callback_list; - attr.u.callback_list=cbl; - obj->attrs=attr_generic_prepend_attr(obj->attrs, &attr); - } - callback_list_add(cbl, attr->u.callback); - return 1; - } - obj->attrs=attr_generic_add_attr(obj->attrs, attr); - if (obj->attrs && obj->attrs[0] && obj->attrs[0]->type == attr_callback_list) - callback_list_call_attr_2(obj->attrs[0]->u.callback_list, attr->type, attr->u.data, 1); - return 1; +navit_object_add_attr(struct navit_object *obj, struct attr *attr) { + dbg(lvl_debug, "enter, obj=%p, attr=%p (%s)", obj, attr, attr_to_name(attr->type)); + if (attr->type == attr_callback) { + struct callback_list *cbl; + if (obj->attrs && obj->attrs[0] && obj->attrs[0]->type == attr_callback_list) + cbl=obj->attrs[0]->u.callback_list; + else { + struct attr attr; + cbl=callback_list_new(); + attr.type=attr_callback_list; + attr.u.callback_list=cbl; + obj->attrs=attr_generic_prepend_attr(obj->attrs, &attr); + } + callback_list_add(cbl, attr->u.callback); + return 1; + } + obj->attrs=attr_generic_add_attr(obj->attrs, attr); + if (obj->attrs && obj->attrs[0] && obj->attrs[0]->type == attr_callback_list) + callback_list_call_attr_2(obj->attrs[0]->u.callback_list, attr->type, attr->u.data, 1); + return 1; } int -navit_object_remove_attr(struct navit_object *obj, struct attr *attr) -{ - if (attr->type == attr_callback) { - if (obj->attrs && obj->attrs[0] && obj->attrs[0]->type == attr_callback_list) { - callback_list_remove(obj->attrs[0]->u.callback_list, attr->u.callback); - return 1; - } else - return 0; - } - obj->attrs=attr_generic_remove_attr(obj->attrs, attr); - if (obj->attrs && obj->attrs[0] && obj->attrs[0]->type == attr_callback_list) - callback_list_call_attr_2(obj->attrs[0]->u.callback_list, attr->type, attr->u.data, -1); - return 1; +navit_object_remove_attr(struct navit_object *obj, struct attr *attr) { + if (attr->type == attr_callback) { + if (obj->attrs && obj->attrs[0] && obj->attrs[0]->type == attr_callback_list) { + callback_list_remove(obj->attrs[0]->u.callback_list, attr->u.callback); + return 1; + } else + return 0; + } + obj->attrs=attr_generic_remove_attr(obj->attrs, attr); + if (obj->attrs && obj->attrs[0] && obj->attrs[0]->type == attr_callback_list) + callback_list_call_attr_2(obj->attrs[0]->u.callback_list, attr->type, attr->u.data, -1); + return 1; } void -navit_object_destroy(struct navit_object *obj) -{ - attr_list_free(obj->attrs); - g_free(obj); +navit_object_destroy(struct navit_object *obj) { + attr_list_free(obj->attrs); + g_free(obj); } |