// compression void compress(FILE *inputFile, FILE *outputFile) { int prefix = getc(inputFile); if (prefix == EOF) { return; } int character; int nextCode; int index; // LZW starts out with a dictionary of 256 characters (in the case of 8 codeLength) and uses those as the "standard" // character set. nextCode = 256; // next code is the next available string code dictionaryInit(); // while (there is still data to be read) while ((character = getc(inputFile)) != (unsigned)EOF) { // ch = read a character; // if (dictionary contains prefix+character) if ((index = dictionaryLookup(prefix, character)) != -1) prefix = index; // prefix = prefix+character else { // ...no, try to add it // encode s to output file writeBinary(outputFile, prefix); // add prefix+character to dictionary if (nextCode < dictionarySize) dictionaryAdd(prefix, character, nextCode++); // prefix = character prefix = character; //... output the last string after adding the new one } } // encode s to output file writeBinary(outputFile, prefix); // output the last code if (leftover > 0) fputc(leftoverBits << 4, outputFile); // free the dictionary here dictionaryDestroy(); }
static Something bridgeDictionaryGet(Thread *thread){ return dictionaryLookup(stackGetThis(thread)->value, stackGetVariable(0, thread).object); }