/***************************************************************************
* 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;
}