/*************************************************************************** * Sample Program Using LZSS Library * * File : sample.c * Purpose : Demonstrate usage of LZSS library * Author : Michael Dipperstein * Date : February 21, 2004 * **************************************************************************** * UPDATES * * Revision 1.1 2004/02/22 17:36:30 michael * Initial revision. Mostly code form old lzss.c. * * 11/07/04 Name changed to sample.c * * $Id: sample.c,v 1.5 2007/09/20 04:34:45 michael Exp $ * $Log: sample.c,v $ * Revision 1.5 2007/09/20 04:34:45 michael * Replace getopt with optlist. * Changes required for LGPL v3. * * Revision 1.4 2006/12/26 04:09:09 michael * Updated e-mail address and minor text clean-up. * * Revision 1.3 2004/11/13 22:51:01 michael * Provide distinct names for by file and by name functions and add some * comments to make their usage clearer. * * Revision 1.2 2004/11/11 14:37:26 michael * Open input and output files as binary. * * Revision 1.1 2004/11/08 05:54:18 michael * 1. Split encode and decode routines for smarter linking * 2. Renamed lzsample.c sample.c to match my other samples * 3. Makefile now builds code as libraries for better LGPL compliance. * * **************************************************************************** * * SAMPLE: Sample usage of LZSS Library * Copyright (C) 2004, 2006, 2007 by * Michael Dipperstein (mdipper@alumni.engr.ucsb.edu) * * This file is part of the lzss library. * * The lzss library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * The lzss library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser * General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * ***************************************************************************/ /*************************************************************************** * INCLUDED FILES ***************************************************************************/ #include #include #include #include "lzss.h" #include "optlist.h" /*************************************************************************** * TYPE DEFINITIONS ***************************************************************************/ typedef enum { ENCODE, DECODE } MODES; /*************************************************************************** * CONSTANTS ***************************************************************************/ char *RemovePath(char *fullPath); /*************************************************************************** * GLOBAL VARIABLES ***************************************************************************/ /*************************************************************************** * PROTOTYPES ***************************************************************************/ /*************************************************************************** * FUNCTIONS ***************************************************************************/ /**************************************************************************** * Function : main * Description: This is the main function for this program, it validates * the command line input and, if valid, it will either * encode a file using the LZSS algorithm or decode a * file encoded with the LZSS algorithm. * Parameters : argc - number of parameters * argv - parameter list * Effects : Encodes/Decodes input file * Returned : EXIT_SUCCESS for success, otherwise EXIT_FAILURE. ****************************************************************************/ int main(int argc, char *argv[]) { option_t *optList, *thisOpt; FILE *fpIn, *fpOut; /* pointer to open input & output files */ MODES mode; /* initialize data */ fpIn = NULL; fpOut = NULL; mode = ENCODE; /* parse command line */ optList = GetOptList(argc, argv, "cdi:o:h?"); thisOpt = optList; while (thisOpt != NULL) { switch(thisOpt->option) { case 'c': /* compression mode */ mode = ENCODE; break; case 'd': /* decompression mode */ mode = DECODE; break; case 'i': /* input file name */ if (fpIn != NULL) { fprintf(stderr, "Multiple input files not allowed.\n"); fclose(fpIn); if (fpOut != NULL) { fclose(fpOut); } FreeOptList(optList); exit(EXIT_FAILURE); } /* open input file as binary */ fpIn = fopen(thisOpt->argument, "rb"); if (fpIn == NULL) { perror("Opening input file"); if (fpOut != NULL) { fclose(fpOut); } FreeOptList(optList); exit(EXIT_FAILURE); } break; case 'o': /* output file name */ if (fpOut != NULL) { fprintf(stderr, "Multiple output files not allowed.\n"); fclose(fpOut); if (fpIn != NULL) { fclose(fpIn); } FreeOptList(optList); exit(EXIT_FAILURE); } /* open output file as binary */ fpOut = fopen(thisOpt->argument, "wb"); if (fpOut == NULL) { perror("Opening output file"); if (fpIn != NULL) { fclose(fpIn); } FreeOptList(optList); exit(EXIT_FAILURE); } break; case 'h': case '?': printf("Usage: %s \n\n", RemovePath(argv[0])); printf("options:\n"); printf(" -c : Encode input file to output file.\n"); printf(" -d : Decode input file to output file.\n"); printf(" -i : Name of input file.\n"); printf(" -o : Name of output file.\n"); printf(" -h | ? : Print out command line options.\n\n"); printf("Default: %s -c -i stdin -o stdout\n", RemovePath(argv[0])); FreeOptList(optList); return(EXIT_SUCCESS); } optList = thisOpt->next; free(thisOpt); thisOpt = optList; } /* use stdin/out if no files are provided */ if (fpIn == NULL) { fpIn = stdin; } if (fpOut == NULL) { fpOut = stdout; } /* we have valid parameters encode or decode */ if (mode == ENCODE) { EncodeLZSSByFile(fpIn, fpOut); } else { DecodeLZSSByFile(fpIn, fpOut); } /* remember to close files */ fclose(fpIn); fclose(fpOut); return EXIT_SUCCESS; } /*************************************************************************** * Function : RemovePath * Description: This is function accepts a pointer to the name of a file * along with path information and returns a pointer to the * character that is not part of the path. * Parameters : fullPath - pointer to an array of characters containing * a file name and possible path modifiers. * Effects : None * Returned : Returns a pointer to the first character after any path * information. ***************************************************************************/ char *RemovePath(char *fullPath) { int i; char *start, *tmp; /* start of file name */ const char delim[3] = {'\\', '/', ':'}; /* path deliminators */ start = fullPath; /* find the first character after all file path delimiters */ for (i = 0; i < 3; i++) { tmp = strrchr(start, delim[i]); if (tmp != NULL) { start = tmp + 1; } } return start; }