blob: b3e2a58c1966b94f64257f86409b1edf12516ca5 [file] [log] [blame]
Nathan Moinvaziriaa323f52017-10-05 23:32:57 -07001/* mz_os.h -- System functions
Nathan Moinvaziridb958942021-01-23 16:18:11 -08002 part of the minizip-ng project
Nathan Moinvaziriaa323f52017-10-05 23:32:57 -07003
Nathan Moinvaziridb958942021-01-23 16:18:11 -08004 Copyright (C) 2010-2021 Nathan Moinvaziri
5 https://github.com/zlib-ng/minizip-ng
Nathan Moinvaziriaa323f52017-10-05 23:32:57 -07006
7 This program is distributed under the terms of the same license as zlib.
8 See the accompanying LICENSE file for the full text of the license.
9*/
10
Nathan Moinvaziri408940f2018-05-09 09:42:31 -070011#ifndef MZ_OS_H
12#define MZ_OS_H
Nathan Moinvaziriaa323f52017-10-05 23:32:57 -070013
Nathan Moinvaziriaa323f52017-10-05 23:32:57 -070014#ifdef __cplusplus
15extern "C" {
16#endif
17
18/***************************************************************************/
19
Nathan Moinvaziri21a31022018-10-24 09:50:16 -070020#if defined(__APPLE__)
Nathan Moinvaziri7d94b1f2019-05-08 23:41:47 -070021# define MZ_VERSION_MADEBY_HOST_SYSTEM (MZ_HOST_SYSTEM_OSX_DARWIN)
Cameron Cawley28f78ff2019-08-06 14:14:14 +010022#elif defined(__riscos__)
23# define MZ_VERSION_MADEBY_HOST_SYSTEM (MZ_HOST_SYSTEM_RISCOS)
Nathan Moinvaziri21a31022018-10-24 09:50:16 -070024#elif defined(_WIN32)
Nathan Moinvaziri7d94b1f2019-05-08 23:41:47 -070025# define MZ_VERSION_MADEBY_HOST_SYSTEM (MZ_HOST_SYSTEM_WINDOWS_NTFS)
Ørjan72459e92020-11-18 11:21:17 +000026#else
27# define MZ_VERSION_MADEBY_HOST_SYSTEM (MZ_HOST_SYSTEM_UNIX)
Nathan Moinvaziriaa323f52017-10-05 23:32:57 -070028#endif
29
Nathan Moinvaziri1a7e7e42020-10-25 14:50:53 -070030#if defined(HAVE_LZMA) || defined(HAVE_LIBCOMP)
Nathan Moinvaziri7d94b1f2019-05-08 23:41:47 -070031# define MZ_VERSION_MADEBY_ZIP_VERSION (63)
Nathan Moinvazirif77766b2019-10-04 18:33:13 -070032#elif defined(HAVE_WZAES)
Nathan Moinvaziri7d94b1f2019-05-08 23:41:47 -070033# define MZ_VERSION_MADEBY_ZIP_VERSION (51)
Nathan Moinvazirif77766b2019-10-04 18:33:13 -070034#elif defined(HAVE_BZIP2)
Nathan Moinvaziri7d94b1f2019-05-08 23:41:47 -070035# define MZ_VERSION_MADEBY_ZIP_VERSION (46)
juanii30589b52018-02-08 13:12:37 -030036#else
Nathan Moinvaziri7d94b1f2019-05-08 23:41:47 -070037# define MZ_VERSION_MADEBY_ZIP_VERSION (45)
juanii30589b52018-02-08 13:12:37 -030038#endif
39
Nathan Moinvaziri7d94b1f2019-05-08 23:41:47 -070040#define MZ_VERSION_MADEBY ((MZ_VERSION_MADEBY_HOST_SYSTEM << 8) | \
41 (MZ_VERSION_MADEBY_ZIP_VERSION))
42
43#define MZ_PATH_SLASH_UNIX ('/')
44#if defined(_WIN32)
45# define MZ_PATH_SLASH_PLATFORM ('\\')
46#else
Nathan Moinvaziri034d7e62019-05-09 12:47:40 -070047# define MZ_PATH_SLASH_PLATFORM (MZ_PATH_SLASH_UNIX)
Nathan Moinvaziri7d94b1f2019-05-08 23:41:47 -070048#endif
juanii30589b52018-02-08 13:12:37 -030049
50/***************************************************************************/
51
Nathan Moinvaziri21a31022018-10-24 09:50:16 -070052#if defined(_WIN32)
53struct dirent {
54 char d_name[256];
55};
56typedef void* DIR;
Nathan Moinvaziri9fb82902018-10-25 21:21:58 -070057#else
58#include <dirent.h>
Nathan Moinvaziri21a31022018-10-24 09:50:16 -070059#endif
Nathan Moinvaziriaa323f52017-10-05 23:32:57 -070060
Nathan Moinvaziri21a31022018-10-24 09:50:16 -070061/***************************************************************************/
Nathan Moinvazirib16ab562018-11-20 16:56:21 -080062/* Shared functions */
Nathan Moinvaziri8cb7df72018-10-25 08:39:48 -070063
64int32_t mz_path_combine(char *path, const char *join, int32_t max_path);
Nathan Moinvazirib16ab562018-11-20 16:56:21 -080065/* Combines two paths */
Nathan Moinvaziri8cb7df72018-10-25 08:39:48 -070066
Nathan Moinvaziri7d94b1f2019-05-08 23:41:47 -070067int32_t mz_path_append_slash(char *path, int32_t max_path, char slash);
68/* Appends a path slash on to the end of the path */
Nathan Moinvaziri3249eac2019-05-02 21:07:39 -070069
70int32_t mz_path_remove_slash(char *path);
71/* Removes a path slash from the end of the path */
72
73int32_t mz_path_has_slash(const char *path);
74/* Returns whether or not the path ends with slash */
75
Nathan Moinvaziri7d94b1f2019-05-08 23:41:47 -070076int32_t mz_path_convert_slashes(char *path, char slash);
Nathan Moinvaziri3a941ef2019-05-08 19:24:09 -070077/* Converts the slashes in a path */
78
Nathan Moinvaziri8cb7df72018-10-25 08:39:48 -070079int32_t mz_path_compare_wc(const char *path, const char *wildcard, uint8_t ignore_case);
Nathan Moinvazirib16ab562018-11-20 16:56:21 -080080/* Compare two paths with wildcard */
Nathan Moinvaziri8cb7df72018-10-25 08:39:48 -070081
82int32_t mz_path_resolve(const char *path, char *target, int32_t max_target);
Nathan Moinvazirib16ab562018-11-20 16:56:21 -080083/* Resolves path */
Nathan Moinvaziri8cb7df72018-10-25 08:39:48 -070084
85int32_t mz_path_remove_filename(char *path);
Nathan Moinvazirib16ab562018-11-20 16:56:21 -080086/* Remove the filename from a path */
Nathan Moinvaziri8cb7df72018-10-25 08:39:48 -070087
Nathan Moinvaziri3c438162019-04-28 09:23:56 -070088int32_t mz_path_remove_extension(char *path);
89/* Remove the extension from a path */
90
Nathan Moinvaziri8cb7df72018-10-25 08:39:48 -070091int32_t mz_path_get_filename(const char *path, const char **filename);
Nathan Moinvazirib16ab562018-11-20 16:56:21 -080092/* Get the filename from a path */
Nathan Moinvaziri8cb7df72018-10-25 08:39:48 -070093
94int32_t mz_dir_make(const char *path);
Nathan Moinvazirib16ab562018-11-20 16:56:21 -080095/* Creates a directory recursively */
Nathan Moinvaziri8cb7df72018-10-25 08:39:48 -070096
97int32_t mz_file_get_crc(const char *path, uint32_t *result_crc);
Nathan Moinvazirib16ab562018-11-20 16:56:21 -080098/* Gets the crc32 hash of a file */
Nathan Moinvaziri8cb7df72018-10-25 08:39:48 -070099
100/***************************************************************************/
Nathan Moinvazirib16ab562018-11-20 16:56:21 -0800101/* Platform specific functions */
Nathan Moinvaziri65a87022018-07-31 12:48:31 -0700102
Nathan Moinvaziriea5e45d2018-10-30 13:59:17 -0700103wchar_t *mz_os_unicode_string_create(const char *string, int32_t encoding);
Nathan Moinvazirib16ab562018-11-20 16:56:21 -0800104/* Create unicode string from a utf8 string */
Nathan Moinvaziri8cb7df72018-10-25 08:39:48 -0700105
Nathan Moinvaziri21a31022018-10-24 09:50:16 -0700106void mz_os_unicode_string_delete(wchar_t **string);
Nathan Moinvazirib16ab562018-11-20 16:56:21 -0800107/* Delete a unicode string that was created */
Nathan Moinvaziridd808232018-06-11 07:38:58 -0700108
Nathan Moinvaziriea5e45d2018-10-30 13:59:17 -0700109uint8_t *mz_os_utf8_string_create(const char *string, int32_t encoding);
Nathan Moinvazirib16ab562018-11-20 16:56:21 -0800110/* Create a utf8 string from a string with another encoding */
Nathan Moinvaziriea5e45d2018-10-30 13:59:17 -0700111
112void mz_os_utf8_string_delete(uint8_t **string);
Nathan Moinvazirib16ab562018-11-20 16:56:21 -0800113/* Delete a utf8 string that was created */
Nathan Moinvaziriea5e45d2018-10-30 13:59:17 -0700114
Nathan Moinvaziri648f5962018-10-25 19:35:50 -0700115int32_t mz_os_rand(uint8_t *buf, int32_t size);
Nathan Moinvazirib16ab562018-11-20 16:56:21 -0800116/* Random number generator (not cryptographically secure) */
Nathan Moinvaziri648f5962018-10-25 19:35:50 -0700117
Nathan Moinvaziri21a31022018-10-24 09:50:16 -0700118int32_t mz_os_rename(const char *source_path, const char *target_path);
Nathan Moinvazirib16ab562018-11-20 16:56:21 -0800119/* Rename a file */
Nathan Moinvaziri8cb7df72018-10-25 08:39:48 -0700120
Nathan Moinvaziri3249eac2019-05-02 21:07:39 -0700121int32_t mz_os_unlink(const char *path);
Nathan Moinvazirib16ab562018-11-20 16:56:21 -0800122/* Delete an existing file */
Nathan Moinvaziri8cb7df72018-10-25 08:39:48 -0700123
Nathan Moinvaziri21a31022018-10-24 09:50:16 -0700124int32_t mz_os_file_exists(const char *path);
Nathan Moinvazirib16ab562018-11-20 16:56:21 -0800125/* Check to see if a file exists */
Nathan Moinvaziri8cb7df72018-10-25 08:39:48 -0700126
Nathan Moinvaziri21a31022018-10-24 09:50:16 -0700127int64_t mz_os_get_file_size(const char *path);
Nathan Moinvazirib16ab562018-11-20 16:56:21 -0800128/* Gets the length of a file */
Nathan Moinvaziri8cb7df72018-10-25 08:39:48 -0700129
Nathan Moinvaziri21a31022018-10-24 09:50:16 -0700130int32_t mz_os_get_file_date(const char *path, time_t *modified_date, time_t *accessed_date, time_t *creation_date);
Nathan Moinvazirib16ab562018-11-20 16:56:21 -0800131/* Gets a file's modified, access, and creation dates if supported */
Nathan Moinvaziri8cb7df72018-10-25 08:39:48 -0700132
Nathan Moinvaziri21a31022018-10-24 09:50:16 -0700133int32_t mz_os_set_file_date(const char *path, time_t modified_date, time_t accessed_date, time_t creation_date);
Nathan Moinvazirib16ab562018-11-20 16:56:21 -0800134/* Sets a file's modified, access, and creation dates if supported */
Nathan Moinvaziri8cb7df72018-10-25 08:39:48 -0700135
Nathan Moinvaziri21a31022018-10-24 09:50:16 -0700136int32_t mz_os_get_file_attribs(const char *path, uint32_t *attributes);
Nathan Moinvazirib16ab562018-11-20 16:56:21 -0800137/* Gets a file's attributes */
Nathan Moinvaziri8cb7df72018-10-25 08:39:48 -0700138
Nathan Moinvaziri21a31022018-10-24 09:50:16 -0700139int32_t mz_os_set_file_attribs(const char *path, uint32_t attributes);
Nathan Moinvazirib16ab562018-11-20 16:56:21 -0800140/* Sets a file's attributes */
Nathan Moinvaziri8cb7df72018-10-25 08:39:48 -0700141
Nathan Moinvaziri21a31022018-10-24 09:50:16 -0700142int32_t mz_os_make_dir(const char *path);
Nathan Moinvazirib16ab562018-11-20 16:56:21 -0800143/* Recursively creates a directory */
Nathan Moinvaziri8cb7df72018-10-25 08:39:48 -0700144
Nathan Moinvaziri21a31022018-10-24 09:50:16 -0700145DIR* mz_os_open_dir(const char *path);
Nathan Moinvazirib16ab562018-11-20 16:56:21 -0800146/* Opens a directory for listing */
Nathan Moinvaziri21a31022018-10-24 09:50:16 -0700147struct
148dirent* mz_os_read_dir(DIR *dir);
Nathan Moinvazirib16ab562018-11-20 16:56:21 -0800149/* Reads a directory listing entry */
Nathan Moinvaziri8cb7df72018-10-25 08:39:48 -0700150
Nathan Moinvaziri21a31022018-10-24 09:50:16 -0700151int32_t mz_os_close_dir(DIR *dir);
Nathan Moinvazirib16ab562018-11-20 16:56:21 -0800152/* Closes a directory that has been opened for listing */
Nathan Moinvaziri8cb7df72018-10-25 08:39:48 -0700153
Nathan Moinvaziri21a31022018-10-24 09:50:16 -0700154int32_t mz_os_is_dir(const char *path);
Nathan Moinvazirib16ab562018-11-20 16:56:21 -0800155/* Checks to see if path is a directory */
Nathan Moinvaziri8cb7df72018-10-25 08:39:48 -0700156
Nathan Moinvaziri3249eac2019-05-02 21:07:39 -0700157int32_t mz_os_is_symlink(const char *path);
158/* Checks to see if path is a symbolic link */
159
160int32_t mz_os_make_symlink(const char *path, const char *target_path);
161/* Creates a symbolic link pointing to a target */
162
163int32_t mz_os_read_symlink(const char *path, char *target_path, int32_t max_target_path);
164/* Gets the target path for a symbolic link */
165
Nathan Moinvaziri21a31022018-10-24 09:50:16 -0700166uint64_t mz_os_ms_time(void);
Nathan Moinvazirib16ab562018-11-20 16:56:21 -0800167/* Gets the time in milliseconds */
Nathan Moinvaziri3431a662018-05-06 16:59:31 -0700168
Nathan Moinvaziriaa323f52017-10-05 23:32:57 -0700169/***************************************************************************/
170
171#ifdef __cplusplus
172}
173#endif
174
175#endif