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