From 67d0068cbfdcb7e2e8af99379c6f7a8c5b97905f Mon Sep 17 00:00:00 2001 From: giraffedata Date: Sat, 1 Jul 2023 22:29:06 +0000 Subject: cleanup git-svn-id: http://svn.code.sf.net/p/netpbm/code/trunk@4563 9d0c8265-081b-0410-96cb-a4ca84ce46f8 --- converter/pbm/g3topbm.c | 107 +++++++++++++++++++++++++++++------------------- 1 file changed, 65 insertions(+), 42 deletions(-) (limited to 'converter/pbm') diff --git a/converter/pbm/g3topbm.c b/converter/pbm/g3topbm.c index 6cf08b24..d951efe0 100644 --- a/converter/pbm/g3topbm.c +++ b/converter/pbm/g3topbm.c @@ -71,10 +71,6 @@ The receiver may be less patient. It may opt to disconnect if one row is not received within 5 seconds. */ -static G3TableEntry * whash[HASHSIZE]; -static G3TableEntry * bhash[HASHSIZE]; - - struct CmdlineInfo { /* All the information the user supplied in the command line, in a form easy for the program to use. @@ -163,6 +159,11 @@ parseCommandLine(int argc, const char ** const argv, +typedef struct { + const G3TableEntry * whash[HASHSIZE]; + const G3TableEntry * bhash[HASHSIZE]; +} BwHash; + struct BitStream { FILE * fileP; @@ -275,16 +276,16 @@ skipToNextLine(struct BitStream * const bitStreamP) { static void -addtohash(G3TableEntry * hash[], - G3TableEntry table[], - unsigned int const n, - int const a, - int const b) { +addtohash(const G3TableEntry ** const hash, + const G3TableEntry * const table, + unsigned int const n, + int const a, + int const b) { unsigned int i; for (i = 0; i < n; ++i) { - G3TableEntry * const teP = &table[i*2]; + const G3TableEntry * const teP = &table[i*2]; unsigned int const pos = ((teP->length + a) * (teP->code + b)) % HASHSIZE; if (hash[pos]) @@ -295,38 +296,51 @@ addtohash(G3TableEntry * hash[], -static G3TableEntry * -hashfind(G3TableEntry * hash[], - int const length, - int const code, - int const a, - int const b) { +static const G3TableEntry * +hashfind(const G3TableEntry * const * const hash, + unsigned int const length, + int const code, + int const a, + int const b) { - unsigned int pos; - G3TableEntry * te; + unsigned int const pos = ((length + a) * (code + b)) % HASHSIZE; + const G3TableEntry * const teP = hash[pos]; - pos = ((length + a) * (code + b)) % HASHSIZE; - te = hash[pos]; - return ((te && te->length == length && te->code == code) ? te : NULL); + return ((teP && teP->length == length && teP->code == code) ? teP : NULL); } -static void -buildHashes(G3TableEntry * (*whashP)[HASHSIZE], - G3TableEntry * (*bhashP)[HASHSIZE]) { +static BwHash * +newBwHash() { - unsigned int i; + BwHash * bwHashP; + + MALLOCVAR(bwHashP); + + if (!bwHashP) + pm_error("Unable to allocate memory for hashes"); + else { + unsigned int i; + /* Initialize */ + for (i = 0; i < HASHSIZE; ++i) + bwHashP->whash[i] = bwHashP->bhash[i] = NULL; - for (i = 0; i < HASHSIZE; ++i) - (*whashP)[i] = (*bhashP)[i] = NULL; + addtohash(bwHashP->whash, &g3ttable_table [0], 64, WHASHA, WHASHB); + addtohash(bwHashP->whash, &g3ttable_mtable[2], 40, WHASHA, WHASHB); + + addtohash(bwHashP->bhash, &g3ttable_table [1], 64, BHASHA, BHASHB); + addtohash(bwHashP->bhash, &g3ttable_mtable[3], 40, BHASHA, BHASHB); + } + return bwHashP; +} - addtohash(*whashP, &g3ttable_table[0], 64, WHASHA, WHASHB); - addtohash(*whashP, &g3ttable_mtable[2], 40, WHASHA, WHASHB); - addtohash(*bhashP, &g3ttable_table[1], 64, BHASHA, BHASHB); - addtohash(*bhashP, &g3ttable_mtable[3], 40, BHASHA, BHASHB); +static void +freeBwHash(BwHash * const bwHashP) { + + free(bwHashP); } @@ -342,10 +356,11 @@ makeRowWhite(unsigned char * const packedBitrow, -static G3TableEntry * -g3code(unsigned int const curcode, - unsigned int const curlen, - bit const color) { +static const G3TableEntry * +g3code(unsigned int const curcode, + unsigned int const curlen, + bit const color, + const BwHash * const bwHashP) { /*---------------------------------------------------------------------------- Return the position in the code tables mtable and ttable of the G3 code which is the 'curlen' bits long with value 'curcode'. @@ -353,20 +368,20 @@ g3code(unsigned int const curcode, Note that it is the _position_ in the table that determines the meaning of the code. The contents of the table entry do not. -----------------------------------------------------------------------------*/ - G3TableEntry * retval; + const G3TableEntry * retval; switch (color) { case PBM_WHITE: if (curlen < 4) retval = NULL; else - retval = hashfind(whash, curlen, curcode, WHASHA, WHASHB); + retval = hashfind(bwHashP->whash, curlen, curcode, WHASHA, WHASHB); break; case PBM_BLACK: if (curlen < 2) retval = NULL; else - retval = hashfind(bhash, curlen, curcode, BHASHA, BHASHB); + retval = hashfind(bwHashP->bhash, curlen, curcode, BHASHA, BHASHB); break; default: pm_error("INTERNAL ERROR: color is not black or white"); @@ -481,6 +496,7 @@ formatBadCodeException(const char ** const exceptionP, static void readFaxRow(struct BitStream * const bitStreamP, unsigned char * const packedBitrow, + BwHash * const bwHashP, unsigned int * const lineLengthP, const char ** const exceptionP, const char ** const errorP) { @@ -561,7 +577,7 @@ readFaxRow(struct BitStream * const bitStreamP, done = TRUE; } else if (curcode != 0) { const G3TableEntry * const teP = - g3code(curcode, curlen, currentColor); + g3code(curcode, curlen, currentColor, bwHashP); /* Address of structure that describes the current G3 code. Null means 'curcode' isn't a G3 code yet (probably just the beginning of one) @@ -718,6 +734,7 @@ readFax(struct BitStream * const bitStreamP, bool const stretch, unsigned int const expectedLineSize, bool const tolerateErrors, + BwHash * const bwHashP, unsigned char *** const packedBitsP, unsigned int * const colsP, unsigned int * const rowsP) { @@ -747,7 +764,7 @@ readFax(struct BitStream * const bitStreamP, const char * exception; packedBits[row] = pbm_allocrow_packed(MAXCOLS); - readFaxRow(bitStreamP, packedBits[row], + readFaxRow(bitStreamP, packedBits[row], bwHashP, &lineSize, &exception, &error); handleRowException(exception, error, row, tolerateErrors); @@ -788,6 +805,7 @@ main(int argc, const char * argv[]) { struct BitStream bitStream; unsigned int rows, cols; unsigned char ** packedBits; + BwHash * bwHashP; pm_proginit(&argc, argv); @@ -805,10 +823,10 @@ main(int argc, const char * argv[]) { } skipToNextLine(&bitStream); - buildHashes(&whash, &bhash); + bwHashP = newBwHash(); readFax(&bitStream, cmdline.stretch, cmdline.expectedLineSize, - !cmdline.stop_error, + !cmdline.stop_error, bwHashP, &packedBits, &cols, &rows); pm_close(ifP); @@ -825,5 +843,10 @@ main(int argc, const char * argv[]) { freeBits(packedBits, rows, cmdline.stretch); + freeBwHash(bwHashP); + return 0; } + + + -- cgit 1.4.1