source: trunk/third/glib2/glib/gtypes.h @ 20721

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