diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-05-10 15:03:43 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-05-10 17:21:54 +0300 |
commit | 8b04169265fb9762b2c1dfca3f43068f5b8233be (patch) | |
tree | 43049c1809b2b70b21ed9300ebdd286d18833c8b /src/triplet.c | |
parent | bb242e454d5cf8b0c6bb1ca5d009ec18e86c0c2b (diff) | |
download | wydawca-8b04169265fb9762b2c1dfca3f43068f5b8233be.tar.gz wydawca-8b04169265fb9762b2c1dfca3f43068f5b8233be.tar.bz2 |
Update grecs.
* Makefile.am (ChangeLog): Use git2chg.awk.
* bootstrap.conf (gnulib_modules): Don't access grecs/gnulib.modules.
* configure.ac (GRECS_SETUP): Add options.
* gnulib.modules (getopt,gitlog-to-changelog)
(hash,error,version-etc): Remove.
* src/Makefile.am: Remove getopt.m4, use one from grecs.
* src/getopt.m4: Remove.
* src/cmdline.opt: Rewrite.
* src/config.c: Update.
* src/wydawca.h (spool) <aliases>: Change data type.
(all_spool_aliases): Change data type.
(config_finish): New proto.
* src/wydawca.c: Use grecs functions.
* src/dictionary.c: Likewise.
* src/net.c: Likewise.
* src/process.c: Likewise.
* src/mail.c: Use grecs_symtab.
* src/timer.c: Likewise.
* src/triplet.c: Likewise.
Diffstat (limited to 'src/triplet.c')
-rw-r--r-- | src/triplet.c | 84 |
1 files changed, 46 insertions, 38 deletions
diff --git a/src/triplet.c b/src/triplet.c index ea57a08..6bd9e6a 100644 --- a/src/triplet.c +++ b/src/triplet.c @@ -15,25 +15,24 @@ with wydawca. If not, see <http://www.gnu.org/licenses/>. */ #include "wydawca.h" -#include "hash.h" #include <time.h> -static Hash_table *triplet_table; +static struct grecs_symtab *triplet_table; -static size_t -hash_triplet_hasher (void const *data, unsigned n_buckets) +static unsigned +hash_triplet_hasher (void *data, unsigned long n_buckets) { struct file_triplet const *t = data; - return hash_string (t->name, n_buckets); + return grecs_hash_string (t->name, n_buckets); } /* Compare two strings for equality. */ -static bool +static int hash_triplet_compare (void const *data1, void const *data2) { struct file_triplet const *t1 = data1; struct file_triplet const *t2 = data2; - return t1->name && t2->name && strcmp (t1->name, t2->name) == 0; + return strcmp (t1->name, t2->name); } /* Reclaim memory storage associated with a table entry */ @@ -44,6 +43,8 @@ hash_triplet_free (void *data) struct file_triplet *tp = data; struct uploader_info *up; + free (tp->name); + for (i = 0; i < FILE_TYPE_COUNT; i++) { if (tp->file[i].name) @@ -78,40 +79,47 @@ triplet_strdup (struct file_triplet *tp, const char *str) void register_file (struct file_info *finfo, const struct spool *spool) { - struct file_triplet *tp, *ret; + struct file_triplet key, *ret; + int install = 1; - tp = xmalloc (sizeof(*tp) + finfo->root_len + 1); - memset (tp, 0, sizeof (*tp)); - tp->name = (char*)(tp + 1); - memcpy (tp->name, finfo->name, finfo->root_len); - tp->name[finfo->root_len] = 0; - tp->spool = spool; - - if (! ((triplet_table - || (triplet_table = hash_initialize (0, 0, - hash_triplet_hasher, - hash_triplet_compare, - hash_triplet_free))) - && (ret = hash_insert (triplet_table, tp)))) - xalloc_die (); - - if (ret == tp) - obstack_init (&tp->obstk); - else - free (tp); + if (!triplet_table) + { + triplet_table = grecs_symtab_create (sizeof (struct file_triplet), + hash_triplet_hasher, + hash_triplet_compare, + NULL, + NULL, + hash_triplet_free); + if (!triplet_table) + grecs_alloc_die (); + } + + key.name = xmalloc (finfo->root_len + 1); + memcpy (key.name, finfo->name, finfo->root_len); + key.name[finfo->root_len] = 0; + + ret = grecs_symtab_lookup_or_install (triplet_table, &key, &install); + if (!ret) + grecs_alloc_die (); + free (key.name); + if (install) + { + ret->spool = spool; + obstack_init (&ret->obstk); + } ret->file[finfo->type] = *finfo; } /* Return true if any part of the triplet TRP was modified more than TTL seconds ago */ -static bool +static int triplet_expired_p (struct file_triplet *trp, time_t ttl) { int i; time_t now = time (NULL); if (ttl == 0) - return false; + return 0; for (i = 0; i < FILE_TYPE_COUNT; i++) { @@ -120,10 +128,10 @@ triplet_expired_p (struct file_triplet *trp, time_t ttl) { if (debug_level) logmsg (LOG_DEBUG, _("file %s expired"), trp->file[i].name); - return true; + return 1; } } - return false; + return 0; } enum triplet_state @@ -191,7 +199,7 @@ remove_triplet (struct file_triplet *trp) } /* Process a single triplet from the table */ -static bool +static int triplet_processor (void *data, void *proc_data) { struct file_triplet *trp = data; @@ -211,7 +219,7 @@ triplet_processor (void *data, void *proc_data) logmsg (LOG_DEBUG, _("processing triplet `%s'"), trp->name); if (process_directives (trp)) remove_triplet (trp); - return true; + return 0; case triplet_incomplete: if (debug_level) @@ -223,7 +231,7 @@ triplet_processor (void *data, void *proc_data) case triplet_bad: UPDATE_STATS (STAT_BAD_TRIPLETS); remove_triplet (trp); - return true; + return 0; } if (triplet_expired_p (trp, trp->spool->file_sweep_time)) @@ -232,7 +240,7 @@ triplet_processor (void *data, void *proc_data) remove_triplet (trp); } - return true; + return 0; } /* Process all triplets from the table according to the SPOOL */ @@ -244,15 +252,15 @@ enumerate_triplets (const struct spool *spool) spool->tag, mu_url_to_string (spool->dest_url)); if (triplet_table) { - hash_do_for_each (triplet_table, triplet_processor, NULL); - hash_clear (triplet_table); + grecs_symtab_enumerate (triplet_table, triplet_processor, NULL); + grecs_symtab_clear (triplet_table); } } size_t count_collected_triplets () { - return triplet_table ? hash_get_n_entries (triplet_table) : 0; + return triplet_table ? grecs_symtab_count_entries (triplet_table) : 0; } |