/* mz.h -- Errors codes, zip flags and magic
   part of the minizip-ng project

   Copyright (C) Nathan Moinvaziri
     https://github.com/zlib-ng/minizip-ng

   This program is distributed under the terms of the same license as zlib.
   See the accompanying LICENSE file for the full text of the license.
*/

#ifndef MZ_H
#define MZ_H

/***************************************************************************/

/* MZ_VERSION */
#define MZ_VERSION       ("4.1.0")
#define MZ_VERSION_BUILD (0x040100)

/* MZ_ERROR */
#define MZ_OK             (0)  /* zlib */
#define MZ_STREAM_ERROR   (-1) /* zlib */
#define MZ_DATA_ERROR     (-3) /* zlib */
#define MZ_MEM_ERROR      (-4) /* zlib */
#define MZ_BUF_ERROR      (-5) /* zlib */
#define MZ_VERSION_ERROR  (-6) /* zlib */

#define MZ_END_OF_LIST    (-100)
#define MZ_END_OF_STREAM  (-101)

#define MZ_PARAM_ERROR    (-102)
#define MZ_FORMAT_ERROR   (-103)
#define MZ_INTERNAL_ERROR (-104)
#define MZ_CRC_ERROR      (-105)
#define MZ_CRYPT_ERROR    (-106)
#define MZ_EXIST_ERROR    (-107)
#define MZ_PASSWORD_ERROR (-108)
#define MZ_SUPPORT_ERROR  (-109)
#define MZ_HASH_ERROR     (-110)
#define MZ_OPEN_ERROR     (-111)
#define MZ_CLOSE_ERROR    (-112)
#define MZ_SEEK_ERROR     (-113)
#define MZ_TELL_ERROR     (-114)
#define MZ_READ_ERROR     (-115)
#define MZ_WRITE_ERROR    (-116)
#define MZ_SIGN_ERROR     (-117)
#define MZ_SYMLINK_ERROR  (-118)

/* MZ_OPEN */
#define MZ_OPEN_MODE_READ      (0x01)
#define MZ_OPEN_MODE_WRITE     (0x02)
#define MZ_OPEN_MODE_READWRITE (MZ_OPEN_MODE_READ | MZ_OPEN_MODE_WRITE)
#define MZ_OPEN_MODE_APPEND    (0x04)
#define MZ_OPEN_MODE_CREATE    (0x08)
#define MZ_OPEN_MODE_EXISTING  (0x10)
#define MZ_OPEN_MODE_NOFOLLOW  (0x20)

/* MZ_SEEK */
#define MZ_SEEK_SET (0)
#define MZ_SEEK_CUR (1)
#define MZ_SEEK_END (2)

/* MZ_COMPRESS */
#define MZ_COMPRESS_METHOD_STORE   (0)
#define MZ_COMPRESS_METHOD_DEFLATE (8)
#define MZ_COMPRESS_METHOD_BZIP2   (12)
#define MZ_COMPRESS_METHOD_LZMA    (14)
#define MZ_COMPRESS_METHOD_ZSTD    (93)
#define MZ_COMPRESS_METHOD_XZ      (95)
#define MZ_COMPRESS_METHOD_AES     (99)

#define MZ_COMPRESS_LEVEL_DEFAULT  (-1)
#define MZ_COMPRESS_LEVEL_FAST     (2)
#define MZ_COMPRESS_LEVEL_NORMAL   (6)
#define MZ_COMPRESS_LEVEL_BEST     (9)

/* MZ_ZIP_FLAG */
#define MZ_ZIP_FLAG_ENCRYPTED          (1 << 0)
#define MZ_ZIP_FLAG_LZMA_EOS_MARKER    (1 << 1)
#define MZ_ZIP_FLAG_DEFLATE_MAX        (1 << 1)
#define MZ_ZIP_FLAG_DEFLATE_NORMAL     (0)
#define MZ_ZIP_FLAG_DEFLATE_FAST       (1 << 2)
#define MZ_ZIP_FLAG_DEFLATE_SUPER_FAST (MZ_ZIP_FLAG_DEFLATE_FAST | MZ_ZIP_FLAG_DEFLATE_MAX)
#define MZ_ZIP_FLAG_DATA_DESCRIPTOR    (1 << 3)
#define MZ_ZIP_FLAG_UTF8               (1 << 11)
#define MZ_ZIP_FLAG_MASK_LOCAL_INFO    (1 << 13)

/* MZ_ZIP_EXTENSION */
#define MZ_ZIP_EXTENSION_ZIP64 (0x0001)
#define MZ_ZIP_EXTENSION_NTFS  (0x000a)
#define MZ_ZIP_EXTENSION_AES   (0x9901)
#define MZ_ZIP_EXTENSION_UNIX1 (0x000d)
#define MZ_ZIP_EXTENSION_SIGN  (0x10c5)
#define MZ_ZIP_EXTENSION_HASH  (0x1a51)
#define MZ_ZIP_EXTENSION_CDCD  (0xcdcd)

/* MZ_ZIP64 */
#define MZ_ZIP64_AUTO    (0)
#define MZ_ZIP64_FORCE   (1)
#define MZ_ZIP64_DISABLE (2)

