Advertisement
Tiger0915

LZW

Feb 12th, 2013
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.27 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define DEBUG 1
  6.  
  7. void dict_print(unsigned char **dictionary, int patLength[])
  8. {
  9.     int i, j;
  10.     printf("Dictionary at this point: \n");
  11.     for(i=0;i<1000;i++)
  12.     {
  13.         if(patLength[i]!=0)
  14.         {
  15.             printf("Entry #%d: ", i);
  16.             for(j=0;j<patLength[i];j++)
  17.                 printf("%d ",(int)dictionary[i][j]);
  18.             printf(" - PatLength: %d\n",patLength[i]);
  19.         }
  20.     }
  21.     printf("End Dictionary Print\n");
  22. }
  23.  
  24. int contains(unsigned char *string, unsigned char **dictionary, int *patLength)
  25. {
  26.     int i, j;
  27.     int foundMatch = 0;
  28.     for(i=0;i<1000;i++)
  29.     {
  30.         foundMatch = 1;
  31.         for(j=0;j<strlen((char *)string);j++)
  32.         {
  33.             if(string[j] != dictionary[i][j])
  34.             {  
  35.                 foundMatch = 0;
  36.                 break;
  37.             }
  38.         }
  39.         if(foundMatch) break;
  40.     }
  41.     if(foundMatch) {
  42.         printf("Found match for %s, index in dictionary is %d.\n", string, i);
  43.         return 1;
  44.     }
  45.     printf("Did not find match for %s.\n", string);
  46.     return 0;    
  47. }
  48.  
  49. unsigned char *my_concat(unsigned char *str, unsigned char ch)
  50. {
  51.     size_t sizeOfChar = sizeof(unsigned char);
  52.     size_t sizeOfStr  = sizeof(unsigned char) * strlen((char *)str);
  53.     size_t sizeOfNewStr = sizeof(unsigned char) * (strlen((char *)str) + 2);
  54.    
  55.     unsigned char *newStr = malloc(sizeOfNewStr);
  56.     memset(newStr, 0, sizeOfStr);
  57.     memcpy(newStr, str, sizeOfStr);
  58.     memcpy(newStr + sizeOfStr, &ch, 1);
  59.     memcpy(newStr + sizeOfStr + sizeOfChar, "\0", 1);
  60.  
  61.     return newStr;
  62. }
  63.  
  64. int main(int argc, char *argv[])
  65. {
  66.         FILE *fptInput, *fptOutput;
  67.         int i, j;
  68.  
  69.         unsigned char *dictionary[1000]; // contains patterns
  70.         int patLength[1000]; // contains corresponding length of patterns
  71.  
  72.         unsigned char *string; // most recent pattern
  73.         unsigned char character; // current character being read
  74.  
  75.         unsigned char *newString; // string + character, used to check dictionary
  76.  
  77.         // make sure correct command line arguments
  78.         if(argc != 3)
  79.         {
  80.                 printf("Error, not enough command line arguments.\n");
  81.                 printf("Usage: ./rle [-c or -d] [filename]\n");
  82.  //               exit(0);
  83.         }
  84.  
  85.         // open input file from command line and check for correctness
  86.         if((fptInput=fopen(argv[2], "rb"))==NULL)
  87.         {
  88.                 printf("Error opening file %s \n",argv[2]);
  89. //                exit(0);
  90.         }
  91.  
  92.         // initialize patLength and dictionary
  93.         for(i=0;i<1000;i++)
  94.         {
  95.             dictionary[i] = NULL;
  96.             patLength[i] = 0;
  97.         }
  98.  
  99.         // initialize alphabet of dictionary
  100.         for(i=0;i<256;i++)
  101.         {
  102.             dictionary[i] = (unsigned char *)malloc(sizeof(char));
  103.             dictionary[i][0] = i;
  104.             patLength[i] = 1;
  105.         }
  106.  
  107.         // print initialization
  108.         if(DEBUG) dict_print(dictionary, patLength);
  109.  
  110.         i = contains((unsigned char *)"1", dictionary, patLength);
  111.        
  112.  
  113.  
  114.         // if we are in compress mode
  115.         if(!strcmp(argv[1],"-c"))
  116.         {
  117.             string = NULL;
  118.             while((i=fread(&character,1,1,fptInput))==1)
  119.             {
  120.                 printf("Character read in from file: %c\n",character);
  121.                 newString = my_concat(string, character);
  122.                 if(contains(newString, dictionary, patLength))
  123.                 {
  124.                     printf("Found match for %s\n", newString);
  125.                     string = newString;
  126.                 }
  127.                 else {
  128.                     printf("We need to encode %s to output and add %s to dictionary\n",
  129.                         string, newString);
  130.                 }
  131.             }
  132.         }
  133.         // if we are in decompress mode
  134.         else if(!strcmp(argv[1],"-d"))
  135.         {
  136.        
  137.         }
  138.         // if we aren't in compress or decompress mode, we got an incorrect input flag
  139.         else
  140.         {
  141.                 printf("Error. Incorrect input flags, must be -c or -d.\n");
  142.                 printf("Usage: ./rle [-c or -d] [filename]\n");
  143.         }
  144.  
  145.         // close files
  146.         fclose(fptInput);
  147.         fclose(fptOutput);
  148.  
  149.         // free all the memory
  150.         for(i=0;i<1000;i++)
  151.         {
  152.             if(dictionary[i]!=NULL) free(dictionary[i]);
  153.         }
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement