Skip to content

Commit

Permalink
Support multiple prefixes
Browse files Browse the repository at this point in the history
  • Loading branch information
tagoh committed Jan 11, 2012
1 parent 41d11b5 commit 146fbd0
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 44 deletions.
41 changes: 8 additions & 33 deletions liblangtag/lt-variant-db.c
Expand Up @@ -94,7 +94,7 @@ lt_variant_db_parse(lt_variant_db_t *variantdb,
for (i = 0; i < n; i++) {
xmlNodePtr ent = xmlXPathNodeSetItem(xobj->nodesetval, i);
xmlNodePtr cnode;
xmlChar *subtag = NULL, *desc = NULL, *prefix = NULL;
xmlChar *subtag = NULL, *desc = NULL;
lt_variant_t *le = NULL;
gchar *s;
GList *prefix_list = NULL, *l;
Expand Down Expand Up @@ -125,40 +125,14 @@ lt_variant_db_parse(lt_variant_db_t *variantdb,
}
if (!subtag) {
g_warning("No subtag node: description = '%s', prefix = '%s'",
desc, prefix);
desc, prefix_list ? (gchar *)prefix_list->data : "N/A");
goto bail1;
}
if (!desc) {
g_warning("No description node: subtag = '%s', prefix = '%s'",
subtag, prefix);
subtag, prefix_list ? (gchar *)prefix_list->data : "N/A");
goto bail1;
}
if (prefix_list) {
for (l = prefix_list; ; l = g_list_next(l)) {
if (!g_list_next(l)) {
prefix = xmlStrdup(l->data);
xmlFree(l->data);
break;
}
le = lt_variant_create();
if (!le) {
g_set_error(&err, LT_ERROR, LT_ERR_OOM,
"Unable to create an instance of lt_variant_t.");
goto bail1;
}
lt_variant_set_tag(le, (const gchar *)subtag);
lt_variant_set_name(le, (const gchar *)desc);
lt_variant_set_prefix(le, l->data);

s = g_strdup(lt_variant_get_tag(le));
g_hash_table_replace(variantdb->variant_entries,
lt_strlower(s),
lt_variant_ref(le));
xmlFree(l->data);
lt_variant_unref(le);
}
g_list_free(prefix_list);
}
le = lt_variant_create();
if (!le) {
g_set_error(&err, LT_ERROR, LT_ERR_OOM,
Expand All @@ -167,8 +141,11 @@ lt_variant_db_parse(lt_variant_db_t *variantdb,
}
lt_variant_set_tag(le, (const gchar *)subtag);
lt_variant_set_name(le, (const gchar *)desc);
if (prefix)
lt_variant_set_prefix(le, (const gchar *)prefix);
for (l = prefix_list; l != NULL; l = g_list_next(l)) {
lt_variant_add_prefix(le, l->data);
xmlFree(l->data);
}
g_list_free(prefix_list);

s = g_strdup(lt_variant_get_tag(le));
g_hash_table_replace(variantdb->variant_entries,
Expand All @@ -179,8 +156,6 @@ lt_variant_db_parse(lt_variant_db_t *variantdb,
xmlFree(subtag);
if (desc)
xmlFree(desc);
if (prefix)
xmlFree(prefix);
lt_variant_unref(le);
}
bail:
Expand Down
2 changes: 1 addition & 1 deletion liblangtag/lt-variant-private.h
Expand Up @@ -32,7 +32,7 @@ void lt_variant_set_tag (lt_variant_t *variant,
const gchar *subtag);
void lt_variant_set_name (lt_variant_t *variant,
const gchar *description);
void lt_variant_set_prefix(lt_variant_t *variant,
void lt_variant_add_prefix(lt_variant_t *variant,
const gchar *prefix);

G_END_DECLS
Expand Down
28 changes: 20 additions & 8 deletions liblangtag/lt-variant.c
Expand Up @@ -32,10 +32,20 @@ struct _lt_variant_t {
lt_mem_t parent;
gchar *tag;
gchar *description;
gchar *prefix;
GList *prefix;
};

/*< private >*/
static void
_lt_variant_prefix_free(GList *list)
{
GList *l;

for (l = list; l != NULL; l = g_list_next(l)) {
g_free(l->data);
}
g_list_free(list);
}

/*< protected >*/
lt_variant_t *
Expand Down Expand Up @@ -77,17 +87,19 @@ lt_variant_set_name(lt_variant_t *variant,
}

void
lt_variant_set_prefix(lt_variant_t *variant,
lt_variant_add_prefix(lt_variant_t *variant,
const gchar *prefix)
{
g_return_if_fail (variant != NULL);
g_return_if_fail (prefix != NULL);

if (variant->prefix)
lt_mem_remove_ref(&variant->parent, variant->prefix);
variant->prefix = g_strdup(prefix);
lt_mem_add_ref(&variant->parent, variant->prefix,
(lt_destroy_func_t)g_free);
if (!variant->prefix) {
variant->prefix = g_list_append(variant->prefix, g_strdup(prefix));
lt_mem_add_ref(&variant->parent, variant->prefix,
(lt_destroy_func_t)_lt_variant_prefix_free);
} else {
variant->prefix = g_list_append(variant->prefix, g_strdup(prefix));
}
}

/*< public >*/
Expand Down Expand Up @@ -122,7 +134,7 @@ lt_variant_get_name(const lt_variant_t *variant)
return variant->description;
}

const gchar *
const GList *
lt_variant_get_prefix(const lt_variant_t *variant)
{
g_return_val_if_fail (variant != NULL, NULL);
Expand Down
2 changes: 1 addition & 1 deletion liblangtag/lt-variant.h
Expand Up @@ -33,7 +33,7 @@ lt_variant_t *lt_variant_ref (lt_variant_t *variant);
void lt_variant_unref (lt_variant_t *variant);
const gchar *lt_variant_get_tag (const lt_variant_t *variant);
const gchar *lt_variant_get_name (const lt_variant_t *variant);
const gchar *lt_variant_get_prefix(const lt_variant_t *variant);
const GList *lt_variant_get_prefix(const lt_variant_t *variant);

G_END_DECLS

Expand Down
6 changes: 5 additions & 1 deletion tests/variant-db.c
Expand Up @@ -39,10 +39,14 @@ main(int argc,
if (g_strcmp0(argv[1], "list") == 0) {
} else if (g_strcmp0(argv[1], "lookup") == 0) {
lt_variant_t *variant = lt_variant_db_lookup(variantdb, argv[2]);
const GList *prefix, *l;

if (variant) {
g_print("desc: %s\n", lt_variant_get_name(variant));
g_print("prefix: %s\n", lt_variant_get_prefix(variant));
prefix = lt_variant_get_prefix(variant);
for (l = prefix; l != NULL; l = g_list_next(l)) {
g_print("prefix: %s\n", (gchar *)l->data);
}
lt_variant_unref(variant);
} else {
g_print("no such variant: %s\n", argv[2]);
Expand Down

0 comments on commit 146fbd0

Please sign in to comment.