/*************************************************************************** * Sample Program Using Arithmetic Encoding Library * * File : sample.c * Purpose : Demonstrate usage of arithmetic encoding library * Author : Michael Dipperstein * Date : March 10, 2004 * **************************************************************************** * UPDATES * * $Id: sample.c,v 1.3 2007/09/08 15:48:14 michael Exp $ * $Log: sample.c,v $ * Revision 1.3 2007/09/08 15:48:14 michael * Replace getopt with optlist. * Changes required for LGPL v3. * * Revision 1.2 2004/08/13 13:08:43 michael * Add support for adaptive encoding * * Use executable name in help messages * * Revision 1.1.1.1 2004/04/04 14:54:13 michael * Initial version * * **************************************************************************** * * SAMPLE: Sample usage of the arcode Arithmetic Encoding Library * Copyright (C) 2004, 2007 by Michael Dipperstein (mdipper@cs.ucsb.edu) * * This file is part of the arcode library. * * The arcode 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 arcode 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 "optlist.h" #include "arcode.h" /*************************************************************************** * PROTOTYPES ***************************************************************************/ char *RemovePath(char *fullPath); /*************************************************************************** * FUNCTIONS ***************************************************************************/ /**************************************************************************** * Function : main * Description: This is the main function for this program, it validates * the command line input and, if valid, it will call * functions to encode or decode a file using the arithmetic * coding 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; char *inFile, *outFile; /* name of input & output files */ char encode; /* encode/decode */ char staticModel; /* static/adaptive model*/ /* initialize data */ inFile = NULL; outFile = NULL; encode = TRUE; staticModel = TRUE; /* parse command line */ optList = GetOptList(argc, argv, "acdi:o:h?"); thisOpt = optList; while (thisOpt != NULL) { switch(thisOpt->option) { case 'a': /* adaptive model vs. static */ staticModel = FALSE; break; case 'c': /* compression mode */ encode = TRUE; break; case 'd': /* decompression mode */ encode = FALSE; break; case 'i': /* input file name */ if (inFile != NULL) { fprintf(stderr, "Multiple input files not allowed.\n"); free(inFile); if (outFile != NULL) { free(outFile); } FreeOptList(optList); exit(EXIT_FAILURE); } else if ((inFile = (char *)malloc(strlen(thisOpt->argument) + 1)) == NULL) { perror("Memory allocation"); if (outFile != NULL) { free(outFile); } FreeOptList(optList); exit(EXIT_FAILURE); } strcpy(inFile, thisOpt->argument); break; case 'o': /* output file name */ if (outFile != NULL) { fprintf(stderr, "Multiple output files not allowed.\n"); free(outFile); if (inFile != NULL) { free(inFile); } FreeOptList(optList); exit(EXIT_FAILURE); } else if ((outFile = (char *)malloc(strlen(thisOpt->argument) + 1)) == NULL) { perror("Memory allocation"); if (inFile != NULL) { free(inFile); } FreeOptList(optList); exit(EXIT_FAILURE); } strcpy(outFile, thisOpt->argument); 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(" -a : Use adaptive model instead of static.\n"); printf(" -h | ? : Print out command line options.\n\n"); printf("Default: %s -c\n", RemovePath(argv[0])); FreeOptList(optList); return(EXIT_SUCCESS); } optList = thisOpt->next; free(thisOpt); thisOpt = optList; } /* validate command line */ if (inFile == NULL) { fprintf(stderr, "Input file must be provided\n"); fprintf(stderr, "Enter \"%s -?\" for help.\n", RemovePath(argv[0])); if (outFile != NULL) { free(outFile); } exit (EXIT_FAILURE); } else if (outFile == NULL) { fprintf(stderr, "Output file must be provided\n"); fprintf(stderr, "Enter \"%s -?\" for help.\n", RemovePath(argv[0])); if (inFile != NULL) { free(inFile); } exit (EXIT_FAILURE); } /* we have valid parameters encode or decode */ if (encode) { ArEncodeFile(inFile, outFile, staticModel); } else { ArDecodeFile(inFile, outFile, staticModel); } free(inFile); free(outFile); 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; }