summaryrefslogtreecommitdiff
path: root/huffman.c
diff options
context:
space:
mode:
authorMatt Turner <mattst88@gmail.com>2008-11-14 04:01:47 +0000
committerMatt Turner <mattst88@gmail.com>2008-11-14 04:01:47 +0000
commit70e35dac3ac20a4554bce8b30f236d220e22487e (patch)
treedc2cb38fd574a25672993acc6d78a3e2dedc78a8 /huffman.c
parentfac9b754c5c93f49c951fa157a3cb30b6fb05214 (diff)
-- Remove stop watch functions from idea.c, linear.c, and huffman.c
git-svn-id: svn://mattst88.com/svn/cleanbench/trunk@26 0d43b9a7-5ab2-4d7b-af9d-f64450cef757
Diffstat (limited to 'huffman.c')
-rw-r--r--huffman.c327
1 files changed, 112 insertions, 215 deletions
diff --git a/huffman.c b/huffman.c
index b16ceab..97d2c4a 100644
--- a/huffman.c
+++ b/huffman.c
@@ -4,6 +4,7 @@
#include <string.h>
#include <math.h>
#include <limits.h>
+#include <time.h>
#include "nmglobal.h"
#include "nbench1.h"
@@ -40,69 +41,11 @@ static long plaintextlen; /* Length of plaintext */
static void create_text_line(char *dt,long nchars);
static void create_text_block(char *tb, unsigned long tblen,
unsigned short maxlinlen);
-static unsigned long DoHuffIteration(char *plaintext,
- char *comparray, char *decomparray,
+static clock_t DoHuffIteration(char *plaintext, char *comparray, char *decomparray,
unsigned long arraysize, unsigned long nloops, huff_node *hufftree);
static void SetCompBit(uint8_t *comparray, uint32_t bitoffset, char bitchar);
static int GetCompBit(uint8_t *comparray, uint32_t bitoffset);
-/*
-** Word catalog
-*/
-#define WORDCATSIZE 50
-
-char *wordcatarray[WORDCATSIZE] = { /* FIXME: const? */
- "Hello",
- "He",
- "Him",
- "the",
- "this",
- "that",
- "though",
- "rough",
- "cough",
- "obviously",
- "But",
- "but",
- "bye",
- "begin",
- "beginning",
- "beginnings",
- "of",
- "our",
- "ourselves",
- "yourselves",
- "to",
- "together",
- "togetherness",
- "from",
- "either",
- "I",
- "A",
- "return",
- "However",
- "that",
- "example",
- "yet",
- "quickly",
- "all",
- "if",
- "were",
- "includes",
- "always",
- "never",
- "not",
- "small",
- "returns",
- "set",
- "basic",
- "Entered",
- "with",
- "used",
- "shown",
- "you",
- "know"
-};
/**************
** DoHuffman **
@@ -113,132 +56,101 @@ char *wordcatarray[WORDCATSIZE] = { /* FIXME: const? */
** Also, the compression cycle includes building the
** Huffman tree.
*/
-void DoHuffman(void)
+void
+DoHuffman(void)
{
-HuffStruct *lochuffstruct; /* Loc pointer to global data */
-char *context;
-int systemerror;
-unsigned long accumtime;
-double iterations;
-char *comparray = NULL;
-char *decomparray = NULL;
-char *plaintext = NULL;
-
-/*
-** Link to global data
-*/
-lochuffstruct=&global_huffstruct;
-
-/*
-** Set error context.
-*/
-context="CPU:Huffman";
-
-/*
-** Allocate memory for the plaintext and the compressed text.
-** We'll be really pessimistic here, and allocate equal amounts
-** for both (though we know...well, we PRESUME) the compressed
-** stuff will take less than the plain stuff.
-** Also note that we'll build a 3rd buffer to decompress
-** into, and we preallocate space for the huffman tree.
-** (We presume that the Huffman tree will grow no larger
-** than 512 bytes. This is actually a super-conservative
-** estimate...but, who cares?)
-*/
-plaintext = malloc(lochuffstruct->arraysize);
-if (!plaintext) {
- fprintf(stderr, "Error in %s, could not allocate memory. Exitting...\n", context);
- exit(1);
-}
-
-comparray = malloc(lochuffstruct->arraysize);
-if (!comparray) {
- fprintf(stderr, "Error in %s, could not allocate memory. Exitting...\n", context);
- free(plaintext);
- exit(1); /* FIXME: do I need exits here? */
-}
-
-decomparray = malloc(lochuffstruct->arraysize);
-if (!decomparray) {
- fprintf(stderr, "Error in %s, could not allocate memory. Exitting...\n", context);
- free(plaintext);
- free(comparray);
- exit(1);
-}
+ const char* context = "CPU:Huffman";
+ HuffStruct* lochuffstruct = &global_huffstruct;
+ clock_t total_time = 0;
+ int iterations = 0;
+ char* comparray = NULL;
+ char* decomparray = NULL;
+ char* plaintext = NULL;
+
+
+ /*
+ ** Allocate memory for the plaintext and the compressed text.
+ ** We'll be really pessimistic here, and allocate equal amounts
+ ** for both (though we know...well, we PRESUME) the compressed
+ ** stuff will take less than the plain stuff.
+ ** Also note that we'll build a 3rd buffer to decompress
+ ** into, and we preallocate space for the huffman tree.
+ ** (We presume that the Huffman tree will grow no larger
+ ** than 512 bytes. This is actually a super-conservative
+ ** estimate...but, who cares?)
+ */
+ plaintext = malloc(lochuffstruct->arraysize);
+ if (!plaintext) {
+ fprintf(stderr, "Error in %s, could not allocate memory. Exitting...\n", context);
+ exit(1);
+ }
+
+ comparray = malloc(lochuffstruct->arraysize);
+ if (!comparray) {
+ fprintf(stderr, "Error in %s, could not allocate memory. Exitting...\n", context);
+ free(plaintext);
+ exit(1); /* FIXME: do I need exits here? */
+ }
+
+ decomparray = malloc(lochuffstruct->arraysize);
+ if (!decomparray) {
+ fprintf(stderr, "Error in %s, could not allocate memory. Exitting...\n", context);
+ free(plaintext);
+ free(comparray);
+ exit(1);
+ }
+
+ hufftree = malloc(sizeof(huff_node) * 512);
+ if (!hufftree) {
+ fprintf(stderr, "Error in %s, could not allocate memory. Exitting...\n", context);
+ free(plaintext);
+ free(comparray);
+ free(decomparray);
+ exit(1);
+ }
+
+ /*
+ ** Build the plaintext buffer. Since we want this to
+ ** actually be able to compress, we'll use the
+ ** wordcatalog to build the plaintext stuff.
+ */
+ /*
+ ** Reset random number generator so things repeat.
+ ** added by Uwe F. Mayer
+ */
+ randnum((int32_t)13);
+ create_text_block(plaintext,lochuffstruct->arraysize-1,(unsigned short)500);
+ plaintext[lochuffstruct->arraysize-1L]='\0';
+ plaintextlen=lochuffstruct->arraysize;
+
+ /*
+ ** See if we need to perform self adjustment loop.
+ */
+ if (lochuffstruct->adjust == FALSE) {
+ lochuffstruct->adjust = TRUE;
+ /*
+ ** Do self-adjustment. This involves initializing the
+ ** # of loops and increasing the loop count until we
+ ** get a number of loops that we can use.
+ */
+ for (lochuffstruct->loops = 100; lochuffstruct->loops < MAXHUFFLOOPS; lochuffstruct->loops += 10) {
+ if (DoHuffIteration(plaintext, comparray, decomparray, lochuffstruct->arraysize, lochuffstruct->loops, hufftree) > global_min_ticks) {
+ break;
+ }
+ }
+ }
+
+ do {
+ total_time += DoHuffIteration(plaintext, comparray, decomparray, lochuffstruct->arraysize, lochuffstruct->loops, hufftree);
+ iterations += lochuffstruct->loops;
+ } while (total_time < lochuffstruct->request_secs * CLOCKS_PER_SEC);
-hufftree = malloc(sizeof(huff_node) * 512);
-if (!hufftree) {
- fprintf(stderr, "Error in %s, could not allocate memory. Exitting...\n", context);
free(plaintext);
free(comparray);
free(decomparray);
- exit(1);
-}
-
-/*
-** Build the plaintext buffer. Since we want this to
-** actually be able to compress, we'll use the
-** wordcatalog to build the plaintext stuff.
-*/
-/*
-** Reset random number generator so things repeat.
-** added by Uwe F. Mayer
-*/
-randnum((int32_t)13);
-create_text_block(plaintext,lochuffstruct->arraysize-1,(unsigned short)500);
-plaintext[lochuffstruct->arraysize-1L]='\0';
-plaintextlen=lochuffstruct->arraysize;
-
-/*
-** See if we need to perform self adjustment loop.
-*/
-if(lochuffstruct->adjust==0)
-{
- /*
- ** Do self-adjustment. This involves initializing the
- ** # of loops and increasing the loop count until we
- ** get a number of loops that we can use.
- */
- for(lochuffstruct->loops=100L;
- lochuffstruct->loops<MAXHUFFLOOPS;
- lochuffstruct->loops+=10L)
- if(DoHuffIteration(plaintext,
- comparray,
- decomparray,
- lochuffstruct->arraysize,
- lochuffstruct->loops,
- hufftree)>global_min_ticks) break;
-}
-
-/*
-** All's well if we get here. Do the test.
-*/
-accumtime=0L;
-iterations=(double)0.0;
-
-do {
- accumtime+=DoHuffIteration(plaintext,
- comparray,
- decomparray,
- lochuffstruct->arraysize,
- lochuffstruct->loops,
- hufftree);
- iterations+=(double)lochuffstruct->loops;
-} while(TicksToSecs(accumtime)<lochuffstruct->request_secs);
-
-/*
-** Clean up, calculate results, and go home. Be sure to
-** show that we don't have to rerun adjustment code.
-*/
-free(plaintext);
-free(comparray);
-free(decomparray);
-free(hufftree);
-lochuffstruct->iterspersec=iterations / TicksToFracSecs(accumtime);
-
-if(lochuffstruct->adjust==0)
- lochuffstruct->adjust=1;
+ free(hufftree);
+ lochuffstruct->iterspersec = (double)(iterations * CLOCKS_PER_SEC) / (double)total_time;
}
/*********************
@@ -250,18 +162,28 @@ if(lochuffstruct->adjust==0)
static void create_text_line(char *dt,
long nchars)
{
-long charssofar; /* # of characters so far */
+long charssofar = 0; /* # of characters so far */
long tomove; /* # of characters to move */
char myword[40]; /* Local buffer for words */
char *wordptr; /* Pointer to word from catalog */
-charssofar=0;
+/*
+** Word catalog
+*/
+#define WORDCATSIZE 50
+
+const char * wordcatarray[WORDCATSIZE] = {
+ "Hello", "He", "Him", "the", "this", "that", "though", "rough", "cough", "obviously", "But",
+ "but", "bye", "begin", "beginning", "beginnings", "of", "our", "ourselves", "yourselves",
+ "to", "together", "togetherness", "from", "either", "I", "A", "return", "However", "that",
+ "example", "yet", "quickly", "all", "if", "were", "includes", "always", "never", "not", "small",
+ "returns", "set", "basic", "Entered", "with", "used", "shown", "you", "know"
+};
do {
/*
** Grab a random word from the wordcatalog
*/
-/* wordptr=wordcatarray[abs_randwc((long)WORDCATSIZE)];*/
wordptr=wordcatarray[abs_randwc((int32_t)WORDCATSIZE)];
memmove(myword, wordptr, strlen(wordptr) + 1);
@@ -343,13 +265,10 @@ bytessofar+=linelen;
** (b) Compresses the text
** (c) Decompresses the text and verifies correct decompression
*/
-static unsigned long DoHuffIteration(char *plaintext,
- char *comparray,
- char *decomparray,
- unsigned long arraysize,
- unsigned long nloops,
- huff_node *hufftree)
+static clock_t
+DoHuffIteration(char *plaintext, char *comparray, char *decomparray, unsigned long arraysize, unsigned long nloops, huff_node *hufftree)
{
+ clock_t start, stop;
int i; /* Index */
long j; /* Bigger index */
int root; /* Pointer to huffman tree root */
@@ -361,19 +280,9 @@ long maxbitoffset; /* Holds limit of bit offset */
long bitstringlen; /* Length of bitstring */
int c; /* Character from plaintext */
char bitstring[30]; /* Holds bitstring */
-unsigned long elapsed; /* For stopwatch */
-#ifdef DEBUG
-int status=0;
-#endif
-/*
-** Start the stopwatch
-*/
-elapsed=StartStopwatch();
+ start = clock();
-/*
-** Do everything for nloops
-*/
while(nloops--)
{
@@ -404,7 +313,7 @@ for(i=0;i<256;i++)
** was arbitrarily assigned led to an underflow error at runtime. We
** use that zeroed-out bits are in fact 0 as a float.
** Uwe F. Mayer */
-bzero((char *)&(hufftree[256]),sizeof(huff_node)*256);
+bzero((char *)&(hufftree[256]),sizeof(huff_node)*256); /* FIXME: replace bzero with memset? */
/*
** Build the huffman tree. First clear all the parent
** pointers and left/right pointers. Also, discard all
@@ -521,26 +430,14 @@ do {
}
decomparray[textoffset]=hufftree[i].c;
-#ifdef DEBUG
- if(hufftree[i].c != plaintext[textoffset])
- {
- /* Show error */
- printf("Error at textoffset %ld\n",textoffset);
- status=1;
- }
-#endif
textoffset++;
} while(bitoffset<maxbitoffset);
} /* End the big while(nloops--) from above */
-/*
-** All done
-*/
-#ifdef DEBUG
- if (status==0) printf("Huffman: OK\n");
-#endif
-return(StopStopwatch(elapsed));
+ stop = clock();
+
+ return stop - start;
}
/***************