summaryrefslogtreecommitdiff
path: root/libmu_sieve/mem.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmu_sieve/mem.c')
-rw-r--r--libmu_sieve/mem.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/libmu_sieve/mem.c b/libmu_sieve/mem.c
index 3c39a3d10..565ba3228 100644
--- a/libmu_sieve/mem.c
+++ b/libmu_sieve/mem.c
@@ -83,6 +83,9 @@ mu_sieve_free (mu_sieve_machine_t mach, void *ptr)
int rc;
struct memory_cell mcell;
+ if (!ptr)
+ return;
+
mcell.ptr = ptr;
rc = mu_list_remove (mach->memory_pool, &mcell);
if (rc)
@@ -228,3 +231,65 @@ mu_i_sv_2nrealloc (mu_sieve_machine_t mach, void **pptr, size_t *pnmemb,
*pptr = ptr;
*pnmemb = nmemb;
}
+
+char *
+mu_i_sv_id_canon (mu_sieve_machine_t mach, char const *name)
+{
+ size_t i;
+ char *p;
+
+ if (!name)
+ return NULL;
+
+ for (i = 0; i < mach->idcount; i++)
+ {
+ if (strcmp (mach->idspace[i], name) == 0)
+ return mach->idspace[i];
+ }
+
+ if (mach->idcount == mach->idmax)
+ {
+ mu_i_sv_2nrealloc (mach,
+ (void **) &mach->idspace,
+ &mach->idmax,
+ sizeof mach->idspace[0]);
+ }
+
+ p = mu_sieve_strdup (mach, name);
+ mach->idspace[mach->idcount++] = p;
+
+ return p;
+}
+
+size_t
+mu_i_sv_id_num (mu_sieve_machine_t mach, char const *name)
+{
+ size_t i;
+
+ for (i = 0; i < mach->idcount; i++)
+ {
+ if (mach->idspace[i] == name || strcmp (mach->idspace[i], name) == 0)
+ return i;
+ }
+ abort ();
+}
+
+char *
+mu_i_sv_id_str (mu_sieve_machine_t mach, size_t n)
+{
+ if (n >= mach->idcount)
+ abort ();
+ return mach->idspace[n];
+}
+
+void
+mu_i_sv_free_idspace (mu_sieve_machine_t mach)
+{
+ size_t i;
+
+ for (i = 0; i < mach->idcount; i++)
+ mu_sieve_free (mach, mach->idspace[i]);
+ mach->idcount = 0;
+}
+
+

Return to:

Send suggestions and report system problems to the System administrator.