Skip to content

Commit

Permalink
Add iterator support to lt_redundant_db_t
Browse files Browse the repository at this point in the history
  • Loading branch information
tagoh committed Oct 29, 2012
1 parent 41fe486 commit 12fc211
Show file tree
Hide file tree
Showing 4 changed files with 129 additions and 7 deletions.
1 change: 1 addition & 0 deletions liblangtag/langtag.h
Expand Up @@ -20,6 +20,7 @@
#include <liblangtag/lt-extension.h>
#include <liblangtag/lt-iter.h>
#include <liblangtag/lt-list.h>
#include <liblangtag/lt-redundant.h>
#include <liblangtag/lt-string.h>
#include <liblangtag/lt-tag.h>
#undef __LANGTAG_H__INSIDE
Expand Down
60 changes: 53 additions & 7 deletions liblangtag/lt-redundant-db.c
Expand Up @@ -17,6 +17,7 @@
#include <stdlib.h>
#include <string.h>
#include <libxml/xpath.h>
#include "lt-iter-private.h"
#include "lt-error.h"
#include "lt-redundant.h"
#include "lt-redundant-private.h"
Expand All @@ -38,10 +39,14 @@
* or RFC 5646.
*/
struct _lt_redundant_db_t {
lt_mem_t parent;
lt_xml_t *xml;
lt_trie_t *redundant_entries;
lt_iter_tmpl_t parent;
lt_xml_t *xml;
lt_trie_t *redundant_entries;
};
typedef struct _lt_redundant_db_iter_t {
lt_iter_t parent;
lt_iter_t *iter;
} lt_redundant_db_iter_t;

/*< private >*/
static lt_bool_t
Expand Down Expand Up @@ -168,6 +173,42 @@ lt_redundant_db_parse(lt_redundant_db_t *redundantdb,
return retval;
}

static lt_iter_t *
_lt_redundant_db_iter_init(lt_iter_tmpl_t *tmpl)
{
lt_redundant_db_iter_t *retval;
lt_redundant_db_t *db = (lt_redundant_db_t *)tmpl;

retval = malloc(sizeof (lt_redundant_db_iter_t));
if (retval) {
retval->iter = lt_iter_init((lt_iter_tmpl_t *)db->redundant_entries);
if (!retval->iter) {
free(retval);
retval = NULL;
}
}

return &retval->parent;
}

static void
_lt_redundant_db_iter_fini(lt_iter_t *iter)
{
lt_redundant_db_iter_t *db_iter = (lt_redundant_db_iter_t *)iter;

lt_iter_finish(db_iter->iter);
}

static lt_bool_t
_lt_redundant_db_iter_next(lt_iter_t *iter,
lt_pointer_t *key,
lt_pointer_t *val)
{
lt_redundant_db_iter_t *db_iter = (lt_redundant_db_iter_t *)iter;

return lt_iter_next(db_iter->iter, key, val);
}

/*< public >*/
/**
* lt_redundant_db_new:
Expand All @@ -184,8 +225,13 @@ lt_redundant_db_new(void)
if (retval) {
lt_error_t *err = NULL;

lt_iter_tmpl_init(&retval->parent);
retval->parent.init = _lt_redundant_db_iter_init;
retval->parent.fini = _lt_redundant_db_iter_fini;
retval->parent.next = _lt_redundant_db_iter_next;

retval->redundant_entries = lt_trie_new();
lt_mem_add_ref(&retval->parent, retval->redundant_entries,
lt_mem_add_ref((lt_mem_t *)retval, retval->redundant_entries,
(lt_destroy_func_t)lt_trie_unref);

retval->xml = lt_xml_new();
Expand All @@ -194,7 +240,7 @@ lt_redundant_db_new(void)
retval = NULL;
goto bail;
}
lt_mem_add_ref(&retval->parent, retval->xml,
lt_mem_add_ref((lt_mem_t *)retval, retval->xml,
(lt_destroy_func_t)lt_xml_unref);

lt_redundant_db_parse(retval, &err);
Expand Down Expand Up @@ -223,7 +269,7 @@ lt_redundant_db_ref(lt_redundant_db_t *redundantdb)
{
lt_return_val_if_fail (redundantdb != NULL, NULL);

return lt_mem_ref(&redundantdb->parent);
return lt_mem_ref((lt_mem_t *)redundantdb);
}

/**
Expand All @@ -237,7 +283,7 @@ void
lt_redundant_db_unref(lt_redundant_db_t *redundantdb)
{
if (redundantdb)
lt_mem_unref(&redundantdb->parent);
lt_mem_unref((lt_mem_t *)redundantdb);
}

/**
Expand Down
5 changes: 5 additions & 0 deletions tests/Makefile.am
Expand Up @@ -46,6 +46,7 @@ noinst_PROGRAMS = \
test-extlang-db \
test-grandfathered-db \
test-lang-db \
test-redundant-db \
test-region-db \
test-script-db \
test-tag \
Expand Down Expand Up @@ -83,6 +84,10 @@ test_lang_db_SOURCES = \
lang-db.c \
$(NULL)
#
test_redundant_db_SOURCES = \
redundant-db.c \
$(NULL)
#
test_region_db_SOURCES = \
region-db.c \
$(NULL)
Expand Down
70 changes: 70 additions & 0 deletions tests/redundant-db.c
@@ -0,0 +1,70 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* redundant-db.c
* Copyright (C) 2011-2012 Akira TAGOH
*
* Authors:
* Akira TAGOH <akira@tagoh.org>
*
* You may distribute under the terms of either the GNU
* Lesser General Public License or the Mozilla Public
* License, as specified in the README file.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <stdio.h>
#include <locale.h>
#include "langtag.h"
#include "lt-utils.h"

int
main(int argc,
char **argv)
{
lt_redundant_db_t *redundantdb;
lt_redundant_t *redundant;

setlocale(LC_ALL, "");

lt_db_set_datadir(TEST_DATADIR);
redundantdb = lt_redundant_db_new();

if (lt_strcmp0(argv[1], "list_keys") == 0) {
const char *key;
lt_iter_t *iter;

iter = lt_iter_init((lt_iter_tmpl_t *)redundantdb);
while (lt_iter_next(iter,
(lt_pointer_t *)&key,
NULL)) {
printf("%s\n", key);
}
lt_iter_finish(iter);
} else if (lt_strcmp0(argv[1], "list_values") == 0) {
lt_iter_t *iter;

iter = lt_iter_init((lt_iter_tmpl_t *)redundantdb);
while (lt_iter_next(iter,
NULL,
(lt_pointer_t *)&redundant)) {
lt_redundant_dump(redundant);
}
lt_iter_finish(iter);
} else if (lt_strcmp0(argv[1], "lookup") == 0) {
redundant = lt_redundant_db_lookup(redundantdb, argv[2]);
if (!redundant) {
printf("No entry for %s\n", argv[2]);
} else {
printf("%s (%s)\n",
lt_redundant_get_tag(redundant),
lt_redundant_get_name(redundant));
}
lt_redundant_unref(redundant);
}

lt_redundant_db_unref(redundantdb);

return 0;
}

0 comments on commit 12fc211

Please sign in to comment.