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