1/* 2 * 3 * Copyright (c) 2009, 2010, 2011 4 * Phillip Lougher <phillip@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 29static struct compressor gzip_comp_ops = { 30 ZLIB_COMPRESSION, "gzip" 31}; 32#else 33extern struct compressor gzip_comp_ops; 34#endif 35 36#ifndef LZMA_SUPPORT 37static struct compressor lzma_comp_ops = { 38 LZMA_COMPRESSION, "lzma" 39}; 40#else 41extern struct compressor lzma_comp_ops; 42#endif 43 44#ifndef LZO_SUPPORT 45static struct compressor lzo_comp_ops = { 46 LZO_COMPRESSION, "lzo" 47}; 48#else 49extern struct compressor lzo_comp_ops; 50#endif 51 52#ifndef LZ4_SUPPORT 53static struct compressor lz4_comp_ops = { 54 LZ4_COMPRESSION, "lz4" 55}; 56#else 57extern struct compressor lz4_comp_ops; 58#endif 59 60#ifndef XZ_SUPPORT 61static struct compressor xz_comp_ops = { 62 XZ_COMPRESSION, "xz" 63}; 64#else 65extern struct compressor xz_comp_ops; 66#endif 67 68 69static struct compressor unknown_comp_ops = { 70 0, "unknown" 71}; 72 73 74struct 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 84struct 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 96struct 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 108void 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 121void 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