diff options
Diffstat (limited to 'lib/ephy-langs.c')
-rw-r--r-- | lib/ephy-langs.c | 451 |
1 files changed, 208 insertions, 243 deletions
diff --git a/lib/ephy-langs.c b/lib/ephy-langs.c index cae80de47..01135a12b 100644 --- a/lib/ephy-langs.c +++ b/lib/ephy-langs.c @@ -33,304 +33,269 @@ void ephy_langs_sanitise (GArray *array) { - char *lang1, *lang2; - int i, j; - - /* if we have 'xy-ab' in list but not 'xy', append 'xy' */ - for (i = 0; i < (int) array->len; i++) - { - gboolean found = FALSE; - char *dash, *prefix; - - lang1 = (char *) g_array_index (array,char *, i); - - dash = strchr (lang1, '-'); - if (dash == NULL) continue; - - for (j = i + 1; j < (int) array->len; j++) - { - lang2 = (char *) g_array_index (array, char *, j); - if (strchr (lang2, '-') == NULL && - g_str_has_prefix (lang1, lang2)) - { - found = TRUE; - } - } - - if (found == FALSE) - { - prefix = g_strndup (lang1, dash - lang1); - g_array_append_val (array, prefix); - } - } - - /* uniquify */ - for (i = 0; i < (int) array->len - 1; i++) - { - for (j = (int) array->len - 1; j > i; j--) - { - lang1 = (char *) g_array_index (array,char *, i); - lang2 = (char *) g_array_index (array, char *, j); - - if (strcmp (lang1, lang2) == 0) - { - g_array_remove_index (array, j); - g_free (lang2); - } - } - } - - /* move 'xy' code behind all 'xy-ab' codes */ - for (i = (int) array->len - 2; i >= 0; i--) - { - for (j = (int) array->len - 1; j > i; j--) - { - lang1 = (char *) g_array_index (array, char *, i); - lang2 = (char *) g_array_index (array, char *, j); - - if (strchr (lang1, '-') == NULL && - strchr (lang2, '-') != NULL && - g_str_has_prefix (lang2, lang1)) - { - g_array_insert_val (array, j + 1, lang1); - g_array_remove_index (array, i); - break; - } - } - } + char *lang1, *lang2; + int i, j; + + /* if we have 'xy-ab' in list but not 'xy', append 'xy' */ + for (i = 0; i < (int)array->len; i++) { + gboolean found = FALSE; + char *dash, *prefix; + + lang1 = (char *)g_array_index (array, char *, i); + + dash = strchr (lang1, '-'); + if (dash == NULL) continue; + + for (j = i + 1; j < (int)array->len; j++) { + lang2 = (char *)g_array_index (array, char *, j); + if (strchr (lang2, '-') == NULL && + g_str_has_prefix (lang1, lang2)) { + found = TRUE; + } + } + + if (found == FALSE) { + prefix = g_strndup (lang1, dash - lang1); + g_array_append_val (array, prefix); + } + } + + /* uniquify */ + for (i = 0; i < (int)array->len - 1; i++) { + for (j = (int)array->len - 1; j > i; j--) { + lang1 = (char *)g_array_index (array, char *, i); + lang2 = (char *)g_array_index (array, char *, j); + + if (strcmp (lang1, lang2) == 0) { + g_array_remove_index (array, j); + g_free (lang2); + } + } + } + + /* move 'xy' code behind all 'xy-ab' codes */ + for (i = (int)array->len - 2; i >= 0; i--) { + for (j = (int)array->len - 1; j > i; j--) { + lang1 = (char *)g_array_index (array, char *, i); + lang2 = (char *)g_array_index (array, char *, j); + + if (strchr (lang1, '-') == NULL && + strchr (lang2, '-') != NULL && + g_str_has_prefix (lang2, lang1)) { + g_array_insert_val (array, j + 1, lang1); + g_array_remove_index (array, i); + break; + } + } + } } void ephy_langs_append_languages (GArray *array) { - const char * const * languages; - char *lang; - int i; - - languages = g_get_language_names (); - g_return_if_fail (languages != NULL); - - /* FIXME: maybe just use the first, instead of all of them? */ - for (i = 0; languages[i] != NULL; i++) - { - - if (strstr (languages[i], ".") == 0 && - strstr (languages[i], "@") == 0 && - strcmp (languages[i], "C") != 0) - { - /* change to lowercase and '_' to '-' */ - lang = g_strdelimit (g_ascii_strdown - (languages[i], -1), "_", '-'); - - g_array_append_val (array, lang); - } - } - - /* Fallback: add "en" if list is empty */ - if (array->len == 0) - { - lang = g_strdup ("en"); - g_array_append_val (array, lang); - } + const char * const *languages; + char *lang; + int i; + + languages = g_get_language_names (); + g_return_if_fail (languages != NULL); + + /* FIXME: maybe just use the first, instead of all of them? */ + for (i = 0; languages[i] != NULL; i++) { + if (strstr (languages[i], ".") == 0 && + strstr (languages[i], "@") == 0 && + strcmp (languages[i], "C") != 0) { + /* change to lowercase and '_' to '-' */ + lang = g_strdelimit (g_ascii_strdown + (languages[i], -1), "_", '-'); + + g_array_append_val (array, lang); + } + } + + /* Fallback: add "en" if list is empty */ + if (array->len == 0) { + lang = g_strdup ("en"); + g_array_append_val (array, lang); + } } char ** ephy_langs_get_languages (void) { - GArray *array; + GArray *array; - array = g_array_new (TRUE, FALSE, sizeof (char *)); + array = g_array_new (TRUE, FALSE, sizeof (char *)); - ephy_langs_append_languages (array); + ephy_langs_append_languages (array); - ephy_langs_sanitise (array); + ephy_langs_sanitise (array); - return (char **)(void *) g_array_free (array, FALSE); + return (char **)(void *)g_array_free (array, FALSE); } static void ephy_langs_bind_iso_domains (void) { - static gboolean bound = FALSE; + static gboolean bound = FALSE; - if (bound == FALSE) - { - bindtextdomain (ISO_639_DOMAIN, LOCALEDIR); - bind_textdomain_codeset (ISO_639_DOMAIN, "UTF-8"); + if (bound == FALSE) { + bindtextdomain (ISO_639_DOMAIN, LOCALEDIR); + bind_textdomain_codeset (ISO_639_DOMAIN, "UTF-8"); - bindtextdomain(ISO_3166_DOMAIN, LOCALEDIR); - bind_textdomain_codeset (ISO_3166_DOMAIN, "UTF-8"); + bindtextdomain (ISO_3166_DOMAIN, LOCALEDIR); + bind_textdomain_codeset (ISO_3166_DOMAIN, "UTF-8"); - bound = TRUE; - } + bound = TRUE; + } } static void read_iso_639_entry (xmlTextReaderPtr reader, - GHashTable *table) + GHashTable *table) { - xmlChar *code, *name; - - code = xmlTextReaderGetAttribute (reader, (const xmlChar *) "iso_639_1_code"); - name = xmlTextReaderGetAttribute (reader, (const xmlChar *) "name"); - - /* Get iso-639-2 code */ - if (code == NULL || code[0] == '\0') - { - xmlFree (code); - /* FIXME: use the 2T or 2B code? */ - code = xmlTextReaderGetAttribute (reader, (const xmlChar *) "iso_639_2T_code"); - } - - if (code != NULL && code[0] != '\0' && name != NULL && name[0] != '\0') - { - g_hash_table_insert (table, code, name); - } - else - { - xmlFree (code); - xmlFree (name); - } + xmlChar *code, *name; + + code = xmlTextReaderGetAttribute (reader, (const xmlChar *)"iso_639_1_code"); + name = xmlTextReaderGetAttribute (reader, (const xmlChar *)"name"); + + /* Get iso-639-2 code */ + if (code == NULL || code[0] == '\0') { + xmlFree (code); + /* FIXME: use the 2T or 2B code? */ + code = xmlTextReaderGetAttribute (reader, (const xmlChar *)"iso_639_2T_code"); + } + + if (code != NULL && code[0] != '\0' && name != NULL && name[0] != '\0') { + g_hash_table_insert (table, code, name); + } else { + xmlFree (code); + xmlFree (name); + } } static void read_iso_3166_entry (xmlTextReaderPtr reader, - GHashTable *table) + GHashTable *table) { - xmlChar *code, *name; + xmlChar *code, *name; - code = xmlTextReaderGetAttribute (reader, (const xmlChar *) "alpha_2_code"); - name = xmlTextReaderGetAttribute (reader, (const xmlChar *) "name"); + code = xmlTextReaderGetAttribute (reader, (const xmlChar *)"alpha_2_code"); + name = xmlTextReaderGetAttribute (reader, (const xmlChar *)"name"); - if (code != NULL && code[0] != '\0' && name != NULL && name[0] != '\0') - { - char *lcode; + if (code != NULL && code[0] != '\0' && name != NULL && name[0] != '\0') { + char *lcode; - lcode = g_ascii_strdown ((char *) code, -1); - xmlFree (code); - - g_hash_table_insert (table, lcode, name); - } - else - { - xmlFree (code); - xmlFree (name); - } + lcode = g_ascii_strdown ((char *)code, -1); + xmlFree (code); + g_hash_table_insert (table, lcode, name); + } else { + xmlFree (code); + xmlFree (name); + } } -typedef enum -{ - STATE_START, - STATE_STOP, - STATE_ENTRIES, +typedef enum { + STATE_START, + STATE_STOP, + STATE_ENTRIES, } ParserState; static void -load_iso_entries (int iso, - GFunc read_entry_func, - gpointer user_data) +load_iso_entries (int iso, + GFunc read_entry_func, + gpointer user_data) { - xmlTextReaderPtr reader; - ParserState state = STATE_START; - xmlChar iso_entries[32], iso_entry[32]; - char *filename; - int ret = -1; - - LOG ("Loading ISO-%d codes", iso); - - START_PROFILER ("Loading ISO codes") - - filename = g_strdup_printf (ISO_CODES_PREFIX "/share/xml/iso-codes/iso_%d.xml", iso); - reader = xmlNewTextReaderFilename (filename); - if (reader == NULL) goto out; - - xmlStrPrintf (iso_entries, sizeof (iso_entries), (const xmlChar *)"iso_%d_entries", iso); - xmlStrPrintf (iso_entry, sizeof (iso_entry), (const xmlChar *)"iso_%d_entry", iso); - - ret = xmlTextReaderRead (reader); - - while (ret == 1) - { - const xmlChar *tag; - xmlReaderTypes type; - - tag = xmlTextReaderConstName (reader); - type = xmlTextReaderNodeType (reader); - - if (state == STATE_ENTRIES && - type == XML_READER_TYPE_ELEMENT && - xmlStrEqual (tag, iso_entry)) - { - read_entry_func (reader, user_data); - } - else if (state == STATE_START && - type == XML_READER_TYPE_ELEMENT && - xmlStrEqual (tag, iso_entries)) - { - state = STATE_ENTRIES; - } - else if (state == STATE_ENTRIES && - type == XML_READER_TYPE_END_ELEMENT && - xmlStrEqual (tag, iso_entries)) - { - state = STATE_STOP; - } - else if (type == XML_READER_TYPE_SIGNIFICANT_WHITESPACE || - type == XML_READER_TYPE_WHITESPACE || - type == XML_READER_TYPE_TEXT || - type == XML_READER_TYPE_COMMENT) - { - /* eat it */ - } - else - { - /* ignore it */ - } - - ret = xmlTextReaderRead (reader); - } - - xmlFreeTextReader (reader); - -out: - if (ret < 0 || state != STATE_STOP) - { - g_warning ("Failed to load ISO-%d codes from %s!\n", - iso, filename); - } - - g_free (filename); - - STOP_PROFILER ("Loading ISO codes") + xmlTextReaderPtr reader; + ParserState state = STATE_START; + xmlChar iso_entries[32], iso_entry[32]; + char *filename; + int ret = -1; + + LOG ("Loading ISO-%d codes", iso); + + START_PROFILER ("Loading ISO codes") + + filename = g_strdup_printf (ISO_CODES_PREFIX "/share/xml/iso-codes/iso_%d.xml", iso); + reader = xmlNewTextReaderFilename (filename); + if (reader == NULL) goto out; + + xmlStrPrintf (iso_entries, sizeof (iso_entries), (const xmlChar *)"iso_%d_entries", iso); + xmlStrPrintf (iso_entry, sizeof (iso_entry), (const xmlChar *)"iso_%d_entry", iso); + + ret = xmlTextReaderRead (reader); + + while (ret == 1) { + const xmlChar *tag; + xmlReaderTypes type; + + tag = xmlTextReaderConstName (reader); + type = xmlTextReaderNodeType (reader); + + if (state == STATE_ENTRIES && + type == XML_READER_TYPE_ELEMENT && + xmlStrEqual (tag, iso_entry)) { + read_entry_func (reader, user_data); + } else if (state == STATE_START && + type == XML_READER_TYPE_ELEMENT && + xmlStrEqual (tag, iso_entries)) { + state = STATE_ENTRIES; + } else if (state == STATE_ENTRIES && + type == XML_READER_TYPE_END_ELEMENT && + xmlStrEqual (tag, iso_entries)) { + state = STATE_STOP; + } else if (type == XML_READER_TYPE_SIGNIFICANT_WHITESPACE || + type == XML_READER_TYPE_WHITESPACE || + type == XML_READER_TYPE_TEXT || + type == XML_READER_TYPE_COMMENT) { + /* eat it */ + } else { + /* ignore it */ + } + + ret = xmlTextReaderRead (reader); + } + + xmlFreeTextReader (reader); + + out: + if (ret < 0 || state != STATE_STOP) { + g_warning ("Failed to load ISO-%d codes from %s!\n", + iso, filename); + } + + g_free (filename); + + STOP_PROFILER ("Loading ISO codes") } GHashTable * ephy_langs_iso_639_table (void) { - GHashTable *table; + GHashTable *table; - ephy_langs_bind_iso_domains (); - table = g_hash_table_new_full (g_str_hash, g_str_equal, - (GDestroyNotify) xmlFree, - (GDestroyNotify) xmlFree); + ephy_langs_bind_iso_domains (); + table = g_hash_table_new_full (g_str_hash, g_str_equal, + (GDestroyNotify)xmlFree, + (GDestroyNotify)xmlFree); - load_iso_entries (639, (GFunc) read_iso_639_entry, table); + load_iso_entries (639, (GFunc)read_iso_639_entry, table); - return table; + return table; } GHashTable * ephy_langs_iso_3166_table (void) { - GHashTable *table; + GHashTable *table; + + ephy_langs_bind_iso_domains (); + table = g_hash_table_new_full (g_str_hash, g_str_equal, + (GDestroyNotify)g_free, + (GDestroyNotify)xmlFree); - ephy_langs_bind_iso_domains (); - table = g_hash_table_new_full (g_str_hash, g_str_equal, - (GDestroyNotify) g_free, - (GDestroyNotify) xmlFree); - - load_iso_entries (3166, (GFunc) read_iso_3166_entry, table); + load_iso_entries (3166, (GFunc)read_iso_3166_entry, table); - return table; + return table; } |