/** * lt_script_db_new: * * Create a new instance of a #lt_script_db_t. * * Returns: (transfer full): a new instance of #lt_script_db_t. */ lt_script_db_t * lt_script_db_new(void) { lt_script_db_t *retval = lt_mem_alloc_object(sizeof (lt_script_db_t)); if (retval) { lt_error_t *err = NULL; lt_script_t *le; LT_ITER_TMPL_INIT (&retval->parent, _lt_script_db); retval->script_entries = lt_trie_new(); lt_mem_add_ref((lt_mem_t *)retval, retval->script_entries, (lt_destroy_func_t)lt_trie_unref); le = lt_script_create(); lt_script_set_tag(le, "*"); lt_script_set_name(le, "Wildcard entry"); lt_trie_replace(retval->script_entries, lt_script_get_tag(le), le, (lt_destroy_func_t)lt_script_unref); le = lt_script_create(); lt_script_set_tag(le, ""); lt_script_set_name(le, "Empty entry"); lt_trie_replace(retval->script_entries, lt_script_get_tag(le), le, (lt_destroy_func_t)lt_script_unref); retval->xml = lt_xml_new(); if (!retval->xml) { lt_script_db_unref(retval); retval = NULL; goto bail; } lt_mem_add_ref((lt_mem_t *)retval, retval->xml, (lt_destroy_func_t)lt_xml_unref); lt_script_db_parse(retval, &err); if (lt_error_is_set(err, LT_ERR_ANY)) { lt_error_print(err, LT_ERR_ANY); lt_script_db_unref(retval); retval = NULL; lt_error_unref(err); } } bail: return retval; }
/** * lt_region_db_new: * * Create a new instance of a #lt_region_db_t. * * Returns: (transfer full): a new instance of #lt_region_db_t. */ lt_region_db_t * lt_region_db_new(void) { lt_region_db_t *retval = lt_mem_alloc_object(sizeof (lt_region_db_t)); if (retval) { GError *err = NULL; lt_region_t *le; retval->region_entries = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)lt_region_unref); lt_mem_add_ref(&retval->parent, retval->region_entries, (lt_destroy_func_t)g_hash_table_destroy); le = lt_region_create(); lt_region_set_tag(le, "*"); lt_region_set_name(le, "Wildcard entry"); g_hash_table_replace(retval->region_entries, g_strdup(lt_region_get_tag(le)), le); le = lt_region_create(); lt_region_set_tag(le, ""); lt_region_set_name(le, "Empty entry"); g_hash_table_replace(retval->region_entries, g_strdup(lt_region_get_tag(le)), le); retval->xml = lt_xml_new(); if (!retval->xml) { lt_region_db_unref(retval); retval = NULL; goto bail; } lt_mem_add_ref(&retval->parent, retval->xml, (lt_destroy_func_t)lt_xml_unref); lt_region_db_parse(retval, &err); if (err) { g_printerr(err->message); lt_region_db_unref(retval); retval = NULL; g_error_free(err); } } bail: return retval; }
static gboolean _lt_ext_ldml_u_lookup_type(lt_ext_ldml_u_data_t *data, const gchar *subtag, GError **error) { lt_xml_t *xml = NULL; xmlDocPtr doc; xmlXPathContextPtr xctxt = NULL; xmlXPathObjectPtr xobj = NULL; gint i, n; gchar key[4], *xpath_string = NULL; GList *l; GString *s; gboolean retval = FALSE; g_return_val_if_fail (data->current_type > 0, FALSE); l = g_list_last(data->tags); if (l == NULL) { g_set_error(error, LT_ERROR, LT_ERR_FAIL_ON_SCANNER, "Invalid internal state. failed to find a key container."); goto bail; } s = l->data; strncpy(key, s->str, 2); key[2] = 0; xml = lt_xml_new(); doc = lt_xml_get_cldr(xml, data->current_type); xctxt = xmlXPathNewContext(doc); if (!xctxt) { g_set_error(error, LT_ERROR, LT_ERR_OOM, "Unable to create an instance of xmlXPathContextPtr."); goto bail; } xpath_string = g_strdup_printf("/ldmlBCP47/keyword/key[@name = '%s']", key); xobj = xmlXPathEvalExpression((const xmlChar *)xpath_string, xctxt); if (!xobj) { g_set_error(error, LT_ERROR, LT_ERR_FAIL_ON_XML, "No valid elements for %s: %s", doc->name, xpath_string); goto bail; } n = xmlXPathNodeSetGetLength(xobj->nodesetval); for (i = 0; i < n; i++) { xmlNodePtr ent = xmlXPathNodeSetItem(xobj->nodesetval, i); xmlNodePtr cnode; xmlChar *name; if (!ent) { g_set_error(error, LT_ERROR, LT_ERR_FAIL_ON_XML, "Unable to obtain the xml node via XPath."); goto bail; } cnode = ent->children; while (cnode != NULL) { if (xmlStrcmp(cnode->name, (const xmlChar *)"type") == 0) { name = xmlGetProp(cnode, (const xmlChar *)"name"); if (name && g_ascii_strcasecmp((const gchar *)name, subtag) == 0) { retval = TRUE; xmlFree(name); goto bail; } else if (g_strcmp0((const gchar *)name, "CODEPOINTS") == 0) { gsize len = strlen(subtag), j; static const gchar *hexdigit = "0123456789abcdefABCDEF"; gchar *p; guint64 x; /* an exception to deal with the unicode code point. */ if (len >= 4 && len <= 6) { for (j = 0; j < len; j++) { if (!strchr(hexdigit, subtag[j])) goto bail2; } x = g_ascii_strtoull(subtag, &p, 16); if (p && p[0] == 0 && x <= 0x10ffff) { retval = TRUE; xmlFree(name); goto bail; } } bail2:; } xmlFree(name); } else if (xmlStrcmp(cnode->name, (const xmlChar *)"text") == 0) { /* ignore */ } else { g_warning("Unknown node under /ldmlBCP47/keyword/key: %s", cnode->name); } cnode = cnode->next; } } bail: g_free(xpath_string); if (xobj) xmlXPathFreeObject(xobj); if (xctxt) xmlXPathFreeContext(xctxt); if (xml) lt_xml_unref(xml); return retval; }
static gboolean _lt_ext_ldml_u_lookup_key(lt_ext_ldml_u_data_t *data, const gchar *subtag, GError **error) { gint i, j, n; lt_xml_t *xml = lt_xml_new(); gboolean retval = FALSE; for (i = LT_XML_CLDR_BCP47_BEGIN; i <= LT_XML_CLDR_BCP47_END; i++) { xmlDocPtr doc = lt_xml_get_cldr(xml, i); xmlXPathContextPtr xctxt = NULL; xmlXPathObjectPtr xobj = NULL; xctxt = xmlXPathNewContext(doc); if (!xctxt) { g_set_error(error, LT_ERROR, LT_ERR_OOM, "Unable to create an instance of xmlXPathContextPtr."); goto bail1; } xobj = xmlXPathEvalExpression((const xmlChar *)"/ldmlBCP47/keyword/key", xctxt); if (!xobj) { g_set_error(error, LT_ERROR, LT_ERR_FAIL_ON_XML, "No valid elements for %s", doc->name); goto bail1; } n = xmlXPathNodeSetGetLength(xobj->nodesetval); for (j = 0; j < n; j++) { xmlNodePtr ent = xmlXPathNodeSetItem(xobj->nodesetval, j); xmlChar *name; if (!ent) { g_set_error(error, LT_ERROR, LT_ERR_FAIL_ON_XML, "Unable to obtain the xml node via XPath."); goto bail1; } name = xmlGetProp(ent, (const xmlChar *)"name"); if (g_ascii_strcasecmp((const gchar *)name, subtag) == 0) { data->current_type = i; data->state = STATE_TYPE; xmlFree(name); retval = TRUE; goto bail1; } xmlFree(name); } bail1: if (xobj) xmlXPathFreeObject(xobj); if (xctxt) xmlXPathFreeContext(xctxt); if (*error || retval) goto bail; } g_set_error(error, LT_ERROR, LT_ERR_FAIL_ON_SCANNER, "Invalid key for -u- extension: %s", subtag); bail: lt_xml_unref(xml); return *error == NULL; }