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