Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix unicode support in tinydir_file_open #39 #40

Merged
merged 4 commits into from
Sep 8, 2016
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 28 additions & 9 deletions tinydir.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,15 +84,27 @@ extern "C" {
#define _tinydir_strncmp strncmp
#endif

#define _TINYDIR_PATH_MAX 4096
#if (defined _MSC_VER || defined __MINGW32__)
#include <windows.h>
#define PATH_MAX MAX_PATH
#elif defined __linux__
#include <linux/limits.h>
#endif
#define _TINYDIR_PATH_MAX PATH_MAX

#ifdef _MSC_VER
/* extra chars for the "\\*" mask */
# define _TINYDIR_PATH_EXTRA 2
#else
# define _TINYDIR_PATH_EXTRA 0
#endif

#define _TINYDIR_FILENAME_MAX 256

#if (defined _MSC_VER || defined __MINGW32__)
#define _TINYDIR_DRIVE_MAX 3
#endif

#ifdef _MSC_VER
# define _TINYDIR_FUNC static __inline
#elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
Expand Down Expand Up @@ -209,6 +221,8 @@ int tinydir_readfile_n(const tinydir_dir *dir, tinydir_file *file, size_t i);
_TINYDIR_FUNC
int tinydir_open_subdir_n(tinydir_dir *dir, size_t i);

_TINYDIR_FUNC
int tinydir_file_open(tinydir_file *file, const _tinydir_char_t *path);
_TINYDIR_FUNC
void _tinydir_get_ext(tinydir_file *file);
_TINYDIR_FUNC
Expand Down Expand Up @@ -624,10 +638,10 @@ int tinydir_file_open(tinydir_file *file, const _tinydir_char_t *path)
#if ((defined _MSC_VER) && (_MSC_VER >= 1400))
_tsplitpath_s(
path,
drive_buf, sizeof drive_buf,
dir_name_buf, sizeof dir_name_buf,
file_name_buf, sizeof file_name_buf,
ext_buf, sizeof ext_buf);
drive_buf, _TINYDIR_DRIVE_MAX,
dir_name_buf, _TINYDIR_FILENAME_MAX,
file_name_buf, _TINYDIR_FILENAME_MAX,
ext_buf, sizeof _TINYDIR_FILENAME_MAX);
#else
_tsplitpath(
path,
Expand All @@ -636,18 +650,23 @@ int tinydir_file_open(tinydir_file *file, const _tinydir_char_t *path)
file_name_buf,
ext_buf);
#endif

/* _splitpath_s not work fine with only filename and widechar support */
#ifdef _UNICODE
if (drive_buf[0] == L'\xFEFE')
drive_buf[0] = '\0';
if (dir_name_buf[0] == L'\xFEFE')
dir_name_buf[0] = '\0';
#endif

if (errno)
{
errno = EINVAL;
return -1;
}
/* Emulate the behavior of dirname by returning "." for dir name if it's
empty */
#if ((defined _MSC_VER || defined __MINGW32__) && (defined UNICODE))
if (drive_buf[0] == '\0' && drive_buf[1] == '\0' && dir_name_buf[0] == '\0' && dir_name_buf[1] == '\0')
#else
if (drive_buf[0] == '\0' && dir_name_buf[0] == '\0')
#endif
{
_tinydir_strcpy(dir_name_buf, TINYDIR_STRING("."));
}
Expand Down