/src/zziplib/zzip/memdisk.h

https://bitbucket.org/cabalistic/ogredeps/ · C++ Header · 171 lines · 135 code · 26 blank · 10 comment · 9 complexity · d58db38ce5371a5d3ea3b6e571b07d4d MD5 · raw file

  1. #ifndef __ZZIP_MEMDISK_H
  2. #define __ZZIP_MEMDISK_H
  3. /* NOTE: this is part of libzzipmmapped (i.e. it is not libzzip). */
  4. #include <zzip/types.h>
  5. #include <zzip/mmapped.h>
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9. typedef struct _zzip_mem_disk ZZIP_MEM_DISK;
  10. typedef struct _zzip_mem_entry ZZIP_MEM_ENTRY;
  11. struct _zzip_mem_disk {
  12. ZZIP_DISK* disk;
  13. ZZIP_MEM_ENTRY* list;
  14. ZZIP_MEM_ENTRY* last;
  15. };
  16. #ifndef zzip_mem_disk_extern
  17. #define zzip_mem_disk_extern
  18. #endif
  19. zzip_mem_disk_extern zzip__new__ ZZIP_MEM_DISK*
  20. zzip_mem_disk_new (void);
  21. zzip_mem_disk_extern zzip__new__ ZZIP_MEM_DISK*
  22. zzip_mem_disk_open (char* filename);
  23. zzip_mem_disk_extern zzip__new__ ZZIP_MEM_DISK*
  24. zzip_mem_disk_fdopen (int fd);
  25. zzip_mem_disk_extern zzip__new__ ZZIP_MEM_DISK *
  26. zzip_mem_disk_buffer(char *buffer, size_t buflen);
  27. zzip_mem_disk_extern void
  28. zzip_mem_disk_close (ZZIP_MEM_DISK* _zzip_restrict dir);
  29. zzip_mem_disk_extern long
  30. zzip_mem_disk_load (ZZIP_MEM_DISK* dir, ZZIP_DISK* disk);
  31. zzip_mem_disk_extern void
  32. zzip_mem_disk_unload (ZZIP_MEM_DISK* dir);
  33. ZZIP_EXTRA_BLOCK*
  34. zzip_mem_entry_extra_block (ZZIP_MEM_ENTRY* entry, short datatype);
  35. #ifdef USE_INLINE
  36. _zzip_inline ZZIP_DISK* zzip_disk (ZZIP_MEM_DISK* dir) { return dir->disk; }
  37. #else
  38. #define zzip_disk(_X_) ((_X_)->disk)
  39. #endif
  40. /* these functions are much faster than the orgiinal zzip_disk_ functions */
  41. /* zzip_mem_entry <is similar to> zzip_disk_entry */
  42. struct _zzip_mem_entry {
  43. struct _zzip_mem_entry* zz_next;
  44. char* zz_name; /* zero-terminated (from "filename") */
  45. zzip_byte_t* zz_data; /* compressed content start (mmap addr) */
  46. int zz_flags; /* (from "z_flags") */
  47. int zz_compr; /* (from "z_compr") */
  48. long zz_mktime; /* (from "z_dostime") */
  49. long zz_crc32; /* (from "z_crc32") */
  50. zzip_off_t zz_csize; /* (from "z_csize") overridden by zip64 */
  51. zzip_off_t zz_usize; /* (from "z_usize") overridden by zip64 */
  52. zzip_off_t zz_offset; /* (from "z_offset") overridden by zip64 */
  53. int zz_diskstart; /* (from "z_diskstart") rridden by zip64 */
  54. int zz_filetype; /* (from "z_filetype") */
  55. char* zz_comment; /* zero-terminated (from "comment") */
  56. ZZIP_EXTRA_BLOCK* zz_ext[3]; /* terminated by null in z_datatype */
  57. }; /* the extra blocks are NOT converted */
  58. #define _zzip_mem_disk_findfirst(_d_) ((_d_)->list)
  59. #define _zzip_mem_disk_findnext(_d_,_e_) (!(_e_)?(_d_)->list:(_e_)->zz_next)
  60. #define _zzip_mem_entry_findnext(_e_) ((_e_)->zz_next)
  61. #ifndef USE_INLINE
  62. #define zzip_mem_disk_findfirst _zzip_mem_disk_findfirst
  63. #define zzip_mem_disk_findnext _zzip_mem_disk_findnext
  64. #define zzip_mem_entry_findnext _zzip_mem_entry_findnext
  65. #else
  66. _zzip_inline ZZIP_MEM_ENTRY*
  67. zzip_mem_disk_findfirst(ZZIP_MEM_DISK* dir) {
  68. if (! dir) return 0;
  69. return _zzip_mem_disk_findfirst(dir); }
  70. _zzip_inline ZZIP_MEM_ENTRY*
  71. zzip_mem_disk_findnext(ZZIP_MEM_DISK* dir, ZZIP_MEM_ENTRY* entry) {
  72. if (! dir) return 0;
  73. return _zzip_mem_disk_findnext(dir, entry); }
  74. _zzip_inline ZZIP_MEM_ENTRY*
  75. zzip_mem_entry_findnext(ZZIP_MEM_ENTRY* entry) {
  76. if (! entry) return 0;
  77. return _zzip_mem_entry_findnext(entry); }
  78. #endif
  79. #define _zzip_mem_entry_to_name(_e_) ((_e_)->zz_name)
  80. #define _zzip_mem_entry_to_comment(_e_) ((_e_)->zz_comment)
  81. #define _zzip_mem_entry_strdup_name(_e_) (strdup((_e_)->zz_name))
  82. #define _zzip_mem_entry_to_data(_e_) ((_e_)->zz_data)
  83. #ifndef USE_INLINE
  84. #define zzip_mem_entry_to_name _zzip_mem_entry_to_name
  85. #define zzip_mem_entry_to_comment _zzip_mem_entry_to_comment
  86. #define zzip_mem_entry_strdup_name _zzip_mem_entry_strdup_name
  87. #define zzip_mem_entry_to_data _zzip_mem_entry_to_data
  88. #else
  89. _zzip_inline char*
  90. zzip_mem_entry_to_name(ZZIP_MEM_ENTRY* entry) {
  91. if (! entry) return 0;
  92. return _zzip_mem_entry_to_name(entry); }
  93. _zzip_inline char*
  94. zzip_mem_entry_to_comment(ZZIP_MEM_ENTRY* entry) {
  95. if (! entry) return 0;
  96. return _zzip_mem_entry_to_comment(entry); }
  97. zzip__new__
  98. _zzip_inline char*
  99. zzip_mem_entry_strdup_name(ZZIP_MEM_ENTRY* entry) {
  100. if (! entry) return 0;
  101. return _zzip_mem_entry_strdup_name(entry); }
  102. _zzip_inline zzip_byte_t*
  103. zzip_mem_entry_to_data(ZZIP_MEM_ENTRY* entry) {
  104. if (! entry) return 0;
  105. return _zzip_mem_entry_to_data(entry); }
  106. #endif
  107. ZZIP_MEM_ENTRY*
  108. zzip_mem_disk_findfile(ZZIP_MEM_DISK* dir,
  109. char* filename, ZZIP_MEM_ENTRY* after,
  110. zzip_strcmp_fn_t compare);
  111. ZZIP_MEM_ENTRY*
  112. zzip_mem_disk_findmatch(ZZIP_MEM_DISK* dir,
  113. char* filespec, ZZIP_MEM_ENTRY* after,
  114. zzip_fnmatch_fn_t compare, int flags);
  115. /* named access -------------------------------------------------------- */
  116. #define zzip_mem_entry_usize(_e_) ((_e_)->zz_usize)
  117. #define zzip_mem_entry_csize(_e_) ((_e_)->zz_csize)
  118. #define zzip_mem_entry_data_encrypted(_e_) ZZIP_IS_ENCRYPTED((_e_)->zz_flags)
  119. #define zzip_mem_entry_data_streamed(_e_) ZZIP_IS_STREAMED((_e_)->zz_flags)
  120. #define zzip_mem_entry_data_comprlevel(_e_) ((_e_)->zz_compr)
  121. #define zzip_mem_entry_data_stored(_e_) ((_e_)->zz_compr == ZZIP_IS_STORED)
  122. #define zzip_mem_entry_data_deflated(_e_) ((_e_)->zz_compr == ZZIP_IS_DEFLATED)
  123. /* zzip_mem_disk_file -------------------------------------------------- */
  124. /* since only the header data is being cached, all the real data
  125. * operations are actually the same as in mmapped.h - just fopen makes
  126. * access to the header data in memory instead of the zip archive.
  127. */
  128. typedef ZZIP_DISK_FILE ZZIP_MEM_DISK_FILE;
  129. zzip__new__ ZZIP_MEM_DISK_FILE*
  130. zzip_mem_entry_fopen (ZZIP_MEM_DISK* dir, ZZIP_MEM_ENTRY* entry);
  131. zzip__new__ ZZIP_MEM_DISK_FILE*
  132. zzip_mem_disk_fopen (ZZIP_MEM_DISK* dir, char* filename);
  133. _zzip_size_t
  134. zzip_mem_disk_fread (void* ptr, _zzip_size_t size, _zzip_size_t nmemb,
  135. ZZIP_MEM_DISK_FILE* file);
  136. int
  137. zzip_mem_disk_fclose (ZZIP_MEM_DISK_FILE* file);
  138. int
  139. zzip_mem_disk_feof (ZZIP_MEM_DISK_FILE* file);
  140. /* convert dostime of entry to unix time_t */
  141. long zzip_disk_entry_get_mktime(ZZIP_DISK_ENTRY* entry);
  142. #ifdef __cplusplus
  143. }
  144. #endif
  145. #endif