/* * This is the compress routine. It shows the basic algorithm for * the compression programs used in this article. First, an input * characters is loaded. The modeling routines are called to * convert the character to a symbol, which has a high, low and * range. Finally, the arithmetic coder module is called to * output the symbols to the bit stream. */ void compress() { int i; char c; SYMBOL s; FILE *compressed_file; static char *input = "GLIB BATES"; compressed_file=fopen( "software/benchmarks/data/test.cmp", "wb" ); if ( compressed_file == NULL ) error_exit( "Could not open output file" ); puts( "Compressing..." ); initialize_output_bitstream(); initialize_arithmetic_encoder(); for ( i=0 ; ; ) { c = input[ i++ ]; convert_int_to_symbol( c, &s ); encode_symbol( compressed_file, &s ); if ( c == '\0' ) break; } flush_arithmetic_encoder( compressed_file ); flush_output_bitstream( compressed_file ); fclose( compressed_file); }
/** * Compresses the input text and writes the compressed data to a file. * @param[in] filename name and path of the file to compress. * @param[in] compressed name and path of the compressed output file. * @param[in] algorithm the algorithm that will be used to build the suffix tree (Ukkonnen or Kurtz). * @param[in] see if see will be used. */ static void zip(char *filename, char *compressed, BOOL algorithm, int parts, BOOL see) { Uchar *origText, *prevText = NULL; Uint origTextLen, partTextLen, currentTextLen; FILE *compressed_file; int i, part; fsmTree_t stree = NULL, prevTree = NULL; BOOL alloc = False; #ifdef WIN32 HANDLE hndl; origText = (Uchar *) file2String(filename, &origTextLen, &hndl); #else origText = (Uchar *) file2String(filename, &origTextLen); #endif if(origText == NULL) { fprintf(stderr,"Cannot open file %s\n", filename); exit(EXIT_FAILURE); } /*if(textLen > MAXTEXTLEN) { fprintf(stderr,"Sorry, textlen = %lu is larger than maximal textlen = %lu\n", (Showuint) textLen,(Showuint) MAXTEXTLEN); exit(EXIT_FAILURE); }*/ if (!compressed) { CALLOC(compressed, Uchar, strlen(filename) + 5); strcpy(compressed, filename); strcat(compressed, ".ctx"); alloc = True; } compressed_file = fopen(compressed, "wb"); if (!compressed_file) { printf( "Could not open output file"); exit(1); } if (alloc) FREE(compressed); buildAlpha(origText, origTextLen); printf ("Alphasize: %ld\n", alphasize); printf("Algorithm %d\n", algorithm); setMaxCount(); /* write magic number */ putc(MAGIC >> 8, compressed_file); putc(MAGIC, compressed_file); /* write # of parts */ putc(parts, compressed_file); initialize_output_bitstream(); initialize_arithmetic_encoder(); writeAlphabet(compressed_file); currentTextLen = 0; for (part = 1; part <= parts; part++) { printf("---------- part %d ---------------\n", part); if (part != parts) { partTextLen = floor(origTextLen / parts); } else { partTextLen = origTextLen - (floor(origTextLen / parts) * (parts - 1)); } if (part > 1) { prevText = text; prevTree = stree; } textlen = partTextLen; CALLOC(text, Uchar, textlen); reversestring(origText + currentTextLen, textlen, text); if (algorithm == UKKONEN) { suffixTree_t tree = initSuffixTree(); buildSuffixTree(tree); printf("Tree built\n"); pruneSuffixTree(tree); stree = fsmSuffixTree(tree); } else { stree = buildSTree(); printf("Tree built\n"); } /*if (part > 1) { copyStatistics(prevTree, stree, prevText); FREE(prevText); freeFsmTree(prevTree); }*/ DEBUGCODE(printf("gamma hits: %d gamma Misses: %d\n", getHits(), getMisses())); printf("height: %ld\n", getHeight(stree)); /* write textlen */ for (i=3; i>=0; i--) { writeByte(textlen >> (8 * i), compressed_file); } printf ("Textlen: %ld\n", textlen); writeFsmTree(stree, compressed_file); printf("FSM...\n"); makeFsm(stree); DEBUGCODE(printFsmTree(stree)); printf("Encoding...\n"); encode(stree, compressed_file, origText + currentTextLen, partTextLen, see); currentTextLen += partTextLen; } FREE(text); freeFsmTree(stree); flush_arithmetic_encoder(compressed_file); flush_output_bitstream(compressed_file); #ifdef WIN32 freetextspace(origText, hndl); #else freetextspace(origText, origTextLen); #endif fclose(compressed_file); }