Home | History | Annotate | Download | only in squashfs-tools
      1 #ifndef COMPRESSOR_H
      2 #define COMPRESSOR_H
      3 /*
      4  *
      5  * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014
      6  * Phillip Lougher <phillip (at) squashfs.org.uk>
      7  *
      8  * This program is free software; you can redistribute it and/or
      9  * modify it under the terms of the GNU General Public License
     10  * as published by the Free Software Foundation; either version 2,
     11  * or (at your option) any later version.
     12  *
     13  * This program is distributed in the hope that it will be useful,
     14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16  * GNU General Public License for more details.
     17  *
     18  * You should have received a copy of the GNU General Public License
     19  * along with this program; if not, write to the Free Software
     20  * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
     21  *
     22  * compressor.h
     23  */
     24 
     25 struct compressor {
     26 	int id;
     27 	char *name;
     28 	int supported;
     29 	int (*init)(void **, int, int);
     30 	int (*compress)(void *, void *, void *, int, int, int *);
     31 	int (*uncompress)(void *, void *, int, int, int *);
     32 	int (*options)(char **, int);
     33 	int (*options_post)(int);
     34 	void *(*dump_options)(int, int *);
     35 	int (*extract_options)(int, void *, int);
     36 	int (*check_options)(int, void *, int);
     37 	void (*display_options)(void *, int);
     38 	void (*usage)();
     39 };
     40 
     41 extern struct compressor *lookup_compressor(char *);
     42 extern struct compressor *lookup_compressor_id(int);
     43 extern void display_compressors(char *, char *);
     44 extern void display_compressor_usage(char *);
     45 
     46 static inline int compressor_init(struct compressor *comp, void **stream,
     47 	int block_size, int datablock)
     48 {
     49 	if(comp->init == NULL)
     50 		return 0;
     51 	return comp->init(stream, block_size, datablock);
     52 }
     53 
     54 
     55 static inline int compressor_compress(struct compressor *comp, void *strm,
     56 	void *dest, void *src, int size, int block_size, int *error)
     57 {
     58 	return comp->compress(strm, dest, src, size, block_size, error);
     59 }
     60 
     61 
     62 static inline int compressor_uncompress(struct compressor *comp, void *dest,
     63 	void *src, int size, int block_size, int *error)
     64 {
     65 	return comp->uncompress(dest, src, size, block_size, error);
     66 }
     67 
     68 
     69 /*
     70  * For the following functions please see the lzo, lz4 or xz
     71  * compressors for commented examples of how they are used.
     72  */
     73 static inline int compressor_options(struct compressor *comp, char *argv[],
     74 	int argc)
     75 {
     76 	if(comp->options == NULL)
     77 		return -1;
     78 
     79 	return comp->options(argv, argc);
     80 }
     81 
     82 
     83 static inline int compressor_options_post(struct compressor *comp, int block_size)
     84 {
     85 	if(comp->options_post == NULL)
     86 		return 0;
     87 	return comp->options_post(block_size);
     88 }
     89 
     90 
     91 static inline void *compressor_dump_options(struct compressor *comp,
     92 	int block_size, int *size)
     93 {
     94 	if(comp->dump_options == NULL)
     95 		return NULL;
     96 	return comp->dump_options(block_size, size);
     97 }
     98 
     99 
    100 static inline int compressor_extract_options(struct compressor *comp,
    101 	int block_size, void *buffer, int size)
    102 {
    103 	if(comp->extract_options == NULL)
    104 		return size ? -1 : 0;
    105 	return comp->extract_options(block_size, buffer, size);
    106 }
    107 
    108 
    109 static inline int compressor_check_options(struct compressor *comp,
    110 	int block_size, void *buffer, int size)
    111 {
    112 	if(comp->check_options == NULL)
    113 		return 0;
    114 	return comp->check_options(block_size, buffer, size);
    115 }
    116 
    117 
    118 static inline void compressor_display_options(struct compressor *comp,
    119 	void *buffer, int size)
    120 {
    121 	if(comp->display_options != NULL)
    122 		comp->display_options(buffer, size);
    123 }
    124 #endif
    125