Groonga
Loading...
Searching...
No Matches
portability.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2015-2017 Brazil
3 Copyright (C) 2022-2025 Sutou Kouhei <kou@clear-code.com>
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18*/
19
20#pragma once
21
22#ifdef WIN32
23# ifdef __cplusplus
24# define grn_memcpy(dest, src, n) ::memcpy_s((dest), (n), (src), (n))
25# else /* __cplusplus */
26# define grn_memcpy(dest, src, n) memcpy_s((dest), (n), (src), (n))
27# endif /* __cplusplus */
28#else /* WIN32 */
29# ifdef __cplusplus
30# define grn_memcpy(dest, src, n) ::memcpy((dest), (src), (n))
31# else /* __cplusplus */
32# define grn_memcpy(dest, src, n) memcpy((dest), (src), (n))
33# endif /* __cplusplus */
34#endif /* WIN32 */
35
36#ifdef WIN32
37# define grn_memmove(dest, src, n) memmove_s((dest), (n), (src), (n))
38#else /* WIN32 */
39# define grn_memmove(dest, src, n) memmove((dest), (src), (n))
40#endif /* WIN32 */
41
42#define GRN_ENV_BUFFER_SIZE 1024
43
44#ifdef WIN32
45# define grn_getenv(name, dest, dest_size) \
46 do { \
47 char *dest_ = (dest); \
48 size_t dest_size_ = (dest_size); \
49 if (dest_size_ > 0) { \
50 DWORD env_size; \
51 env_size = GetEnvironmentVariableA((name), dest_, dest_size_); \
52 if (env_size == 0 || env_size > dest_size_) { \
53 dest_[0] = '\0'; \
54 } \
55 } \
56 } while (0)
57#else /* WIN32 */
58# define grn_getenv(name, dest, dest_size) \
59 do { \
60 const char *env_value = getenv((name)); \
61 char *dest_ = (dest); \
62 size_t dest_size_ = (dest_size); \
63 if (dest_size_ > 0) { \
64 if (env_value) { \
65 strncpy(dest_, env_value, dest_size_ - 1); \
66 } else { \
67 dest_[0] = '\0'; \
68 } \
69 } \
70 } while (0)
71#endif /* WIN32 */
72
73#ifdef WIN32
74# define grn_fopen(name, mode) _fsopen((name), (mode), _SH_DENYNO)
75#else /* WIN32 */
76# define grn_fopen(name, mode) fopen((name), (mode))
77#endif /* WIN32 */
78
79#ifdef WIN32
80# define grn_strdup_raw(string) _strdup((string))
81#else /* WIN32 */
82# define grn_strdup_raw(string) strdup((string))
83#endif /* WIN32 */
84
85#ifdef WIN32
86# define grn_unlink(filename) _unlink((filename))
87#else /* WIN32 */
88# define grn_unlink(filename) unlink((filename))
89#endif /* WIN32 */
90
91#ifdef WIN32
92# define grn_strncat(dest, dest_size, src, n) \
93 strncat_s((dest), (dest_size), (src), (n))
94#else /* WIN32 */
95# define grn_strncat(dest, dest_size, src, n) strncat((dest), (src), (n))
96#endif /* WIN32 */
97
98#ifdef WIN32
99# define grn_strcpy(dest, dest_size, src) strcpy_s((dest), (dest_size), (src))
100#else /* WIN32 */
101# define grn_strcpy(dest, dest_size, src) strcpy((dest), (src))
102#endif /* WIN32 */
103
104#ifdef WIN32
105# define grn_strncpy(dest, dest_size, src, n) \
106 strncpy_s((dest), (dest_size), (src), (n))
107#else /* WIN32 */
108# define grn_strncpy(dest, dest_size, src, n) strncpy((dest), (src), (n))
109#endif /* WIN32 */
110
111#ifdef WIN32
112# define grn_strcat(dest, dest_size, src) strcat_s((dest), (dest_size), (src))
113#else /* WIN32 */
114# define grn_strcat(dest, dest_size, src) strcat((dest), (src))
115#endif /* WIN32 */
116
117#ifdef WIN32
118# define grn_strcasecmp(string1, string2) _stricmp((string1), (string2))
119#else /* WIN32 */
120# define grn_strcasecmp(string1, string2) strcasecmp((string1), (string2))
121#endif /* WIN32 */
122
123#ifdef WIN32
124# define grn_strncasecmp(string1, string2, n) \
125 _strnicmp((string1), (string2), (n))
126#else /* WIN32 */
127# define grn_strncasecmp(string1, string2, n) \
128 strncasecmp((string1), (string2), (n))
129#endif /* WIN32 */
130
131#ifdef WIN32
132# define grn_snprintf(dest, dest_size, n, ...) \
133 do { \
134 _snprintf_s((dest), (dest_size), (n) - 1, __VA_ARGS__); \
135 } while (false)
136#else /* WIN32 */
137# define grn_snprintf(dest, dest_size, n, ...) \
138 snprintf((dest), (n), __VA_ARGS__)
139#endif /* WIN32 */
140
141#ifdef WIN32
142# define grn_vsnprintf(dest, dest_size, format, args) \
143 do { \
144 vsnprintf((dest), (dest_size), (format), (args)); \
145 (dest)[(dest_size) - 1] = '\0'; \
146 } while (false)
147#else /* WIN32 */
148# define grn_vsnprintf(dest, dest_size, format, args) \
149 vsnprintf((dest), (dest_size), (format), (args))
150#endif /* WIN32 */
151
152#ifdef WIN32
153# define grn_write(fd, buf, count) _write((fd), (buf), (count))
154#else /* WIN32 */
155# define grn_write(fd, buf, count) write((fd), (buf), (count))
156#endif /* WIN32 */
157
158#ifdef WIN32
159# define grn_read(fd, buf, count) _read((fd), (buf), (count))
160#else /* WIN32 */
161# define grn_read(fd, buf, count) read((fd), (buf), (count))
162#endif /* WIN32 */
163
164#ifdef WIN32
165# define GRN_OPEN_CREATE_MODE (_S_IREAD | _S_IWRITE)
166# define GRN_OPEN_FLAG_BINARY _O_BINARY
167# define grn_open(fd, pathname, flags) \
168 _sopen_s(&(fd), (pathname), (flags), _SH_DENYNO, GRN_OPEN_CREATE_MODE)
169#else /* WIN32 */
170# define GRN_OPEN_CREATE_MODE (S_IRUSR | S_IWUSR | S_IRGRP)
171# define GRN_OPEN_FLAG_BINARY 0
172# define grn_open(fd, pathname, flags) \
173 (fd) = open((pathname), (flags), GRN_OPEN_CREATE_MODE)
174#endif /* WIN32 */
175
176#ifdef WIN32
177# define grn_close(fd) _close((fd))
178#else /* WIN32 */
179# define grn_close(fd) close((fd))
180#endif /* WIN32 */
181
182#ifdef WIN32
183# define grn_fileno(stream) _fileno((stream))
184#else /* WIN32 */
185# define grn_fileno(stream) fileno((stream))
186#endif /* WIN32 */
187
188#ifdef WIN32
189# define grn_isatty(stream) _isatty((stream))
190#else /* WIN32 */
191# define grn_isatty(stream) isatty((stream))
192#endif /* WIN32 */
193
194#ifdef WIN32
195# define grn_getpid() _getpid()
196#elif defined(__wasi__)
197# define grn_getpid() 1
198#else
199# define grn_getpid() getpid()
200#endif /* WIN32 */
201
202#ifdef WIN32
203# define grn_time_t __time64_t
204# define grn_time(dest_time) _time64((dest_time))
205# define grn_mktime(tm) _mktime64((tm))
206# define grn_timegm(tm) _mkgmtime64((tm))
207#else /* WIN32 */
208# define grn_time_t time_t
209# define grn_time(dest_time) time((dest_time))
210# define grn_mktime(tm) mktime((tm))
211# define grn_timegm(tm) timegm((tm))
212#endif /* WIN32 */