You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

unarr.h 4.5KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. /* Copyright 2015 the unarr project authors (see AUTHORS file).
  2. License: LGPLv3 */
  3. #ifndef unarr_h
  4. #define unarr_h
  5. #include <stddef.h>
  6. #include <stdint.h>
  7. #include <stdbool.h>
  8. typedef int64_t off64_t;
  9. typedef int64_t time64_t;
  10. #define UNARR_API_VERSION 100
  11. /***** common/stream *****/
  12. typedef struct ar_stream_s ar_stream;
  13. /* opens a read-only stream for the given file path; returns NULL on error */
  14. ar_stream *ar_open_file(const char *path);
  15. #ifdef _WIN32
  16. ar_stream *ar_open_file_w(const wchar_t *path);
  17. #endif
  18. /* opens a read-only stream for the given chunk of memory; the pointer must be valid until ar_close is called */
  19. ar_stream *ar_open_memory(const void *data, size_t datalen);
  20. #ifdef _WIN32
  21. typedef struct IStream IStream;
  22. /* opens a read-only stream based on the given IStream */
  23. ar_stream *ar_open_istream(IStream *stream);
  24. #endif
  25. /* closes the stream and releases underlying resources */
  26. void ar_close(ar_stream *stream);
  27. /* tries to read 'count' bytes into buffer, advancing the read offset pointer; returns the actual number of bytes read */
  28. size_t ar_read(ar_stream *stream, void *buffer, size_t count);
  29. /* moves the read offset pointer (same as fseek); returns false on failure */
  30. bool ar_seek(ar_stream *stream, off64_t offset, int origin);
  31. /* shortcut for ar_seek(stream, count, SEEK_CUR); returns false on failure */
  32. bool ar_skip(ar_stream *stream, off64_t count);
  33. /* returns the current read offset (or 0 on error) */
  34. off64_t ar_tell(ar_stream *stream);
  35. /***** common/unarr *****/
  36. typedef struct ar_archive_s ar_archive;
  37. /* frees all data stored for the given archive; does not close the underlying stream */
  38. void ar_close_archive(ar_archive *ar);
  39. /* reads the next archive entry; returns false on error or at the end of the file (use ar_at_eof to distinguish the two cases) */
  40. bool ar_parse_entry(ar_archive *ar);
  41. /* reads the archive entry at the given offset as returned by ar_entry_get_offset (offset 0 always restarts at the first entry); should always succeed */
  42. bool ar_parse_entry_at(ar_archive *ar, off64_t offset);
  43. /* reads the (first) archive entry associated with the given name; returns false if the entry couldn't be found */
  44. bool ar_parse_entry_for(ar_archive *ar, const char *entry_name);
  45. /* returns whether the last ar_parse_entry call has reached the file's expected end */
  46. bool ar_at_eof(ar_archive *ar);
  47. /* returns the name of the current entry as UTF-8 string; this pointer is only valid until the next call to ar_parse_entry; returns NULL on failure */
  48. const char *ar_entry_get_name(ar_archive *ar);
  49. /* returns the stream offset of the current entry for use with ar_parse_entry_at */
  50. off64_t ar_entry_get_offset(ar_archive *ar);
  51. /* returns the total size of uncompressed data of the current entry; read exactly that many bytes using ar_entry_uncompress */
  52. size_t ar_entry_get_size(ar_archive *ar);
  53. /* returns the stored modification date of the current entry in 100ns since 1601/01/01 */
  54. time64_t ar_entry_get_filetime(ar_archive *ar);
  55. /* WARNING: don't manually seek in the stream between ar_parse_entry and the last corresponding ar_entry_uncompress call! */
  56. /* uncompresses the next 'count' bytes of the current entry into buffer; returns false on error */
  57. bool ar_entry_uncompress(ar_archive *ar, void *buffer, size_t count);
  58. /* copies at most 'count' bytes of the archive's global comment (if any) into buffer; returns the actual amout of bytes copied (or, if 'buffer' is NULL, the required buffer size) */
  59. size_t ar_get_global_comment(ar_archive *ar, void *buffer, size_t count);
  60. /***** rar/rar *****/
  61. /* checks whether 'stream' could contain RAR data and prepares for archive listing/extraction; returns NULL on failure */
  62. ar_archive *ar_open_rar_archive(ar_stream *stream);
  63. /***** tar/tar *****/
  64. /* checks whether 'stream' could contain TAR data and prepares for archive listing/extraction; returns NULL on failure */
  65. ar_archive *ar_open_tar_archive(ar_stream *stream);
  66. /***** zip/zip *****/
  67. /* checks whether 'stream' could contain ZIP data and prepares for archive listing/extraction; returns NULL on failure */
  68. /* set deflatedonly for extracting XPS, EPUB, etc. documents where non-Deflate compression methods are not supported by specification */
  69. ar_archive *ar_open_zip_archive(ar_stream *stream, bool deflatedonly);
  70. /***** _7z/_7z *****/
  71. /* checks whether 'stream' could contain 7Z data and prepares for archive listing/extraction; returns NULL on failure */
  72. ar_archive *ar_open_7z_archive(ar_stream *stream);
  73. #endif