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