1 /** @file c_wrapper.h C wrapper for various libcore classes. 2 * @ingroup core 3 * 4 * Defines a C wrapper API for (some of the) libcore classes. Legacy code 5 * can use this wrapper API to access libcore functionality. Note that the 6 * identifiers in this file are @em not in the @c de namespace. 7 * 8 * @note The basic de data types (e.g., dint32) are not available for the C 9 * API; instead, only the standard C data types should be used. 10 * 11 * @authors Copyright © 2011-2017 Jaakko Keränen <jaakko.keranen@iki.fi> 12 * 13 * @par License 14 * LGPL: http://www.gnu.org/licenses/lgpl.html 15 * 16 * <small>This program is free software; you can redistribute it and/or modify 17 * it under the terms of the GNU Lesser General Public License as published by 18 * the Free Software Foundation; either version 3 of the License, or (at your 19 * option) any later version. This program is distributed in the hope that it 20 * will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty 21 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser 22 * General Public License for more details. You should have received a copy of 23 * the GNU Lesser General Public License along with this program; if not, see: 24 * http://www.gnu.org/licenses</small> 25 */ 26 27 #ifndef LIBDENG2_C_WRAPPER_H 28 #define LIBDENG2_C_WRAPPER_H 29 30 #include "libcore.h" 31 32 #if defined(__cplusplus) && !defined(DENG2_C_API_ONLY) 33 using de::dint16; 34 using de::dint32; 35 using de::dint64; 36 using de::duint16; 37 using de::duint32; 38 using de::duint64; 39 using de::dfloat; 40 using de::ddouble; 41 #endif 42 43 #ifdef __cplusplus 44 extern "C" { 45 #endif 46 47 /* 48 * App 49 */ 50 DENG2_PUBLIC void App_Log(unsigned int metadata, char const *format, ...); 51 DENG2_PUBLIC void App_Timer(unsigned int milliseconds, void (*callback)(void)); 52 DENG2_PUBLIC DENG2_NORETURN void App_FatalError(char const *msgFormat, ...); 53 54 /* 55 * CommandLine 56 */ 57 DENG2_PUBLIC void CommandLine_Alias(char const *longname, char const *shortname); 58 DENG2_PUBLIC int CommandLine_Count(void); 59 DENG2_PUBLIC char const *CommandLine_At(int i); 60 DENG2_PUBLIC char const *CommandLine_PathAt(int i); 61 DENG2_PUBLIC char const *CommandLine_Next(void); 62 DENG2_PUBLIC char const *CommandLine_NextAsPath(void); 63 DENG2_PUBLIC int CommandLine_Check(char const *check); 64 DENG2_PUBLIC int CommandLine_CheckWith(char const *check, int num); 65 DENG2_PUBLIC int CommandLine_Exists(char const *check); 66 DENG2_PUBLIC int CommandLine_IsOption(int i); 67 DENG2_PUBLIC int CommandLine_IsMatchingAlias(char const *original, char const *originalOrAlias); 68 69 /* 70 * LogBuffer 71 */ 72 #define DE2_ESC(StringLiteral) "\x1b" #StringLiteral 73 74 // Log levels (see de::Log for description). 75 typedef enum logentry_metadata_e 76 { 77 DE2_LOG_XVERBOSE = 1, 78 DE2_LOG_VERBOSE = 2, 79 DE2_LOG_MESSAGE = 3, 80 DE2_LOG_NOTE = 4, 81 DE2_LOG_WARNING = 5, 82 DE2_LOG_ERROR = 6, 83 DE2_LOG_CRITICAL = 7, 84 85 DE2_LOG_GENERIC = 0x10000, 86 DE2_LOG_RES = 0x20000, 87 DE2_LOG_MAP = 0x40000, ///< Map developer 88 DE2_LOG_SCR = 0x80000, ///< Script developer 89 DE2_LOG_GL = 0x100000, ///< GL domain (shaders, etc.) 90 DE2_LOG_AUDIO = 0x200000, ///< Audio domain 91 DE2_LOG_INPUT = 0x400000, ///< Input domain 92 DE2_LOG_NET = 0x800000, ///< Network domain 93 DE2_LOG_DEV = 0x8000000, ///< Native code developer (i.e., the programmer) 94 95 DE2_DEV_XVERBOSE = DE2_LOG_DEV | DE2_LOG_XVERBOSE, 96 DE2_DEV_VERBOSE = DE2_LOG_DEV | DE2_LOG_VERBOSE, 97 DE2_DEV_MSG = DE2_LOG_DEV | DE2_LOG_MESSAGE, 98 DE2_DEV_NOTE = DE2_LOG_DEV | DE2_LOG_NOTE, 99 DE2_DEV_WARNING = DE2_LOG_DEV | DE2_LOG_WARNING, 100 DE2_DEV_ERROR = DE2_LOG_DEV | DE2_LOG_ERROR, 101 DE2_DEV_CRITICAL = DE2_LOG_DEV | DE2_LOG_CRITICAL, 102 103 // RES 104 DE2_RES_XVERBOSE = DE2_LOG_RES | DE2_LOG_XVERBOSE, 105 DE2_RES_VERBOSE = DE2_LOG_RES | DE2_LOG_VERBOSE, 106 DE2_RES_MSG = DE2_LOG_RES | DE2_LOG_MESSAGE, 107 DE2_RES_NOTE = DE2_LOG_RES | DE2_LOG_NOTE, 108 DE2_RES_WARNING = DE2_LOG_RES | DE2_LOG_WARNING, 109 DE2_RES_ERROR = DE2_LOG_RES | DE2_LOG_ERROR, 110 DE2_RES_CRITICAL = DE2_LOG_RES | DE2_LOG_CRITICAL, 111 112 DE2_DEV_RES_XVERBOSE = DE2_LOG_DEV | DE2_LOG_RES | DE2_LOG_XVERBOSE, 113 DE2_DEV_RES_VERBOSE = DE2_LOG_DEV | DE2_LOG_RES | DE2_LOG_VERBOSE, 114 DE2_DEV_RES_MSG = DE2_LOG_DEV | DE2_LOG_RES | DE2_LOG_MESSAGE, 115 DE2_DEV_RES_NOTE = DE2_LOG_DEV | DE2_LOG_RES | DE2_LOG_NOTE, 116 DE2_DEV_RES_WARNING = DE2_LOG_DEV | DE2_LOG_RES | DE2_LOG_WARNING, 117 DE2_DEV_RES_ERROR = DE2_LOG_DEV | DE2_LOG_RES | DE2_LOG_ERROR, 118 DE2_DEV_RES_CRITICAL = DE2_LOG_DEV | DE2_LOG_RES | DE2_LOG_CRITICAL, 119 120 // MAP 121 DE2_MAP_XVERBOSE = DE2_LOG_MAP | DE2_LOG_XVERBOSE, 122 DE2_MAP_VERBOSE = DE2_LOG_MAP | DE2_LOG_VERBOSE, 123 DE2_MAP_MSG = DE2_LOG_MAP | DE2_LOG_MESSAGE, 124 DE2_MAP_NOTE = DE2_LOG_MAP | DE2_LOG_NOTE, 125 DE2_MAP_WARNING = DE2_LOG_MAP | DE2_LOG_WARNING, 126 DE2_MAP_ERROR = DE2_LOG_MAP | DE2_LOG_ERROR, 127 DE2_MAP_CRITICAL = DE2_LOG_MAP | DE2_LOG_CRITICAL, 128 129 DE2_DEV_MAP_XVERBOSE = DE2_LOG_DEV | DE2_LOG_MAP | DE2_LOG_XVERBOSE, 130 DE2_DEV_MAP_VERBOSE = DE2_LOG_DEV | DE2_LOG_MAP | DE2_LOG_VERBOSE, 131 DE2_DEV_MAP_MSG = DE2_LOG_DEV | DE2_LOG_MAP | DE2_LOG_MESSAGE, 132 DE2_DEV_MAP_NOTE = DE2_LOG_DEV | DE2_LOG_MAP | DE2_LOG_NOTE, 133 DE2_DEV_MAP_WARNING = DE2_LOG_DEV | DE2_LOG_MAP | DE2_LOG_WARNING, 134 DE2_DEV_MAP_ERROR = DE2_LOG_DEV | DE2_LOG_MAP | DE2_LOG_ERROR, 135 DE2_DEV_MAP_CRITICAL = DE2_LOG_DEV | DE2_LOG_MAP | DE2_LOG_CRITICAL, 136 137 // SCR 138 DE2_SCR_XVERBOSE = DE2_LOG_SCR | DE2_LOG_XVERBOSE, 139 DE2_SCR_VERBOSE = DE2_LOG_SCR | DE2_LOG_VERBOSE, 140 DE2_SCR_MSG = DE2_LOG_SCR | DE2_LOG_MESSAGE, 141 DE2_SCR_NOTE = DE2_LOG_SCR | DE2_LOG_NOTE, 142 DE2_SCR_WARNING = DE2_LOG_SCR | DE2_LOG_WARNING, 143 DE2_SCR_ERROR = DE2_LOG_SCR | DE2_LOG_ERROR, 144 DE2_SCR_CRITICAL = DE2_LOG_SCR | DE2_LOG_CRITICAL, 145 146 DE2_DEV_SCR_XVERBOSE = DE2_LOG_DEV | DE2_LOG_SCR | DE2_LOG_XVERBOSE, 147 DE2_DEV_SCR_VERBOSE = DE2_LOG_DEV | DE2_LOG_SCR | DE2_LOG_VERBOSE, 148 DE2_DEV_SCR_MSG = DE2_LOG_DEV | DE2_LOG_SCR | DE2_LOG_MESSAGE, 149 DE2_DEV_SCR_NOTE = DE2_LOG_DEV | DE2_LOG_SCR | DE2_LOG_NOTE, 150 DE2_DEV_SCR_WARNING = DE2_LOG_DEV | DE2_LOG_SCR | DE2_LOG_WARNING, 151 DE2_DEV_SCR_ERROR = DE2_LOG_DEV | DE2_LOG_SCR | DE2_LOG_ERROR, 152 DE2_DEV_SCR_CRITICAL = DE2_LOG_DEV | DE2_LOG_SCR | DE2_LOG_CRITICAL, 153 154 // GL 155 DE2_GL_XVERBOSE = DE2_LOG_GL | DE2_LOG_XVERBOSE, 156 DE2_GL_VERBOSE = DE2_LOG_GL | DE2_LOG_VERBOSE, 157 DE2_GL_MSG = DE2_LOG_GL | DE2_LOG_MESSAGE, 158 DE2_GL_NOTE = DE2_LOG_GL | DE2_LOG_NOTE, 159 DE2_GL_WARNING = DE2_LOG_GL | DE2_LOG_WARNING, 160 DE2_GL_ERROR = DE2_LOG_GL | DE2_LOG_ERROR, 161 DE2_GL_CRITICAL = DE2_LOG_GL | DE2_LOG_CRITICAL, 162 163 DE2_DEV_GL_XVERBOSE = DE2_LOG_DEV | DE2_LOG_GL | DE2_LOG_XVERBOSE, 164 DE2_DEV_GL_VERBOSE = DE2_LOG_DEV | DE2_LOG_GL | DE2_LOG_VERBOSE, 165 DE2_DEV_GL_MSG = DE2_LOG_DEV | DE2_LOG_GL | DE2_LOG_MESSAGE, 166 DE2_DEV_GL_NOTE = DE2_LOG_DEV | DE2_LOG_GL | DE2_LOG_NOTE, 167 DE2_DEV_GL_WARNING = DE2_LOG_DEV | DE2_LOG_GL | DE2_LOG_WARNING, 168 DE2_DEV_GL_ERROR = DE2_LOG_DEV | DE2_LOG_GL | DE2_LOG_ERROR, 169 DE2_DEV_GL_CRITICAL = DE2_LOG_DEV | DE2_LOG_GL | DE2_LOG_CRITICAL, 170 171 // AUDIO 172 DE2_AUDIO_XVERBOSE = DE2_LOG_AUDIO | DE2_LOG_XVERBOSE, 173 DE2_AUDIO_VERBOSE = DE2_LOG_AUDIO | DE2_LOG_VERBOSE, 174 DE2_AUDIO_MSG = DE2_LOG_AUDIO | DE2_LOG_MESSAGE, 175 DE2_AUDIO_NOTE = DE2_LOG_AUDIO | DE2_LOG_NOTE, 176 DE2_AUDIO_WARNING = DE2_LOG_AUDIO | DE2_LOG_WARNING, 177 DE2_AUDIO_ERROR = DE2_LOG_AUDIO | DE2_LOG_ERROR, 178 DE2_AUDIO_CRITICAL = DE2_LOG_AUDIO | DE2_LOG_CRITICAL, 179 180 DE2_DEV_AUDIO_XVERBOSE = DE2_LOG_DEV | DE2_LOG_AUDIO | DE2_LOG_XVERBOSE, 181 DE2_DEV_AUDIO_VERBOSE = DE2_LOG_DEV | DE2_LOG_AUDIO | DE2_LOG_VERBOSE, 182 DE2_DEV_AUDIO_MSG = DE2_LOG_DEV | DE2_LOG_AUDIO | DE2_LOG_MESSAGE, 183 DE2_DEV_AUDIO_NOTE = DE2_LOG_DEV | DE2_LOG_AUDIO | DE2_LOG_NOTE, 184 DE2_DEV_AUDIO_WARNING = DE2_LOG_DEV | DE2_LOG_AUDIO | DE2_LOG_WARNING, 185 DE2_DEV_AUDIO_ERROR = DE2_LOG_DEV | DE2_LOG_AUDIO | DE2_LOG_ERROR, 186 DE2_DEV_AUDIO_CRITICAL = DE2_LOG_DEV | DE2_LOG_AUDIO | DE2_LOG_CRITICAL, 187 188 // INPUT 189 DE2_INPUT_XVERBOSE = DE2_LOG_INPUT | DE2_LOG_XVERBOSE, 190 DE2_INPUT_VERBOSE = DE2_LOG_INPUT | DE2_LOG_VERBOSE, 191 DE2_INPUT_MSG = DE2_LOG_INPUT | DE2_LOG_MESSAGE, 192 DE2_INPUT_NOTE = DE2_LOG_INPUT | DE2_LOG_NOTE, 193 DE2_INPUT_WARNING = DE2_LOG_INPUT | DE2_LOG_WARNING, 194 DE2_INPUT_ERROR = DE2_LOG_INPUT | DE2_LOG_ERROR, 195 DE2_INPUT_CRITICAL = DE2_LOG_INPUT | DE2_LOG_CRITICAL, 196 197 DE2_DEV_INPUT_XVERBOSE = DE2_LOG_DEV | DE2_LOG_INPUT | DE2_LOG_XVERBOSE, 198 DE2_DEV_INPUT_VERBOSE = DE2_LOG_DEV | DE2_LOG_INPUT | DE2_LOG_VERBOSE, 199 DE2_DEV_INPUT_MSG = DE2_LOG_DEV | DE2_LOG_INPUT | DE2_LOG_MESSAGE, 200 DE2_DEV_INPUT_NOTE = DE2_LOG_DEV | DE2_LOG_INPUT | DE2_LOG_NOTE, 201 DE2_DEV_INPUT_WARNING = DE2_LOG_DEV | DE2_LOG_INPUT | DE2_LOG_WARNING, 202 DE2_DEV_INPUT_ERROR = DE2_LOG_DEV | DE2_LOG_INPUT | DE2_LOG_ERROR, 203 DE2_DEV_INPUT_CRITICAL = DE2_LOG_DEV | DE2_LOG_INPUT | DE2_LOG_CRITICAL, 204 205 // NET 206 DE2_NET_XVERBOSE = DE2_LOG_NET | DE2_LOG_XVERBOSE, 207 DE2_NET_VERBOSE = DE2_LOG_NET | DE2_LOG_VERBOSE, 208 DE2_NET_MSG = DE2_LOG_NET | DE2_LOG_MESSAGE, 209 DE2_NET_NOTE = DE2_LOG_NET | DE2_LOG_NOTE, 210 DE2_NET_WARNING = DE2_LOG_NET | DE2_LOG_WARNING, 211 DE2_NET_ERROR = DE2_LOG_NET | DE2_LOG_ERROR, 212 DE2_NET_CRITICAL = DE2_LOG_NET | DE2_LOG_CRITICAL, 213 214 DE2_DEV_NET_XVERBOSE = DE2_LOG_DEV | DE2_LOG_NET | DE2_LOG_XVERBOSE, 215 DE2_DEV_NET_VERBOSE = DE2_LOG_DEV | DE2_LOG_NET | DE2_LOG_VERBOSE, 216 DE2_DEV_NET_MSG = DE2_LOG_DEV | DE2_LOG_NET | DE2_LOG_MESSAGE, 217 DE2_DEV_NET_NOTE = DE2_LOG_DEV | DE2_LOG_NET | DE2_LOG_NOTE, 218 DE2_DEV_NET_WARNING = DE2_LOG_DEV | DE2_LOG_NET | DE2_LOG_WARNING, 219 DE2_DEV_NET_ERROR = DE2_LOG_DEV | DE2_LOG_NET | DE2_LOG_ERROR, 220 DE2_DEV_NET_CRITICAL = DE2_LOG_DEV | DE2_LOG_NET | DE2_LOG_CRITICAL 221 } 222 logentry_metadata_t; 223 224 #define DE2_LOG_DEBUG (DE2_LOG_DEV | DE2_LOG_VERBOSE) 225 #define DE2_LOG_TRACE (DE2_LOG_DEV | DE2_LOG_XVERBOSE) 226 227 DENG2_PUBLIC void LogBuffer_EnableStandardOutput(int enable); 228 DENG2_PUBLIC void LogBuffer_Flush(void); 229 DENG2_PUBLIC void LogBuffer_Clear(void); 230 DENG2_PUBLIC void LogBuffer_Printf(unsigned int metadata, char const *format, ...); // note: manual newlines 231 232 /* 233 * Info 234 */ 235 DENG2_OPAQUE(de_Info) 236 237 DENG2_PUBLIC de_Info *Info_NewFromString(char const *utf8text); 238 DENG2_PUBLIC de_Info *Info_NewFromFile(char const *nativePath); 239 DENG2_PUBLIC void Info_Delete(de_Info *info); 240 DENG2_PUBLIC int Info_FindValue(de_Info *info, char const *path, char *buffer, size_t bufSize); 241 242 /* 243 * UnixInfo 244 */ 245 DENG2_PUBLIC char *UnixInfo_GetConfigValue(char const *configFile, char const *key); // caller must free() returned 246 247 /* 248 * ByteOrder 249 */ 250 DENG2_PUBLIC dint16 LittleEndianByteOrder_ToForeignInt16(dint16 value); 251 DENG2_PUBLIC dint32 LittleEndianByteOrder_ToForeignInt32(dint32 value); 252 DENG2_PUBLIC dint64 LittleEndianByteOrder_ToForeignInt64(dint64 value); 253 DENG2_PUBLIC duint16 LittleEndianByteOrder_ToForeignUInt16(duint16 value); 254 DENG2_PUBLIC duint32 LittleEndianByteOrder_ToForeignUInt32(duint32 value); 255 DENG2_PUBLIC duint64 LittleEndianByteOrder_ToForeignUInt64(duint64 value); 256 DENG2_PUBLIC dfloat LittleEndianByteOrder_ToForeignFloat(dfloat value); 257 DENG2_PUBLIC ddouble LittleEndianByteOrder_ToForeignDouble(ddouble value); 258 DENG2_PUBLIC dint16 LittleEndianByteOrder_ToNativeInt16(dint16 value); 259 DENG2_PUBLIC dint32 LittleEndianByteOrder_ToNativeInt32(dint32 value); 260 DENG2_PUBLIC dint64 LittleEndianByteOrder_ToNativeInt64(dint64 value); 261 DENG2_PUBLIC duint16 LittleEndianByteOrder_ToNativeUInt16(duint16 value); 262 DENG2_PUBLIC duint32 LittleEndianByteOrder_ToNativeUInt32(duint32 value); 263 DENG2_PUBLIC duint64 LittleEndianByteOrder_ToNativeUInt64(duint64 value); 264 DENG2_PUBLIC dfloat LittleEndianByteOrder_ToNativeFloat(dfloat value); 265 DENG2_PUBLIC ddouble LittleEndianByteOrder_ToNativeDouble(ddouble value); 266 267 #ifdef __cplusplus 268 } // extern "C" 269 #endif 270 271 #endif // LIBDENG2_C_WRAPPER_H 272