00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00118 #ifndef LIB_MSPACK_H
00119 #define LIB_MSPACK_H 1
00120
00121 #ifdef __cplusplus
00122 extern "C" {
00123 #endif
00124
00125 #include <sys/types.h>
00126 #include <stdlib.h>
00127 #ifndef _MSC_VER
00128 # include <unistd.h>
00129 #endif
00130
00154 #define MSPACK_SYS_SELFTEST(result) do { \
00155 (result) = mspack_sys_selftest_internal(sizeof(off_t)); \
00156 } while (0)
00157
00159 extern int mspack_sys_selftest_internal(int);
00160
00190 extern int mspack_version(int entity);
00191
00193 #define MSPACK_VER_LIBRARY (0)
00194
00195 #define MSPACK_VER_SYSTEM (1)
00196
00197 #define MSPACK_VER_MSCABD (2)
00198
00199 #define MSPACK_VER_MSCABC (3)
00200
00201 #define MSPACK_VER_MSCHMD (4)
00202
00203 #define MSPACK_VER_MSCHMC (5)
00204
00205 #define MSPACK_VER_MSLITD (6)
00206
00207 #define MSPACK_VER_MSLITC (7)
00208
00209 #define MSPACK_VER_MSHLPD (8)
00210
00211 #define MSPACK_VER_MSHLPC (9)
00212
00213 #define MSPACK_VER_MSSZDDD (10)
00214
00215 #define MSPACK_VER_MSSZDDC (11)
00216
00217 #define MSPACK_VER_MSKWAJD (12)
00218
00219 #define MSPACK_VER_MSKWAJC (13)
00220
00221
00222
00242 struct mspack_system {
00267 struct mspack_file * (*open)(struct mspack_system *self,
00268 char *filename,
00269 int mode);
00270
00278 void (*close)(struct mspack_file *file);
00279
00291 int (*read)(struct mspack_file *file,
00292 void *buffer,
00293 int bytes);
00294
00308 int (*write)(struct mspack_file *file,
00309 void *buffer,
00310 int bytes);
00311
00335 int (*seek)(struct mspack_file *file,
00336 off_t offset,
00337 int mode);
00338
00346 off_t (*tell)(struct mspack_file *file);
00347
00362 void (*message)(struct mspack_file *file,
00363 char *format,
00364 ...);
00365
00376 void * (*alloc)(struct mspack_system *self,
00377 size_t bytes);
00378
00385 void (*free)(void *ptr);
00386
00399 void (*copy)(void *src,
00400 void *dest,
00401 size_t bytes);
00402
00409 void *null_ptr;
00410 };
00411
00413 #define MSPACK_SYS_OPEN_READ (0)
00414
00415 #define MSPACK_SYS_OPEN_WRITE (1)
00416
00417 #define MSPACK_SYS_OPEN_UPDATE (2)
00418
00419 #define MSPACK_SYS_OPEN_APPEND (3)
00420
00422 #define MSPACK_SYS_SEEK_START (0)
00423
00424 #define MSPACK_SYS_SEEK_CUR (1)
00425
00426 #define MSPACK_SYS_SEEK_END (2)
00427
00433 struct mspack_file {
00434 int dummy;
00435 };
00436
00437
00438
00440 #define MSPACK_ERR_OK (0)
00441
00442 #define MSPACK_ERR_ARGS (1)
00443
00444 #define MSPACK_ERR_OPEN (2)
00445
00446 #define MSPACK_ERR_READ (3)
00447
00448 #define MSPACK_ERR_WRITE (4)
00449
00450 #define MSPACK_ERR_SEEK (5)
00451
00452 #define MSPACK_ERR_NOMEMORY (6)
00453
00454 #define MSPACK_ERR_SIGNATURE (7)
00455
00456 #define MSPACK_ERR_DATAFORMAT (8)
00457
00458 #define MSPACK_ERR_CHECKSUM (9)
00459
00460 #define MSPACK_ERR_CRUNCH (10)
00461
00462 #define MSPACK_ERR_DECRUNCH (11)
00463
00464
00465
00470 extern struct mscab_compressor *
00471 mspack_create_cab_compressor(struct mspack_system *sys);
00472
00477 extern struct mscab_decompressor *
00478 mspack_create_cab_decompressor(struct mspack_system *sys);
00479
00483 extern void mspack_destroy_cab_compressor(struct mscab_compressor *self);
00484
00488 extern void mspack_destroy_cab_decompressor(struct mscab_decompressor *self);
00489
00490
00495 extern struct mschm_compressor *
00496 mspack_create_chm_compressor(struct mspack_system *sys);
00497
00502 extern struct mschm_decompressor *
00503 mspack_create_chm_decompressor(struct mspack_system *sys);
00504
00508 extern void mspack_destroy_chm_compressor(struct mschm_compressor *self);
00509
00513 extern void mspack_destroy_chm_decompressor(struct mschm_decompressor *self);
00514
00515
00520 extern struct mslit_compressor *
00521 mspack_create_lit_compressor(struct mspack_system *sys);
00522
00527 extern struct mslit_decompressor *
00528 mspack_create_lit_decompressor(struct mspack_system *sys);
00529
00533 extern void mspack_destroy_lit_compressor(struct mslit_compressor *self);
00534
00538 extern void mspack_destroy_lit_decompressor(struct mslit_decompressor *self);
00539
00540
00545 extern struct mshlp_compressor *
00546 mspack_create_hlp_compressor(struct mspack_system *sys);
00547
00552 extern struct mshlp_decompressor *
00553 mspack_create_hlp_decompressor(struct mspack_system *sys);
00554
00558 extern void mspack_destroy_hlp_compressor(struct mshlp_compressor *self);
00559
00563 extern void mspack_destroy_hlp_decompressor(struct mshlp_decompressor *self);
00564
00565
00570 extern struct msszdd_compressor *
00571 mspack_create_szdd_compressor(struct mspack_system *sys);
00572
00577 extern struct msszdd_decompressor *
00578 mspack_create_szdd_decompressor(struct mspack_system *sys);
00579
00583 extern void mspack_destroy_szdd_compressor(struct msszdd_compressor *self);
00584
00588 extern void mspack_destroy_szdd_decompressor(struct msszdd_decompressor *self);
00589
00590
00595 extern struct mskwaj_compressor *
00596 mspack_create_kwaj_compressor(struct mspack_system *sys);
00597
00602 extern struct mskwaj_decompressor *
00603 mspack_create_kwaj_decompressor(struct mspack_system *sys);
00604
00608 extern void mspack_destroy_kwaj_compressor(struct mskwaj_compressor *self);
00609
00613 extern void mspack_destroy_kwaj_decompressor(struct mskwaj_decompressor *self);
00614
00615
00616
00617
00629 struct mscabd_cabinet {
00635 struct mscabd_cabinet *next;
00636
00642 char *filename;
00643
00645 off_t base_offset;
00646
00648 unsigned int length;
00649
00651 struct mscabd_cabinet *prevcab;
00652
00654 struct mscabd_cabinet *nextcab;
00655
00657 char *prevname;
00658
00660 char *nextname;
00661
00665 char *previnfo;
00666
00670 char *nextinfo;
00671
00673 struct mscabd_file *files;
00674
00676 struct mscabd_folder *folders;
00677
00682 unsigned short set_id;
00683
00689 unsigned short set_index;
00690
00701 unsigned short header_resv;
00702
00714 int flags;
00715 };
00716
00718 #define MSCAB_HDR_RESV_OFFSET (0x28)
00719
00721 #define MSCAB_HDR_PREVCAB (0x01)
00722
00723 #define MSCAB_HDR_NEXTCAB (0x02)
00724
00725 #define MSCAB_HDR_RESV (0x04)
00726
00736 struct mscabd_folder {
00741 struct mscabd_folder *next;
00742
00752 int comp_type;
00753
00759 unsigned int num_blocks;
00760 };
00761
00769 #define MSCABD_COMP_METHOD(comp_type) ((comp_type) & 0x0F)
00770
00777 #define MSCABD_COMP_LEVEL(comp_type) (((comp_type) >> 8) & 0x1F)
00778
00780 #define MSCAB_COMP_NONE (0)
00781
00782 #define MSCAB_COMP_MSZIP (1)
00783
00784 #define MSCAB_COMP_QUANTUM (2)
00785
00786 #define MSCAB_COMP_LZX (3)
00787
00793 struct mscabd_file {
00798 struct mscabd_file *next;
00799
00808 char *filename;
00809
00811 unsigned int length;
00812
00825 int attribs;
00826
00828 char time_h;
00830 char time_m;
00832 char time_s;
00833
00835 char date_d;
00837 char date_m;
00839 int date_y;
00840
00842 struct mscabd_folder *folder;
00843
00845 unsigned int offset;
00846 };
00847
00849 #define MSCAB_ATTRIB_RDONLY (0x01)
00850
00851 #define MSCAB_ATTRIB_HIDDEN (0x02)
00852
00853 #define MSCAB_ATTRIB_SYSTEM (0x04)
00854
00855 #define MSCAB_ATTRIB_ARCH (0x20)
00856
00857 #define MSCAB_ATTRIB_EXEC (0x40)
00858
00859 #define MSCAB_ATTRIB_UTF_NAME (0x80)
00860
00862 #define MSCABD_PARAM_SEARCHBUF (0)
00863
00864 #define MSCABD_PARAM_FIXMSZIP (1)
00865
00866 #define MSCABD_PARAM_DECOMPBUF (2)
00867
00869 struct mscab_compressor {
00870 int dummy;
00871 };
00872
00880 struct mscab_decompressor {
00901 struct mscabd_cabinet * (*open) (struct mscab_decompressor *self,
00902 char *filename);
00903
00933 void (*close)(struct mscab_decompressor *self,
00934 struct mscabd_cabinet *cab);
00935
00970 struct mscabd_cabinet * (*search) (struct mscab_decompressor *self,
00971 char *filename);
00972
01013 int (*append) (struct mscab_decompressor *self,
01014 struct mscabd_cabinet *cab,
01015 struct mscabd_cabinet *nextcab);
01016
01035 int (*prepend) (struct mscab_decompressor *self,
01036 struct mscabd_cabinet *cab,
01037 struct mscabd_cabinet *prevcab);
01038
01061 int (*extract)(struct mscab_decompressor *self,
01062 struct mscabd_file *file,
01063 char *filename);
01064
01087 int (*set_param)(struct mscab_decompressor *self,
01088 int param,
01089 int value);
01090
01102 int (*last_error)(struct mscab_decompressor *self);
01103 };
01104
01105
01106
01115 struct mschmc_file {
01117 int section;
01118
01121 char *filename;
01122
01125 char *chm_filename;
01126
01130 off_t length;
01131 };
01132
01141 struct mschmd_section {
01143 struct mschmd_header *chm;
01144
01150 unsigned int id;
01151 };
01152
01158 struct mschmd_sec_uncompressed {
01160 struct mschmd_section base;
01161
01163 off_t offset;
01164 };
01165
01171 struct mschmd_sec_mscompressed {
01173 struct mschmd_section base;
01174
01176 struct mschmd_file *content;
01177
01179 struct mschmd_file *control;
01180
01182 struct mschmd_file *rtable;
01183 };
01184
01190 struct mschmd_header {
01192 unsigned int version;
01193
01201 unsigned int timestamp;
01202
01207 unsigned int language;
01208
01213 char *filename;
01214
01216 off_t length;
01217
01219 struct mschmd_file *files;
01220
01227 struct mschmd_file *sysfiles;
01228
01230 struct mschmd_sec_uncompressed sec0;
01231
01233 struct mschmd_sec_mscompressed sec1;
01234
01236 off_t dir_offset;
01237
01239 unsigned int num_chunks;
01240
01242 unsigned int chunk_size;
01243
01245 unsigned int density;
01246
01255 unsigned int depth;
01256
01262 unsigned int index_root;
01263 };
01264
01270 struct mschmd_file {
01275 struct mschmd_file *next;
01276
01281 struct mschmd_section *section;
01282
01284 off_t offset;
01285
01287 off_t length;
01288
01290 char *filename;
01291 };
01292
01294 #define MSCHMC_ENDLIST (0)
01295
01296 #define MSCHMC_UNCOMP (1)
01297
01298 #define MSCHMC_MSCOMP (2)
01299
01301 #define MSCHMC_PARAM_TIMESTAMP (0)
01302
01303 #define MSCHMC_PARAM_LANGUAGE (1)
01304
01305 #define MSCHMC_PARAM_LZXWINDOW (2)
01306
01307 #define MSCHMC_PARAM_DENSITY (3)
01308
01309 #define MSCHMC_PARAM_INDEX (4)
01310
01318 struct mschm_compressor {
01350 int (*generate)(struct mschm_compressor *self,
01351 struct mschmc_file file_list[],
01352 char *output_file);
01353
01407 int (*use_temporary_file)(struct mschm_compressor *self,
01408 int use_temp_file,
01409 char *temp_file);
01455 int (*set_param)(struct mschm_compressor *self,
01456 int param,
01457 unsigned int value);
01458
01467 int (*last_error)(struct mschm_compressor *self);
01468 };
01469
01477 struct mschm_decompressor {
01498 struct mschmd_header *(*open)(struct mschm_decompressor *self,
01499 char *filename);
01500
01518 void (*close)(struct mschm_decompressor *self,
01519 struct mschmd_header *chm);
01520
01539 int (*extract)(struct mschm_decompressor *self,
01540 struct mschmd_file *file,
01541 char *filename);
01542
01554 int (*last_error)(struct mschm_decompressor *self);
01555
01578 struct mschmd_header *(*fast_open)(struct mschm_decompressor *self,
01579 char *filename);
01580
01619 int (*fast_find)(struct mschm_decompressor *self,
01620 struct mschmd_header *chm,
01621 char *filename,
01622 struct mschmd_file *f_ptr,
01623 int f_size);
01624 };
01625
01626
01627
01629 struct mslit_compressor {
01630 int dummy;
01631 };
01632
01634 struct mslit_decompressor {
01635 int dummy;
01636 };
01637
01638
01639
01640
01642 struct mshlp_compressor {
01643 int dummy;
01644 };
01645
01647 struct mshlp_decompressor {
01648 int dummy;
01649 };
01650
01651
01652
01653
01655 #define MSSZDDC_PARAM_MISSINGCHAR (0)
01656
01658 #define MSSZDD_FMT_NORMAL (0)
01659
01661 #define MSSZDD_FMT_QBASIC (1)
01662
01668 struct msszddd_header {
01670 int format;
01671
01673 off_t length;
01674
01682 char missing_char;
01683 };
01684
01692 struct msszdd_compressor {
01728 int (*compress)(struct msszdd_compressor *self,
01729 char *input,
01730 char *output,
01731 off_t length);
01732
01754 int (*set_param)(struct msszdd_compressor *self,
01755 int param,
01756 unsigned int value);
01757
01766 int (*last_error)(struct mschm_decompressor *self);
01767 };
01768
01776 struct msszdd_decompressor {
01796 struct msszddd_header *(*open)(struct msszdd_decompressor *self,
01797 char *filename);
01798
01812 void (*close)(struct msszdd_decompressor *self,
01813 struct msszddd_header *szdd);
01814
01828 int (*extract)(struct msszdd_decompressor *self,
01829 struct msszddd_header *szdd,
01830 char *filename);
01831
01849 int (*decompress)(struct msszdd_decompressor *self,
01850 char *input,
01851 char *output);
01852
01864 int (*last_error)(struct msszdd_decompressor *self);
01865 };
01866
01867
01868
01870 #define MSKWAJC_PARAM_COMP_TYPE (0)
01871
01875 #define MSKWAJC_PARAM_INCLUDE_LENGTH (1)
01876
01878 #define MSKWAJ_COMP_NONE (0)
01879
01880 #define MSKWAJ_COMP_XOR (1)
01881
01882 #define MSKWAJ_COMP_SZDD (2)
01883
01884 #define MSKWAJ_COMP_LZH (3)
01885
01887 #define MSKWAJ_HDR_HASLENGTH (0x01)
01888
01890 #define MSKWAJ_HDR_HASUNKNOWN1 (0x02)
01891
01893 #define MSKWAJ_HDR_HASUNKNOWN2 (0x04)
01894
01896 #define MSKWAJ_HDR_HASFILENAME (0x08)
01897
01899 #define MSKWAJ_HDR_HASFILEEXT (0x10)
01900
01902 #define MSKWAJ_HDR_HASEXTRATEXT (0x20)
01903
01909 struct mskwajd_header {
01913 unsigned short comp_type;
01914
01916 off_t data_offset;
01917
01919 int headers;
01920
01922 off_t length;
01923
01925 char *filename;
01926
01930 char *extra;
01931
01933 unsigned short extra_length;
01934 };
01935
01943 struct mskwaj_compressor {
01962 int (*compress)(struct mskwaj_compressor *self,
01963 char *input,
01964 char *output,
01965 off_t length);
01966
01990 int (*set_param)(struct mskwaj_compressor *self,
01991 int param,
01992 unsigned int value);
01993
01994
02012 int (*set_filename)(struct mskwaj_compressor *self,
02013 char *filename);
02014
02032 int (*set_extra_data)(struct mskwaj_compressor *self,
02033 void *data,
02034 size_t bytes);
02035
02044 int (*last_error)(struct mschm_decompressor *self);
02045 };
02046
02054 struct mskwaj_decompressor {
02074 struct mskwajd_header *(*open)(struct mskwaj_decompressor *self,
02075 char *filename);
02076
02089 void (*close)(struct mskwaj_decompressor *self,
02090 struct mskwajd_header *kwaj);
02091
02105 int (*extract)(struct mskwaj_decompressor *self,
02106 struct mskwajd_header *kwaj,
02107 char *filename);
02108
02126 int (*decompress)(struct mskwaj_decompressor *self,
02127 char *input,
02128 char *output);
02129
02141 int (*last_error)(struct mskwaj_decompressor *self);
02142 };
02143
02144 #ifdef __cplusplus
02145 };
02146 #endif
02147
02148 #endif