summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkira TAGOH <akira@tagoh.org>2015-12-01 16:46:09 +0900
committerAkira TAGOH <akira@tagoh.org>2015-12-01 17:04:13 +0900
commit3a29458f9adc0fc5b874142c76efbad5a2a785b1 (patch)
tree6b91895d2112a0139bc6fb6bae1a806823dada03
parent64804dcc9f9e6d4d49de053cecf65d0aee8d32b7 (diff)
Fix the behavior on lt_tag_transform() according to tr#35
-rw-r--r--liblangtag/lt-tag.c56
1 files changed, 50 insertions, 6 deletions
diff --git a/liblangtag/lt-tag.c b/liblangtag/lt-tag.c
index 95fd927..dba8547 100644
--- a/liblangtag/lt-tag.c
+++ b/liblangtag/lt-tag.c
@@ -2103,6 +2103,10 @@ lt_tag_transform(lt_tag_t *tag,
char *retval = NULL, *s;
lt_error_t *err = NULL;
lt_tag_t *canoned_tag = NULL;
+ lt_list_t *lv = NULL;
+ const lt_list_t *l;
+ lt_extension_t *ext = NULL;
+ lt_string_t *priv = NULL;
lt_return_val_if_fail (tag != NULL, NULL);
@@ -2127,6 +2131,14 @@ lt_tag_transform(lt_tag_t *tag,
} else {
goto bail1;
}
+ l = lt_tag_get_variants(canoned_tag);
+ for ( ; l; l = lt_list_next(l)) {
+ lv = lt_list_append(lv, lt_variant_ref(lt_list_value(l)), (lt_destroy_func_t)lt_variant_unref);
+ }
+ ext = (lt_extension_t *)lt_tag_get_extension(canoned_tag);
+ if (ext)
+ lt_extension_ref(ext);
+ priv = lt_string_new(lt_string_value(canoned_tag->privateuse));
/* clean up for lookup */
lt_tag_free_variants(canoned_tag);
lt_tag_free_extension(canoned_tag);
@@ -2143,6 +2155,11 @@ lt_tag_transform(lt_tag_t *tag,
xmlNodePtr ent;
int retry;
lt_tag_t *wt;
+ lt_lang_t *und;
+ lt_lang_db_t *langdb = lt_db_get_lang();
+
+ und = lt_lang_db_lookup(langdb, "und");
+ lt_lang_db_unref(langdb);
xml = lt_xml_new();
doc = lt_xml_get_cldr(xml, LT_XML_CLDR_SUPPLEMENTAL_LIKELY_SUBTAGS);
@@ -2153,7 +2170,7 @@ lt_tag_transform(lt_tag_t *tag,
goto bail2;
}
- for (retry = 4; retry > 0; retry--) {
+ for (retry = 5; retry > 0; retry--) {
xmlChar *to;
char *xpath_string = NULL;
int n;
@@ -2164,15 +2181,20 @@ lt_tag_transform(lt_tag_t *tag,
wt = lt_tag_copy(canoned_tag);
switch (retry) {
case 1:
- lt_tag_free_script(wt);
+ lt_tag_free_language(wt);
lt_tag_free_region(wt);
+ lt_tag_set_language(wt, lt_lang_ref(und));
break;
case 2:
lt_tag_free_script(wt);
+ lt_tag_free_region(wt);
break;
case 3:
lt_tag_free_region(wt);
break;
+ case 4:
+ lt_tag_free_script(wt);
+ break;
default:
break;
}
@@ -2225,15 +2247,22 @@ lt_tag_transform(lt_tag_t *tag,
switch (retry) {
case 1:
+ r = (lt_region_t *)lt_tag_get_region(canoned_tag);
+ if (r)
+ lt_tag_set_region(wt, lt_region_ref(r));
+ goto copies_variants;
case 2:
+ case 4:
sc = (lt_script_t *)lt_tag_get_script(canoned_tag);
- lt_tag_set_script(wt, lt_script_ref(sc));
- if (retry == 2)
+ if (sc)
+ lt_tag_set_script(wt, lt_script_ref(sc));
+ if (retry == 4)
goto copies_variants;
case 3:
r = (lt_region_t *)lt_tag_get_region(canoned_tag);
- lt_tag_set_region(wt, lt_region_ref(r));
- case 4:
+ if (r)
+ lt_tag_set_region(wt, lt_region_ref(r));
+ case 5:
copies_variants:
l = lt_tag_get_variants(canoned_tag);
for (ll = l; ll != NULL; ll = lt_list_next(ll)) {
@@ -2243,6 +2272,13 @@ lt_tag_transform(lt_tag_t *tag,
}
break;
}
+ for (l = lv; l; l = lt_list_next(l)) {
+ lt_tag_set_variant(wt, lt_variant_ref(lt_list_value(l)));
+ }
+ if (ext)
+ lt_tag_set_extension(wt, lt_extension_ref(ext));
+ if (priv)
+ lt_string_append(wt->privateuse, lt_string_value(priv));
lt_tag_free_tag_string(wt);
retval = strdup(lt_tag_get_string(wt));
} else {
@@ -2260,6 +2296,12 @@ lt_tag_transform(lt_tag_t *tag,
lt_xml_unref(xml);
} LT_STMT_END;
bail1:
+ if (priv)
+ lt_string_unref(priv);
+ if (ext)
+ lt_extension_unref(ext);
+ if (lv)
+ lt_list_free(lv);
if (canoned_tag)
lt_tag_unref(canoned_tag);
@@ -2269,6 +2311,8 @@ lt_tag_transform(lt_tag_t *tag,
else
lt_error_print(err, LT_ERR_ANY);
lt_error_unref(err);
+ } else if (err) {
+ lt_error_unref(err);
}
return retval;