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 }