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