00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00153 #ifndef LIB_MSPACK_H
00154 #define LIB_MSPACK_H 1
00155
00156 #ifdef __cplusplus
00157 extern "C" {
00158 #endif
00159
00160 #include <sys/types.h>
00161 #include <stdlib.h>
00162
00186 #define MSPACK_SYS_SELFTEST(result) do { \
00187 (result) = mspack_sys_selftest_internal(sizeof(off_t)); \
00188 } while (0)
00189
00191 extern int mspack_sys_selftest_internal(int);
00192
00222 extern int mspack_version(int entity);
00223
00225 #define MSPACK_VER_LIBRARY (0)
00226
00227 #define MSPACK_VER_SYSTEM (1)
00228
00229 #define MSPACK_VER_MSCABD (2)
00230
00231 #define MSPACK_VER_MSCABC (3)
00232
00233 #define MSPACK_VER_MSCHMD (4)
00234
00235 #define MSPACK_VER_MSCHMC (5)
00236
00237 #define MSPACK_VER_MSLITD (6)
00238
00239 #define MSPACK_VER_MSLITC (7)
00240
00241 #define MSPACK_VER_MSHLPD (8)
00242
00243 #define MSPACK_VER_MSHLPC (9)
00244
00245 #define MSPACK_VER_MSSZDDD (10)
00246
00247 #define MSPACK_VER_MSSZDDC (11)
00248
00249 #define MSPACK_VER_MSKWAJD (12)
00250
00251 #define MSPACK_VER_MSKWAJC (13)
00252
00253
00254
00274 struct mspack_system {
00299 struct mspack_file * (*open)(struct mspack_system *self,
00300 const char *filename,
00301 int mode);
00302
00310 void (*close)(struct mspack_file *file);
00311
00323 int (*read)(struct mspack_file *file,
00324 void *buffer,
00325 int bytes);
00326
00340 int (*write)(struct mspack_file *file,
00341 void *buffer,
00342 int bytes);
00343
00367 int (*seek)(struct mspack_file *file,
00368 off_t offset,
00369 int mode);
00370
00378 off_t (*tell)(struct mspack_file *file);
00379
00394 void (*message)(struct mspack_file *file,
00395 const char *format,
00396 ...);
00397
00408 void * (*alloc)(struct mspack_system *self,
00409 size_t bytes);
00410
00417 void (*free)(void *ptr);
00418
00431 void (*copy)(void *src,
00432 void *dest,
00433 size_t bytes);
00434
00441 void *null_ptr;
00442 };
00443
00445 #define MSPACK_SYS_OPEN_READ (0)
00446
00447 #define MSPACK_SYS_OPEN_WRITE (1)
00448
00449 #define MSPACK_SYS_OPEN_UPDATE (2)
00450
00451 #define MSPACK_SYS_OPEN_APPEND (3)
00452
00454 #define MSPACK_SYS_SEEK_START (0)
00455
00456 #define MSPACK_SYS_SEEK_CUR (1)
00457
00458 #define MSPACK_SYS_SEEK_END (2)
00459
00465 struct mspack_file {
00466 int dummy;
00467 };
00468
00469
00470
00472 #define MSPACK_ERR_OK (0)
00473
00474 #define MSPACK_ERR_ARGS (1)
00475
00476 #define MSPACK_ERR_OPEN (2)
00477
00478 #define MSPACK_ERR_READ (3)
00479
00480 #define MSPACK_ERR_WRITE (4)
00481
00482 #define MSPACK_ERR_SEEK (5)
00483
00484 #define MSPACK_ERR_NOMEMORY (6)
00485
00486 #define MSPACK_ERR_SIGNATURE (7)
00487
00488 #define MSPACK_ERR_DATAFORMAT (8)
00489
00490 #define MSPACK_ERR_CHECKSUM (9)
00491
00492 #define MSPACK_ERR_CRUNCH (10)
00493
00494 #define MSPACK_ERR_DECRUNCH (11)
00495
00496
00497
00502 extern struct mscab_compressor *
00503 mspack_create_cab_compressor(struct mspack_system *sys);
00504
00509 extern struct mscab_decompressor *
00510 mspack_create_cab_decompressor(struct mspack_system *sys);
00511
00515 extern void mspack_destroy_cab_compressor(struct mscab_compressor *self);
00516
00520 extern void mspack_destroy_cab_decompressor(struct mscab_decompressor *self);
00521
00522
00527 extern struct mschm_compressor *
00528 mspack_create_chm_compressor(struct mspack_system *sys);
00529
00534 extern struct mschm_decompressor *
00535 mspack_create_chm_decompressor(struct mspack_system *sys);
00536
00540 extern void mspack_destroy_chm_compressor(struct mschm_compressor *self);
00541
00545 extern void mspack_destroy_chm_decompressor(struct mschm_decompressor *self);
00546
00547
00552 extern struct mslit_compressor *
00553 mspack_create_lit_compressor(struct mspack_system *sys);
00554
00559 extern struct mslit_decompressor *
00560 mspack_create_lit_decompressor(struct mspack_system *sys);
00561
00565 extern void mspack_destroy_lit_compressor(struct mslit_compressor *self);
00566
00570 extern void mspack_destroy_lit_decompressor(struct mslit_decompressor *self);
00571
00572
00577 extern struct mshlp_compressor *
00578 mspack_create_hlp_compressor(struct mspack_system *sys);
00579
00584 extern struct mshlp_decompressor *
00585 mspack_create_hlp_decompressor(struct mspack_system *sys);
00586
00590 extern void mspack_destroy_hlp_compressor(struct mshlp_compressor *self);
00591
00595 extern void mspack_destroy_hlp_decompressor(struct mshlp_decompressor *self);
00596
00597
00602 extern struct msszdd_compressor *
00603 mspack_create_szdd_compressor(struct mspack_system *sys);
00604
00609 extern struct msszdd_decompressor *
00610 mspack_create_szdd_decompressor(struct mspack_system *sys);
00611
00615 extern void mspack_destroy_szdd_compressor(struct msszdd_compressor *self);
00616
00620 extern void mspack_destroy_szdd_decompressor(struct msszdd_decompressor *self);
00621
00622
00627 extern struct mskwaj_compressor *
00628 mspack_create_kwaj_compressor(struct mspack_system *sys);
00629
00634 extern struct mskwaj_decompressor *
00635 mspack_create_kwaj_decompressor(struct mspack_system *sys);
00636
00640 extern void mspack_destroy_kwaj_compressor(struct mskwaj_compressor *self);
00641
00645 extern void mspack_destroy_kwaj_decompressor(struct mskwaj_decompressor *self);
00646
00647
00648
00649
00661 struct mscabd_cabinet {
00667 struct mscabd_cabinet *next;
00668
00674 const char *filename;
00675
00677 off_t base_offset;
00678
00680 unsigned int length;
00681
00683 struct mscabd_cabinet *prevcab;
00684
00686 struct mscabd_cabinet *nextcab;
00687
00689 char *prevname;
00690
00692 char *nextname;
00693
00697 char *previnfo;
00698
00702 char *nextinfo;
00703
00705 struct mscabd_file *files;
00706
00708 struct mscabd_folder *folders;
00709
00714 unsigned short set_id;
00715
00721 unsigned short set_index;
00722
00733 unsigned short header_resv;
00734
00746 int flags;
00747 };
00748
00750 #define MSCAB_HDR_RESV_OFFSET (0x28)
00751
00753 #define MSCAB_HDR_PREVCAB (0x01)
00754
00755 #define MSCAB_HDR_NEXTCAB (0x02)
00756
00757 #define MSCAB_HDR_RESV (0x04)
00758
00768 struct mscabd_folder {
00773 struct mscabd_folder *next;
00774
00784 int comp_type;
00785
00791 unsigned int num_blocks;
00792 };
00793
00801 #define MSCABD_COMP_METHOD(comp_type) ((comp_type) & 0x0F)
00802
00809 #define MSCABD_COMP_LEVEL(comp_type) (((comp_type) >> 8) & 0x1F)
00810
00812 #define MSCAB_COMP_NONE (0)
00813
00814 #define MSCAB_COMP_MSZIP (1)
00815
00816 #define MSCAB_COMP_QUANTUM (2)
00817
00818 #define MSCAB_COMP_LZX (3)
00819
00825 struct mscabd_file {
00830 struct mscabd_file *next;
00831
00840 char *filename;
00841
00843 unsigned int length;
00844
00857 int attribs;
00858
00860 char time_h;
00862 char time_m;
00864 char time_s;
00865
00867 char date_d;
00869 char date_m;
00871 int date_y;
00872
00874 struct mscabd_folder *folder;
00875
00877 unsigned int offset;
00878 };
00879
00881 #define MSCAB_ATTRIB_RDONLY (0x01)
00882
00883 #define MSCAB_ATTRIB_HIDDEN (0x02)
00884
00885 #define MSCAB_ATTRIB_SYSTEM (0x04)
00886
00887 #define MSCAB_ATTRIB_ARCH (0x20)
00888
00889 #define MSCAB_ATTRIB_EXEC (0x40)
00890
00891 #define MSCAB_ATTRIB_UTF_NAME (0x80)
00892
00894 #define MSCABD_PARAM_SEARCHBUF (0)
00895
00896 #define MSCABD_PARAM_FIXMSZIP (1)
00897
00898 #define MSCABD_PARAM_DECOMPBUF (2)
00899
00901 struct mscab_compressor {
00902 int dummy;
00903 };
00904
00912 struct mscab_decompressor {
00933 struct mscabd_cabinet * (*open) (struct mscab_decompressor *self,
00934 const char *filename);
00935
00965 void (*close)(struct mscab_decompressor *self,
00966 struct mscabd_cabinet *cab);
00967
01002 struct mscabd_cabinet * (*search) (struct mscab_decompressor *self,
01003 const char *filename);
01004
01045 int (*append) (struct mscab_decompressor *self,
01046 struct mscabd_cabinet *cab,
01047 struct mscabd_cabinet *nextcab);
01048
01067 int (*prepend) (struct mscab_decompressor *self,
01068 struct mscabd_cabinet *cab,
01069 struct mscabd_cabinet *prevcab);
01070
01093 int (*extract)(struct mscab_decompressor *self,
01094 struct mscabd_file *file,
01095 const char *filename);
01096
01119 int (*set_param)(struct mscab_decompressor *self,
01120 int param,
01121 int value);
01122
01134 int (*last_error)(struct mscab_decompressor *self);
01135 };
01136
01137
01138
01147 struct mschmc_file {
01149 int section;
01150
01153 const char *filename;
01154
01157 char *chm_filename;
01158
01162 off_t length;
01163 };
01164
01173 struct mschmd_section {
01175 struct mschmd_header *chm;
01176
01182 unsigned int id;
01183 };
01184
01190 struct mschmd_sec_uncompressed {
01192 struct mschmd_section base;
01193
01195 off_t offset;
01196 };
01197
01203 struct mschmd_sec_mscompressed {
01205 struct mschmd_section base;
01206
01208 struct mschmd_file *content;
01209
01211 struct mschmd_file *control;
01212
01214 struct mschmd_file *rtable;
01215
01219 struct mschmd_file *spaninfo;
01220 };
01221
01227 struct mschmd_header {
01229 unsigned int version;
01230
01238 unsigned int timestamp;
01239
01244 unsigned int language;
01245
01250 const char *filename;
01251
01253 off_t length;
01254
01256 struct mschmd_file *files;
01257
01264 struct mschmd_file *sysfiles;
01265
01267 struct mschmd_sec_uncompressed sec0;
01268
01270 struct mschmd_sec_mscompressed sec1;
01271
01273 off_t dir_offset;
01274
01276 unsigned int num_chunks;
01277
01279 unsigned int chunk_size;
01280
01282 unsigned int density;
01283
01292 unsigned int depth;
01293
01299 unsigned int index_root;
01300
01305 unsigned int first_pmgl;
01306
01311 unsigned int last_pmgl;
01312
01317 unsigned char **chunk_cache;
01318 };
01319
01325 struct mschmd_file {
01330 struct mschmd_file *next;
01331
01336 struct mschmd_section *section;
01337
01339 off_t offset;
01340
01342 off_t length;
01343
01345 char *filename;
01346 };
01347
01349 #define MSCHMC_ENDLIST (0)
01350
01351 #define MSCHMC_UNCOMP (1)
01352
01353 #define MSCHMC_MSCOMP (2)
01354
01356 #define MSCHMC_PARAM_TIMESTAMP (0)
01357
01358 #define MSCHMC_PARAM_LANGUAGE (1)
01359
01360 #define MSCHMC_PARAM_LZXWINDOW (2)
01361
01362 #define MSCHMC_PARAM_DENSITY (3)
01363
01364 #define MSCHMC_PARAM_INDEX (4)
01365
01373 struct mschm_compressor {
01405 int (*generate)(struct mschm_compressor *self,
01406 struct mschmc_file file_list[],
01407 const char *output_file);
01408
01462 int (*use_temporary_file)(struct mschm_compressor *self,
01463 int use_temp_file,
01464 const char *temp_file);
01510 int (*set_param)(struct mschm_compressor *self,
01511 int param,
01512 unsigned int value);
01513
01522 int (*last_error)(struct mschm_compressor *self);
01523 };
01524
01532 struct mschm_decompressor {
01553 struct mschmd_header *(*open)(struct mschm_decompressor *self,
01554 const char *filename);
01555
01573 void (*close)(struct mschm_decompressor *self,
01574 struct mschmd_header *chm);
01575
01594 int (*extract)(struct mschm_decompressor *self,
01595 struct mschmd_file *file,
01596 const char *filename);
01597
01609 int (*last_error)(struct mschm_decompressor *self);
01610
01633 struct mschmd_header *(*fast_open)(struct mschm_decompressor *self,
01634 const char *filename);
01635
01674 int (*fast_find)(struct mschm_decompressor *self,
01675 struct mschmd_header *chm,
01676 const char *filename,
01677 struct mschmd_file *f_ptr,
01678 int f_size);
01679 };
01680
01681
01682
01684 struct mslit_compressor {
01685 int dummy;
01686 };
01687
01689 struct mslit_decompressor {
01690 int dummy;
01691 };
01692
01693
01694
01695
01697 struct mshlp_compressor {
01698 int dummy;
01699 };
01700
01702 struct mshlp_decompressor {
01703 int dummy;
01704 };
01705
01706
01707
01708
01710 #define MSSZDDC_PARAM_MISSINGCHAR (0)
01711
01713 #define MSSZDD_FMT_NORMAL (0)
01714
01716 #define MSSZDD_FMT_QBASIC (1)
01717
01723 struct msszddd_header {
01725 int format;
01726
01728 off_t length;
01729
01737 char missing_char;
01738 };
01739
01747 struct msszdd_compressor {
01783 int (*compress)(struct msszdd_compressor *self,
01784 const char *input,
01785 const char *output,
01786 off_t length);
01787
01809 int (*set_param)(struct msszdd_compressor *self,
01810 int param,
01811 unsigned int value);
01812
01821 int (*last_error)(struct mschm_decompressor *self);
01822 };
01823
01831 struct msszdd_decompressor {
01851 struct msszddd_header *(*open)(struct msszdd_decompressor *self,
01852 const char *filename);
01853
01867 void (*close)(struct msszdd_decompressor *self,
01868 struct msszddd_header *szdd);
01869
01883 int (*extract)(struct msszdd_decompressor *self,
01884 struct msszddd_header *szdd,
01885 const char *filename);
01886
01904 int (*decompress)(struct msszdd_decompressor *self,
01905 const char *input,
01906 const char *output);
01907
01919 int (*last_error)(struct msszdd_decompressor *self);
01920 };
01921
01922
01923
01925 #define MSKWAJC_PARAM_COMP_TYPE (0)
01926
01930 #define MSKWAJC_PARAM_INCLUDE_LENGTH (1)
01931
01933 #define MSKWAJ_COMP_NONE (0)
01934
01935 #define MSKWAJ_COMP_XOR (1)
01936
01937 #define MSKWAJ_COMP_SZDD (2)
01938
01939 #define MSKWAJ_COMP_LZH (3)
01940
01942 #define MSKWAJ_HDR_HASLENGTH (0x01)
01943
01945 #define MSKWAJ_HDR_HASUNKNOWN1 (0x02)
01946
01948 #define MSKWAJ_HDR_HASUNKNOWN2 (0x04)
01949
01951 #define MSKWAJ_HDR_HASFILENAME (0x08)
01952
01954 #define MSKWAJ_HDR_HASFILEEXT (0x10)
01955
01957 #define MSKWAJ_HDR_HASEXTRATEXT (0x20)
01958
01964 struct mskwajd_header {
01968 unsigned short comp_type;
01969
01971 off_t data_offset;
01972
01974 int headers;
01975
01977 off_t length;
01978
01980 char *filename;
01981
01985 char *extra;
01986
01988 unsigned short extra_length;
01989 };
01990
01998 struct mskwaj_compressor {
02017 int (*compress)(struct mskwaj_compressor *self,
02018 const char *input,
02019 const char *output,
02020 off_t length);
02021
02045 int (*set_param)(struct mskwaj_compressor *self,
02046 int param,
02047 unsigned int value);
02048
02049
02067 int (*set_filename)(struct mskwaj_compressor *self,
02068 const char *filename);
02069
02087 int (*set_extra_data)(struct mskwaj_compressor *self,
02088 void *data,
02089 size_t bytes);
02090
02099 int (*last_error)(struct mschm_decompressor *self);
02100 };
02101
02109 struct mskwaj_decompressor {
02129 struct mskwajd_header *(*open)(struct mskwaj_decompressor *self,
02130 const char *filename);
02131
02144 void (*close)(struct mskwaj_decompressor *self,
02145 struct mskwajd_header *kwaj);
02146
02160 int (*extract)(struct mskwaj_decompressor *self,
02161 struct mskwajd_header *kwaj,
02162 const char *filename);
02163
02181 int (*decompress)(struct mskwaj_decompressor *self,
02182 const char *input,
02183 const char *output);
02184
02196 int (*last_error)(struct mskwaj_decompressor *self);
02197 };
02198
02199 #ifdef __cplusplus
02200 }
02201 #endif
02202
02203 #endif