libmspack
mspack.h
Go to the documentation of this file.
00001 /* libmspack -- a library for working with Microsoft compression formats.
00002  * (C) 2003-2013 Stuart Caie <kyzer@4u.net>
00003  *
00004  * libmspack is free software; you can redistribute it and/or modify it under
00005  * the terms of the GNU Lesser General Public License (LGPL) version 2.1
00006  *
00007  * This program is distributed in the hope that it will be useful,
00008  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00009  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00010  * GNU Lesser General Public License for more details.
00011  *
00012  * You should have received a copy of the GNU Lesser General Public License
00013  * along with this program; if not, write to the Free Software
00014  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00015  */
00016 
00158 #ifndef LIB_MSPACK_H
00159 #define LIB_MSPACK_H 1
00160 
00161 #ifdef __cplusplus
00162 extern "C" {
00163 #endif
00164 
00165 #include <sys/types.h>
00166 #include <stdlib.h>
00167 
00191 #define MSPACK_SYS_SELFTEST(result)  do { \
00192   (result) = mspack_sys_selftest_internal(sizeof(off_t)); \
00193 } while (0)
00194 
00196 extern int mspack_sys_selftest_internal(int);
00197 
00229 extern int mspack_version(int entity);
00230 
00232 #define MSPACK_VER_LIBRARY   (0)
00233 
00234 #define MSPACK_VER_SYSTEM    (1)
00235 
00236 #define MSPACK_VER_MSCABD    (2)
00237 
00238 #define MSPACK_VER_MSCABC    (3)
00239 
00240 #define MSPACK_VER_MSCHMD    (4)
00241 
00242 #define MSPACK_VER_MSCHMC    (5)
00243 
00244 #define MSPACK_VER_MSLITD    (6)
00245 
00246 #define MSPACK_VER_MSLITC    (7)
00247 
00248 #define MSPACK_VER_MSHLPD    (8)
00249 
00250 #define MSPACK_VER_MSHLPC    (9)
00251 
00252 #define MSPACK_VER_MSSZDDD   (10)
00253 
00254 #define MSPACK_VER_MSSZDDC   (11)
00255 
00256 #define MSPACK_VER_MSKWAJD   (12)
00257 
00258 #define MSPACK_VER_MSKWAJC   (13)
00259 
00260 #define MSPACK_VER_MSOABD    (14)
00261 
00262 #define MSPACK_VER_MSOABC    (15)
00263 
00264 /* --- file I/O abstraction ------------------------------------------------ */
00265 
00285 struct mspack_system {
00310   struct mspack_file * (*open)(struct mspack_system *self,
00311                                const char *filename,
00312                                int mode);
00313 
00321   void (*close)(struct mspack_file *file);
00322 
00334   int (*read)(struct mspack_file *file,
00335               void *buffer,
00336               int bytes);
00337 
00351   int (*write)(struct mspack_file *file,
00352                void *buffer,
00353                int bytes);
00354 
00378   int (*seek)(struct mspack_file *file,
00379               off_t offset,
00380               int mode);
00381 
00389   off_t (*tell)(struct mspack_file *file);
00390   
00405   void (*message)(struct mspack_file *file,
00406                   const char *format,
00407                   ...);
00408 
00419   void * (*alloc)(struct mspack_system *self,
00420                   size_t bytes);
00421   
00428   void (*free)(void *ptr);
00429 
00442   void (*copy)(void *src,
00443                void *dest,
00444                size_t bytes);
00445 
00452   void *null_ptr;
00453 };
00454 
00456 #define MSPACK_SYS_OPEN_READ   (0)
00457 
00458 #define MSPACK_SYS_OPEN_WRITE  (1)
00459 
00460 #define MSPACK_SYS_OPEN_UPDATE (2)
00461 
00462 #define MSPACK_SYS_OPEN_APPEND (3)
00463 
00465 #define MSPACK_SYS_SEEK_START  (0)
00466 
00467 #define MSPACK_SYS_SEEK_CUR    (1)
00468 
00469 #define MSPACK_SYS_SEEK_END    (2)
00470 
00476 struct mspack_file {
00477   int dummy;
00478 };
00479 
00480 /* --- error codes --------------------------------------------------------- */
00481 
00483 #define MSPACK_ERR_OK          (0)
00484 
00485 #define MSPACK_ERR_ARGS        (1)
00486 
00487 #define MSPACK_ERR_OPEN        (2)
00488 
00489 #define MSPACK_ERR_READ        (3)
00490 
00491 #define MSPACK_ERR_WRITE       (4)
00492 
00493 #define MSPACK_ERR_SEEK        (5)
00494 
00495 #define MSPACK_ERR_NOMEMORY    (6)
00496 
00497 #define MSPACK_ERR_SIGNATURE   (7)
00498 
00499 #define MSPACK_ERR_DATAFORMAT  (8)
00500 
00501 #define MSPACK_ERR_CHECKSUM    (9)
00502 
00503 #define MSPACK_ERR_CRUNCH      (10)
00504 
00505 #define MSPACK_ERR_DECRUNCH    (11)
00506 
00507 /* --- functions available in library -------------------------------------- */
00508 
00513 extern struct mscab_compressor *
00514   mspack_create_cab_compressor(struct mspack_system *sys);
00515 
00520 extern struct mscab_decompressor *
00521   mspack_create_cab_decompressor(struct mspack_system *sys);
00522 
00526 extern void mspack_destroy_cab_compressor(struct mscab_compressor *self);
00527 
00531 extern void mspack_destroy_cab_decompressor(struct mscab_decompressor *self);
00532 
00533 
00538 extern struct mschm_compressor *
00539   mspack_create_chm_compressor(struct mspack_system *sys);
00540 
00545 extern struct mschm_decompressor *
00546   mspack_create_chm_decompressor(struct mspack_system *sys);
00547 
00551 extern void mspack_destroy_chm_compressor(struct mschm_compressor *self);
00552 
00556 extern void mspack_destroy_chm_decompressor(struct mschm_decompressor *self);
00557 
00558 
00563 extern struct mslit_compressor *
00564   mspack_create_lit_compressor(struct mspack_system *sys);
00565 
00570 extern struct mslit_decompressor *
00571   mspack_create_lit_decompressor(struct mspack_system *sys);
00572 
00576 extern void mspack_destroy_lit_compressor(struct mslit_compressor *self);
00577 
00581 extern void mspack_destroy_lit_decompressor(struct mslit_decompressor *self);
00582 
00583 
00588 extern struct mshlp_compressor *
00589   mspack_create_hlp_compressor(struct mspack_system *sys);
00590 
00595 extern struct mshlp_decompressor *
00596   mspack_create_hlp_decompressor(struct mspack_system *sys);
00597 
00601 extern void mspack_destroy_hlp_compressor(struct mshlp_compressor *self);
00602 
00606 extern void mspack_destroy_hlp_decompressor(struct mshlp_decompressor *self);
00607 
00608 
00613 extern struct msszdd_compressor *
00614   mspack_create_szdd_compressor(struct mspack_system *sys);
00615 
00620 extern struct msszdd_decompressor *
00621   mspack_create_szdd_decompressor(struct mspack_system *sys);
00622 
00626 extern void mspack_destroy_szdd_compressor(struct msszdd_compressor *self);
00627 
00631 extern void mspack_destroy_szdd_decompressor(struct msszdd_decompressor *self);
00632 
00633 
00638 extern struct mskwaj_compressor *
00639   mspack_create_kwaj_compressor(struct mspack_system *sys);
00640 
00645 extern struct mskwaj_decompressor *
00646   mspack_create_kwaj_decompressor(struct mspack_system *sys);
00647 
00651 extern void mspack_destroy_kwaj_compressor(struct mskwaj_compressor *self);
00652 
00656 extern void mspack_destroy_kwaj_decompressor(struct mskwaj_decompressor *self);
00657 
00658 
00663 extern struct msoab_compressor *
00664   mspack_create_oab_compressor(struct mspack_system *sys);
00665 
00670 extern struct msoab_decompressor *
00671   mspack_create_oab_decompressor(struct mspack_system *sys);
00672 
00676 extern void mspack_destroy_oab_compressor(struct msoab_compressor *self);
00677 
00681 extern void mspack_destroy_oab_decompressor(struct msoab_decompressor *self);
00682 
00683 
00684 /* --- support for .CAB (MS Cabinet) file format --------------------------- */
00685 
00697 struct mscabd_cabinet {
00703   struct mscabd_cabinet *next;
00704 
00710   const char *filename;
00711   
00713   off_t base_offset;
00714 
00716   unsigned int length;
00717 
00719   struct mscabd_cabinet *prevcab;
00720 
00722   struct mscabd_cabinet *nextcab;
00723 
00725   char *prevname;
00726 
00728   char *nextname;
00729 
00733   char *previnfo;
00734 
00738   char *nextinfo;
00739 
00741   struct mscabd_file *files;
00742 
00744   struct mscabd_folder *folders;
00745 
00750   unsigned short set_id;
00751 
00757   unsigned short set_index;
00758 
00769   unsigned short header_resv;
00770 
00782   int flags;
00783 };
00784 
00786 #define MSCAB_HDR_RESV_OFFSET (0x28)
00787 
00789 #define MSCAB_HDR_PREVCAB (0x01)
00790 
00791 #define MSCAB_HDR_NEXTCAB (0x02)
00792 
00793 #define MSCAB_HDR_RESV    (0x04)
00794 
00804 struct mscabd_folder {
00809   struct mscabd_folder *next;
00810 
00820   int comp_type;
00821 
00827   unsigned int num_blocks;
00828 };
00829 
00837 #define MSCABD_COMP_METHOD(comp_type) ((comp_type) & 0x0F)
00838 
00845 #define MSCABD_COMP_LEVEL(comp_type) (((comp_type) >> 8) & 0x1F)
00846 
00848 #define MSCAB_COMP_NONE       (0)
00849 
00850 #define MSCAB_COMP_MSZIP      (1)
00851 
00852 #define MSCAB_COMP_QUANTUM    (2)
00853 
00854 #define MSCAB_COMP_LZX        (3)
00855 
00861 struct mscabd_file {
00866   struct mscabd_file *next;
00867 
00876   char *filename;
00877 
00879   unsigned int length;
00880 
00893   int attribs;
00894 
00896   char time_h;
00898   char time_m;
00900   char time_s;
00901 
00903   char date_d;
00905   char date_m;
00907   int date_y;
00908 
00910   struct mscabd_folder *folder;
00911 
00913   unsigned int offset;
00914 };
00915 
00917 #define MSCAB_ATTRIB_RDONLY   (0x01)
00918 
00919 #define MSCAB_ATTRIB_HIDDEN   (0x02)
00920 
00921 #define MSCAB_ATTRIB_SYSTEM   (0x04)
00922 
00923 #define MSCAB_ATTRIB_ARCH     (0x20)
00924 
00925 #define MSCAB_ATTRIB_EXEC     (0x40)
00926 
00927 #define MSCAB_ATTRIB_UTF_NAME (0x80)
00928 
00930 #define MSCABD_PARAM_SEARCHBUF (0)
00931 
00932 #define MSCABD_PARAM_FIXMSZIP  (1)
00933 
00934 #define MSCABD_PARAM_DECOMPBUF (2)
00935 
00937 struct mscab_compressor {
00938   int dummy; 
00939 };
00940 
00948 struct mscab_decompressor {
00969   struct mscabd_cabinet * (*open) (struct mscab_decompressor *self,
00970                                    const char *filename);
00971 
01001   void (*close)(struct mscab_decompressor *self,
01002                 struct mscabd_cabinet *cab);
01003 
01038   struct mscabd_cabinet * (*search) (struct mscab_decompressor *self,
01039                                      const char *filename);
01040 
01081   int (*append) (struct mscab_decompressor *self,
01082                  struct mscabd_cabinet *cab,
01083                  struct mscabd_cabinet *nextcab);
01084 
01103   int (*prepend) (struct mscab_decompressor *self,
01104                   struct mscabd_cabinet *cab,
01105                   struct mscabd_cabinet *prevcab);
01106 
01129   int (*extract)(struct mscab_decompressor *self,
01130                  struct mscabd_file *file,
01131                  const char *filename);
01132 
01155   int (*set_param)(struct mscab_decompressor *self,
01156                    int param,
01157                    int value);
01158 
01170   int (*last_error)(struct mscab_decompressor *self);
01171 };
01172 
01173 /* --- support for .CHM (HTMLHelp) file format ----------------------------- */
01174 
01183 struct mschmc_file {
01185   int section;
01186 
01189   const char *filename;
01190 
01193   char *chm_filename;
01194 
01198   off_t length;
01199 };
01200 
01209 struct mschmd_section {
01211   struct mschmd_header *chm;
01212 
01218   unsigned int id;
01219 };
01220 
01226 struct mschmd_sec_uncompressed {
01228   struct mschmd_section base;
01229 
01231   off_t offset;
01232 };
01233 
01239 struct mschmd_sec_mscompressed {
01241   struct mschmd_section base;
01242 
01244   struct mschmd_file *content;
01245 
01247   struct mschmd_file *control;
01248 
01250   struct mschmd_file *rtable;
01251 
01255   struct mschmd_file *spaninfo;
01256 };
01257 
01263 struct mschmd_header {
01265   unsigned int version;
01266 
01274   unsigned int timestamp;
01275       
01280   unsigned int language;
01281 
01286   const char *filename;
01287 
01289   off_t length;
01290 
01292   struct mschmd_file *files;
01293 
01300   struct mschmd_file *sysfiles;
01301 
01303   struct mschmd_sec_uncompressed sec0;
01304 
01306   struct mschmd_sec_mscompressed sec1;
01307 
01309   off_t dir_offset;
01310 
01312   unsigned int num_chunks;
01313 
01315   unsigned int chunk_size;
01316 
01318   unsigned int density;
01319 
01328   unsigned int depth;
01329 
01335   unsigned int index_root;
01336 
01341   unsigned int first_pmgl;
01342 
01347   unsigned int last_pmgl;
01348 
01353   unsigned char **chunk_cache;
01354 };
01355 
01361 struct mschmd_file {
01366   struct mschmd_file *next;
01367 
01372   struct mschmd_section *section;
01373 
01375   off_t offset;
01376 
01378   off_t length;
01379 
01381   char *filename;
01382 };
01383 
01385 #define MSCHMC_ENDLIST   (0)
01386 
01387 #define MSCHMC_UNCOMP    (1)
01388 
01389 #define MSCHMC_MSCOMP    (2)
01390  
01392 #define MSCHMC_PARAM_TIMESTAMP  (0)
01393 
01394 #define MSCHMC_PARAM_LANGUAGE   (1)
01395 
01396 #define MSCHMC_PARAM_LZXWINDOW  (2)
01397 
01398 #define MSCHMC_PARAM_DENSITY    (3)
01399 
01400 #define MSCHMC_PARAM_INDEX      (4)
01401 
01409 struct mschm_compressor {
01441   int (*generate)(struct mschm_compressor *self,
01442                   struct mschmc_file file_list[],
01443                   const char *output_file);
01444 
01498   int (*use_temporary_file)(struct mschm_compressor *self,
01499                             int use_temp_file,
01500                             const char *temp_file);
01546   int (*set_param)(struct mschm_compressor *self,
01547                    int param,
01548                    unsigned int value);
01549 
01558   int (*last_error)(struct mschm_compressor *self);
01559 };
01560 
01568 struct mschm_decompressor {
01589   struct mschmd_header *(*open)(struct mschm_decompressor *self,
01590                                 const char *filename);
01591 
01609   void (*close)(struct mschm_decompressor *self,
01610                 struct mschmd_header *chm);
01611 
01630   int (*extract)(struct mschm_decompressor *self,
01631                  struct mschmd_file *file,
01632                  const char *filename);
01633 
01645   int (*last_error)(struct mschm_decompressor *self);
01646 
01669   struct mschmd_header *(*fast_open)(struct mschm_decompressor *self,
01670                                      const char *filename);
01671 
01710   int (*fast_find)(struct mschm_decompressor *self,
01711                    struct mschmd_header *chm,
01712                    const char *filename,
01713                    struct mschmd_file *f_ptr,
01714                    int f_size);
01715 };
01716 
01717 /* --- support for .LIT (EBook) file format -------------------------------- */
01718 
01720 struct mslit_compressor {
01721   int dummy; 
01722 };
01723 
01725 struct mslit_decompressor {
01726   int dummy; 
01727 };
01728 
01729 
01730 /* --- support for .HLP (MS Help) file format ------------------------------ */
01731 
01733 struct mshlp_compressor {
01734   int dummy; 
01735 };
01736 
01738 struct mshlp_decompressor {
01739   int dummy; 
01740 };
01741 
01742 
01743 /* --- support for SZDD file format ---------------------------------------- */
01744 
01746 #define MSSZDDC_PARAM_MISSINGCHAR (0)
01747 
01749 #define MSSZDD_FMT_NORMAL (0)
01750 
01752 #define MSSZDD_FMT_QBASIC (1)
01753 
01759 struct msszddd_header {
01761   int format;
01762 
01764   off_t length;
01765 
01773   char missing_char;
01774 };
01775 
01783 struct msszdd_compressor {
01819   int (*compress)(struct msszdd_compressor *self,
01820                   const char *input,
01821                   const char *output,
01822                   off_t length);
01823 
01845   int (*set_param)(struct msszdd_compressor *self,
01846                    int param,
01847                    unsigned int value);
01848 
01857   int (*last_error)(struct mschm_decompressor *self);
01858 };
01859 
01867 struct msszdd_decompressor {
01887   struct msszddd_header *(*open)(struct msszdd_decompressor *self,
01888                                  const char *filename);
01889 
01903   void (*close)(struct msszdd_decompressor *self,
01904                 struct msszddd_header *szdd);
01905 
01919   int (*extract)(struct msszdd_decompressor *self,
01920                  struct msszddd_header *szdd,
01921                  const char *filename);
01922 
01940   int (*decompress)(struct msszdd_decompressor *self,
01941                     const char *input,
01942                     const char *output);
01943 
01955   int (*last_error)(struct msszdd_decompressor *self);
01956 };
01957 
01958 /* --- support for KWAJ file format ---------------------------------------- */
01959 
01961 #define MSKWAJC_PARAM_COMP_TYPE  (0)
01962 
01966 #define MSKWAJC_PARAM_INCLUDE_LENGTH (1)
01967 
01969 #define MSKWAJ_COMP_NONE (0)
01970 
01971 #define MSKWAJ_COMP_XOR (1)
01972 
01973 #define MSKWAJ_COMP_SZDD (2)
01974 
01975 #define MSKWAJ_COMP_LZH (3)
01976 
01977 #define MSKWAJ_COMP_MSZIP (4)
01978 
01980 #define MSKWAJ_HDR_HASLENGTH (0x01)
01981 
01983 #define MSKWAJ_HDR_HASUNKNOWN1 (0x02)
01984 
01986 #define MSKWAJ_HDR_HASUNKNOWN2 (0x04)
01987 
01989 #define MSKWAJ_HDR_HASFILENAME (0x08)
01990 
01992 #define MSKWAJ_HDR_HASFILEEXT (0x10)
01993 
01995 #define MSKWAJ_HDR_HASEXTRATEXT (0x20)
01996 
02002 struct mskwajd_header {
02006   unsigned short comp_type;
02007 
02009   off_t data_offset;
02010 
02012   int headers;
02013 
02015   off_t length;
02016 
02018   char *filename;
02019 
02023   char *extra;
02024 
02026   unsigned short extra_length;
02027 };
02028 
02036 struct mskwaj_compressor {
02055   int (*compress)(struct mskwaj_compressor *self,
02056                   const char *input,
02057                   const char *output,
02058                   off_t length);
02059 
02083   int (*set_param)(struct mskwaj_compressor *self,
02084                    int param,
02085                    unsigned int value);
02086 
02087 
02105   int (*set_filename)(struct mskwaj_compressor *self,
02106                       const char *filename);
02107 
02125   int (*set_extra_data)(struct mskwaj_compressor *self,
02126                         void *data,
02127                         size_t bytes);
02128 
02137   int (*last_error)(struct mschm_decompressor *self);
02138 };
02139 
02147 struct mskwaj_decompressor {
02167   struct mskwajd_header *(*open)(struct mskwaj_decompressor *self,
02168                                  const char *filename);
02169 
02182   void (*close)(struct mskwaj_decompressor *self,
02183                 struct mskwajd_header *kwaj);
02184 
02198   int (*extract)(struct mskwaj_decompressor *self,
02199                  struct mskwajd_header *kwaj,
02200                  const char *filename);
02201 
02219   int (*decompress)(struct mskwaj_decompressor *self,
02220                     const char *input,
02221                     const char *output);
02222 
02234   int (*last_error)(struct mskwaj_decompressor *self);
02235 };
02236 
02237 /* --- support for .LZX (Offline Address Book) file format ----------------- */
02238 
02246 struct msoab_compressor {
02261   int (*compress) (struct msoab_compressor *self,
02262                    const char *input,
02263                    const char *output);
02264 
02285   int (*compress_incremental) (struct msoab_compressor *self,
02286                                const char *input,
02287                                const char *base,
02288                                const char *output);
02289 };
02290 
02298 struct msoab_decompressor {
02314   int (*decompress) (struct msoab_decompressor *self,
02315                      const char *input,
02316                      const char *output);
02317 
02343   int (*decompress_incremental) (struct msoab_decompressor *self,
02344                                  const char *input,
02345                                  const char *base,
02346                                  const char *output);
02347 };
02348 
02349 #ifdef __cplusplus
02350 }
02351 #endif
02352 
02353 #endif
 All Data Structures Files Functions Variables Defines