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 }