📄 sample.c
字号:
/**************************************************************************** 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.3 2004/11/13 22:51:01 michael Exp $* $Log: sample.c,v $* 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 by Michael Dipperstein (mdipper@cs.ucsb.edu)** This 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 2.1 of the License, or (at your option) any later version.** This 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 library; if not, write to the Free Software* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA****************************************************************************//**************************************************************************** INCLUDED FILES***************************************************************************/#include <stdio.h>#include <stdlib.h>#include <string.h>#include "lzss.h"#include "getopt.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[]){ int opt; FILE *fpIn, *fpOut; /* pointer to open input & output files */ MODES mode; /* initialize data */ fpIn = NULL; fpOut = NULL; mode = ENCODE; /* parse command line */ while ((opt = getopt(argc, argv, "cdtni:o:h?")) != -1) { switch(opt) { 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); } exit(EXIT_FAILURE); } /* open input file as binary */ fpIn = fopen(optarg, "rb"); if (fpIn == NULL) { perror("Opening input file"); if (fpOut != NULL) { fclose(fpOut); } 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); } exit(EXIT_FAILURE); } /* open output file as binary */ fpOut = fopen(optarg, "wb"); if (fpOut == NULL) { perror("Opening output file"); if (fpIn != NULL) { fclose(fpIn); } exit(EXIT_FAILURE); } break; case 'h': case '?': printf("Usage: %s <options>\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 <filename> : Name of input file.\n"); printf(" -o <filename> : 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])); return(EXIT_SUCCESS); } } /* 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;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -