aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2018-09-10 11:59:45 +0300
committerSergey Poznyakoff <gray@gnu.org>2018-09-10 11:59:45 +0300
commit07a88216ed19f7942e75e2d249b84724a41a75db (patch)
tree724365f1aaea0ac588234bcf53748cde689e3d79
parent7ba312101e40bf17d517b401f0f56b70b17f5f1a (diff)
downloaddico-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--NEWS8
-rw-r--r--dicod/database.c11
-rw-r--r--dicod/virtual.c47
-rw-r--r--doc/libdico.texi26
-rw-r--r--include/dico/assoc.h1
-rw-r--r--lib/assoc.c8
6 files changed, 89 insertions, 12 deletions
diff --git a/NEWS b/NEWS
index afe09f2..7f2166f 100644
--- a/NEWS
+++ b/NEWS
@@ -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);
+}

Return to:

Send suggestions and report system problems to the System administrator.