aboutsummaryrefslogtreecommitdiff
path: root/src/triplet.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2011-05-10 15:03:43 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2011-05-10 17:21:54 +0300
commit8b04169265fb9762b2c1dfca3f43068f5b8233be (patch)
tree43049c1809b2b70b21ed9300ebdd286d18833c8b /src/triplet.c
parentbb242e454d5cf8b0c6bb1ca5d009ec18e86c0c2b (diff)
downloadwydawca-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.c84
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;
}

Return to:

Send suggestions and report system problems to the System administrator.