1*79398b25SAndroid Build Coastguard Worker /*
2*79398b25SAndroid Build Coastguard Worker *
3*79398b25SAndroid Build Coastguard Worker * Copyright (c) 2009, 2010, 2011
4*79398b25SAndroid Build Coastguard Worker * Phillip Lougher <[email protected]>
5*79398b25SAndroid Build Coastguard Worker *
6*79398b25SAndroid Build Coastguard Worker * This program is free software; you can redistribute it and/or
7*79398b25SAndroid Build Coastguard Worker * modify it under the terms of the GNU General Public License
8*79398b25SAndroid Build Coastguard Worker * as published by the Free Software Foundation; either version 2,
9*79398b25SAndroid Build Coastguard Worker * or (at your option) any later version.
10*79398b25SAndroid Build Coastguard Worker *
11*79398b25SAndroid Build Coastguard Worker * This program is distributed in the hope that it will be useful,
12*79398b25SAndroid Build Coastguard Worker * but WITHOUT ANY WARRANTY; without even the implied warranty of
13*79398b25SAndroid Build Coastguard Worker * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14*79398b25SAndroid Build Coastguard Worker * GNU General Public License for more details.
15*79398b25SAndroid Build Coastguard Worker *
16*79398b25SAndroid Build Coastguard Worker * You should have received a copy of the GNU General Public License
17*79398b25SAndroid Build Coastguard Worker * along with this program; if not, write to the Free Software
18*79398b25SAndroid Build Coastguard Worker * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19*79398b25SAndroid Build Coastguard Worker *
20*79398b25SAndroid Build Coastguard Worker * compressor.c
21*79398b25SAndroid Build Coastguard Worker */
22*79398b25SAndroid Build Coastguard Worker
23*79398b25SAndroid Build Coastguard Worker #include <stdio.h>
24*79398b25SAndroid Build Coastguard Worker #include <string.h>
25*79398b25SAndroid Build Coastguard Worker #include "compressor.h"
26*79398b25SAndroid Build Coastguard Worker #include "squashfs_fs.h"
27*79398b25SAndroid Build Coastguard Worker
28*79398b25SAndroid Build Coastguard Worker #ifndef GZIP_SUPPORT
29*79398b25SAndroid Build Coastguard Worker static struct compressor gzip_comp_ops = {
30*79398b25SAndroid Build Coastguard Worker ZLIB_COMPRESSION, "gzip"
31*79398b25SAndroid Build Coastguard Worker };
32*79398b25SAndroid Build Coastguard Worker #else
33*79398b25SAndroid Build Coastguard Worker extern struct compressor gzip_comp_ops;
34*79398b25SAndroid Build Coastguard Worker #endif
35*79398b25SAndroid Build Coastguard Worker
36*79398b25SAndroid Build Coastguard Worker #ifndef LZMA_SUPPORT
37*79398b25SAndroid Build Coastguard Worker static struct compressor lzma_comp_ops = {
38*79398b25SAndroid Build Coastguard Worker LZMA_COMPRESSION, "lzma"
39*79398b25SAndroid Build Coastguard Worker };
40*79398b25SAndroid Build Coastguard Worker #else
41*79398b25SAndroid Build Coastguard Worker extern struct compressor lzma_comp_ops;
42*79398b25SAndroid Build Coastguard Worker #endif
43*79398b25SAndroid Build Coastguard Worker
44*79398b25SAndroid Build Coastguard Worker #ifndef LZO_SUPPORT
45*79398b25SAndroid Build Coastguard Worker static struct compressor lzo_comp_ops = {
46*79398b25SAndroid Build Coastguard Worker LZO_COMPRESSION, "lzo"
47*79398b25SAndroid Build Coastguard Worker };
48*79398b25SAndroid Build Coastguard Worker #else
49*79398b25SAndroid Build Coastguard Worker extern struct compressor lzo_comp_ops;
50*79398b25SAndroid Build Coastguard Worker #endif
51*79398b25SAndroid Build Coastguard Worker
52*79398b25SAndroid Build Coastguard Worker #ifndef LZ4_SUPPORT
53*79398b25SAndroid Build Coastguard Worker static struct compressor lz4_comp_ops = {
54*79398b25SAndroid Build Coastguard Worker LZ4_COMPRESSION, "lz4"
55*79398b25SAndroid Build Coastguard Worker };
56*79398b25SAndroid Build Coastguard Worker #else
57*79398b25SAndroid Build Coastguard Worker extern struct compressor lz4_comp_ops;
58*79398b25SAndroid Build Coastguard Worker #endif
59*79398b25SAndroid Build Coastguard Worker
60*79398b25SAndroid Build Coastguard Worker #ifndef XZ_SUPPORT
61*79398b25SAndroid Build Coastguard Worker static struct compressor xz_comp_ops = {
62*79398b25SAndroid Build Coastguard Worker XZ_COMPRESSION, "xz"
63*79398b25SAndroid Build Coastguard Worker };
64*79398b25SAndroid Build Coastguard Worker #else
65*79398b25SAndroid Build Coastguard Worker extern struct compressor xz_comp_ops;
66*79398b25SAndroid Build Coastguard Worker #endif
67*79398b25SAndroid Build Coastguard Worker
68*79398b25SAndroid Build Coastguard Worker #ifndef ZSTD_SUPPORT
69*79398b25SAndroid Build Coastguard Worker static struct compressor zstd_comp_ops = {
70*79398b25SAndroid Build Coastguard Worker ZSTD_COMPRESSION, "zstd"
71*79398b25SAndroid Build Coastguard Worker };
72*79398b25SAndroid Build Coastguard Worker #else
73*79398b25SAndroid Build Coastguard Worker extern struct compressor zstd_comp_ops;
74*79398b25SAndroid Build Coastguard Worker #endif
75*79398b25SAndroid Build Coastguard Worker
76*79398b25SAndroid Build Coastguard Worker static struct compressor unknown_comp_ops = {
77*79398b25SAndroid Build Coastguard Worker 0, "unknown"
78*79398b25SAndroid Build Coastguard Worker };
79*79398b25SAndroid Build Coastguard Worker
80*79398b25SAndroid Build Coastguard Worker
81*79398b25SAndroid Build Coastguard Worker struct compressor *compressor[] = {
82*79398b25SAndroid Build Coastguard Worker &gzip_comp_ops,
83*79398b25SAndroid Build Coastguard Worker &lzma_comp_ops,
84*79398b25SAndroid Build Coastguard Worker &lzo_comp_ops,
85*79398b25SAndroid Build Coastguard Worker &lz4_comp_ops,
86*79398b25SAndroid Build Coastguard Worker &xz_comp_ops,
87*79398b25SAndroid Build Coastguard Worker &zstd_comp_ops,
88*79398b25SAndroid Build Coastguard Worker &unknown_comp_ops
89*79398b25SAndroid Build Coastguard Worker };
90*79398b25SAndroid Build Coastguard Worker
91*79398b25SAndroid Build Coastguard Worker
lookup_compressor(char * name)92*79398b25SAndroid Build Coastguard Worker struct compressor *lookup_compressor(char *name)
93*79398b25SAndroid Build Coastguard Worker {
94*79398b25SAndroid Build Coastguard Worker int i;
95*79398b25SAndroid Build Coastguard Worker
96*79398b25SAndroid Build Coastguard Worker for(i = 0; compressor[i]->id; i++)
97*79398b25SAndroid Build Coastguard Worker if(strcmp(compressor[i]->name, name) == 0)
98*79398b25SAndroid Build Coastguard Worker break;
99*79398b25SAndroid Build Coastguard Worker
100*79398b25SAndroid Build Coastguard Worker return compressor[i];
101*79398b25SAndroid Build Coastguard Worker }
102*79398b25SAndroid Build Coastguard Worker
103*79398b25SAndroid Build Coastguard Worker
lookup_compressor_id(int id)104*79398b25SAndroid Build Coastguard Worker struct compressor *lookup_compressor_id(int id)
105*79398b25SAndroid Build Coastguard Worker {
106*79398b25SAndroid Build Coastguard Worker int i;
107*79398b25SAndroid Build Coastguard Worker
108*79398b25SAndroid Build Coastguard Worker for(i = 0; compressor[i]->id; i++)
109*79398b25SAndroid Build Coastguard Worker if(id == compressor[i]->id)
110*79398b25SAndroid Build Coastguard Worker break;
111*79398b25SAndroid Build Coastguard Worker
112*79398b25SAndroid Build Coastguard Worker return compressor[i];
113*79398b25SAndroid Build Coastguard Worker }
114*79398b25SAndroid Build Coastguard Worker
115*79398b25SAndroid Build Coastguard Worker
display_compressors(char * indent,char * def_comp)116*79398b25SAndroid Build Coastguard Worker void display_compressors(char *indent, char *def_comp)
117*79398b25SAndroid Build Coastguard Worker {
118*79398b25SAndroid Build Coastguard Worker int i;
119*79398b25SAndroid Build Coastguard Worker
120*79398b25SAndroid Build Coastguard Worker for(i = 0; compressor[i]->id; i++)
121*79398b25SAndroid Build Coastguard Worker if(compressor[i]->supported)
122*79398b25SAndroid Build Coastguard Worker fprintf(stderr, "%s\t%s%s\n", indent,
123*79398b25SAndroid Build Coastguard Worker compressor[i]->name,
124*79398b25SAndroid Build Coastguard Worker strcmp(compressor[i]->name, def_comp) == 0 ?
125*79398b25SAndroid Build Coastguard Worker " (default)" : "");
126*79398b25SAndroid Build Coastguard Worker }
127*79398b25SAndroid Build Coastguard Worker
128*79398b25SAndroid Build Coastguard Worker
display_compressor_usage(char * def_comp)129*79398b25SAndroid Build Coastguard Worker void display_compressor_usage(char *def_comp)
130*79398b25SAndroid Build Coastguard Worker {
131*79398b25SAndroid Build Coastguard Worker int i;
132*79398b25SAndroid Build Coastguard Worker
133*79398b25SAndroid Build Coastguard Worker for(i = 0; compressor[i]->id; i++)
134*79398b25SAndroid Build Coastguard Worker if(compressor[i]->supported) {
135*79398b25SAndroid Build Coastguard Worker char *str = strcmp(compressor[i]->name, def_comp) == 0 ?
136*79398b25SAndroid Build Coastguard Worker " (default)" : "";
137*79398b25SAndroid Build Coastguard Worker if(compressor[i]->usage) {
138*79398b25SAndroid Build Coastguard Worker fprintf(stderr, "\t%s%s\n",
139*79398b25SAndroid Build Coastguard Worker compressor[i]->name, str);
140*79398b25SAndroid Build Coastguard Worker compressor[i]->usage();
141*79398b25SAndroid Build Coastguard Worker } else
142*79398b25SAndroid Build Coastguard Worker fprintf(stderr, "\t%s (no options)%s\n",
143*79398b25SAndroid Build Coastguard Worker compressor[i]->name, str);
144*79398b25SAndroid Build Coastguard Worker }
145*79398b25SAndroid Build Coastguard Worker }
146