📄 glib-full.h
字号:
/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. *//* * Modified by the GLib Team and others 1997-1999. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */#ifndef __G_LIB_H__#define __G_LIB_H__/* system specific config file glibconfig.h provides definitions for * the extrema of many of the standard types. These are: * * G_MINSHORT, G_MAXSHORT * G_MININT, G_MAXINT * G_MINLONG, G_MAXLONG * G_MINFLOAT, G_MAXFLOAT * G_MINDOUBLE, G_MAXDOUBLE * * It also provides the following typedefs: * * gint8, guint8 * gint16, guint16 * gint32, guint32 * gint64, guint64 * * It defines the G_BYTE_ORDER symbol to one of G_*_ENDIAN (see later in * this file). * * And it provides a way to store and retrieve a `gint' in/from a `gpointer'. * This is useful to pass an integer instead of a pointer to a callback. * * GINT_TO_POINTER(i), GUINT_TO_POINTER(i) * GPOINTER_TO_INT(p), GPOINTER_TO_UINT(p) * * Finally, it provide the following wrappers to STDC functions: * * g_ATEXIT * To register hooks which are executed on exit(). * Usually a wrapper for STDC atexit. * * void *g_memmove(void *dest, const void *src, guint count); * A wrapper for STDC memmove, or an implementation, if memmove doesn't * exist. The prototype looks like the above, give or take a const, * or size_t. */#include <glibconfig.h>/* include varargs functions for assertment macros */#include <stdarg.h>/* optionally feature DMALLOC memory allocation debugger */#ifdef USE_DMALLOC#include "dmalloc.h"#endif#ifdef NATIVE_WIN32/* On native Win32, directory separator is the backslash, and search path * separator is the semicolon. */#define G_DIR_SEPARATOR '\\'#define G_DIR_SEPARATOR_S "\\"#define G_SEARCHPATH_SEPARATOR ';'#define G_SEARCHPATH_SEPARATOR_S ";"#else /* !NATIVE_WIN32 *//* Unix */#define G_DIR_SEPARATOR '/'#define G_DIR_SEPARATOR_S "/"#define G_SEARCHPATH_SEPARATOR ':'#define G_SEARCHPATH_SEPARATOR_S ":"#endif /* !NATIVE_WIN32 */#ifdef __cplusplusextern "C" {#endif /* __cplusplus *//* Provide definitions for some commonly used macros. * Some of them are only provided if they haven't already * been defined. It is assumed that if they are already * defined then the current definition is correct. */#ifndef NULL#define NULL ((void*) 0)#endif#ifndef FALSE#define FALSE (0)#endif#ifndef TRUE#define TRUE (!FALSE)#endif#undef MAX#define MAX(a, b) (((a) > (b)) ? (a) : (b))#undef MIN#define MIN(a, b) (((a) < (b)) ? (a) : (b))#undef ABS#define ABS(a) (((a) < 0) ? -(a) : (a))#undef CLAMP#define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x)))/* Define G_VA_COPY() to do the right thing for copying va_list variables. * glibconfig.h may have already defined G_VA_COPY as va_copy or __va_copy. */#if !defined (G_VA_COPY)# if defined (__GNUC__) && defined (__PPC__) && (defined (_CALL_SYSV) || defined (_WIN32))# define G_VA_COPY(ap1, ap2) (*(ap1) = *(ap2))# elif defined (G_VA_COPY_AS_ARRAY)# define G_VA_COPY(ap1, ap2) g_memmove ((ap1), (ap2), sizeof (va_list))# else /* va_list is a pointer */# define G_VA_COPY(ap1, ap2) ((ap1) = (ap2))# endif /* va_list is a pointer */#endif /* !G_VA_COPY *//* Provide convenience macros for handling structure * fields through their offsets. */#define G_STRUCT_OFFSET(struct_type, member) \ ((gulong) ((gchar*) &((struct_type*) 0)->member))#define G_STRUCT_MEMBER_P(struct_p, struct_offset) \ ((gpointer) ((gchar*) (struct_p) + (gulong) (struct_offset)))#define G_STRUCT_MEMBER(member_type, struct_p, struct_offset) \ (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))/* inlining hassle. for compilers that don't allow the `inline' keyword, * mostly because of strict ANSI C compliance or dumbness, we try to fall * back to either `__inline__' or `__inline'. * we define G_CAN_INLINE, if the compiler seems to be actually * *capable* to do function inlining, in which case inline function bodys * do make sense. we also define G_INLINE_FUNC to properly export the * function prototypes if no inlining can be performed. * we special case most of the stuff, so inline functions can have a normal * implementation by defining G_INLINE_FUNC to extern and G_CAN_INLINE to 1. */#ifndef G_INLINE_FUNC# define G_CAN_INLINE 1#endif#ifdef G_HAVE_INLINE# if defined (__GNUC__) && defined (__STRICT_ANSI__)# undef inline# define inline __inline__# endif#else /* !G_HAVE_INLINE */# undef inline# if defined (G_HAVE___INLINE__)# define inline __inline__# else /* !inline && !__inline__ */# if defined (G_HAVE___INLINE)# define inline __inline# else /* !inline && !__inline__ && !__inline */# define inline /* don't inline, then */# ifndef G_INLINE_FUNC# undef G_CAN_INLINE# endif# endif# endif#endif#ifndef G_INLINE_FUNC# ifdef __GNUC__# ifdef __OPTIMIZE__# define G_INLINE_FUNC extern inline# else# undef G_CAN_INLINE# define G_INLINE_FUNC extern# endif# else /* !__GNUC__ */# ifdef G_CAN_INLINE# define G_INLINE_FUNC static inline# else# define G_INLINE_FUNC extern# endif# endif /* !__GNUC__ */#endif /* !G_INLINE_FUNC *//* Provide simple macro statement wrappers (adapted from Perl): * G_STMT_START { statements; } G_STMT_END; * can be used as a single statement, as in * if (x) G_STMT_START { ... } G_STMT_END; else ... * * For gcc we will wrap the statements within `({' and `})' braces. * For SunOS they will be wrapped within `if (1)' and `else (void) 0', * and otherwise within `do' and `while (0)'. */#if !(defined (G_STMT_START) && defined (G_STMT_END))# if defined (__GNUC__) && !defined (__STRICT_ANSI__) && !defined (__cplusplus)# define G_STMT_START (void)(# define G_STMT_END )# else# if (defined (sun) || defined (__sun__))# define G_STMT_START if (1)# define G_STMT_END else (void)0# else# define G_STMT_START do# define G_STMT_END while (0)# endif# endif#endif/* Provide macros to feature the GCC function attribute. */#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)#define G_GNUC_PRINTF( format_idx, arg_idx ) \ __attribute__((format (printf, format_idx, arg_idx)))#define G_GNUC_SCANF( format_idx, arg_idx ) \ __attribute__((format (scanf, format_idx, arg_idx)))#define G_GNUC_FORMAT( arg_idx ) \ __attribute__((format_arg (arg_idx)))#define G_GNUC_NORETURN \ __attribute__((noreturn))#define G_GNUC_CONST \ __attribute__((const))#define G_GNUC_UNUSED \ __attribute__((unused))#else /* !__GNUC__ */#define G_GNUC_PRINTF( format_idx, arg_idx )#define G_GNUC_SCANF( format_idx, arg_idx )#define G_GNUC_FORMAT( arg_idx )#define G_GNUC_NORETURN#define G_GNUC_CONST#define G_GNUC_UNUSED#endif /* !__GNUC__ *//* Wrap the gcc __PRETTY_FUNCTION__ and __FUNCTION__ variables with * macros, so we can refer to them as strings unconditionally. */#ifdef __GNUC__#define G_GNUC_FUNCTION __FUNCTION__#define G_GNUC_PRETTY_FUNCTION __PRETTY_FUNCTION__#else /* !__GNUC__ */#define G_GNUC_FUNCTION ""#define G_GNUC_PRETTY_FUNCTION ""#endif /* !__GNUC__ *//* we try to provide a usefull equivalent for ATEXIT if it is * not defined, but use is actually abandoned. people should * use g_atexit() instead. */#ifndef ATEXIT# define ATEXIT(proc) g_ATEXIT(proc)#else# define G_NATIVE_ATEXIT#endif /* ATEXIT *//* Hacker macro to place breakpoints for elected machines. * Actual use is strongly deprecated of course ;) */#if defined (__i386__) && defined (__GNUC__) && __GNUC__ >= 2#define G_BREAKPOINT() G_STMT_START{ __asm__ __volatile__ ("int $03"); }G_STMT_END#elif defined (__alpha__) && defined (__GNUC__) && __GNUC__ >= 2#define G_BREAKPOINT() G_STMT_START{ __asm__ __volatile__ ("bpt"); }G_STMT_END#else /* !__i386__ && !__alpha__ */#define G_BREAKPOINT()#endif /* __i386__ *//* Provide macros for easily allocating memory. The macros * will cast the allocated memory to the specified type * in order to avoid compiler warnings. (Makes the code neater). */#ifdef __DMALLOC_H__# define g_new(type, count) (ALLOC (type, count))# define g_new0(type, count) (CALLOC (type, count))# define g_renew(type, mem, count) (REALLOC (mem, type, count))#else /* __DMALLOC_H__ */# define g_new(type, count) \ ((type *) g_malloc ((unsigned) sizeof (type) * (count)))# define g_new0(type, count) \ ((type *) g_malloc0 ((unsigned) sizeof (type) * (count)))# define g_renew(type, mem, count) \ ((type *) g_realloc (mem, (unsigned) sizeof (type) * (count)))#endif /* __DMALLOC_H__ */#define g_mem_chunk_create(type, pre_alloc, alloc_type) ( \ g_mem_chunk_new (#type " mem chunks (" #pre_alloc ")", \ sizeof (type), \ sizeof (type) * (pre_alloc), \ (alloc_type)) \)#define g_chunk_new(type, chunk) ( \ (type *) g_mem_chunk_alloc (chunk) \)#define g_chunk_new0(type, chunk) ( \ (type *) g_mem_chunk_alloc0 (chunk) \)#define g_chunk_free(mem, mem_chunk) G_STMT_START { \ g_mem_chunk_free ((mem_chunk), (mem)); \} G_STMT_END#define g_string(x) #x/* Provide macros for error handling. The "assert" macros will * exit on failure. The "return" macros will exit the current * function. Two different definitions are given for the macros * if G_DISABLE_ASSERT is not defined, in order to support gcc's * __PRETTY_FUNCTION__ capability. */#ifdef G_DISABLE_ASSERT#define g_assert(expr)#define g_assert_not_reached()#else /* !G_DISABLE_ASSERT */#ifdef __GNUC__#define g_assert(expr) G_STMT_START{ \ if (!(expr)) \ g_log (G_LOG_DOMAIN, \ G_LOG_LEVEL_ERROR, \ "file %s: line %d (%s): assertion failed: (%s)", \ __FILE__, \ __LINE__, \ __PRETTY_FUNCTION__, \ #expr); }G_STMT_END#define g_assert_not_reached() G_STMT_START{ \ g_log (G_LOG_DOMAIN, \ G_LOG_LEVEL_ERROR, \ "file %s: line %d (%s): should not be reached", \ __FILE__, \ __LINE__, \ __PRETTY_FUNCTION__); }G_STMT_END#else /* !__GNUC__ */#define g_assert(expr) G_STMT_START{ \ if (!(expr)) \ g_log (G_LOG_DOMAIN, \ G_LOG_LEVEL_ERROR, \ "file %s: line %d: assertion failed: (%s)", \ __FILE__, \ __LINE__, \ #expr); }G_STMT_END#define g_assert_not_reached() G_STMT_START{ \ g_log (G_LOG_DOMAIN, \ G_LOG_LEVEL_ERROR, \ "file %s: line %d: should not be reached", \ __FILE__, \ __LINE__); }G_STMT_END#endif /* __GNUC__ */#endif /* !G_DISABLE_ASSERT */#ifdef G_DISABLE_CHECKS#define g_return_if_fail(expr)#define g_return_val_if_fail(expr,val)#else /* !G_DISABLE_CHECKS */#ifdef __GNUC__#define g_return_if_fail(expr) G_STMT_START{ \ if (!(expr)) \ { \ g_log (G_LOG_DOMAIN, \ G_LOG_LEVEL_CRITICAL, \ "file %s: line %d (%s): assertion `%s' failed.", \ __FILE__, \ __LINE__, \ __PRETTY_FUNCTION__, \ #expr); \ return; \ }; }G_STMT_END#define g_return_val_if_fail(expr,val) G_STMT_START{ \ if (!(expr)) \ { \ g_log (G_LOG_DOMAIN, \ G_LOG_LEVEL_CRITICAL, \ "file %s: line %d (%s): assertion `%s' failed.", \ __FILE__, \ __LINE__, \ __PRETTY_FUNCTION__, \ #expr); \ return val; \ }; }G_STMT_END#else /* !__GNUC__ */#define g_return_if_fail(expr) G_STMT_START{ \ if (!(expr)) \ { \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -