1 /*************************************************************************************************
2  * A command line utility of LZMA
3  *************************************************************************************************/
4 
5 
6 #include <lzmalib.h>
7 #include <stdlib.h>
8 #include <string.h>
9 #include <stdio.h>
10 
11 #undef TRUE
12 #define TRUE           1
13 #undef FALSE
14 #define FALSE          0
15 
16 
17 /* global variables */
18 const char *progname;                    /* program name */
19 
20 
21 /* function prototypes */
22 int main(int argc, char **argv);
23 void usage(void);
24 char *readfile(const char *file, int *sp);
25 
26 
27 /* main routine */
main(int argc,char ** argv)28 int main(int argc, char **argv){
29   int i, bsiz, rsiz, dec;
30   char *file, *buf, *res;
31   progname = argv[0];
32   dec = FALSE;
33   file = NULL;
34   for(i = 1; i < argc; i++){
35     if(!file && argv[i][0] == '-'){
36       if(!strcmp(argv[i], "-d")){
37         dec = TRUE;
38       } else {
39         usage();
40       }
41     } else if(!file){
42       file = argv[i];
43     } else {
44       usage();
45     }
46   }
47   buf = NULL;
48   if(!(buf = readfile(file, &bsiz))){
49     fprintf(stderr, "%s: %s: cannot open\n", progname, file ? file : "(stdin)");
50     return 1;
51   }
52   if(dec){
53     if(!(res = lzma_decompress(buf, bsiz, &rsiz))){
54       fprintf(stderr, "%s: decompression failed\n", progname);
55       free(buf);
56       return 1;
57     }
58     for(i = 0; i < rsiz; i++){
59       putchar(res[i]);
60     }
61     lzma_free(res);
62   } else {
63     if(!(res = lzma_compress(buf, bsiz, &rsiz))){
64       fprintf(stderr, "%s: compression failed\n", progname);
65       free(buf);
66       return 1;
67     }
68     for(i = 0; i < rsiz; i++){
69       putchar(res[i]);
70     }
71     lzma_free(res);
72   }
73   free(buf);
74   return 0;
75 }
76 
77 
78 /* print the usage and exit */
usage(void)79 void usage(void){
80   fprintf(stderr, "%s: LZMA encoder and decoder\n", progname);
81   fprintf(stderr, "\n");
82   fprintf(stderr, "usage:\n");
83   fprintf(stderr, "  %s [-d] [file]\n", progname);
84   fprintf(stderr, "\n");
85   exit(1);
86 }
87 
88 
89 /* read the standard input */
readfile(const char * file,int * sp)90 char *readfile(const char *file, int *sp){
91   FILE *ifp;
92   char *buf;
93   int i, blen, c;
94   if(file){
95     if(!(ifp = fopen(file, "rb"))) return NULL;
96   } else {
97     ifp = stdin;
98   }
99   blen = 256;
100   if(!(buf = malloc(blen))){
101     if(ifp != stdin) fclose(ifp);
102     return NULL;
103   }
104   for(i = 0; (c = fgetc(ifp)) != EOF; i++){
105     if(i >= blen - 1 && !(buf = realloc(buf, blen *= 2))){
106       if(ifp != stdin) fclose(ifp);
107       return NULL;
108     }
109     buf[i] = c;
110   }
111   buf[i] = '\0';
112   if(sp) *sp = i;
113   if(ifp != stdin) fclose(ifp);
114   return buf;
115 }
116 
117 
118 
119 /* END OF FILE */
120