diff options
author | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2009-02-14 19:17:07 +0000 |
---|---|---|
committer | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2009-02-14 19:17:07 +0000 |
commit | 5a902182c466dddc86f7a23f516a1099eb4ef194 (patch) | |
tree | 25aee7af096482c39a10bf74528217b8d1830619 /lib | |
parent | 23f5ae1861b268c4adcdaec6657406328dfdf811 (diff) | |
download | netpbm-mirror-5a902182c466dddc86f7a23f516a1099eb4ef194.tar.gz netpbm-mirror-5a902182c466dddc86f7a23f516a1099eb4ef194.tar.xz netpbm-mirror-5a902182c466dddc86f7a23f516a1099eb4ef194.zip |
Release 10.35.60
git-svn-id: http://svn.code.sf.net/p/netpbm/code/stable@841 9d0c8265-081b-0410-96cb-a4ca84ce46f8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libpammap.c | 65 |
1 files changed, 49 insertions, 16 deletions
diff --git a/lib/libpammap.c b/lib/libpammap.c index 9e90ade0..023a65a0 100644 --- a/lib/libpammap.c +++ b/lib/libpammap.c @@ -17,6 +17,7 @@ #include "pm_c_util.h" #include "mallocvar.h" +#include "nstring.h" #include "pam.h" #include "pammap.h" @@ -387,14 +388,14 @@ pnm_computetuplefreqhash(struct pam * const pamP, -tupletable -pnm_alloctupletable(const struct pam * const pamP, - unsigned int const size) { +static void +alloctupletable(const struct pam * const pamP, + unsigned int const size, + tupletable * const tupletableP, + const char ** const errorP) { - tupletable retval; - if (UINT_MAX / sizeof(struct tupleint) < size) - pm_error("size %u is too big for arithmetic", size); + asprintfN(errorP, "size %u is too big for arithmetic", size); else { unsigned int const mainTableSize = size * sizeof(struct tupleint *); unsigned int const tupleIntSize = @@ -406,20 +407,48 @@ pnm_alloctupletable(const struct pam * const pamP, as a single malloc block and suballocate internally. */ if ((UINT_MAX - mainTableSize) / tupleIntSize < size) - pm_error("size %u is too big for arithmetic", size); + asprintfN(errorP, "size %u is too big for arithmetic", size); else { + unsigned int const allocSize = mainTableSize + size * tupleIntSize; void * pool; - unsigned int i; - - pool = malloc(mainTableSize + size * tupleIntSize); - retval = (tupletable) pool; + pool = malloc(allocSize); - for (i = 0; i < size; ++i) - retval[i] = (struct tupleint *) - ((char*)pool + mainTableSize + i * tupleIntSize); + if (!pool) + asprintfN(errorP, "Unable to allocate %u bytes for a %u-entry " + "tuple table", allocSize, size); + else { + tupletable const tbl = (tupletable) pool; + + unsigned int i; + + *errorP = NULL; + + for (i = 0; i < size; ++i) + tbl[i] = (struct tupleint *) + ((char*)pool + mainTableSize + i * tupleIntSize); + + *tupletableP = tbl; + } } } +} + + + +tupletable +pnm_alloctupletable(const struct pam * const pamP, + unsigned int const size) { + + tupletable retval; + const char * error; + + alloctupletable(pamP, size, &retval, &error); + + if (error) { + strfree(error); + pm_error("Failed to allocation tuple table of size %u", size); + } return retval; } @@ -466,10 +495,14 @@ tuplehashtotable(const struct pam * const pamP, in the table to tuples or anything else in existing space. -----------------------------------------------------------------------------*/ tupletable tupletable; + const char * error; - tupletable = pnm_alloctupletable(pamP, allocsize); + alloctupletable(pamP, allocsize, &tupletable, &error); - if (tupletable != NULL) { + if (error) { + strfree(error); + pm_error("Failed to allocate table table of size %u", allocsize); + } else { unsigned int i, j; /* Loop through the hash table. */ j = 0; |