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-1335  USA
17 */
18 
19 #pragma once
20 
21 #ifdef WIN32
22 # ifdef __cplusplus
23 #  define grn_memcpy(dest, src, n) ::memcpy_s((dest), (n), (src), (n))
24 # else /* __cplusplus */
25 #  define grn_memcpy(dest, src, n) memcpy_s((dest), (n), (src), (n))
26 # endif /* __cplusplus */
27 #else /* WIN32 */
28 # ifdef __cplusplus
29 #  define grn_memcpy(dest, src, n) std::memcpy((dest), (src), (n))
30 # else /* __cplusplus */
31 #  define grn_memcpy(dest, src, n) memcpy((dest), (src), (n))
32 # endif /* __cplusplus */
33 #endif /* WIN32 */
34 
35 #ifdef WIN32
36 # define grn_memmove(dest, src, n) memmove_s((dest), (n), (src), (n))
37 #else /* WIN32 */
38 # define grn_memmove(dest, src, n) memmove((dest), (src), (n))
39 #endif /* WIN32 */
40 
41 #define GRN_ENV_BUFFER_SIZE 1024
42 
43 #ifdef WIN32
44 # define grn_getenv(name, dest, dest_size) do {                         \
45     char *dest_ = (dest);                                               \
46     size_t dest_size_ = (dest_size);                                    \
47     if (dest_size_ > 0) {                                               \
48       DWORD env_size;                                                   \
49       env_size = GetEnvironmentVariableA((name), dest_, dest_size_);    \
50       if (env_size == 0 || env_size > dest_size_) {                     \
51         dest_[0] = '\0';                                                \
52       }                                                                 \
53     }                                                                   \
54   } while (0)
55 #else /* WIN32 */
56 # define grn_getenv(name, dest, dest_size) do {         \
57     const char *env_value = getenv((name));             \
58     char *dest_ = (dest);                               \
59     size_t dest_size_ = (dest_size);                    \
60     if (dest_size_ > 0) {                               \
61       if (env_value) {                                  \
62         strncpy(dest_, env_value, dest_size_ - 1);      \
63       } else {                                          \
64         dest_[0] = '\0';                                \
65       }                                                 \
66     }                                                   \
67   } while (0)
68 #endif /* WIN32 */
69 
70 #ifdef WIN32
71 # define grn_fopen(name, mode) _fsopen((name), (mode), _SH_DENYNO)
72 #else /* WIN32 */
73 # define grn_fopen(name, mode) fopen((name), (mode))
74 #endif /* WIN32 */
75 
76 #ifdef WIN32
77 # define grn_strdup_raw(string) _strdup((string))
78 #else /* WIN32 */
79 # define grn_strdup_raw(string) strdup((string))
80 #endif /* WIN32 */
81 
82 #ifdef WIN32
83 # define grn_unlink(filename) _unlink((filename))
84 #else /* WIN32 */
85 # define grn_unlink(filename) unlink((filename))
86 #endif /* WIN32 */
87 
88 #ifdef WIN32
89 # define grn_strncat(dest, dest_size, src, n)   \
90   strncat_s((dest), (dest_size), (src), (n))
91 #else /* WIN32 */
92 # define grn_strncat(dest, dest_size, src, n)   \
93   strncat((dest), (src), (n))
94 #endif /* WIN32 */
95 
96 #ifdef WIN32
97 # define grn_strcpy(dest, dest_size, src)       \
98   strcpy_s((dest), (dest_size), (src))
99 #else /* WIN32 */
100 # define grn_strcpy(dest, dest_size, src)       \
101   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)   \
109   strncpy((dest), (src), (n))
110 #endif /* WIN32 */
111 
112 #ifdef WIN32
113 # define grn_strcat(dest, dest_size, src)       \
114   strcat_s((dest), (dest_size), (src))
115 #else /* WIN32 */
116 # define grn_strcat(dest, dest_size, src)       \
117   strcat((dest), (src))
118 #endif /* WIN32 */
119 
120 #ifdef WIN32
121 # define grn_strcasecmp(string1, string2)       \
122   _stricmp((string1), (string2))
123 #else /* WIN32 */
124 # define grn_strcasecmp(string1, string2)       \
125   strcasecmp((string1), (string2))
126 #endif /* WIN32 */
127 
128 #ifdef WIN32
129 # define grn_strncasecmp(string1, string2, n)   \
130   _strnicmp((string1), (string2), (n))
131 #else /* WIN32 */
132 # define grn_strncasecmp(string1, string2, n)   \
133   strncasecmp((string1), (string2), (n))
134 #endif /* WIN32 */
135 
136 #ifdef WIN32
137 # define grn_snprintf(dest, dest_size, n, ...) do {             \
138     _snprintf_s((dest), (dest_size), (n) - 1, __VA_ARGS__);     \
139   } while (GRN_FALSE)
140 #else /* WIN32 */
141 # define grn_snprintf(dest, dest_size, n, ...)  \
142   snprintf((dest), (n), __VA_ARGS__)
143 #endif /* WIN32 */
144 
145 #ifdef WIN32
146 # define grn_vsnprintf(dest, dest_size, format, args) do {      \
147     vsnprintf((dest), (dest_size), (format), (args));           \
148     (dest)[(dest_size) - 1] = '\0';                             \
149   } while (GRN_FALSE)
150 #else /* WIN32 */
151 # define grn_vsnprintf(dest, dest_size, format, args)           \
152   vsnprintf((dest), (dest_size), (format), (args))
153 #endif /* WIN32 */
154 
155 #ifdef WIN32
156 # define grn_write(fd, buf, count) _write((fd), (buf), (count))
157 #else /* WIN32 */
158 # define grn_write(fd, buf, count) write((fd), (buf), (count))
159 #endif /* WIN32 */
160 
161 #ifdef WIN32
162 # define grn_read(fd, buf, count) _read((fd), (buf), (count))
163 #else /* WIN32 */
164 # define grn_read(fd, buf, count) read((fd), (buf), (count))
165 #endif /* WIN32 */
166 
167 #ifdef WIN32
168 # define GRN_OPEN_CREATE_MODE (_S_IREAD | _S_IWRITE)
169 # define GRN_OPEN_FLAG_BINARY _O_BINARY
170 # define grn_open(fd, pathname, flags)                                  \
171   _sopen_s(&(fd), (pathname), (flags), _SH_DENYNO, GRN_OPEN_CREATE_MODE)
172 #else /* WIN32 */
173 # define GRN_OPEN_CREATE_MODE (S_IRUSR | S_IWUSR | S_IRGRP)
174 # define GRN_OPEN_FLAG_BINARY 0
175 # define grn_open(fd, pathname, flags)                          \
176   (fd) = open((pathname), (flags), GRN_OPEN_CREATE_MODE)
177 #endif /* WIN32 */
178 
179 #ifdef WIN32
180 # define grn_close(fd) _close((fd))
181 #else /* WIN32 */
182 # define grn_close(fd) close((fd))
183 #endif /* WIN32 */
184 
185 #ifdef WIN32
186 # define grn_fileno(stream) _fileno((stream))
187 #else /* WIN32 */
188 # define grn_fileno(stream) fileno((stream))
189 #endif /* WIN32 */
190 
191 #ifdef WIN32
192 # define grn_isatty(stream) _isatty((stream))
193 #else /* WIN32 */
194 # define grn_isatty(stream) isatty((stream))
195 #endif /* WIN32 */
196 
197 #ifdef WIN32
198 # define grn_getpid() _getpid()
199 #else /* WIN32 */
200 # define grn_getpid() getpid()
201 #endif /* WIN32 */
202