/* MZ_HOST_SYSTEM */
#define MZ_HOST_SYSTEM(VERSION_MADEBY) ((uint8_t)(VERSION_MADEBY >> 8))
#define MZ_HOST_SYSTEM_MSDOS           (0)
#define MZ_HOST_SYSTEM_UNIX            (3)
#define MZ_HOST_SYSTEM_WINDOWS_NTFS    (10)
#define MZ_HOST_SYSTEM_RISCOS          (13)
#define MZ_HOST_SYSTEM_OSX_DARWIN      (19)

/* MZ_PKCRYPT */
#define MZ_PKCRYPT_HEADER_SIZE (12)

/* MZ_AES */
#define MZ_AES_VERSION        (1)
#define MZ_AES_MODE_ECB       (0)
#define MZ_AES_MODE_CBC       (1)
#define MZ_AES_MODE_GCM       (2)
#define MZ_AES_STRENGTH_128   (1)
#define MZ_AES_STRENGTH_192   (2)
#define MZ_AES_STRENGTH_256   (3)
#define MZ_AES_KEY_LENGTH_MAX (32)
#define MZ_AES_BLOCK_SIZE     (16)
#define MZ_AES_FOOTER_SIZE    (10)

/* MZ_HASH */
#define MZ_HASH_MD5         (10)
#define MZ_HASH_MD5_SIZE    (16)
#define MZ_HASH_SHA1        (20)
#define MZ_HASH_SHA1_SIZE   (20)
#define MZ_HASH_SHA224      (22)
#define MZ_HASH_SHA224_SIZE (28)
#define MZ_HASH_SHA256      (23)
#define MZ_HASH_SHA256_SIZE (32)
#define MZ_HASH_SHA384      (24)
#define MZ_HASH_SHA384_SIZE (48)
#define MZ_HASH_SHA512      (25)
#define MZ_HASH_SHA512_SIZE (64)
#define MZ_HASH_MAX_SIZE    (256)

/* MZ_ENCODING */
#define MZ_ENCODING_CODEPAGE_437 (437)
#define MZ_ENCODING_CODEPAGE_932 (932)
#define MZ_ENCODING_CODEPAGE_936 (936)
#define MZ_ENCODING_CODEPAGE_950 (950)
#define MZ_ENCODING_UTF8         (65001)

/* MZ_UTILITY */
#define MZ_UNUSED(SYMBOL) ((void)SYMBOL)

#if defined(_WIN32) && defined(MZ_EXPORTS)
#  define MZ_EXPORT __declspec(dllexport)
#else
#  define MZ_EXPORT
#endif

/***************************************************************************/

#include <stdlib.h> /* size_t, NULL, malloc */
#include <time.h>   /* time_t, time() */
#include <string.h> /* memset, strncpy, strlen */
#include <limits.h>

#if defined(HAVE_STDINT_H)
#  include <stdint.h>
#elif defined(__has_include)
#  if __has_include(<stdint.h>)
#    include <stdint.h>
#  endif
#endif

#ifndef INT8_MAX
typedef signed char int8_t;
#endif
#ifndef INT16_MAX
typedef short int16_t;
#endif
#ifndef INT32_MAX
typedef int int32_t;
#endif
#ifndef INT64_MAX
typedef long long int64_t;
#endif
#ifndef UINT8_MAX
typedef unsigned char uint8_t;
#endif
#ifndef UINT16_MAX
typedef unsigned short uint16_t;
#endif
#ifndef UINT32_MAX
typedef unsigned int uint32_t;
#endif
#ifndef UINT64_MAX
typedef unsigned long long uint64_t;
#endif

#if defined(HAVE_INTTYPES_H)
#  include <inttypes.h>
#elif defined(__has_include)
#  if __has_include(<inttypes.h>)
#    include <inttypes.h>
#  endif
#endif

#ifndef PRId8
#  define PRId8 "hhd"
#endif
#ifndef PRIu8
#  define PRIu8 "hhu"
#endif
#ifndef PRIx8
#  define PRIx8 "hhx"
#endif
#ifndef PRId16
#  define PRId16 "hd"
#endif
#ifndef PRIu16
#  define PRIu16 "hu"
#endif
#ifndef PRIx16
#  define PRIx16 "hx"
#endif
#ifndef PRId32
#  define PRId32 "d"
#endif
#ifndef PRIu32
#  define PRIu32 "u"
#endif
#ifndef PRIx32
#  define PRIx32 "x"
#endif
#if ULONG_MAX == 0xfffffffful
#  ifndef PRId64
#    define PRId64 "ld"
#  endif
#  ifndef PRIu64
#    define PRIu64 "lu"
#  endif
#  ifndef PRIx64
#    define PRIx64 "lx"
#  endif
#else
#  ifndef PRId64
#    define PRId64 "lld"
#  endif
#  ifndef PRIu64
#    define PRIu64 "llu"
#  endif
#  ifndef PRIx64
#    define PRIx64 "llx"
#  endif
#endif

#ifndef INT16_MAX
#  define INT16_MAX 32767
#endif
#ifndef INT32_MAX
#  define INT32_MAX 2147483647L
#endif
#ifndef INT64_MAX
#  define INT64_MAX 9223372036854775807LL
#endif
#ifndef UINT16_MAX
#  define UINT16_MAX 65535U
#endif
#ifndef UINT32_MAX
#  define UINT32_MAX 4294967295UL
#endif
#ifndef UINT64_MAX
#  define UINT64_MAX 18446744073709551615ULL
#endif

/***************************************************************************/

#endif
