/* -*-c-*-
*
- * $Id: mparena.c,v 1.4 1999/12/10 23:28:52 mdw Exp $
+ * $Id: mparena.c,v 1.7 2004/04/08 01:36:15 mdw Exp $
*
* Allocation and freeing of MP buffers
*
* MA 02111-1307, USA.
*/
-/*----- Revision history --------------------------------------------------*
- *
- * $Log: mparena.c,v $
- * Revision 1.4 1999/12/10 23:28:52 mdw
- * Memory allocation counting.
- *
- * Revision 1.3 1999/11/22 13:58:00 mdw
- * Document the tweakables.
- *
- * Revision 1.2 1999/11/21 22:14:19 mdw
- * Fix bug. Improve diagnostic capabilities.
- *
- * Revision 1.1 1999/11/17 18:02:16 mdw
- * New multiprecision integer arithmetic suite.
- *
- */
-
/*----- Header files ------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <mLib/alloc.h>
+#include <mLib/arena.h>
+#include <mLib/exc.h>
#include <mLib/sub.h>
#include "mparena.h"
/* #define MPARENA_DEBUG "mparena.out" */
-/*----- Default allocator -------------------------------------------------*/
-
-static void *defalloc(mparena *a, size_t sz) { return xmalloc(sz); }
-static void deffree(mparena *a, void *p) { free(p); }
-
-mparena_ops mparena_defaultops = { defalloc, deffree };
-
/*----- Static variables --------------------------------------------------*/
#ifdef MPARENA_DEBUG
#endif
-static mparena arena = MPARENA_INIT;
+/*----- Standard arenas ---------------------------------------------------*/
-#define MPARENA_RESOLVE(a) do { \
- if ((a) == MPARENA_GLOBAL) \
- (a) = &arena; \
-} while (0)
+mparena mparena_global = MPARENA_INIT;
+mparena mparena_secure = MPARENA_INIT;
/*----- Main code ---------------------------------------------------------*/
{
a->root = 0;
a->n = 0;
- a->ops = &mparena_defaultops;
+ a->a = &arena_stdlib;
}
-/* --- @mparena_setops@ --- *
+/* --- @mparena_setarena@ --- *
*
- * Arguments: @mparena *a@ = pointer to arena block
- * @mparena_ops *ops@ = pointer to operations block or null
+ * Arguments: @mparena *a@ = pointer to MP arena block
+ * @arena *aa@ = pointer to arena
*
- * Returns: The previous operations block.
+ * Returns: ---
*
- * Use: Sets or queries the operations attached to an arena.
+ * Use: Sets the underlying arena for an MP arena.
*/
-mparena_ops *mparena_setops(mparena *a, mparena_ops *ops)
-{
- mparena_ops *o;
- MPARENA_RESOLVE(a);
- o = a->ops;
- if (ops)
- a->ops = ops;
- return (0);
-}
+extern void mparena_setarena(mparena *a, arena *aa) { a->a = aa; }
/* --- @mparena_destroy@ --- *
*
static void tfree(mparena *a, mparena_node *n)
{
- a->ops->free(a, n->v);
+ A_FREE(a->a, n->v);
if (n->left)
tfree(a, n->left);
if (n->right)
unsigned mparena_count(mparena *a)
{
- MPARENA_RESOLVE(a);
return (a->n);
}
mpw *mpalloc(mparena *a, size_t sz)
{
- MPARENA_RESOLVE(a);
- return (a->ops->alloc(a, MPWS(sz)));
+ mpw *v;
+ if (!sz) return (0);
+ a->n++;
+ v = A_ALLOC(a->a, MPWS(sz));
+ if (!v)
+ THROW(EXC_NOMEM);
+ return (v);
}
#else
mparena_node **nn, *n;
mpw *v;
- MPARENA_RESOLVE(a);
nn = &a->root;
#ifdef MPARENA_DEBUG
#ifdef MPARENA_DEBUG
fputs(" failed\n", debugfp);
#endif
- v = a->ops->alloc(a, MPWS(sz + 1));
+ if ((v = A_ALLOC(a->a, MPWS(sz + 1))) == 0)
+ THROW(EXC_NOMEM);
v[0] = sz;
a->n++;
return (v + 1);
void mpfree(mparena *a, mpw *v)
{
- MPARENA_RESOLVE(a);
- a->ops->free(a, v);
+ if (!v) return;
+ a->n--;
+ A_FREE(a->a, v);
}
#else
mparena_node **nn, *n;
size_t sz = *--v;
- MPARENA_RESOLVE(a);
-
#ifdef MPARENA_DEBUG
MPARENA_OPENFILE;
fprintf(debugfp, "free %u\n before: ", sz);