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