Skip to content

Commit

Permalink
Support -t-k0-, -t-i0-, and -t-t0- subtags
Browse files Browse the repository at this point in the history
  • Loading branch information
tagoh committed Oct 16, 2012
1 parent 94e5d68 commit 68333d0
Show file tree
Hide file tree
Showing 3 changed files with 120 additions and 41 deletions.
20 changes: 12 additions & 8 deletions data/Makefile.am
Expand Up @@ -29,14 +29,18 @@ ldml_xml_files = \
$(bcp47_xml_files) \
$(supplemental_xml_files) \
$(NULL)
bcp47_xml_files = \
common/bcp47/calendar.xml \
common/bcp47/collation.xml \
common/bcp47/currency.xml \
common/bcp47/number.xml \
common/bcp47/timezone.xml \
common/bcp47/transform.xml \
common/bcp47/variant.xml \
bcp47_xml_files = \
common/bcp47/calendar.xml \
common/bcp47/collation.xml \
common/bcp47/currency.xml \
common/bcp47/number.xml \
common/bcp47/timezone.xml \
common/bcp47/transform.xml \
common/bcp47/transform_ime.xml \
common/bcp47/transform_keyboard.xml \
common/bcp47/transform_mt.xml \
common/bcp47/transform_private_use.xml \
common/bcp47/variant.xml \
$(NULL)
supplemental_xml_files = \
common/supplemental/likelySubtags.xml \
Expand Down
140 changes: 107 additions & 33 deletions liblangtag/lt-xml.c
Expand Up @@ -17,6 +17,7 @@
#include <pthread.h>
#include <sys/stat.h>
#include <libxml/parser.h>
#include <libxml/xpath.h>
#include "lt-error.h"
#include "lt-mem.h"
#include "lt-messages.h"
Expand Down Expand Up @@ -58,20 +59,15 @@ lt_xml_read_subtag_registry(lt_xml_t *xml,
LT_STMT_START {
struct stat st;

if (!lt_string_append_filename(regfile,
BUILDDIR, "data", "language-subtag-reegistry.xml", NULL)) {
lt_error_set(&err, LT_ERR_OOM, "Unable to allocate a memory");
goto bail;
}
lt_string_append_filename(regfile,
BUILDDIR,
"data", "language-subtag-reegistry.xml", NULL);
if (stat(lt_string_value(regfile), &st) == -1) {
lt_string_clear(regfile);
#endif
if (!lt_string_append_filename(regfile,
lt_db_get_datadir(),
"language-subtag-registry.xml", NULL)) {
lt_error_set(&err, LT_ERR_OOM, "Unable to allocate a memory");
goto bail;
}
lt_string_append_filename(regfile,
lt_db_get_datadir(),
"language-subtag-registry.xml", NULL);
#ifdef GNOME_ENABLE_DEBUG
}
} LT_STMT_END;
Expand Down Expand Up @@ -128,20 +124,15 @@ lt_xml_read_cldr_bcp47(lt_xml_t *xml,
LT_STMT_START {
struct stat st;

if (!lt_string_append_filename(regfile,
SRCDIR, "data", "common", "bcp47", filename, NULL)) {
lt_error_set(&err, LT_ERR_OOM, "Unable to allocate a memory");
goto bail;
}
lt_string_append_filename(regfile,
SRCDIR, "data", "common", "bcp47",
filename, NULL);
if (stat(lt_string_value(regfile), &st) == -1) {
lt_string_clear(regfile);
#endif
if (!lt_string_append_filename(regfile,
lt_db_get_datadir(),
"common", "bcp47", filename, NULL)) {
lt_error_set(&err, LT_ERR_OOM, "Unable to allocate a memory");
goto bail;
}
lt_string_append_filename(regfile,
lt_db_get_datadir(),
"common", "bcp47", filename, NULL);
#ifdef GNOME_ENABLE_DEBUG
}
} LT_STMT_END;
Expand Down Expand Up @@ -197,20 +188,15 @@ lt_xml_read_cldr_supplemental(lt_xml_t *xml,
LT_STMT_START {
struct stat st;

if (!lt_string_append_filename(regfile,
SRCDIR, "data", "common", "supplemental", filename, NULL)) {
lt_error_set(&err, LT_ERR_OOM, "Unable to allocate a memory");
goto bail;
}
lt_string_append_filename(regfile,
SRCDIR, "data", "common", "supplemental",
filename, NULL);
if (stat(lt_string_value(regfile), &st) == -1) {
lt_string_clear(regfile);
#endif
if (!lt_string_append_filename(regfile,
lt_db_get_datadir(),
"common", "supplemental", filename, NULL)) {
lt_error_set(&err, LT_ERR_OOM, "Unable to allocate a memory");
goto bail;
}
lt_string_append_filename(regfile,
lt_db_get_datadir(),
"common", "supplemental", filename, NULL);
#ifdef GNOME_ENABLE_DEBUG
}
} LT_STMT_END;
Expand Down Expand Up @@ -249,6 +235,74 @@ lt_xml_read_cldr_supplemental(lt_xml_t *xml,
return TRUE;
}

static lt_bool_t
_lt_xml_merge_keys(lt_xml_t *xml,
xmlDocPtr doc1,
xmlDocPtr doc2,
lt_error_t **error)
{
xmlXPathContextPtr xctxt = NULL;
xmlXPathObjectPtr xobj = NULL;
xmlNodePtr parent_node;
int i, n;
lt_bool_t retval = FALSE;

xctxt = xmlXPathNewContext(doc1);
if (!xctxt) {
lt_error_set(error, LT_ERR_OOM,
"Unable to create an instance of xmlXPathContextPtr");
goto bail;
}
xobj = xmlXPathEvalExpression((const xmlChar *)"/ldmlBCP47/keyword", xctxt);
if (!xobj) {
lt_error_set(error, LT_ERR_FAIL_ON_XML,
"No valid elements for %s: keyword",
doc1->name);
goto bail;
}
if ((n = xmlXPathNodeSetGetLength(xobj->nodesetval)) != 1) {
lt_error_set(error, LT_ERR_FAIL_ON_XML,
"Too many keyword elements in %s: %s", doc1->name, doc2->name);
goto bail;
}
parent_node = xmlXPathNodeSetItem(xobj->nodesetval, 0);
xmlXPathFreeObject(xobj);
xmlXPathFreeContext(xctxt);
xobj = NULL;
xctxt = NULL;

xctxt = xmlXPathNewContext(doc2);
if (!xctxt) {
lt_error_set(error, LT_ERR_OOM,
"Unable to create an instance of xmlXPathContextPtr");
goto bail;
}
xobj = xmlXPathEvalExpression((const xmlChar *)"/ldmlBCP47/keyword/key", xctxt);
if (!xobj) {
lt_error_set(error, LT_ERR_FAIL_ON_XML,
"No valid elements for %s: key",
doc2->name);
goto bail;
}
n = xmlXPathNodeSetGetLength(xobj->nodesetval);
for (i = 0; i < n; i++) {
xmlNodePtr p = xmlCopyNode(xmlXPathNodeSetItem(xobj->nodesetval, i), 1);

xmlAddChild(parent_node, p);
}

retval = TRUE;
bail:
if (xobj)
xmlXPathFreeObject(xobj);
if (xctxt)
xmlXPathFreeContext(xctxt);
lt_mem_remove_ref(&xml->parent, doc2);
xmlFreeDoc(doc2);

return retval;
}

/*< public >*/
lt_xml_t *
lt_xml_new(void)
Expand All @@ -265,6 +319,8 @@ lt_xml_new(void)

__xml = lt_mem_alloc_object(sizeof (lt_xml_t));
if (__xml) {
xmlDocPtr doc = NULL;

lt_mem_add_weak_pointer(&__xml->parent, (lt_pointer_t *)&__xml);
if (!lt_xml_read_subtag_registry(__xml, &err))
goto bail;
Expand Down Expand Up @@ -292,6 +348,24 @@ lt_xml_new(void)
&__xml->cldr_bcp47_transform,
&err))
goto bail;
if (!lt_xml_read_cldr_bcp47(__xml, "transform_ime.xml",
&doc,
&err))
goto bail;
if (!_lt_xml_merge_keys(__xml, __xml->cldr_bcp47_transform, doc, &err))
goto bail;
if (!lt_xml_read_cldr_bcp47(__xml, "transform_keyboard.xml",
&doc,
&err))
goto bail;
if (!_lt_xml_merge_keys(__xml, __xml->cldr_bcp47_transform, doc, &err))
goto bail;
if (!lt_xml_read_cldr_bcp47(__xml, "transform_mt.xml",
&doc,
&err))
goto bail;
if (!_lt_xml_merge_keys(__xml, __xml->cldr_bcp47_transform, doc, &err))
goto bail;
if (!lt_xml_read_cldr_bcp47(__xml, "variant.xml",
&__xml->cldr_bcp47_variant,
&err))
Expand Down
1 change: 1 addition & 0 deletions liblangtag/lt-xml.h
Expand Up @@ -30,6 +30,7 @@ typedef enum _lt_xml_cldr_t {
LT_XML_CLDR_BCP47_VARIANT,
LT_XML_CLDR_BCP47_BEGIN = LT_XML_CLDR_BCP47_CALENDAR,
LT_XML_CLDR_BCP47_END = LT_XML_CLDR_BCP47_VARIANT,
LT_XML_CLDR_DUMMY1 = 100,
LT_XML_CLDR_SUPPLEMENTAL_LIKELY_SUBTAGS,
LT_XML_CLDR_SUPPLEMENTAL_BEGIN = LT_XML_CLDR_SUPPLEMENTAL_LIKELY_SUBTAGS,
LT_XML_CLDR_SUPPLEMENTAL_END = LT_XML_CLDR_SUPPLEMENTAL_LIKELY_SUBTAGS,
Expand Down

0 comments on commit 68333d0

Please sign in to comment.