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 groonga_d.groonga;
23 
24 extern(C):
25 nothrow @nogc:
26 
27 /+
28 #ifdef WIN32
29 	#ifdef __cplusplus
30 		#define grn_memcpy(dest, src, n) ::memcpy_s((dest), (n), (src), (n))
31 	#else
32 		#define grn_memcpy(dest, src, n) memcpy_s((dest), (n), (src), (n))
33 	#endif
34 #else
35 	#ifdef __cplusplus
36 		#define grn_memcpy(dest, src, n) std::memcpy((dest), (src), (n))
37 	#else
38 		#define grn_memcpy(dest, src, n) memcpy((dest), (src), (n))
39 	#endif
40 #endif
41 
42 #ifdef WIN32
43 	#define grn_memmove(dest, src, n) memmove_s((dest), (n), (src), (n))
44 #else
45 	#define grn_memmove(dest, src, n) memmove((dest), (src), (n))
46 #endif
47 
48 enum GRN_ENV_BUFFER_SIZE = 1024;
49 
50 #ifdef WIN32
51 	# 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'; } }
52 #else
53 	# 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'; } }
54 #endif
55 
56 #ifdef WIN32
57 	#define grn_fopen(name, mode) _fsopen((name), (mode), _SH_DENYNO)
58 #else
59 	#define grn_fopen(name, mode) fopen((name), (mode))
60 #endif
61 
62 #ifdef WIN32
63 	#define grn_strdup_raw(string_) _strdup((string_))
64 #else
65 	#define grn_strdup_raw(string_) strdup((string_))
66 #endif
67 
68 #ifdef WIN32
69 	#define grn_unlink(filename) _unlink((filename))
70 #else
71 	#define grn_unlink(filename) unlink((filename))
72 #endif
73 
74 #ifdef WIN32
75 	# define grn_strncat(dest, dest_size, src, n) strncat_s((dest), (dest_size), (src), (n))
76 #else
77 	# define grn_strncat(dest, dest_size, src, n) strncat((dest), (src), (n))
78 #endif
79 
80 #ifdef WIN32
81 	# define grn_strcpy(dest, dest_size, src) strcpy_s((dest), (dest_size), (src))
82 #else
83 	# define grn_strcpy(dest, dest_size, src) strcpy((dest), (src))
84 #endif
85 
86 #ifdef WIN32
87 	# define grn_strncpy(dest, dest_size, src, n) strncpy_s((dest), (dest_size), (src), (n))
88 #else
89 	# define grn_strncpy(dest, dest_size, src, n) strncpy((dest), (src), (n))
90 #endif
91 
92 #ifdef WIN32
93 	# define grn_strcat(dest, dest_size, src) strcat_s((dest), (dest_size), (src))
94 #else
95 	# define grn_strcat(dest, dest_size, src) strcat((dest), (src))
96 #endif
97 
98 #ifdef WIN32
99 	# define grn_strcasecmp(string1, string2) _stricmp((string1), (string2))
100 #else
101 	# define grn_strcasecmp(string1, string2) strcasecmp((string1), (string2))
102 #endif
103 
104 #ifdef WIN32
105 	# define grn_strncasecmp(string1, string2, n) _strnicmp((string1), (string2), (n))
106 #else
107 	# define grn_strncasecmp(string1, string2, n) strncasecmp((string1), (string2), (n))
108 #endif
109 
110 #ifdef WIN32
111 	# define grn_snprintf(dest, dest_size, n, ...) do { _snprintf_s((dest), (dest_size), (n) - 1, __VA_ARGS__); } while (groonga_d.groonga.GRN_FALSE)
112 #else
113 	# define grn_snprintf(dest, dest_size, n, ...) snprintf((dest), (n), __VA_ARGS__)
114 #endif
115 
116 #ifdef WIN32
117 	# 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)
118 #else
119 	# define grn_vsnprintf(dest, dest_size, format, args) vsnprintf((dest), (dest_size), (format), (args))
120 #endif
121 
122 #ifdef WIN32
123 	#define grn_write(fd, buf, count) _write((fd), (buf), (count))
124 #else
125 	#define grn_write(fd, buf, count) write((fd), (buf), (count))
126 #endif
127 
128 #ifdef WIN32
129 	#define grn_read(fd, buf, count) _read((fd), (buf), (count))
130 #else
131 	#define grn_read(fd, buf, count) read((fd), (buf), (count))
132 #endif
133 
134 #ifdef WIN32
135 	# define GRN_OPEN_CREATE_MODE (_S_IREAD | _S_IWRITE)
136 	enum GRN_OPEN_FLAG_BINARY = _O_BINARY;
137 	# define grn_open(fd, pathname, flags) _sopen_s(&(fd), (pathname), (flags), _SH_DENYNO, GRN_OPEN_CREATE_MODE)
138 #else
139 	# define GRN_OPEN_CREATE_MODE (S_IRUSR | S_IWUSR | S_IRGRP)
140 	enum GRN_OPEN_FLAG_BINARY = 0;
141 	# define grn_open(fd, pathname, flags) (fd) = open((pathname), (flags), GRN_OPEN_CREATE_MODE)
142 #endif
143 
144 #ifdef WIN32
145 	#define grn_close(fd) _close((fd))
146 #else
147 	#define grn_close(fd) close((fd))
148 #endif
149 
150 #ifdef WIN32
151 	#define grn_fileno(stream) _fileno((stream))
152 #else
153 	#define grn_fileno(stream) fileno((stream))
154 #endif
155 
156 #ifdef WIN32
157 	#define grn_isatty(stream) _isatty((stream))
158 #else
159 	#define grn_isatty(stream) isatty((stream))
160 #endif
161 
162 #ifdef WIN32
163 	#define grn_getpid() _getpid()
164 #else
165 	#define grn_getpid() getpid()
166 #endif
167 +/
168 
169 version (Win32) {
170 	/+
171 	alias grn_time_t = __time64_t;
172 	alias grn_time = _time64;
173 	alias grn_mktime = _mktime64;
174 	+/
175 } else {
176 	alias grn_time_t = core.stdc.time.time_t;
177 	alias grn_time = core.stdc.time.time;
178 	alias grn_mktime = core.stdc.time.mktime;
179 }