diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2018-09-10 11:59:45 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2018-09-10 11:59:45 +0300 |
commit | 07a88216ed19f7942e75e2d249b84724a41a75db (patch) | |
tree | 724365f1aaea0ac588234bcf53748cde689e3d79 | |
parent | 7ba312101e40bf17d517b401f0f56b70b17f5f1a (diff) | |
download | dico-07a88216ed19f7942e75e2d249b84724a41a75db.tar.gz dico-07a88216ed19f7942e75e2d249b84724a41a75db.tar.bz2 |
Correctly display MIME headers read from the underlying db in virtual db
* NEWS: Update.
* doc/libdico.texi: Update.
* dicod/database.c (dicod_database_mime_header): Use temporary storage
to preserve original header in case of failure.
* dicod/virtual.c (dico_result_headers): Implement function.
* include/dico/assoc.h (dico_assoc_count): New function.
* lib/assoc.c (dico_assoc_count): New function.
-rw-r--r-- | NEWS | 8 | ||||
-rw-r--r-- | dicod/database.c | 11 | ||||
-rw-r--r-- | dicod/virtual.c | 47 | ||||
-rw-r--r-- | doc/libdico.texi | 26 | ||||
-rw-r--r-- | include/dico/assoc.h | 1 | ||||
-rw-r--r-- | lib/assoc.c | 8 |
6 files changed, 89 insertions, 12 deletions
@@ -1,4 +1,4 @@ -GNU Dico NEWS -- history of user-visible changes. 2018-09-06 +GNU Dico NEWS -- history of user-visible changes. 2018-09-07 Copyright (C) 2008-2010, 2012-2018 Sergey Poznyakoff See the end of file for copying conditions. @@ -31,9 +31,9 @@ detailed discussion. Debian-based systems provide a package "wordnet-dev", which contains a properly built shared wordnet library. However, this library is named -"libwordnet.so", instead of the expected "libWN.so". Use the ---with-libWN option to configure, in order to inform it about the -change, e.g.: +"libwordnet.so", instead of the expected "libWN.so". Due to this +change, configure was unable to locate the library and wordnet module +was not build. To fix this. use the --with-libWN option, e.g.: ./configure --with-libWN=wordnet diff --git a/dicod/database.c b/dicod/database.c index 34682b8..46c57f5 100644 --- a/dicod/database.c +++ b/dicod/database.c @@ -233,8 +233,15 @@ dicod_database_mime_header(dicod_database_t *db, dico_result_t res) else dico_header_parse(&hdr, NULL); - if (mod->dico_result_headers) - mod->dico_result_headers(res, hdr); + if (mod->dico_result_headers) { + dico_assoc_list_t tmp = dico_assoc_dup(hdr); + if (mod->dico_result_headers(res, tmp) == 0) { + dico_assoc_destroy(&hdr); + hdr = tmp; + } else { + dico_assoc_destroy(&tmp); + } + } return hdr; } diff --git a/dicod/virtual.c b/dicod/virtual.c index 3352c0f..84d98cb 100644 --- a/dicod/virtual.c +++ b/dicod/virtual.c @@ -24,11 +24,6 @@ struct virtual_database { struct vdb_member vdb_memb[1]; }; -struct vdb_result { - dicod_database_t *db; - dico_result_t res; -}; - struct virtual_result { struct virtual_database *vdb; dico_result_t vdres[1]; @@ -287,6 +282,45 @@ virtual_free_result(dico_result_t rp) free(rp); } +static int +virtual_result_headers(dico_result_t rp, dico_assoc_list_t hdr) +{ + struct virtual_result *result = (struct virtual_result *)rp; + size_t i; + int err = 0; + for (i = 0; i < result->vdb->vdb_count; i++) { + if (result->vdres[i]) { + dico_assoc_list_t rhdr = + dicod_database_mime_header(result->vdb->vdb_memb[i].db, + result->vdres[i]); + if (rhdr) { + struct dico_assoc *p; + dico_iterator_t itr; + + if (dico_assoc_count(rhdr) == 0) { + err = 1; + break; + } + + itr = dico_assoc_iterator(rhdr); + for (p = dico_iterator_first(itr); p; + p = dico_iterator_next(itr)) { + if (dico_assoc_append(hdr, p->key, p->value)) { + err = 1; + break; + } + } + dico_iterator_destroy(&itr); + dico_assoc_destroy(&rhdr); + } else + err = 1; + } + if (err) + return err; + } + return 0; +} + struct dico_database_module virtual_builtin_module = { .dico_version = DICO_MODULE_VERSION, .dico_capabilities = DICO_CAPA_INIT_EXT, @@ -299,5 +333,6 @@ struct dico_database_module virtual_builtin_module = { .dico_result_count = virtual_result_count, .dico_compare_count = virtual_compare_count, .dico_free_result = virtual_free_result, - .dico_db_flags = virtual_db_flags + .dico_db_flags = virtual_db_flags, + .dico_result_headers = virtual_result_headers }; diff --git a/doc/libdico.texi b/doc/libdico.texi index 7c66afd..39e3f4a 100644 --- a/doc/libdico.texi +++ b/doc/libdico.texi @@ -224,21 +224,47 @@ struct dico_assoc @{ @deftypefn Function dico_assoc_list_t dico_assoc_create (void) @end deftypefn +@deftypefn Function dico_assoc_list_t dico_assoc_dup(dico_assoc_list_t @var{src}) +@end deftypefn + @deftypefn Function void dico_assoc_destroy (dico_assoc_list_t *@var{passoc}) @end deftypefn +@deftypefn int dico_assoc_clear(dico_assoc_list_t @var{assoc}) +@end deftypefn + @deftypefn Function int dico_assoc_add (dico_assoc_list_t @var{assoc}, @ const char *@var{key}, const char *@var{value}) @end deftypefn +@deftypefn Function int dico_assoc_append(dico_assoc_list_t @var{assoc}, @ + const char *@var{key}, const char *@var{value}) +@end deftypefn + +@deftypefn Function {const char *}dico_assoc_find_n(@ + dico_assoc_list_t @var{assoc}, @ + const char *@var{key}, size_t @var{n}) +@end deftypefn + @deftypefn Function {const char *} dico_assoc_find (@ dico_assoc_list_t @var{assoc}, const char *@var{key}) @end deftypefn +@deftypefn Function void dico_assoc_remove_n(@ + dico_assoc_list_t @var{assoc}, const char *@var{key}, size_t @var{n}) +@end deftypefn + @deftypefn Function void dico_assoc_remove (@ dico_assoc_list_t @var{assoc}, const char *@var{key}) @end deftypefn +@deftypefn Function size_t dico_assoc_count(dico_assoc_list_t @var{assoc}) +@end deftypefn + +@deftypefn Function dico_iterator_t dico_assoc_iterator(@ + dico_assoc_list_t @var{assoc}) +@end deftypefn + @node diag @section Diagnostics Functions @UNREVISED diff --git a/include/dico/assoc.h b/include/dico/assoc.h index c0e846d..a0bc71f 100644 --- a/include/dico/assoc.h +++ b/include/dico/assoc.h @@ -43,6 +43,7 @@ const char *dico_assoc_find_n(dico_assoc_list_t assoc, const char *key, const char *dico_assoc_find(dico_assoc_list_t assoc, const char *key); void dico_assoc_remove_n(dico_assoc_list_t assoc, const char *key, size_t n); void dico_assoc_remove(dico_assoc_list_t assoc, const char *key); +size_t dico_assoc_count(dico_assoc_list_t assoc); dico_iterator_t dico_assoc_iterator(dico_assoc_list_t assoc); diff --git a/lib/assoc.c b/lib/assoc.c index 8880129..5f82898 100644 --- a/lib/assoc.c +++ b/lib/assoc.c @@ -233,3 +233,11 @@ dico_assoc_iterator(dico_assoc_list_t assoc) return NULL; return dico_list_iterator(assoc->list); } + +size_t +dico_assoc_count(dico_assoc_list_t assoc) +{ + if (!assoc) + return 0; + return dico_list_count(assoc->list); +} |