gtypes.h 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482
  1. /* GLIB - Library of useful routines for C programming
  2. * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
  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 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, see <http://www.gnu.org/licenses/>.
  16. */
  17. /*
  18. * Modified by the GLib Team and others 1997-2000. See the AUTHORS
  19. * file for a list of people on the GLib Team. See the ChangeLog
  20. * files for a list of changes. These files are distributed with
  21. * GLib at ftp://ftp.gtk.org/pub/gtk/.
  22. */
  23. #ifndef __G_TYPES_H__
  24. #define __G_TYPES_H__
  25. #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
  26. #error "Only <glib.h> can be included directly."
  27. #endif
  28. #include <glibconfig.h>
  29. #include <glib/gmacros.h>
  30. #include <glib/gversionmacros.h>
  31. #include <time.h>
  32. G_BEGIN_DECLS
  33. /* Provide type definitions for commonly used types.
  34. * These are useful because a "gint8" can be adjusted
  35. * to be 1 byte (8 bits) on all platforms. Similarly and
  36. * more importantly, "gint32" can be adjusted to be
  37. * 4 bytes (32 bits) on all platforms.
  38. */
  39. typedef char gchar;
  40. typedef short gshort;
  41. typedef long glong;
  42. typedef int gint;
  43. typedef gint gboolean;
  44. typedef unsigned char guchar;
  45. typedef unsigned short gushort;
  46. typedef unsigned long gulong;
  47. typedef unsigned int guint;
  48. typedef float gfloat;
  49. typedef double gdouble;
  50. /* Define min and max constants for the fixed size numerical types */
  51. #define G_MININT8 ((gint8) 0x80)
  52. #define G_MAXINT8 ((gint8) 0x7f)
  53. #define G_MAXUINT8 ((guint8) 0xff)
  54. #define G_MININT16 ((gint16) 0x8000)
  55. #define G_MAXINT16 ((gint16) 0x7fff)
  56. #define G_MAXUINT16 ((guint16) 0xffff)
  57. #define G_MININT32 ((gint32) 0x80000000)
  58. #define G_MAXINT32 ((gint32) 0x7fffffff)
  59. #define G_MAXUINT32 ((guint32) 0xffffffff)
  60. #define G_MININT64 ((gint64) G_GINT64_CONSTANT(0x8000000000000000))
  61. #define G_MAXINT64 G_GINT64_CONSTANT(0x7fffffffffffffff)
  62. #define G_MAXUINT64 G_GINT64_CONSTANT(0xffffffffffffffffU)
  63. typedef void* gpointer;
  64. typedef const void *gconstpointer;
  65. typedef gint (*GCompareFunc) (gconstpointer a,
  66. gconstpointer b);
  67. typedef gint (*GCompareDataFunc) (gconstpointer a,
  68. gconstpointer b,
  69. gpointer user_data);
  70. typedef gboolean (*GEqualFunc) (gconstpointer a,
  71. gconstpointer b);
  72. typedef void (*GDestroyNotify) (gpointer data);
  73. typedef void (*GFunc) (gpointer data,
  74. gpointer user_data);
  75. typedef guint (*GHashFunc) (gconstpointer key);
  76. typedef void (*GHFunc) (gpointer key,
  77. gpointer value,
  78. gpointer user_data);
  79. /**
  80. * GFreeFunc:
  81. * @data: a data pointer
  82. *
  83. * Declares a type of function which takes an arbitrary
  84. * data pointer argument and has no return value. It is
  85. * not currently used in GLib or GTK+.
  86. */
  87. typedef void (*GFreeFunc) (gpointer data);
  88. /**
  89. * GTranslateFunc:
  90. * @str: the untranslated string
  91. * @data: user data specified when installing the function, e.g.
  92. * in g_option_group_set_translate_func()
  93. *
  94. * The type of functions which are used to translate user-visible
  95. * strings, for <option>--help</option> output.
  96. *
  97. * Returns: a translation of the string for the current locale.
  98. * The returned string is owned by GLib and must not be freed.
  99. */
  100. typedef const gchar * (*GTranslateFunc) (const gchar *str,
  101. gpointer data);
  102. /* Define some mathematical constants that aren't available
  103. * symbolically in some strict ISO C implementations.
  104. *
  105. * Note that the large number of digits used in these definitions
  106. * doesn't imply that GLib or current computers in general would be
  107. * able to handle floating point numbers with an accuracy like this.
  108. * It's mostly an exercise in futility and future proofing. For
  109. * extended precision floating point support, look somewhere else
  110. * than GLib.
  111. */
  112. #define G_E 2.7182818284590452353602874713526624977572470937000
  113. #define G_LN2 0.69314718055994530941723212145817656807550013436026
  114. #define G_LN10 2.3025850929940456840179914546843642076011014886288
  115. #define G_PI 3.1415926535897932384626433832795028841971693993751
  116. #define G_PI_2 1.5707963267948966192313216916397514420985846996876
  117. #define G_PI_4 0.78539816339744830961566084581987572104929234984378
  118. #define G_SQRT2 1.4142135623730950488016887242096980785696718753769
  119. /* Portable endian checks and conversions
  120. *
  121. * glibconfig.h defines G_BYTE_ORDER which expands to one of
  122. * the below macros.
  123. */
  124. #define G_LITTLE_ENDIAN 1234
  125. #define G_BIG_ENDIAN 4321
  126. #define G_PDP_ENDIAN 3412 /* unused, need specific PDP check */
  127. /* Basic bit swapping functions
  128. */
  129. #define GUINT16_SWAP_LE_BE_CONSTANT(val) ((guint16) ( \
  130. (guint16) ((guint16) (val) >> 8) | \
  131. (guint16) ((guint16) (val) << 8)))
  132. #define GUINT32_SWAP_LE_BE_CONSTANT(val) ((guint32) ( \
  133. (((guint32) (val) & (guint32) 0x000000ffU) << 24) | \
  134. (((guint32) (val) & (guint32) 0x0000ff00U) << 8) | \
  135. (((guint32) (val) & (guint32) 0x00ff0000U) >> 8) | \
  136. (((guint32) (val) & (guint32) 0xff000000U) >> 24)))
  137. #define GUINT64_SWAP_LE_BE_CONSTANT(val) ((guint64) ( \
  138. (((guint64) (val) & \
  139. (guint64) G_GINT64_CONSTANT (0x00000000000000ffU)) << 56) | \
  140. (((guint64) (val) & \
  141. (guint64) G_GINT64_CONSTANT (0x000000000000ff00U)) << 40) | \
  142. (((guint64) (val) & \
  143. (guint64) G_GINT64_CONSTANT (0x0000000000ff0000U)) << 24) | \
  144. (((guint64) (val) & \
  145. (guint64) G_GINT64_CONSTANT (0x00000000ff000000U)) << 8) | \
  146. (((guint64) (val) & \
  147. (guint64) G_GINT64_CONSTANT (0x000000ff00000000U)) >> 8) | \
  148. (((guint64) (val) & \
  149. (guint64) G_GINT64_CONSTANT (0x0000ff0000000000U)) >> 24) | \
  150. (((guint64) (val) & \
  151. (guint64) G_GINT64_CONSTANT (0x00ff000000000000U)) >> 40) | \
  152. (((guint64) (val) & \
  153. (guint64) G_GINT64_CONSTANT (0xff00000000000000U)) >> 56)))
  154. /* Arch specific stuff for speed
  155. */
  156. #if defined (__GNUC__) && (__GNUC__ >= 2) && defined (__OPTIMIZE__)
  157. # if __GNUC__ >= 4 && defined (__GNUC_MINOR__) && __GNUC_MINOR__ >= 3
  158. # define GUINT32_SWAP_LE_BE(val) ((guint32) __builtin_bswap32 ((gint32) (val)))
  159. # define GUINT64_SWAP_LE_BE(val) ((guint64) __builtin_bswap64 ((gint64) (val)))
  160. # endif
  161. # if defined (__i386__)
  162. # define GUINT16_SWAP_LE_BE_IA32(val) \
  163. (G_GNUC_EXTENSION \
  164. ({ register guint16 __v, __x = ((guint16) (val)); \
  165. if (__builtin_constant_p (__x)) \
  166. __v = GUINT16_SWAP_LE_BE_CONSTANT (__x); \
  167. else \
  168. __asm__ ("rorw $8, %w0" \
  169. : "=r" (__v) \
  170. : "0" (__x) \
  171. : "cc"); \
  172. __v; }))
  173. # if !defined (__i486__) && !defined (__i586__) \
  174. && !defined (__pentium__) && !defined (__i686__) \
  175. && !defined (__pentiumpro__) && !defined (__pentium4__)
  176. # define GUINT32_SWAP_LE_BE_IA32(val) \
  177. (G_GNUC_EXTENSION \
  178. ({ register guint32 __v, __x = ((guint32) (val)); \
  179. if (__builtin_constant_p (__x)) \
  180. __v = GUINT32_SWAP_LE_BE_CONSTANT (__x); \
  181. else \
  182. __asm__ ("rorw $8, %w0\n\t" \
  183. "rorl $16, %0\n\t" \
  184. "rorw $8, %w0" \
  185. : "=r" (__v) \
  186. : "0" (__x) \
  187. : "cc"); \
  188. __v; }))
  189. # else /* 486 and higher has bswap */
  190. # define GUINT32_SWAP_LE_BE_IA32(val) \
  191. (G_GNUC_EXTENSION \
  192. ({ register guint32 __v, __x = ((guint32) (val)); \
  193. if (__builtin_constant_p (__x)) \
  194. __v = GUINT32_SWAP_LE_BE_CONSTANT (__x); \
  195. else \
  196. __asm__ ("bswap %0" \
  197. : "=r" (__v) \
  198. : "0" (__x)); \
  199. __v; }))
  200. # endif /* processor specific 32-bit stuff */
  201. # define GUINT64_SWAP_LE_BE_IA32(val) \
  202. (G_GNUC_EXTENSION \
  203. ({ union { guint64 __ll; \
  204. guint32 __l[2]; } __w, __r; \
  205. __w.__ll = ((guint64) (val)); \
  206. if (__builtin_constant_p (__w.__ll)) \
  207. __r.__ll = GUINT64_SWAP_LE_BE_CONSTANT (__w.__ll); \
  208. else \
  209. { \
  210. __r.__l[0] = GUINT32_SWAP_LE_BE (__w.__l[1]); \
  211. __r.__l[1] = GUINT32_SWAP_LE_BE (__w.__l[0]); \
  212. } \
  213. __r.__ll; }))
  214. /* Possibly just use the constant version and let gcc figure it out? */
  215. # define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_IA32 (val))
  216. # ifndef GUINT32_SWAP_LE_BE
  217. # define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_IA32 (val))
  218. # endif
  219. # ifndef GUINT64_SWAP_LE_BE
  220. # define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_IA32 (val))
  221. # endif
  222. # elif defined (__ia64__)
  223. # define GUINT16_SWAP_LE_BE_IA64(val) \
  224. (G_GNUC_EXTENSION \
  225. ({ register guint16 __v, __x = ((guint16) (val)); \
  226. if (__builtin_constant_p (__x)) \
  227. __v = GUINT16_SWAP_LE_BE_CONSTANT (__x); \
  228. else \
  229. __asm__ __volatile__ ("shl %0 = %1, 48 ;;" \
  230. "mux1 %0 = %0, @rev ;;" \
  231. : "=r" (__v) \
  232. : "r" (__x)); \
  233. __v; }))
  234. # define GUINT32_SWAP_LE_BE_IA64(val) \
  235. (G_GNUC_EXTENSION \
  236. ({ register guint32 __v, __x = ((guint32) (val)); \
  237. if (__builtin_constant_p (__x)) \
  238. __v = GUINT32_SWAP_LE_BE_CONSTANT (__x); \
  239. else \
  240. __asm__ __volatile__ ("shl %0 = %1, 32 ;;" \
  241. "mux1 %0 = %0, @rev ;;" \
  242. : "=r" (__v) \
  243. : "r" (__x)); \
  244. __v; }))
  245. # define GUINT64_SWAP_LE_BE_IA64(val) \
  246. (G_GNUC_EXTENSION \
  247. ({ register guint64 __v, __x = ((guint64) (val)); \
  248. if (__builtin_constant_p (__x)) \
  249. __v = GUINT64_SWAP_LE_BE_CONSTANT (__x); \
  250. else \
  251. __asm__ __volatile__ ("mux1 %0 = %1, @rev ;;" \
  252. : "=r" (__v) \
  253. : "r" (__x)); \
  254. __v; }))
  255. # define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_IA64 (val))
  256. # ifndef GUINT32_SWAP_LE_BE
  257. # define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_IA64 (val))
  258. # endif
  259. # ifndef GUINT64_SWAP_LE_BE
  260. # define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_IA64 (val))
  261. # endif
  262. # elif defined (__x86_64__)
  263. # define GUINT32_SWAP_LE_BE_X86_64(val) \
  264. (G_GNUC_EXTENSION \
  265. ({ register guint32 __v, __x = ((guint32) (val)); \
  266. if (__builtin_constant_p (__x)) \
  267. __v = GUINT32_SWAP_LE_BE_CONSTANT (__x); \
  268. else \
  269. __asm__ ("bswapl %0" \
  270. : "=r" (__v) \
  271. : "0" (__x)); \
  272. __v; }))
  273. # define GUINT64_SWAP_LE_BE_X86_64(val) \
  274. (G_GNUC_EXTENSION \
  275. ({ register guint64 __v, __x = ((guint64) (val)); \
  276. if (__builtin_constant_p (__x)) \
  277. __v = GUINT64_SWAP_LE_BE_CONSTANT (__x); \
  278. else \
  279. __asm__ ("bswapq %0" \
  280. : "=r" (__v) \
  281. : "0" (__x)); \
  282. __v; }))
  283. /* gcc seems to figure out optimal code for this on its own */
  284. # define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_CONSTANT (val))
  285. # ifndef GUINT32_SWAP_LE_BE
  286. # define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_X86_64 (val))
  287. # endif
  288. # ifndef GUINT64_SWAP_LE_BE
  289. # define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_X86_64 (val))
  290. # endif
  291. # else /* generic gcc */
  292. # define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_CONSTANT (val))
  293. # ifndef GUINT32_SWAP_LE_BE
  294. # define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_CONSTANT (val))
  295. # endif
  296. # ifndef GUINT64_SWAP_LE_BE
  297. # define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_CONSTANT (val))
  298. # endif
  299. # endif
  300. #else /* generic */
  301. # define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_CONSTANT (val))
  302. # define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_CONSTANT (val))
  303. # define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_CONSTANT (val))
  304. #endif /* generic */
  305. #define GUINT16_SWAP_LE_PDP(val) ((guint16) (val))
  306. #define GUINT16_SWAP_BE_PDP(val) (GUINT16_SWAP_LE_BE (val))
  307. #define GUINT32_SWAP_LE_PDP(val) ((guint32) ( \
  308. (((guint32) (val) & (guint32) 0x0000ffffU) << 16) | \
  309. (((guint32) (val) & (guint32) 0xffff0000U) >> 16)))
  310. #define GUINT32_SWAP_BE_PDP(val) ((guint32) ( \
  311. (((guint32) (val) & (guint32) 0x00ff00ffU) << 8) | \
  312. (((guint32) (val) & (guint32) 0xff00ff00U) >> 8)))
  313. /* The G*_TO_?E() macros are defined in glibconfig.h.
  314. * The transformation is symmetric, so the FROM just maps to the TO.
  315. */
  316. #define GINT16_FROM_LE(val) (GINT16_TO_LE (val))
  317. #define GUINT16_FROM_LE(val) (GUINT16_TO_LE (val))
  318. #define GINT16_FROM_BE(val) (GINT16_TO_BE (val))
  319. #define GUINT16_FROM_BE(val) (GUINT16_TO_BE (val))
  320. #define GINT32_FROM_LE(val) (GINT32_TO_LE (val))
  321. #define GUINT32_FROM_LE(val) (GUINT32_TO_LE (val))
  322. #define GINT32_FROM_BE(val) (GINT32_TO_BE (val))
  323. #define GUINT32_FROM_BE(val) (GUINT32_TO_BE (val))
  324. #define GINT64_FROM_LE(val) (GINT64_TO_LE (val))
  325. #define GUINT64_FROM_LE(val) (GUINT64_TO_LE (val))
  326. #define GINT64_FROM_BE(val) (GINT64_TO_BE (val))
  327. #define GUINT64_FROM_BE(val) (GUINT64_TO_BE (val))
  328. #define GLONG_FROM_LE(val) (GLONG_TO_LE (val))
  329. #define GULONG_FROM_LE(val) (GULONG_TO_LE (val))
  330. #define GLONG_FROM_BE(val) (GLONG_TO_BE (val))
  331. #define GULONG_FROM_BE(val) (GULONG_TO_BE (val))
  332. #define GINT_FROM_LE(val) (GINT_TO_LE (val))
  333. #define GUINT_FROM_LE(val) (GUINT_TO_LE (val))
  334. #define GINT_FROM_BE(val) (GINT_TO_BE (val))
  335. #define GUINT_FROM_BE(val) (GUINT_TO_BE (val))
  336. #define GSIZE_FROM_LE(val) (GSIZE_TO_LE (val))
  337. #define GSSIZE_FROM_LE(val) (GSSIZE_TO_LE (val))
  338. #define GSIZE_FROM_BE(val) (GSIZE_TO_BE (val))
  339. #define GSSIZE_FROM_BE(val) (GSSIZE_TO_BE (val))
  340. /* Portable versions of host-network order stuff
  341. */
  342. #define g_ntohl(val) (GUINT32_FROM_BE (val))
  343. #define g_ntohs(val) (GUINT16_FROM_BE (val))
  344. #define g_htonl(val) (GUINT32_TO_BE (val))
  345. #define g_htons(val) (GUINT16_TO_BE (val))
  346. /* IEEE Standard 754 Single Precision Storage Format (gfloat):
  347. *
  348. * 31 30 23 22 0
  349. * +--------+---------------+---------------+
  350. * | s 1bit | e[30:23] 8bit | f[22:0] 23bit |
  351. * +--------+---------------+---------------+
  352. * B0------------------->B1------->B2-->B3-->
  353. *
  354. * IEEE Standard 754 Double Precision Storage Format (gdouble):
  355. *
  356. * 63 62 52 51 32 31 0
  357. * +--------+----------------+----------------+ +---------------+
  358. * | s 1bit | e[62:52] 11bit | f[51:32] 20bit | | f[31:0] 32bit |
  359. * +--------+----------------+----------------+ +---------------+
  360. * B0--------------->B1---------->B2--->B3----> B4->B5->B6->B7->
  361. */
  362. /* subtract from biased_exponent to form base2 exponent (normal numbers) */
  363. typedef union _GDoubleIEEE754 GDoubleIEEE754;
  364. typedef union _GFloatIEEE754 GFloatIEEE754;
  365. #define G_IEEE754_FLOAT_BIAS (127)
  366. #define G_IEEE754_DOUBLE_BIAS (1023)
  367. /* multiply with base2 exponent to get base10 exponent (normal numbers) */
  368. #define G_LOG_2_BASE_10 (0.30102999566398119521)
  369. #if G_BYTE_ORDER == G_LITTLE_ENDIAN
  370. union _GFloatIEEE754
  371. {
  372. gfloat v_float;
  373. struct {
  374. guint mantissa : 23;
  375. guint biased_exponent : 8;
  376. guint sign : 1;
  377. } mpn;
  378. };
  379. union _GDoubleIEEE754
  380. {
  381. gdouble v_double;
  382. struct {
  383. guint mantissa_low : 32;
  384. guint mantissa_high : 20;
  385. guint biased_exponent : 11;
  386. guint sign : 1;
  387. } mpn;
  388. };
  389. #elif G_BYTE_ORDER == G_BIG_ENDIAN
  390. union _GFloatIEEE754
  391. {
  392. gfloat v_float;
  393. struct {
  394. guint sign : 1;
  395. guint biased_exponent : 8;
  396. guint mantissa : 23;
  397. } mpn;
  398. };
  399. union _GDoubleIEEE754
  400. {
  401. gdouble v_double;
  402. struct {
  403. guint sign : 1;
  404. guint biased_exponent : 11;
  405. guint mantissa_high : 20;
  406. guint mantissa_low : 32;
  407. } mpn;
  408. };
  409. #else /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */
  410. #error unknown ENDIAN type
  411. #endif /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */
  412. typedef struct _GTimeVal GTimeVal;
  413. struct _GTimeVal
  414. {
  415. glong tv_sec;
  416. glong tv_usec;
  417. };
  418. G_END_DECLS
  419. /* We prefix variable declarations so they can
  420. * properly get exported in Windows DLLs.
  421. */
  422. #ifndef GLIB_VAR
  423. # ifdef G_PLATFORM_WIN32
  424. # ifdef GLIB_STATIC_COMPILATION
  425. # define GLIB_VAR extern
  426. # else /* !GLIB_STATIC_COMPILATION */
  427. # ifdef GLIB_COMPILATION
  428. # ifdef DLL_EXPORT
  429. # define GLIB_VAR __declspec(dllexport)
  430. # else /* !DLL_EXPORT */
  431. # define GLIB_VAR extern
  432. # endif /* !DLL_EXPORT */
  433. # else /* !GLIB_COMPILATION */
  434. # define GLIB_VAR extern __declspec(dllimport)
  435. # endif /* !GLIB_COMPILATION */
  436. # endif /* !GLIB_STATIC_COMPILATION */
  437. # else /* !G_PLATFORM_WIN32 */
  438. # define GLIB_VAR _GLIB_EXTERN
  439. # endif /* !G_PLATFORM_WIN32 */
  440. #endif /* GLIB_VAR */
  441. #endif /* __G_TYPES_H__ */