-
-
Notifications
You must be signed in to change notification settings - Fork 150
/
cross.h
164 lines (128 loc) · 4.42 KB
/
cross.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
/*
* SPDX-License-Identifier: GPL-2.0-or-later
*
* Copyright (C) 2021-2023 The DOSBox Staging Team
* Copyright (C) 2002-2021 The DOSBox Team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef DOSBOX_CROSS_H
#define DOSBOX_CROSS_H
#include "dosbox.h"
#include <cstdio>
#include <string>
#include <vector>
#include <ctime>
#include <sys/stat.h>
#include <sys/types.h>
#if defined (_MSC_VER) /* MS Visual C++ */
#include <direct.h>
#include <io.h>
#define LONGTYPE(a) a##i64
#else /* LINUX / GCC */
#include <dirent.h>
#include <unistd.h>
#define LONGTYPE(a) a##LL
#endif
#include "std_filesystem.h"
#define CROSS_LEN 512 /* Maximum filename size */
#if defined (WIN32)
#define CROSS_FILENAME(blah)
#define CROSS_FILESPLIT '\\'
#else
#define CROSS_FILENAME(blah) strreplace(blah,'\\','/')
#define CROSS_FILESPLIT '/'
#endif
#define CROSS_NONE 0
#define CROSS_FILE 1
#define CROSS_DIR 2
#if defined (WIN32) && !defined (__MINGW32__)
#define ftruncate(blah,blah2) chsize(blah,blah2)
#endif
/* Large file support */
#if defined(_MSC_VER)
// MSVC doesn't support the posix fstream functions,
// typedef their equivalents
#define cross_ftello _ftelli64
#define cross_fseeko _fseeki64
#define cross_off_t __int64
#else
// All other platforms should have POSIX fstream 'o' support
// Note: Meson automatically sets preprocessor defines for us
// Check that off_t is 64 bits
static_assert(sizeof(off_t) == sizeof(int64_t), "off_t not 64 bits");
#define cross_ftello ftello
#define cross_fseeko fseeko
#define cross_off_t off_t
#endif
// fileno is a POSIX function (not mentioned in ISO/C++), which means it might
// be missing when when using C++11 with strict ANSI compatibility.
// New MSVC issues "deprecation" warning when fileno is used and recommends
// using (platform-specific) _fileno. On other platforms we can use fileno
// because it's either a POSIX-compliant system, or the function is available
// when compiling with GNU extensions.
#if defined (_MSC_VER)
#define cross_fileno(s) _fileno(s)
#else
#define cross_fileno(s) fileno(s)
#endif
namespace cross {
#if defined(WIN32)
struct tm *localtime_r(const time_t *timep, struct tm *result);
#else
constexpr auto localtime_r = ::localtime_r;
#endif
} // namespace cross
void CROSS_DetermineConfigPaths();
std_fs::path get_platform_config_dir();
std_fs::path resolve_home(const std::string &str) noexcept;
class Cross {
public:
static void GetPlatformConfigName(std::string& in);
static void CreatePlatformConfigDir(std::string& in);
static bool IsPathAbsolute(std::string const& in);
};
#if defined (WIN32)
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
typedef struct dir_struct {
HANDLE handle;
char base_path[MAX_PATH+4];
WIN32_FIND_DATA search_data;
} dir_information;
#else
//#include <sys/types.h> //Included above
#include <dirent.h>
typedef struct dir_struct {
DIR* dir;
char base_path[CROSS_LEN];
} dir_information;
#endif
dir_information* open_directory(const char* dirname);
bool read_directory_first(dir_information* dirp, char* entry_name, bool& is_directory);
bool read_directory_next(dir_information* dirp, char* entry_name, bool& is_directory);
void close_directory(dir_information* dirp);
FILE *fopen_wrap(const char *path, const char *mode);
FILE *fopen_wrap_ro_fallback(const std::string &filename, bool &is_readonly);
bool wild_match(const char *haystack, const char *needle);
bool WildFileCmp(const char *file, const char *wild, bool long_compare = false);
bool get_expanded_files(const std::string &path,
std::vector<std::string> &files,
bool files_only,
bool skip_native_path = false) noexcept;
std::string get_language_from_os();
#endif