25624 lines
934 KiB
C
25624 lines
934 KiB
C
#ifndef GUM_STATIC
|
|
# define GUM_STATIC
|
|
#endif
|
|
|
|
/*
|
|
* Copyright (C) 2008-2017 Ole André Vadla Ravnås <oleavr@nowsecure.com>
|
|
*
|
|
* Licence: wxWindows Library Licence, Version 3.1
|
|
*/
|
|
|
|
#ifndef __GUM_H__
|
|
#define __GUM_H__
|
|
|
|
/*
|
|
* Copyright (C) 2008-2014 Ole André Vadla Ravnås <ole.andre.ravnas@tillitech.com>
|
|
*
|
|
* Licence: wxWindows Library Licence, Version 3.1
|
|
*/
|
|
|
|
#ifndef __GUMDEFS_H__
|
|
#define __GUMDEFS_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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__
|
|
|
|
#define __GLIB_H_INSIDE__
|
|
|
|
/* 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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_ALLOCA_H__
|
|
#define __G_ALLOCA_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
/* 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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_TYPES_H__
|
|
#define __G_TYPES_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
/* glibconfig.h
|
|
*
|
|
* This is a generated file. Please modify 'configure.ac'
|
|
*/
|
|
|
|
#ifndef __GLIBCONFIG_H__
|
|
#define __GLIBCONFIG_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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/.
|
|
*/
|
|
|
|
/* This file must not include any other glib header file and must thus
|
|
* not refer to variables from glibconfig.h
|
|
*/
|
|
|
|
#ifndef __G_MACROS_H__
|
|
#define __G_MACROS_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
/* We include stddef.h to get the system's definition of NULL
|
|
*/
|
|
#include <stddef.h>
|
|
|
|
#define G_GNUC_CHECK_VERSION(major, minor) \
|
|
(defined(__GNUC__) && \
|
|
((__GNUC__ > (major)) || \
|
|
((__GNUC__ == (major)) && \
|
|
(__GNUC_MINOR__ >= (minor)))))
|
|
|
|
/* Here we provide lG_GNUC_EXTENSION as an alias for __extension__,
|
|
* where this is valid. This allows for warningless compilation of
|
|
* "long long" types even in the presence of '-ansi -pedantic'.
|
|
*/
|
|
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8)
|
|
#define lG_GNUC_EXTENSION __extension__
|
|
#else
|
|
#define lG_GNUC_EXTENSION
|
|
#endif
|
|
|
|
/* Every compiler that we target supports inlining, but some of them may
|
|
* complain about it if we don't say "__inline". If we have C99, or if
|
|
* we are using C++, then we can use "inline" directly. Unfortunately
|
|
* Visual Studio does not support __STDC_VERSION__, so we need to check
|
|
* whether we are on Visual Studio 2013 or earlier to see that we need to
|
|
* say "__inline" in C mode.
|
|
* Otherwise, we say "__inline" to avoid the warning.
|
|
*/
|
|
#define G_CAN_INLINE
|
|
#ifndef __cplusplus
|
|
# ifdef _MSC_VER
|
|
# if (_MSC_VER < 1900)
|
|
# define G_INLINE_DEFINE_NEEDED
|
|
# endif
|
|
# elif !defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199900)
|
|
# define G_INLINE_DEFINE_NEEDED
|
|
# endif
|
|
#endif
|
|
|
|
#ifdef G_INLINE_DEFINE_NEEDED
|
|
# undef inline
|
|
# define inline __inline
|
|
#endif
|
|
|
|
#undef G_INLINE_DEFINE_NEEDED
|
|
|
|
/* For historical reasons we need to continue to support those who
|
|
* define G_IMPLEMENT_INLINES to mean "don't implement this here".
|
|
*/
|
|
#ifdef G_IMPLEMENT_INLINES
|
|
# define G_INLINE_FUNC extern
|
|
# undef G_CAN_INLINE
|
|
#else
|
|
# define G_INLINE_FUNC static inline
|
|
#endif /* G_IMPLEMENT_INLINES */
|
|
|
|
/* Provide macros to feature the GCC function attribute.
|
|
*/
|
|
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
|
|
#define G_GNUC_PURE __attribute__((__pure__))
|
|
#define G_GNUC_MALLOC __attribute__((__malloc__))
|
|
#else
|
|
#define G_GNUC_PURE
|
|
#define G_GNUC_MALLOC
|
|
#endif
|
|
|
|
#if __GNUC__ >= 4
|
|
#define G_GNUC_NULL_TERMINATED __attribute__((__sentinel__))
|
|
#else
|
|
#define G_GNUC_NULL_TERMINATED
|
|
#endif
|
|
|
|
/* Clang feature detection: http://clang.llvm.org/docs/LanguageExtensions.html */
|
|
#ifndef __has_attribute
|
|
#define __has_attribute(x) 0
|
|
#endif
|
|
|
|
#ifndef __has_feature
|
|
#define __has_feature(x) 0
|
|
#endif
|
|
|
|
#ifndef __has_builtin
|
|
#define __has_builtin(x) 0
|
|
#endif
|
|
|
|
#if (!defined(__clang__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))) || \
|
|
(defined(__clang__) && __has_attribute(__alloc_size__))
|
|
#define G_GNUC_ALLOC_SIZE(x) __attribute__((__alloc_size__(x)))
|
|
#define G_GNUC_ALLOC_SIZE2(x,y) __attribute__((__alloc_size__(x,y)))
|
|
#else
|
|
#define G_GNUC_ALLOC_SIZE(x)
|
|
#define G_GNUC_ALLOC_SIZE2(x,y)
|
|
#endif
|
|
|
|
#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__))
|
|
#define G_GNUC_NO_INSTRUMENT \
|
|
__attribute__((__no_instrument_function__))
|
|
#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
|
|
#define G_GNUC_NO_INSTRUMENT
|
|
#endif /* !__GNUC__ */
|
|
|
|
#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)
|
|
#define G_GNUC_DEPRECATED __attribute__((__deprecated__))
|
|
#else
|
|
#define G_GNUC_DEPRECATED
|
|
#endif /* __GNUC__ */
|
|
|
|
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
|
|
#define G_GNUC_DEPRECATED_FOR(f) \
|
|
__attribute__((deprecated("Use " #f " instead")))
|
|
#else
|
|
#define G_GNUC_DEPRECATED_FOR(f) G_GNUC_DEPRECATED
|
|
#endif /* __GNUC__ */
|
|
|
|
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
|
|
#define lG_GNUC_BEGIN_IGNORE_DEPRECATIONS \
|
|
_Pragma ("GCC diagnostic push") \
|
|
_Pragma ("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
|
|
#define lG_GNUC_END_IGNORE_DEPRECATIONS \
|
|
_Pragma ("GCC diagnostic pop")
|
|
#elif defined (_MSC_VER) && (_MSC_VER >= 1500)
|
|
#define lG_GNUC_BEGIN_IGNORE_DEPRECATIONS \
|
|
__pragma (warning (push)) \
|
|
__pragma (warning (disable : 4996))
|
|
#define lG_GNUC_END_IGNORE_DEPRECATIONS \
|
|
__pragma (warning (pop))
|
|
#elif defined (__clang__)
|
|
#define lG_GNUC_BEGIN_IGNORE_DEPRECATIONS \
|
|
_Pragma("clang diagnostic push") \
|
|
_Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"")
|
|
#define lG_GNUC_END_IGNORE_DEPRECATIONS \
|
|
_Pragma("clang diagnostic pop")
|
|
#else
|
|
#define lG_GNUC_BEGIN_IGNORE_DEPRECATIONS
|
|
#define lG_GNUC_END_IGNORE_DEPRECATIONS
|
|
#endif
|
|
|
|
#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)
|
|
#define G_GNUC_MAY_ALIAS __attribute__((may_alias))
|
|
#else
|
|
#define G_GNUC_MAY_ALIAS
|
|
#endif
|
|
|
|
#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
|
|
#define G_GNUC_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
|
|
#else
|
|
#define G_GNUC_WARN_UNUSED_RESULT
|
|
#endif /* __GNUC__ */
|
|
|
|
#ifndef G_DISABLE_DEPRECATED
|
|
/* Wrap the gcc __PRETTY_FUNCTION__ and __FUNCTION__ variables with
|
|
* macros, so we can refer to them as strings unconditionally.
|
|
* usage not-recommended since gcc-3.0
|
|
*/
|
|
#if defined (__GNUC__) && (__GNUC__ < 3)
|
|
#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__ */
|
|
#endif /* !G_DISABLE_DEPRECATED */
|
|
|
|
#if __has_feature(attribute_analyzer_noreturn) && defined(__clang_analyzer__)
|
|
#define G_ANALYZER_ANALYZING 1
|
|
#define G_ANALYZER_NORETURN __attribute__((analyzer_noreturn))
|
|
#else
|
|
#define G_ANALYZER_ANALYZING 0
|
|
#define G_ANALYZER_NORETURN
|
|
#endif
|
|
|
|
#define G_STRINGIFY(macro_or_string) G_STRINGIFY_ARG (macro_or_string)
|
|
#define G_STRINGIFY_ARG(contents) #contents
|
|
|
|
#ifndef __GI_SCANNER__ /* The static assert macro really confuses the introspection parser */
|
|
#define G_PASTE_ARGS(identifier1,identifier2) identifier1 ## identifier2
|
|
#define G_PASTE(identifier1,identifier2) G_PASTE_ARGS (identifier1, identifier2)
|
|
#ifdef __COUNTER__
|
|
#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
|
|
#else
|
|
#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __LINE__)[(expr) ? 1 : -1] G_GNUC_UNUSED
|
|
#endif
|
|
#define G_STATIC_ASSERT_EXPR(expr) ((void) sizeof (char[(expr) ? 1 : -1]))
|
|
#endif
|
|
|
|
/* Provide a string identifying the current code position */
|
|
#if defined(__GNUC__) && (__GNUC__ < 3) && !defined(__cplusplus)
|
|
#define G_STRLOC __FILE__ ":" G_STRINGIFY (__LINE__) ":" __PRETTY_FUNCTION__ "()"
|
|
#else
|
|
#define G_STRLOC __FILE__ ":" G_STRINGIFY (__LINE__)
|
|
#endif
|
|
|
|
/* Provide a string identifying the current function, non-concatenatable */
|
|
#if defined (__GNUC__) && defined (__cplusplus)
|
|
#define G_STRFUNC ((const char*) (__PRETTY_FUNCTION__))
|
|
#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
|
|
#define G_STRFUNC ((const char*) (__func__))
|
|
#elif defined (__GNUC__) || (defined(_MSC_VER) && (_MSC_VER > 1300))
|
|
#define G_STRFUNC ((const char*) (__FUNCTION__))
|
|
#else
|
|
#define G_STRFUNC ((const char*) ("???"))
|
|
#endif
|
|
|
|
/* Guard C code in headers, while including them from C++ */
|
|
#ifdef __cplusplus
|
|
#define G_BEGIN_DECLS extern "C" {
|
|
#define G_END_DECLS }
|
|
#else
|
|
#define G_BEGIN_DECLS
|
|
#define G_END_DECLS
|
|
#endif
|
|
|
|
/* 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
|
|
# ifdef __cplusplus
|
|
# define NULL (0L)
|
|
# else /* !__cplusplus */
|
|
# define NULL ((void*) 0)
|
|
# endif /* !__cplusplus */
|
|
#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)))
|
|
|
|
/* Count the number of elements in an array. The array must be defined
|
|
* as such; using this with a dynamically allocated array will give
|
|
* incorrect results.
|
|
*/
|
|
#define G_N_ELEMENTS(arr) (sizeof (arr) / sizeof ((arr)[0]))
|
|
|
|
/* Macros by analogy to GINT_TO_POINTER, GPOINTER_TO_INT
|
|
*/
|
|
#define GPOINTER_TO_SIZE(p) ((gsize) (p))
|
|
#define GSIZE_TO_POINTER(s) ((gpointer) (gsize) (s))
|
|
|
|
/* Provide convenience macros for handling structure
|
|
* fields through their offsets.
|
|
*/
|
|
|
|
#if (defined(__GNUC__) && __GNUC__ >= 4) || defined (_MSC_VER)
|
|
#define G_STRUCT_OFFSET(struct_type, member) \
|
|
((glong) offsetof (struct_type, member))
|
|
#else
|
|
#define G_STRUCT_OFFSET(struct_type, member) \
|
|
((glong) ((guint8*) &((struct_type*) 0)->member))
|
|
#endif
|
|
|
|
#define G_STRUCT_MEMBER_P(struct_p, struct_offset) \
|
|
((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
|
|
#define G_STRUCT_MEMBER(member_type, struct_p, struct_offset) \
|
|
(*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
|
|
|
|
/* Provide simple macro statement wrappers:
|
|
* G_STMT_START { statements; } G_STMT_END;
|
|
* This can be used as a single statement, like:
|
|
* if (x) G_STMT_START { ... } G_STMT_END; else ...
|
|
* This intentionally does not use compiler extensions like GCC's '({...})' to
|
|
* avoid portability issue or side effects when compiled with different compilers.
|
|
* MSVC complains about "while(0)": C4127: "Conditional expression is constant",
|
|
* so we use __pragma to avoid the warning since the use here is intentional.
|
|
*/
|
|
#if !(defined (G_STMT_START) && defined (G_STMT_END))
|
|
#define G_STMT_START do
|
|
#if defined (_MSC_VER) && (_MSC_VER >= 1500)
|
|
#define G_STMT_END \
|
|
__pragma(warning(push)) \
|
|
__pragma(warning(disable:4127)) \
|
|
while(0) \
|
|
__pragma(warning(pop))
|
|
#else
|
|
#define G_STMT_END while (0)
|
|
#endif
|
|
#endif
|
|
|
|
/* Deprecated -- do not use. */
|
|
#ifndef G_DISABLE_DEPRECATED
|
|
#ifdef G_DISABLE_CONST_RETURNS
|
|
#define G_CONST_RETURN
|
|
#else
|
|
#define G_CONST_RETURN const
|
|
#endif
|
|
#endif
|
|
|
|
/*
|
|
* The G_LIKELY and G_UNLIKELY macros let the programmer give hints to
|
|
* the compiler about the expected result of an expression. Some compilers
|
|
* can use this information for optimizations.
|
|
*
|
|
* The _G_BOOLEAN_EXPR macro is intended to trigger a gcc warning when
|
|
* putting assignments in g_return_if_fail ().
|
|
*/
|
|
#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__)
|
|
#define _G_BOOLEAN_EXPR(expr) \
|
|
lG_GNUC_EXTENSION ({ \
|
|
int _g_boolean_var_; \
|
|
if (expr) \
|
|
_g_boolean_var_ = 1; \
|
|
else \
|
|
_g_boolean_var_ = 0; \
|
|
_g_boolean_var_; \
|
|
})
|
|
#define G_LIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR((expr)), 1))
|
|
#define G_UNLIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR((expr)), 0))
|
|
#else
|
|
#define G_LIKELY(expr) (expr)
|
|
#define G_UNLIKELY(expr) (expr)
|
|
#endif
|
|
|
|
#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)
|
|
#define G_DEPRECATED __attribute__((__deprecated__))
|
|
#elif defined(_MSC_VER) && (_MSC_VER >= 1300)
|
|
#define G_DEPRECATED __declspec(deprecated)
|
|
#else
|
|
#define G_DEPRECATED
|
|
#endif
|
|
|
|
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
|
|
#define G_DEPRECATED_FOR(f) __attribute__((__deprecated__("Use '" #f "' instead")))
|
|
#elif defined(_MSC_FULL_VER) && (_MSC_FULL_VER > 140050320)
|
|
#define G_DEPRECATED_FOR(f) __declspec(deprecated("is deprecated. Use '" #f "' instead"))
|
|
#else
|
|
#define G_DEPRECATED_FOR(f) G_DEPRECATED
|
|
#endif
|
|
|
|
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
|
|
#define G_UNAVAILABLE(maj,min) __attribute__((deprecated("Not available before " #maj "." #min)))
|
|
#elif defined(_MSC_FULL_VER) && (_MSC_FULL_VER > 140050320)
|
|
#define G_UNAVAILABLE(maj,min) __declspec(deprecated("is not available before " #maj "." #min))
|
|
#else
|
|
#define G_UNAVAILABLE(maj,min) G_DEPRECATED
|
|
#endif
|
|
|
|
#ifndef _GLIB_EXTERN
|
|
#define _GLIB_EXTERN extern
|
|
#endif
|
|
|
|
/* These macros are used to mark deprecated functions in GLib headers,
|
|
* and thus have to be exposed in installed headers. But please
|
|
* do *not* use them in other projects. Instead, use G_DEPRECATED
|
|
* or define your own wrappers around it.
|
|
*/
|
|
|
|
#ifdef GLIB_DISABLE_DEPRECATION_WARNINGS
|
|
#define GLIB_DEPRECATED _GLIB_EXTERN
|
|
#define GLIB_DEPRECATED_FOR(f) _GLIB_EXTERN
|
|
#define GLIB_UNAVAILABLE(maj,min) _GLIB_EXTERN
|
|
#else
|
|
#define GLIB_DEPRECATED G_DEPRECATED _GLIB_EXTERN
|
|
#define GLIB_DEPRECATED_FOR(f) G_DEPRECATED_FOR(f) _GLIB_EXTERN
|
|
#define GLIB_UNAVAILABLE(maj,min) G_UNAVAILABLE(maj,min) _GLIB_EXTERN
|
|
#endif
|
|
|
|
#ifdef __GNUC__
|
|
|
|
/* these macros are private */
|
|
#define l_GLIB_AUTOPTR_FUNC_NAME(TypeName) glib_autoptr_cleanup_##TypeName
|
|
#define l_GLIB_AUTOPTR_TYPENAME(TypeName) TypeName##_autoptr
|
|
#define l_GLIB_AUTO_FUNC_NAME(TypeName) glib_auto_cleanup_##TypeName
|
|
#define l_GLIB_CLEANUP(func) __attribute__((cleanup(func)))
|
|
#define l_GLIB_DEFINE_AUTOPTR_CHAINUP(ModuleObjName, ParentName) \
|
|
typedef ModuleObjName *l_GLIB_AUTOPTR_TYPENAME(ModuleObjName); \
|
|
static inline void l_GLIB_AUTOPTR_FUNC_NAME(ModuleObjName) (ModuleObjName **_ptr) { \
|
|
l_GLIB_AUTOPTR_FUNC_NAME(ParentName) ((ParentName **) _ptr); } \
|
|
|
|
|
|
/* these macros are API */
|
|
#define G_DEFINE_AUTOPTR_CLEANUP_FUNC(TypeName, func) \
|
|
typedef TypeName *l_GLIB_AUTOPTR_TYPENAME(TypeName); \
|
|
lG_GNUC_BEGIN_IGNORE_DEPRECATIONS \
|
|
static inline void l_GLIB_AUTOPTR_FUNC_NAME(TypeName) (TypeName **_ptr) { if (*_ptr) (func) (*_ptr); } \
|
|
lG_GNUC_END_IGNORE_DEPRECATIONS
|
|
#define G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(TypeName, func) \
|
|
lG_GNUC_BEGIN_IGNORE_DEPRECATIONS \
|
|
static inline void l_GLIB_AUTO_FUNC_NAME(TypeName) (TypeName *_ptr) { (func) (_ptr); } \
|
|
lG_GNUC_END_IGNORE_DEPRECATIONS
|
|
#define G_DEFINE_AUTO_CLEANUP_FREE_FUNC(TypeName, func, none) \
|
|
lG_GNUC_BEGIN_IGNORE_DEPRECATIONS \
|
|
static inline void l_GLIB_AUTO_FUNC_NAME(TypeName) (TypeName *_ptr) { if (*_ptr != none) (func) (*_ptr); } \
|
|
lG_GNUC_END_IGNORE_DEPRECATIONS
|
|
#define g_autoptr(TypeName) l_GLIB_CLEANUP(l_GLIB_AUTOPTR_FUNC_NAME(TypeName)) l_GLIB_AUTOPTR_TYPENAME(TypeName)
|
|
#define g_auto(TypeName) l_GLIB_CLEANUP(l_GLIB_AUTO_FUNC_NAME(TypeName)) TypeName
|
|
#define g_autofree l_GLIB_CLEANUP(g_autoptr_cleanup_generic_gfree)
|
|
|
|
#else /* not GNU C */
|
|
/* this (dummy) macro is private */
|
|
#define l_GLIB_DEFINE_AUTOPTR_CHAINUP(ModuleObjName, ParentName)
|
|
|
|
/* these (dummy) macros are API */
|
|
#define G_DEFINE_AUTOPTR_CLEANUP_FUNC(TypeName, func)
|
|
#define G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(TypeName, func)
|
|
#define G_DEFINE_AUTO_CLEANUP_FREE_FUNC(TypeName, func, none)
|
|
|
|
/* no declaration of g_auto() or g_autoptr() here */
|
|
#endif
|
|
|
|
#endif /* __G_MACROS_H__ */
|
|
|
|
#include <limits.h>
|
|
#include <float.h>
|
|
#define GLIB_HAVE_ALLOCA_H
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
#define G_MINFLOAT FLT_MIN
|
|
#define G_MAXFLOAT FLT_MAX
|
|
#define G_MINDOUBLE DBL_MIN
|
|
#define G_MAXDOUBLE DBL_MAX
|
|
#define G_MINSHORT SHRT_MIN
|
|
#define G_MAXSHORT SHRT_MAX
|
|
#define G_MAXUSHORT USHRT_MAX
|
|
#define G_MININT INT_MIN
|
|
#define G_MAXINT INT_MAX
|
|
#define G_MAXUINT UINT_MAX
|
|
#define G_MINLONG LONG_MIN
|
|
#define G_MAXLONG LONG_MAX
|
|
#define G_MAXULONG ULONG_MAX
|
|
|
|
typedef signed char gint8;
|
|
typedef unsigned char guint8;
|
|
typedef signed short gint16;
|
|
typedef unsigned short guint16;
|
|
#define G_GINT16_MODIFIER "h"
|
|
#define G_GINT16_FORMAT "hi"
|
|
#define G_GUINT16_FORMAT "hu"
|
|
typedef signed int gint32;
|
|
typedef unsigned int guint32;
|
|
#define G_GINT32_MODIFIER ""
|
|
#define G_GINT32_FORMAT "i"
|
|
#define G_GUINT32_FORMAT "u"
|
|
#define G_HAVE_GINT64 1 /* deprecated, always true */
|
|
|
|
lG_GNUC_EXTENSION typedef signed long long gint64;
|
|
lG_GNUC_EXTENSION typedef unsigned long long guint64;
|
|
|
|
#define G_GINT64_CONSTANT(val) (lG_GNUC_EXTENSION (val##LL))
|
|
#define G_GUINT64_CONSTANT(val) (lG_GNUC_EXTENSION (val##ULL))
|
|
#define G_GINT64_MODIFIER "ll"
|
|
#define G_GINT64_FORMAT "lli"
|
|
#define G_GUINT64_FORMAT "llu"
|
|
|
|
#define GLIB_SIZEOF_VOID_P 4
|
|
#define GLIB_SIZEOF_LONG 4
|
|
#define GLIB_SIZEOF_SIZE_T 4
|
|
#define GLIB_SIZEOF_SSIZE_T 4
|
|
|
|
typedef signed int gssize;
|
|
typedef unsigned int gsize;
|
|
#define G_GSIZE_MODIFIER ""
|
|
#define G_GSSIZE_MODIFIER ""
|
|
#define G_GSIZE_FORMAT "u"
|
|
#define G_GSSIZE_FORMAT "i"
|
|
|
|
#define G_MAXSIZE G_MAXUINT
|
|
#define G_MINSSIZE G_MININT
|
|
#define G_MAXSSIZE G_MAXINT
|
|
|
|
typedef gint64 goffset;
|
|
#define G_MINOFFSET G_MININT64
|
|
#define G_MAXOFFSET G_MAXINT64
|
|
|
|
#define G_GOFFSET_MODIFIER G_GINT64_MODIFIER
|
|
#define G_GOFFSET_FORMAT G_GINT64_FORMAT
|
|
#define G_GOFFSET_CONSTANT(val) G_GINT64_CONSTANT(val)
|
|
|
|
#define G_POLLFD_FORMAT "%d"
|
|
|
|
|
|
#define GPOINTER_TO_INT(p) ((gint) (gint) (p))
|
|
#define GPOINTER_TO_UINT(p) ((guint) (guint) (p))
|
|
|
|
#define GINT_TO_POINTER(i) ((gpointer) (gint) (i))
|
|
#define GUINT_TO_POINTER(u) ((gpointer) (guint) (u))
|
|
|
|
typedef signed int gintptr;
|
|
typedef unsigned int guintptr;
|
|
|
|
#define G_GINTPTR_MODIFIER ""
|
|
#define G_GINTPTR_FORMAT "i"
|
|
#define G_GUINTPTR_FORMAT "u"
|
|
#ifndef G_DISABLE_DEPRECATED
|
|
#define g_ATEXIT(proc) (atexit (proc))
|
|
#define g_memmove(dest,src,len) G_STMT_START { memmove ((dest), (src), (len)); } G_STMT_END
|
|
#endif
|
|
|
|
#define GLIB_MAJOR_VERSION 2
|
|
#define GLIB_MINOR_VERSION 51
|
|
#define GLIB_MICRO_VERSION 5
|
|
|
|
#define G_OS_UNIX
|
|
#define GLIB_STATIC_COMPILATION 1
|
|
#define GOBJECT_STATIC_COMPILATION 1
|
|
#define GIO_STATIC_COMPILATION 1
|
|
|
|
#define G_VA_COPY va_copy
|
|
|
|
#ifndef __cplusplus
|
|
# define G_HAVE_ISO_VARARGS 1
|
|
#endif
|
|
#ifdef __cplusplus
|
|
# define G_HAVE_ISO_VARARGS 1
|
|
#endif
|
|
|
|
/* gcc-2.95.x supports both gnu style and ISO varargs, but if -ansi
|
|
* is passed ISO vararg support is turned off, and there is no work
|
|
* around to turn it on, so we unconditionally turn it off.
|
|
*/
|
|
#if __GNUC__ == 2 && __GNUC_MINOR__ == 95
|
|
# undef G_HAVE_ISO_VARARGS
|
|
#endif
|
|
|
|
#define G_HAVE_GNUC_VARARGS 1
|
|
#define G_HAVE_GROWING_STACK 0
|
|
|
|
#define G_HAVE_GNUC_VISIBILITY 1
|
|
#if defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)
|
|
#define G_GNUC_INTERNAL __attribute__((visibility("hidden")))
|
|
#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550)
|
|
#define G_GNUC_INTERNAL __hidden
|
|
#elif defined (__GNUC__) && defined (G_HAVE_GNUC_VISIBILITY)
|
|
#define G_GNUC_INTERNAL __attribute__((visibility("hidden")))
|
|
#else
|
|
#define G_GNUC_INTERNAL
|
|
#endif
|
|
|
|
#define G_THREADS_ENABLED
|
|
#define G_THREADS_IMPL_POSIX
|
|
|
|
#define G_ATOMIC_LOCK_FREE
|
|
|
|
#define GINT16_TO_LE(val) ((gint16) (val))
|
|
#define GUINT16_TO_LE(val) ((guint16) (val))
|
|
#define GINT16_TO_BE(val) ((gint16) GUINT16_SWAP_LE_BE (val))
|
|
#define GUINT16_TO_BE(val) (GUINT16_SWAP_LE_BE (val))
|
|
#define GINT32_TO_LE(val) ((gint32) (val))
|
|
#define GUINT32_TO_LE(val) ((guint32) (val))
|
|
#define GINT32_TO_BE(val) ((gint32) GUINT32_SWAP_LE_BE (val))
|
|
#define GUINT32_TO_BE(val) (GUINT32_SWAP_LE_BE (val))
|
|
#define GINT64_TO_LE(val) ((gint64) (val))
|
|
#define GUINT64_TO_LE(val) ((guint64) (val))
|
|
#define GINT64_TO_BE(val) ((gint64) GUINT64_SWAP_LE_BE (val))
|
|
#define GUINT64_TO_BE(val) (GUINT64_SWAP_LE_BE (val))
|
|
#define GLONG_TO_LE(val) ((glong) GINT32_TO_LE (val))
|
|
#define GULONG_TO_LE(val) ((gulong) GUINT32_TO_LE (val))
|
|
#define GLONG_TO_BE(val) ((glong) GINT32_TO_BE (val))
|
|
#define GULONG_TO_BE(val) ((gulong) GUINT32_TO_BE (val))
|
|
#define GINT_TO_LE(val) ((gint) GINT32_TO_LE (val))
|
|
#define GUINT_TO_LE(val) ((guint) GUINT32_TO_LE (val))
|
|
#define GINT_TO_BE(val) ((gint) GINT32_TO_BE (val))
|
|
#define GUINT_TO_BE(val) ((guint) GUINT32_TO_BE (val))
|
|
#define GSIZE_TO_LE(val) ((gsize) GUINT32_TO_LE (val))
|
|
#define GSSIZE_TO_LE(val) ((gssize) GINT32_TO_LE (val))
|
|
#define GSIZE_TO_BE(val) ((gsize) GUINT32_TO_BE (val))
|
|
#define GSSIZE_TO_BE(val) ((gssize) GINT32_TO_BE (val))
|
|
#define G_BYTE_ORDER G_LITTLE_ENDIAN
|
|
|
|
#define GLIB_SYSDEF_POLLIN =1
|
|
#define GLIB_SYSDEF_POLLOUT =4
|
|
#define GLIB_SYSDEF_POLLPRI =2
|
|
#define GLIB_SYSDEF_POLLHUP =16
|
|
#define GLIB_SYSDEF_POLLERR =8
|
|
#define GLIB_SYSDEF_POLLNVAL =32
|
|
|
|
#define G_MODULE_SUFFIX "so"
|
|
|
|
typedef int GPid;
|
|
#define G_PID_FORMAT "i"
|
|
|
|
#define GLIB_SYSDEF_AF_UNIX 1
|
|
#define GLIB_SYSDEF_AF_INET 2
|
|
#define GLIB_SYSDEF_AF_INET6 10
|
|
|
|
#define GLIB_SYSDEF_MSG_OOB 1
|
|
#define GLIB_SYSDEF_MSG_PEEK 2
|
|
#define GLIB_SYSDEF_MSG_DONTROUTE 4
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __GLIBCONFIG_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_VERSION_MACROS_H__
|
|
#define __G_VERSION_MACROS_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
/* Version boundaries checks */
|
|
|
|
#define G_ENCODE_VERSION(major,minor) ((major) << 16 | (minor) << 8)
|
|
|
|
/* XXX: Every new stable minor release bump should add a macro here */
|
|
|
|
/**
|
|
* GLIB_VERSION_2_26:
|
|
*
|
|
* A macro that evaluates to the 2.26 version of GLib, in a format
|
|
* that can be used by the C pre-processor.
|
|
*
|
|
* Since: 2.32
|
|
*/
|
|
#define GLIB_VERSION_2_26 (G_ENCODE_VERSION (2, 26))
|
|
|
|
/**
|
|
* GLIB_VERSION_2_28:
|
|
*
|
|
* A macro that evaluates to the 2.28 version of GLib, in a format
|
|
* that can be used by the C pre-processor.
|
|
*
|
|
* Since: 2.32
|
|
*/
|
|
#define GLIB_VERSION_2_28 (G_ENCODE_VERSION (2, 28))
|
|
|
|
/**
|
|
* GLIB_VERSION_2_30:
|
|
*
|
|
* A macro that evaluates to the 2.30 version of GLib, in a format
|
|
* that can be used by the C pre-processor.
|
|
*
|
|
* Since: 2.32
|
|
*/
|
|
#define GLIB_VERSION_2_30 (G_ENCODE_VERSION (2, 30))
|
|
|
|
/**
|
|
* GLIB_VERSION_2_32:
|
|
*
|
|
* A macro that evaluates to the 2.32 version of GLib, in a format
|
|
* that can be used by the C pre-processor.
|
|
*
|
|
* Since: 2.32
|
|
*/
|
|
#define GLIB_VERSION_2_32 (G_ENCODE_VERSION (2, 32))
|
|
|
|
/**
|
|
* GLIB_VERSION_2_34:
|
|
*
|
|
* A macro that evaluates to the 2.34 version of GLib, in a format
|
|
* that can be used by the C pre-processor.
|
|
*
|
|
* Since: 2.34
|
|
*/
|
|
#define GLIB_VERSION_2_34 (G_ENCODE_VERSION (2, 34))
|
|
|
|
/**
|
|
* GLIB_VERSION_2_36:
|
|
*
|
|
* A macro that evaluates to the 2.36 version of GLib, in a format
|
|
* that can be used by the C pre-processor.
|
|
*
|
|
* Since: 2.36
|
|
*/
|
|
#define GLIB_VERSION_2_36 (G_ENCODE_VERSION (2, 36))
|
|
|
|
/**
|
|
* GLIB_VERSION_2_38:
|
|
*
|
|
* A macro that evaluates to the 2.38 version of GLib, in a format
|
|
* that can be used by the C pre-processor.
|
|
*
|
|
* Since: 2.38
|
|
*/
|
|
#define GLIB_VERSION_2_38 (G_ENCODE_VERSION (2, 38))
|
|
|
|
/**
|
|
* GLIB_VERSION_2_40:
|
|
*
|
|
* A macro that evaluates to the 2.40 version of GLib, in a format
|
|
* that can be used by the C pre-processor.
|
|
*
|
|
* Since: 2.40
|
|
*/
|
|
#define GLIB_VERSION_2_40 (G_ENCODE_VERSION (2, 40))
|
|
|
|
/**
|
|
* GLIB_VERSION_2_42:
|
|
*
|
|
* A macro that evaluates to the 2.42 version of GLib, in a format
|
|
* that can be used by the C pre-processor.
|
|
*
|
|
* Since: 2.42
|
|
*/
|
|
#define GLIB_VERSION_2_42 (G_ENCODE_VERSION (2, 42))
|
|
|
|
/**
|
|
* GLIB_VERSION_2_44:
|
|
*
|
|
* A macro that evaluates to the 2.44 version of GLib, in a format
|
|
* that can be used by the C pre-processor.
|
|
*
|
|
* Since: 2.44
|
|
*/
|
|
#define GLIB_VERSION_2_44 (G_ENCODE_VERSION (2, 44))
|
|
|
|
/**
|
|
* GLIB_VERSION_2_46:
|
|
*
|
|
* A macro that evaluates to the 2.46 version of GLib, in a format
|
|
* that can be used by the C pre-processor.
|
|
*
|
|
* Since: 2.46
|
|
*/
|
|
#define GLIB_VERSION_2_46 (G_ENCODE_VERSION (2, 46))
|
|
|
|
/**
|
|
* GLIB_VERSION_2_48:
|
|
*
|
|
* A macro that evaluates to the 2.48 version of GLib, in a format
|
|
* that can be used by the C pre-processor.
|
|
*
|
|
* Since: 2.48
|
|
*/
|
|
#define GLIB_VERSION_2_48 (G_ENCODE_VERSION (2, 48))
|
|
|
|
/**
|
|
* GLIB_VERSION_2_50:
|
|
*
|
|
* A macro that evaluates to the 2.50 version of GLib, in a format
|
|
* that can be used by the C pre-processor.
|
|
*
|
|
* Since: 2.50
|
|
*/
|
|
#define GLIB_VERSION_2_50 (G_ENCODE_VERSION (2, 50))
|
|
|
|
/**
|
|
* GLIB_VERSION_2_52:
|
|
*
|
|
* A macro that evaluates to the 2.52 version of GLib, in a format
|
|
* that can be used by the C pre-processor.
|
|
*
|
|
* Since: 2.52
|
|
*/
|
|
#define GLIB_VERSION_2_52 (G_ENCODE_VERSION (2, 52))
|
|
|
|
/* evaluates to the current stable version; for development cycles,
|
|
* this means the next stable target
|
|
*/
|
|
#if (GLIB_MINOR_VERSION % 2)
|
|
#define GLIB_VERSION_CUR_STABLE (G_ENCODE_VERSION (GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION + 1))
|
|
#else
|
|
#define GLIB_VERSION_CUR_STABLE (G_ENCODE_VERSION (GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION))
|
|
#endif
|
|
|
|
/* evaluates to the previous stable version */
|
|
#if (GLIB_MINOR_VERSION % 2)
|
|
#define GLIB_VERSION_PREV_STABLE (G_ENCODE_VERSION (GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION - 1))
|
|
#else
|
|
#define GLIB_VERSION_PREV_STABLE (G_ENCODE_VERSION (GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION - 2))
|
|
#endif
|
|
|
|
/**
|
|
* GLIB_VERSION_MIN_REQUIRED:
|
|
*
|
|
* A macro that should be defined by the user prior to including
|
|
* the glib.h header.
|
|
* The definition should be one of the predefined GLib version
|
|
* macros: %GLIB_VERSION_2_26, %GLIB_VERSION_2_28,...
|
|
*
|
|
* This macro defines the earliest version of GLib that the package is
|
|
* required to be able to compile against.
|
|
*
|
|
* If the compiler is configured to warn about the use of deprecated
|
|
* functions, then using functions that were deprecated in version
|
|
* %GLIB_VERSION_MIN_REQUIRED or earlier will cause warnings (but
|
|
* using functions deprecated in later releases will not).
|
|
*
|
|
* Since: 2.32
|
|
*/
|
|
/* If the package sets GLIB_VERSION_MIN_REQUIRED to some future
|
|
* GLIB_VERSION_X_Y value that we don't know about, it will compare as
|
|
* 0 in preprocessor tests.
|
|
*/
|
|
#ifndef GLIB_VERSION_MIN_REQUIRED
|
|
# define GLIB_VERSION_MIN_REQUIRED (GLIB_VERSION_CUR_STABLE)
|
|
#elif GLIB_VERSION_MIN_REQUIRED == 0
|
|
# undef GLIB_VERSION_MIN_REQUIRED
|
|
# define GLIB_VERSION_MIN_REQUIRED (GLIB_VERSION_CUR_STABLE + 2)
|
|
#endif
|
|
|
|
/**
|
|
* GLIB_VERSION_MAX_ALLOWED:
|
|
*
|
|
* A macro that should be defined by the user prior to including
|
|
* the glib.h header.
|
|
* The definition should be one of the predefined GLib version
|
|
* macros: %GLIB_VERSION_2_26, %GLIB_VERSION_2_28,...
|
|
*
|
|
* This macro defines the latest version of the GLib API that the
|
|
* package is allowed to make use of.
|
|
*
|
|
* If the compiler is configured to warn about the use of deprecated
|
|
* functions, then using functions added after version
|
|
* %GLIB_VERSION_MAX_ALLOWED will cause warnings.
|
|
*
|
|
* Unless you are using GLIB_CHECK_VERSION() or the like to compile
|
|
* different code depending on the GLib version, then this should be
|
|
* set to the same value as %GLIB_VERSION_MIN_REQUIRED.
|
|
*
|
|
* Since: 2.32
|
|
*/
|
|
#if !defined (GLIB_VERSION_MAX_ALLOWED) || (GLIB_VERSION_MAX_ALLOWED == 0)
|
|
# undef GLIB_VERSION_MAX_ALLOWED
|
|
# define GLIB_VERSION_MAX_ALLOWED (GLIB_VERSION_CUR_STABLE)
|
|
#endif
|
|
|
|
/* sanity checks */
|
|
#if GLIB_VERSION_MIN_REQUIRED > GLIB_VERSION_CUR_STABLE
|
|
#error "GLIB_VERSION_MIN_REQUIRED must be <= GLIB_VERSION_CUR_STABLE"
|
|
#endif
|
|
#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_MIN_REQUIRED
|
|
#error "GLIB_VERSION_MAX_ALLOWED must be >= GLIB_VERSION_MIN_REQUIRED"
|
|
#endif
|
|
#if GLIB_VERSION_MIN_REQUIRED < GLIB_VERSION_2_26
|
|
#error "GLIB_VERSION_MIN_REQUIRED must be >= GLIB_VERSION_2_26"
|
|
#endif
|
|
|
|
/* These macros are used to mark deprecated functions in GLib headers,
|
|
* and thus have to be exposed in installed headers. But please
|
|
* do *not* use them in other projects. Instead, use G_DEPRECATED
|
|
* or define your own wrappers around it.
|
|
*/
|
|
#define GLIB_AVAILABLE_IN_ALL _GLIB_EXTERN
|
|
|
|
/* XXX: Every new stable minor release should add a set of macros here */
|
|
|
|
#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_26
|
|
# define GLIB_DEPRECATED_IN_2_26 GLIB_DEPRECATED
|
|
# define GLIB_DEPRECATED_IN_2_26_FOR(f) GLIB_DEPRECATED_FOR(f)
|
|
#else
|
|
# define GLIB_DEPRECATED_IN_2_26 _GLIB_EXTERN
|
|
# define GLIB_DEPRECATED_IN_2_26_FOR(f) _GLIB_EXTERN
|
|
#endif
|
|
|
|
#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_26
|
|
# define GLIB_AVAILABLE_IN_2_26 GLIB_UNAVAILABLE(2, 26)
|
|
#else
|
|
# define GLIB_AVAILABLE_IN_2_26 _GLIB_EXTERN
|
|
#endif
|
|
|
|
#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_28
|
|
# define GLIB_DEPRECATED_IN_2_28 GLIB_DEPRECATED
|
|
# define GLIB_DEPRECATED_IN_2_28_FOR(f) GLIB_DEPRECATED_FOR(f)
|
|
#else
|
|
# define GLIB_DEPRECATED_IN_2_28 _GLIB_EXTERN
|
|
# define GLIB_DEPRECATED_IN_2_28_FOR(f) _GLIB_EXTERN
|
|
#endif
|
|
|
|
#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_28
|
|
# define GLIB_AVAILABLE_IN_2_28 GLIB_UNAVAILABLE(2, 28)
|
|
#else
|
|
# define GLIB_AVAILABLE_IN_2_28 _GLIB_EXTERN
|
|
#endif
|
|
|
|
#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_30
|
|
# define GLIB_DEPRECATED_IN_2_30 GLIB_DEPRECATED
|
|
# define GLIB_DEPRECATED_IN_2_30_FOR(f) GLIB_DEPRECATED_FOR(f)
|
|
#else
|
|
# define GLIB_DEPRECATED_IN_2_30 _GLIB_EXTERN
|
|
# define GLIB_DEPRECATED_IN_2_30_FOR(f) _GLIB_EXTERN
|
|
#endif
|
|
|
|
#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_30
|
|
# define GLIB_AVAILABLE_IN_2_30 GLIB_UNAVAILABLE(2, 30)
|
|
#else
|
|
# define GLIB_AVAILABLE_IN_2_30 _GLIB_EXTERN
|
|
#endif
|
|
|
|
#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_32
|
|
# define GLIB_DEPRECATED_IN_2_32 GLIB_DEPRECATED
|
|
# define GLIB_DEPRECATED_IN_2_32_FOR(f) GLIB_DEPRECATED_FOR(f)
|
|
#else
|
|
# define GLIB_DEPRECATED_IN_2_32 _GLIB_EXTERN
|
|
# define GLIB_DEPRECATED_IN_2_32_FOR(f) _GLIB_EXTERN
|
|
#endif
|
|
|
|
#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_32
|
|
# define GLIB_AVAILABLE_IN_2_32 GLIB_UNAVAILABLE(2, 32)
|
|
#else
|
|
# define GLIB_AVAILABLE_IN_2_32 _GLIB_EXTERN
|
|
#endif
|
|
|
|
#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_34
|
|
# define GLIB_DEPRECATED_IN_2_34 GLIB_DEPRECATED
|
|
# define GLIB_DEPRECATED_IN_2_34_FOR(f) GLIB_DEPRECATED_FOR(f)
|
|
#else
|
|
# define GLIB_DEPRECATED_IN_2_34 _GLIB_EXTERN
|
|
# define GLIB_DEPRECATED_IN_2_34_FOR(f) _GLIB_EXTERN
|
|
#endif
|
|
|
|
#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_34
|
|
# define GLIB_AVAILABLE_IN_2_34 GLIB_UNAVAILABLE(2, 34)
|
|
#else
|
|
# define GLIB_AVAILABLE_IN_2_34 _GLIB_EXTERN
|
|
#endif
|
|
|
|
#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_36
|
|
# define GLIB_DEPRECATED_IN_2_36 GLIB_DEPRECATED
|
|
# define GLIB_DEPRECATED_IN_2_36_FOR(f) GLIB_DEPRECATED_FOR(f)
|
|
#else
|
|
# define GLIB_DEPRECATED_IN_2_36 _GLIB_EXTERN
|
|
# define GLIB_DEPRECATED_IN_2_36_FOR(f) _GLIB_EXTERN
|
|
#endif
|
|
|
|
#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_36
|
|
# define GLIB_AVAILABLE_IN_2_36 GLIB_UNAVAILABLE(2, 36)
|
|
#else
|
|
# define GLIB_AVAILABLE_IN_2_36 _GLIB_EXTERN
|
|
#endif
|
|
|
|
#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_38
|
|
# define GLIB_DEPRECATED_IN_2_38 GLIB_DEPRECATED
|
|
# define GLIB_DEPRECATED_IN_2_38_FOR(f) GLIB_DEPRECATED_FOR(f)
|
|
#else
|
|
# define GLIB_DEPRECATED_IN_2_38 _GLIB_EXTERN
|
|
# define GLIB_DEPRECATED_IN_2_38_FOR(f) _GLIB_EXTERN
|
|
#endif
|
|
|
|
#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
|
|
# define GLIB_AVAILABLE_IN_2_38 GLIB_UNAVAILABLE(2, 38)
|
|
#else
|
|
# define GLIB_AVAILABLE_IN_2_38 _GLIB_EXTERN
|
|
#endif
|
|
|
|
#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_40
|
|
# define GLIB_DEPRECATED_IN_2_40 GLIB_DEPRECATED
|
|
# define GLIB_DEPRECATED_IN_2_40_FOR(f) GLIB_DEPRECATED_FOR(f)
|
|
#else
|
|
# define GLIB_DEPRECATED_IN_2_40 _GLIB_EXTERN
|
|
# define GLIB_DEPRECATED_IN_2_40_FOR(f) _GLIB_EXTERN
|
|
#endif
|
|
|
|
#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_40
|
|
# define GLIB_AVAILABLE_IN_2_40 GLIB_UNAVAILABLE(2, 40)
|
|
#else
|
|
# define GLIB_AVAILABLE_IN_2_40 _GLIB_EXTERN
|
|
#endif
|
|
|
|
#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_42
|
|
# define GLIB_DEPRECATED_IN_2_42 GLIB_DEPRECATED
|
|
# define GLIB_DEPRECATED_IN_2_42_FOR(f) GLIB_DEPRECATED_FOR(f)
|
|
#else
|
|
# define GLIB_DEPRECATED_IN_2_42 _GLIB_EXTERN
|
|
# define GLIB_DEPRECATED_IN_2_42_FOR(f) _GLIB_EXTERN
|
|
#endif
|
|
|
|
#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_42
|
|
# define GLIB_AVAILABLE_IN_2_42 GLIB_UNAVAILABLE(2, 42)
|
|
#else
|
|
# define GLIB_AVAILABLE_IN_2_42 _GLIB_EXTERN
|
|
#endif
|
|
|
|
#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_44
|
|
# define GLIB_DEPRECATED_IN_2_44 GLIB_DEPRECATED
|
|
# define GLIB_DEPRECATED_IN_2_44_FOR(f) GLIB_DEPRECATED_FOR(f)
|
|
#else
|
|
# define GLIB_DEPRECATED_IN_2_44 _GLIB_EXTERN
|
|
# define GLIB_DEPRECATED_IN_2_44_FOR(f) _GLIB_EXTERN
|
|
#endif
|
|
|
|
#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_44
|
|
# define GLIB_AVAILABLE_IN_2_44 GLIB_UNAVAILABLE(2, 44)
|
|
#else
|
|
# define GLIB_AVAILABLE_IN_2_44 _GLIB_EXTERN
|
|
#endif
|
|
|
|
#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_46
|
|
# define GLIB_DEPRECATED_IN_2_46 GLIB_DEPRECATED
|
|
# define GLIB_DEPRECATED_IN_2_46_FOR(f) GLIB_DEPRECATED_FOR(f)
|
|
#else
|
|
# define GLIB_DEPRECATED_IN_2_46 _GLIB_EXTERN
|
|
# define GLIB_DEPRECATED_IN_2_46_FOR(f) _GLIB_EXTERN
|
|
#endif
|
|
|
|
#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_46
|
|
# define GLIB_AVAILABLE_IN_2_46 GLIB_UNAVAILABLE(2, 46)
|
|
#else
|
|
# define GLIB_AVAILABLE_IN_2_46 _GLIB_EXTERN
|
|
#endif
|
|
|
|
#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_48
|
|
# define GLIB_DEPRECATED_IN_2_48 GLIB_DEPRECATED
|
|
# define GLIB_DEPRECATED_IN_2_48_FOR(f) GLIB_DEPRECATED_FOR(f)
|
|
#else
|
|
# define GLIB_DEPRECATED_IN_2_48 _GLIB_EXTERN
|
|
# define GLIB_DEPRECATED_IN_2_48_FOR(f) _GLIB_EXTERN
|
|
#endif
|
|
|
|
#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_48
|
|
# define GLIB_AVAILABLE_IN_2_48 GLIB_UNAVAILABLE(2, 48)
|
|
#else
|
|
# define GLIB_AVAILABLE_IN_2_48 _GLIB_EXTERN
|
|
#endif
|
|
|
|
#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_50
|
|
# define GLIB_DEPRECATED_IN_2_50 GLIB_DEPRECATED
|
|
# define GLIB_DEPRECATED_IN_2_50_FOR(f) GLIB_DEPRECATED_FOR(f)
|
|
#else
|
|
# define GLIB_DEPRECATED_IN_2_50 _GLIB_EXTERN
|
|
# define GLIB_DEPRECATED_IN_2_50_FOR(f) _GLIB_EXTERN
|
|
#endif
|
|
|
|
#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_50
|
|
# define GLIB_AVAILABLE_IN_2_50 GLIB_UNAVAILABLE(2, 50)
|
|
#else
|
|
# define GLIB_AVAILABLE_IN_2_50 _GLIB_EXTERN
|
|
#endif
|
|
|
|
#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_52
|
|
# define GLIB_DEPRECATED_IN_2_52 GLIB_DEPRECATED
|
|
# define GLIB_DEPRECATED_IN_2_52_FOR(f) GLIB_DEPRECATED_FOR(f)
|
|
#else
|
|
# define GLIB_DEPRECATED_IN_2_52 _GLIB_EXTERN
|
|
# define GLIB_DEPRECATED_IN_2_52_FOR(f) _GLIB_EXTERN
|
|
#endif
|
|
|
|
#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_52
|
|
# define GLIB_AVAILABLE_IN_2_52 GLIB_UNAVAILABLE(2, 52)
|
|
#else
|
|
# define GLIB_AVAILABLE_IN_2_52 _GLIB_EXTERN
|
|
#endif
|
|
|
|
#endif /* __G_VERSION_MACROS_H__ */
|
|
#include <time.h>
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/* Provide type definitions for commonly used types.
|
|
* These are useful because a "gint8" can be adjusted
|
|
* to be 1 byte (8 bits) on all platforms. Similarly and
|
|
* more importantly, "gint32" can be adjusted to be
|
|
* 4 bytes (32 bits) on all platforms.
|
|
*/
|
|
|
|
typedef char gchar;
|
|
typedef short gshort;
|
|
typedef long glong;
|
|
typedef int gint;
|
|
typedef gint gboolean;
|
|
|
|
typedef unsigned char guchar;
|
|
typedef unsigned short gushort;
|
|
typedef unsigned long gulong;
|
|
typedef unsigned int guint;
|
|
|
|
typedef float gfloat;
|
|
typedef double gdouble;
|
|
|
|
/* Define min and max constants for the fixed size numerical types */
|
|
#define G_MININT8 ((gint8) -0x80)
|
|
#define G_MAXINT8 ((gint8) 0x7f)
|
|
#define G_MAXUINT8 ((guint8) 0xff)
|
|
|
|
#define G_MININT16 ((gint16) -0x8000)
|
|
#define G_MAXINT16 ((gint16) 0x7fff)
|
|
#define G_MAXUINT16 ((guint16) 0xffff)
|
|
|
|
#define G_MININT32 ((gint32) (-0x7fffffff - 1))
|
|
#define G_MAXINT32 ((gint32) 0x7fffffff)
|
|
#define G_MAXUINT32 ((guint32) 0xffffffff)
|
|
|
|
#define G_MININT64 ((gint64) G_GINT64_CONSTANT(-0x8000000000000000))
|
|
#define G_MAXINT64 G_GINT64_CONSTANT(0x7fffffffffffffff)
|
|
#define G_MAXUINT64 G_GUINT64_CONSTANT(0xffffffffffffffff)
|
|
|
|
typedef void* gpointer;
|
|
typedef const void *gconstpointer;
|
|
|
|
typedef gint (*GCompareFunc) (gconstpointer a,
|
|
gconstpointer b);
|
|
typedef gint (*GCompareDataFunc) (gconstpointer a,
|
|
gconstpointer b,
|
|
gpointer user_data);
|
|
typedef gboolean (*GEqualFunc) (gconstpointer a,
|
|
gconstpointer b);
|
|
typedef void (*GDestroyNotify) (gpointer data);
|
|
typedef void (*GFunc) (gpointer data,
|
|
gpointer user_data);
|
|
typedef guint (*GHashFunc) (gconstpointer key);
|
|
typedef void (*GHFunc) (gpointer key,
|
|
gpointer value,
|
|
gpointer user_data);
|
|
|
|
/**
|
|
* GFreeFunc:
|
|
* @data: a data pointer
|
|
*
|
|
* Declares a type of function which takes an arbitrary
|
|
* data pointer argument and has no return value. It is
|
|
* not currently used in GLib or GTK+.
|
|
*/
|
|
typedef void (*GFreeFunc) (gpointer data);
|
|
|
|
/**
|
|
* GTranslateFunc:
|
|
* @str: the untranslated string
|
|
* @data: user data specified when installing the function, e.g.
|
|
* in g_option_group_set_translate_func()
|
|
*
|
|
* The type of functions which are used to translate user-visible
|
|
* strings, for <option>--help</option> output.
|
|
*
|
|
* Returns: a translation of the string for the current locale.
|
|
* The returned string is owned by GLib and must not be freed.
|
|
*/
|
|
typedef const gchar * (*GTranslateFunc) (const gchar *str,
|
|
gpointer data);
|
|
|
|
|
|
/* Define some mathematical constants that aren't available
|
|
* symbolically in some strict ISO C implementations.
|
|
*
|
|
* Note that the large number of digits used in these definitions
|
|
* doesn't imply that GLib or current computers in general would be
|
|
* able to handle floating point numbers with an accuracy like this.
|
|
* It's mostly an exercise in futility and future proofing. For
|
|
* extended precision floating point support, look somewhere else
|
|
* than GLib.
|
|
*/
|
|
#define G_E 2.7182818284590452353602874713526624977572470937000
|
|
#define G_LN2 0.69314718055994530941723212145817656807550013436026
|
|
#define G_LN10 2.3025850929940456840179914546843642076011014886288
|
|
#define G_PI 3.1415926535897932384626433832795028841971693993751
|
|
#define G_PI_2 1.5707963267948966192313216916397514420985846996876
|
|
#define G_PI_4 0.78539816339744830961566084581987572104929234984378
|
|
#define G_SQRT2 1.4142135623730950488016887242096980785696718753769
|
|
|
|
/* Portable endian checks and conversions
|
|
*
|
|
* glibconfig.h defines G_BYTE_ORDER which expands to one of
|
|
* the below macros.
|
|
*/
|
|
#define G_LITTLE_ENDIAN 1234
|
|
#define G_BIG_ENDIAN 4321
|
|
#define G_PDP_ENDIAN 3412 /* unused, need specific PDP check */
|
|
|
|
|
|
/* Basic bit swapping functions
|
|
*/
|
|
#define GUINT16_SWAP_LE_BE_CONSTANT(val) ((guint16) ( \
|
|
(guint16) ((guint16) (val) >> 8) | \
|
|
(guint16) ((guint16) (val) << 8)))
|
|
|
|
#define GUINT32_SWAP_LE_BE_CONSTANT(val) ((guint32) ( \
|
|
(((guint32) (val) & (guint32) 0x000000ffU) << 24) | \
|
|
(((guint32) (val) & (guint32) 0x0000ff00U) << 8) | \
|
|
(((guint32) (val) & (guint32) 0x00ff0000U) >> 8) | \
|
|
(((guint32) (val) & (guint32) 0xff000000U) >> 24)))
|
|
|
|
#define GUINT64_SWAP_LE_BE_CONSTANT(val) ((guint64) ( \
|
|
(((guint64) (val) & \
|
|
(guint64) G_GINT64_CONSTANT (0x00000000000000ffU)) << 56) | \
|
|
(((guint64) (val) & \
|
|
(guint64) G_GINT64_CONSTANT (0x000000000000ff00U)) << 40) | \
|
|
(((guint64) (val) & \
|
|
(guint64) G_GINT64_CONSTANT (0x0000000000ff0000U)) << 24) | \
|
|
(((guint64) (val) & \
|
|
(guint64) G_GINT64_CONSTANT (0x00000000ff000000U)) << 8) | \
|
|
(((guint64) (val) & \
|
|
(guint64) G_GINT64_CONSTANT (0x000000ff00000000U)) >> 8) | \
|
|
(((guint64) (val) & \
|
|
(guint64) G_GINT64_CONSTANT (0x0000ff0000000000U)) >> 24) | \
|
|
(((guint64) (val) & \
|
|
(guint64) G_GINT64_CONSTANT (0x00ff000000000000U)) >> 40) | \
|
|
(((guint64) (val) & \
|
|
(guint64) G_GINT64_CONSTANT (0xff00000000000000U)) >> 56)))
|
|
|
|
/* Arch specific stuff for speed
|
|
*/
|
|
#if defined (__GNUC__) && (__GNUC__ >= 2) && defined (__OPTIMIZE__)
|
|
|
|
# if __GNUC__ >= 4 && defined (__GNUC_MINOR__) && __GNUC_MINOR__ >= 3
|
|
# define GUINT32_SWAP_LE_BE(val) ((guint32) __builtin_bswap32 ((gint32) (val)))
|
|
# define GUINT64_SWAP_LE_BE(val) ((guint64) __builtin_bswap64 ((gint64) (val)))
|
|
# endif
|
|
|
|
# if defined (__i386__)
|
|
# define GUINT16_SWAP_LE_BE_IA32(val) \
|
|
(lG_GNUC_EXTENSION \
|
|
({ guint16 __v, __x = ((guint16) (val)); \
|
|
if (__builtin_constant_p (__x)) \
|
|
__v = GUINT16_SWAP_LE_BE_CONSTANT (__x); \
|
|
else \
|
|
__asm__ ("rorw $8, %w0" \
|
|
: "=r" (__v) \
|
|
: "0" (__x) \
|
|
: "cc"); \
|
|
__v; }))
|
|
# if !defined (__i486__) && !defined (__i586__) \
|
|
&& !defined (__pentium__) && !defined (__i686__) \
|
|
&& !defined (__pentiumpro__) && !defined (__pentium4__)
|
|
# define GUINT32_SWAP_LE_BE_IA32(val) \
|
|
(lG_GNUC_EXTENSION \
|
|
({ guint32 __v, __x = ((guint32) (val)); \
|
|
if (__builtin_constant_p (__x)) \
|
|
__v = GUINT32_SWAP_LE_BE_CONSTANT (__x); \
|
|
else \
|
|
__asm__ ("rorw $8, %w0\n\t" \
|
|
"rorl $16, %0\n\t" \
|
|
"rorw $8, %w0" \
|
|
: "=r" (__v) \
|
|
: "0" (__x) \
|
|
: "cc"); \
|
|
__v; }))
|
|
# else /* 486 and higher has bswap */
|
|
# define GUINT32_SWAP_LE_BE_IA32(val) \
|
|
(lG_GNUC_EXTENSION \
|
|
({ guint32 __v, __x = ((guint32) (val)); \
|
|
if (__builtin_constant_p (__x)) \
|
|
__v = GUINT32_SWAP_LE_BE_CONSTANT (__x); \
|
|
else \
|
|
__asm__ ("bswap %0" \
|
|
: "=r" (__v) \
|
|
: "0" (__x)); \
|
|
__v; }))
|
|
# endif /* processor specific 32-bit stuff */
|
|
# define GUINT64_SWAP_LE_BE_IA32(val) \
|
|
(lG_GNUC_EXTENSION \
|
|
({ union { guint64 __ll; \
|
|
guint32 __l[2]; } __w, __r; \
|
|
__w.__ll = ((guint64) (val)); \
|
|
if (__builtin_constant_p (__w.__ll)) \
|
|
__r.__ll = GUINT64_SWAP_LE_BE_CONSTANT (__w.__ll); \
|
|
else \
|
|
{ \
|
|
__r.__l[0] = GUINT32_SWAP_LE_BE (__w.__l[1]); \
|
|
__r.__l[1] = GUINT32_SWAP_LE_BE (__w.__l[0]); \
|
|
} \
|
|
__r.__ll; }))
|
|
/* Possibly just use the constant version and let gcc figure it out? */
|
|
# define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_IA32 (val))
|
|
# ifndef GUINT32_SWAP_LE_BE
|
|
# define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_IA32 (val))
|
|
# endif
|
|
# ifndef GUINT64_SWAP_LE_BE
|
|
# define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_IA32 (val))
|
|
# endif
|
|
# elif defined (__ia64__)
|
|
# define GUINT16_SWAP_LE_BE_IA64(val) \
|
|
(lG_GNUC_EXTENSION \
|
|
({ guint16 __v, __x = ((guint16) (val)); \
|
|
if (__builtin_constant_p (__x)) \
|
|
__v = GUINT16_SWAP_LE_BE_CONSTANT (__x); \
|
|
else \
|
|
__asm__ __volatile__ ("shl %0 = %1, 48 ;;" \
|
|
"mux1 %0 = %0, @rev ;;" \
|
|
: "=r" (__v) \
|
|
: "r" (__x)); \
|
|
__v; }))
|
|
# define GUINT32_SWAP_LE_BE_IA64(val) \
|
|
(lG_GNUC_EXTENSION \
|
|
({ guint32 __v, __x = ((guint32) (val)); \
|
|
if (__builtin_constant_p (__x)) \
|
|
__v = GUINT32_SWAP_LE_BE_CONSTANT (__x); \
|
|
else \
|
|
__asm__ __volatile__ ("shl %0 = %1, 32 ;;" \
|
|
"mux1 %0 = %0, @rev ;;" \
|
|
: "=r" (__v) \
|
|
: "r" (__x)); \
|
|
__v; }))
|
|
# define GUINT64_SWAP_LE_BE_IA64(val) \
|
|
(lG_GNUC_EXTENSION \
|
|
({ guint64 __v, __x = ((guint64) (val)); \
|
|
if (__builtin_constant_p (__x)) \
|
|
__v = GUINT64_SWAP_LE_BE_CONSTANT (__x); \
|
|
else \
|
|
__asm__ __volatile__ ("mux1 %0 = %1, @rev ;;" \
|
|
: "=r" (__v) \
|
|
: "r" (__x)); \
|
|
__v; }))
|
|
# define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_IA64 (val))
|
|
# ifndef GUINT32_SWAP_LE_BE
|
|
# define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_IA64 (val))
|
|
# endif
|
|
# ifndef GUINT64_SWAP_LE_BE
|
|
# define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_IA64 (val))
|
|
# endif
|
|
# elif defined (__x86_64__)
|
|
# define GUINT32_SWAP_LE_BE_X86_64(val) \
|
|
(lG_GNUC_EXTENSION \
|
|
({ guint32 __v, __x = ((guint32) (val)); \
|
|
if (__builtin_constant_p (__x)) \
|
|
__v = GUINT32_SWAP_LE_BE_CONSTANT (__x); \
|
|
else \
|
|
__asm__ ("bswapl %0" \
|
|
: "=r" (__v) \
|
|
: "0" (__x)); \
|
|
__v; }))
|
|
# define GUINT64_SWAP_LE_BE_X86_64(val) \
|
|
(lG_GNUC_EXTENSION \
|
|
({ guint64 __v, __x = ((guint64) (val)); \
|
|
if (__builtin_constant_p (__x)) \
|
|
__v = GUINT64_SWAP_LE_BE_CONSTANT (__x); \
|
|
else \
|
|
__asm__ ("bswapq %0" \
|
|
: "=r" (__v) \
|
|
: "0" (__x)); \
|
|
__v; }))
|
|
/* gcc seems to figure out optimal code for this on its own */
|
|
# define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_CONSTANT (val))
|
|
# ifndef GUINT32_SWAP_LE_BE
|
|
# define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_X86_64 (val))
|
|
# endif
|
|
# ifndef GUINT64_SWAP_LE_BE
|
|
# define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_X86_64 (val))
|
|
# endif
|
|
# else /* generic gcc */
|
|
# define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_CONSTANT (val))
|
|
# ifndef GUINT32_SWAP_LE_BE
|
|
# define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_CONSTANT (val))
|
|
# endif
|
|
# ifndef GUINT64_SWAP_LE_BE
|
|
# define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_CONSTANT (val))
|
|
# endif
|
|
# endif
|
|
#else /* generic */
|
|
# define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_CONSTANT (val))
|
|
# define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_CONSTANT (val))
|
|
# define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_CONSTANT (val))
|
|
#endif /* generic */
|
|
|
|
#define GUINT16_SWAP_LE_PDP(val) ((guint16) (val))
|
|
#define GUINT16_SWAP_BE_PDP(val) (GUINT16_SWAP_LE_BE (val))
|
|
#define GUINT32_SWAP_LE_PDP(val) ((guint32) ( \
|
|
(((guint32) (val) & (guint32) 0x0000ffffU) << 16) | \
|
|
(((guint32) (val) & (guint32) 0xffff0000U) >> 16)))
|
|
#define GUINT32_SWAP_BE_PDP(val) ((guint32) ( \
|
|
(((guint32) (val) & (guint32) 0x00ff00ffU) << 8) | \
|
|
(((guint32) (val) & (guint32) 0xff00ff00U) >> 8)))
|
|
|
|
/* The G*_TO_?E() macros are defined in glibconfig.h.
|
|
* The transformation is symmetric, so the FROM just maps to the TO.
|
|
*/
|
|
#define GINT16_FROM_LE(val) (GINT16_TO_LE (val))
|
|
#define GUINT16_FROM_LE(val) (GUINT16_TO_LE (val))
|
|
#define GINT16_FROM_BE(val) (GINT16_TO_BE (val))
|
|
#define GUINT16_FROM_BE(val) (GUINT16_TO_BE (val))
|
|
#define GINT32_FROM_LE(val) (GINT32_TO_LE (val))
|
|
#define GUINT32_FROM_LE(val) (GUINT32_TO_LE (val))
|
|
#define GINT32_FROM_BE(val) (GINT32_TO_BE (val))
|
|
#define GUINT32_FROM_BE(val) (GUINT32_TO_BE (val))
|
|
|
|
#define GINT64_FROM_LE(val) (GINT64_TO_LE (val))
|
|
#define GUINT64_FROM_LE(val) (GUINT64_TO_LE (val))
|
|
#define GINT64_FROM_BE(val) (GINT64_TO_BE (val))
|
|
#define GUINT64_FROM_BE(val) (GUINT64_TO_BE (val))
|
|
|
|
#define GLONG_FROM_LE(val) (GLONG_TO_LE (val))
|
|
#define GULONG_FROM_LE(val) (GULONG_TO_LE (val))
|
|
#define GLONG_FROM_BE(val) (GLONG_TO_BE (val))
|
|
#define GULONG_FROM_BE(val) (GULONG_TO_BE (val))
|
|
|
|
#define GINT_FROM_LE(val) (GINT_TO_LE (val))
|
|
#define GUINT_FROM_LE(val) (GUINT_TO_LE (val))
|
|
#define GINT_FROM_BE(val) (GINT_TO_BE (val))
|
|
#define GUINT_FROM_BE(val) (GUINT_TO_BE (val))
|
|
|
|
#define GSIZE_FROM_LE(val) (GSIZE_TO_LE (val))
|
|
#define GSSIZE_FROM_LE(val) (GSSIZE_TO_LE (val))
|
|
#define GSIZE_FROM_BE(val) (GSIZE_TO_BE (val))
|
|
#define GSSIZE_FROM_BE(val) (GSSIZE_TO_BE (val))
|
|
|
|
/* Portable versions of host-network order stuff
|
|
*/
|
|
#define g_ntohl(val) (GUINT32_FROM_BE (val))
|
|
#define g_ntohs(val) (GUINT16_FROM_BE (val))
|
|
#define g_htonl(val) (GUINT32_TO_BE (val))
|
|
#define g_htons(val) (GUINT16_TO_BE (val))
|
|
|
|
/* Overflow-checked unsigned integer arithmetic
|
|
*/
|
|
#ifndef _GLIB_TEST_OVERFLOW_FALLBACK
|
|
/* https://bugzilla.gnome.org/show_bug.cgi?id=769104 */
|
|
#if __GNUC__ >= 5 && !defined(__INTEL_COMPILER)
|
|
#define _GLIB_HAVE_BUILTIN_OVERFLOW_CHECKS
|
|
#elif __has_builtin(__builtin_uadd_overflow)
|
|
#define _GLIB_HAVE_BUILTIN_OVERFLOW_CHECKS
|
|
#endif
|
|
#endif
|
|
|
|
#define g_uint_checked_add(dest, a, b) \
|
|
_GLIB_CHECKED_ADD_U32(dest, a, b)
|
|
#define g_uint_checked_mul(dest, a, b) \
|
|
_GLIB_CHECKED_MUL_U32(dest, a, b)
|
|
|
|
#define g_uint64_checked_add(dest, a, b) \
|
|
_GLIB_CHECKED_ADD_U64(dest, a, b)
|
|
#define g_uint64_checked_mul(dest, a, b) \
|
|
_GLIB_CHECKED_MUL_U64(dest, a, b)
|
|
|
|
#if GLIB_SIZEOF_SIZE_T == 8
|
|
#define g_size_checked_add(dest, a, b) \
|
|
_GLIB_CHECKED_ADD_U64(dest, a, b)
|
|
#define g_size_checked_mul(dest, a, b) \
|
|
_GLIB_CHECKED_MUL_U64(dest, a, b)
|
|
#else
|
|
#define g_size_checked_add(dest, a, b) \
|
|
_GLIB_CHECKED_ADD_U32(dest, a, b)
|
|
#define g_size_checked_mul(dest, a, b) \
|
|
_GLIB_CHECKED_MUL_U32(dest, a, b)
|
|
#endif
|
|
|
|
/* The names of the following inlines are private. Use the macro
|
|
* definitions above.
|
|
*/
|
|
#ifdef _GLIB_HAVE_BUILTIN_OVERFLOW_CHECKS
|
|
static inline gboolean _GLIB_CHECKED_ADD_U32 (guint32 *dest, guint32 a, guint32 b) {
|
|
return !__builtin_uadd_overflow(a, b, dest); }
|
|
static inline gboolean _GLIB_CHECKED_MUL_U32 (guint32 *dest, guint32 a, guint32 b) {
|
|
return !__builtin_umul_overflow(a, b, dest); }
|
|
static inline gboolean _GLIB_CHECKED_ADD_U64 (guint64 *dest, guint64 a, guint64 b) {
|
|
G_STATIC_ASSERT(sizeof (unsigned long long) == sizeof (guint64));
|
|
return !__builtin_uaddll_overflow(a, b, (unsigned long long *) dest); }
|
|
static inline gboolean _GLIB_CHECKED_MUL_U64 (guint64 *dest, guint64 a, guint64 b) {
|
|
return !__builtin_umulll_overflow(a, b, (unsigned long long *) dest); }
|
|
#else
|
|
static inline gboolean _GLIB_CHECKED_ADD_U32 (guint32 *dest, guint32 a, guint32 b) {
|
|
*dest = a + b; return *dest >= a; }
|
|
static inline gboolean _GLIB_CHECKED_MUL_U32 (guint32 *dest, guint32 a, guint32 b) {
|
|
*dest = a * b; return !a || *dest / a == b; }
|
|
static inline gboolean _GLIB_CHECKED_ADD_U64 (guint64 *dest, guint64 a, guint64 b) {
|
|
*dest = a + b; return *dest >= a; }
|
|
static inline gboolean _GLIB_CHECKED_MUL_U64 (guint64 *dest, guint64 a, guint64 b) {
|
|
*dest = a * b; return !a || *dest / a == b; }
|
|
#endif
|
|
|
|
/* IEEE Standard 754 Single Precision Storage Format (gfloat):
|
|
*
|
|
* 31 30 23 22 0
|
|
* +--------+---------------+---------------+
|
|
* | s 1bit | e[30:23] 8bit | f[22:0] 23bit |
|
|
* +--------+---------------+---------------+
|
|
* B0------------------->B1------->B2-->B3-->
|
|
*
|
|
* IEEE Standard 754 Double Precision Storage Format (gdouble):
|
|
*
|
|
* 63 62 52 51 32 31 0
|
|
* +--------+----------------+----------------+ +---------------+
|
|
* | s 1bit | e[62:52] 11bit | f[51:32] 20bit | | f[31:0] 32bit |
|
|
* +--------+----------------+----------------+ +---------------+
|
|
* B0--------------->B1---------->B2--->B3----> B4->B5->B6->B7->
|
|
*/
|
|
/* subtract from biased_exponent to form base2 exponent (normal numbers) */
|
|
typedef union _GDoubleIEEE754 GDoubleIEEE754;
|
|
typedef union _GFloatIEEE754 GFloatIEEE754;
|
|
#define G_IEEE754_FLOAT_BIAS (127)
|
|
#define G_IEEE754_DOUBLE_BIAS (1023)
|
|
/* multiply with base2 exponent to get base10 exponent (normal numbers) */
|
|
#define G_LOG_2_BASE_10 (0.30102999566398119521)
|
|
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
|
|
union _GFloatIEEE754
|
|
{
|
|
gfloat v_float;
|
|
struct {
|
|
guint mantissa : 23;
|
|
guint biased_exponent : 8;
|
|
guint sign : 1;
|
|
} mpn;
|
|
};
|
|
union _GDoubleIEEE754
|
|
{
|
|
gdouble v_double;
|
|
struct {
|
|
guint mantissa_low : 32;
|
|
guint mantissa_high : 20;
|
|
guint biased_exponent : 11;
|
|
guint sign : 1;
|
|
} mpn;
|
|
};
|
|
#elif G_BYTE_ORDER == G_BIG_ENDIAN
|
|
union _GFloatIEEE754
|
|
{
|
|
gfloat v_float;
|
|
struct {
|
|
guint sign : 1;
|
|
guint biased_exponent : 8;
|
|
guint mantissa : 23;
|
|
} mpn;
|
|
};
|
|
union _GDoubleIEEE754
|
|
{
|
|
gdouble v_double;
|
|
struct {
|
|
guint sign : 1;
|
|
guint biased_exponent : 11;
|
|
guint mantissa_high : 20;
|
|
guint mantissa_low : 32;
|
|
} mpn;
|
|
};
|
|
#else /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */
|
|
#error unknown ENDIAN type
|
|
#endif /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */
|
|
|
|
typedef struct _GTimeVal GTimeVal;
|
|
|
|
struct _GTimeVal
|
|
{
|
|
glong tv_sec;
|
|
glong tv_usec;
|
|
};
|
|
|
|
G_END_DECLS
|
|
|
|
/* We prefix variable declarations so they can
|
|
* properly get exported in Windows DLLs.
|
|
*/
|
|
#ifndef GLIB_VAR
|
|
# ifdef G_PLATFORM_WIN32
|
|
# ifdef GLIB_STATIC_COMPILATION
|
|
# define GLIB_VAR extern
|
|
# else /* !GLIB_STATIC_COMPILATION */
|
|
# ifdef GLIB_COMPILATION
|
|
# ifdef DLL_EXPORT
|
|
# define GLIB_VAR __declspec(dllexport)
|
|
# else /* !DLL_EXPORT */
|
|
# define GLIB_VAR extern
|
|
# endif /* !DLL_EXPORT */
|
|
# else /* !GLIB_COMPILATION */
|
|
# define GLIB_VAR extern __declspec(dllimport)
|
|
# endif /* !GLIB_COMPILATION */
|
|
# endif /* !GLIB_STATIC_COMPILATION */
|
|
# else /* !G_PLATFORM_WIN32 */
|
|
# define GLIB_VAR _GLIB_EXTERN
|
|
# endif /* !G_PLATFORM_WIN32 */
|
|
#endif /* GLIB_VAR */
|
|
|
|
#endif /* __G_TYPES_H__ */
|
|
|
|
#if defined(__BIONIC__) && defined (GLIB_HAVE_ALLOCA_H)
|
|
# include <alloca.h>
|
|
#elif defined(__GNUC__)
|
|
/* GCC does the right thing */
|
|
# undef alloca
|
|
# define alloca(size) __builtin_alloca (size)
|
|
#elif defined (GLIB_HAVE_ALLOCA_H)
|
|
/* a native and working alloca.h is there */
|
|
# include <alloca.h>
|
|
#else /* !__GNUC__ && !GLIB_HAVE_ALLOCA_H */
|
|
# if defined(_MSC_VER) || defined(__DMC__)
|
|
# include <malloc.h>
|
|
# define alloca _alloca
|
|
# else /* !_MSC_VER && !__DMC__ */
|
|
# ifdef _AIX
|
|
# pragma alloca
|
|
# else /* !_AIX */
|
|
# ifndef alloca /* predefined by HP cc +Olibcalls */
|
|
G_BEGIN_DECLS
|
|
char *alloca ();
|
|
G_END_DECLS
|
|
# endif /* !alloca */
|
|
# endif /* !_AIX */
|
|
# endif /* !_MSC_VER && !__DMC__ */
|
|
#endif /* !__GNUC__ && !GLIB_HAVE_ALLOCA_H */
|
|
|
|
/**
|
|
* g_alloca:
|
|
* @size: number of bytes to allocate.
|
|
*
|
|
* Allocates @size bytes on the stack; these bytes will be freed when the current
|
|
* stack frame is cleaned up. This macro essentially just wraps the alloca()
|
|
* function present on most UNIX variants.
|
|
* Thus it provides the same advantages and pitfalls as alloca():
|
|
*
|
|
* - alloca() is very fast, as on most systems it's implemented by just adjusting
|
|
* the stack pointer register.
|
|
*
|
|
* - It doesn't cause any memory fragmentation, within its scope, separate alloca()
|
|
* blocks just build up and are released together at function end.
|
|
*
|
|
* - Allocation sizes have to fit into the current stack frame. For instance in a
|
|
* threaded environment on Linux, the per-thread stack size is limited to 2 Megabytes,
|
|
* so be sparse with alloca() uses.
|
|
*
|
|
* - Allocation failure due to insufficient stack space is not indicated with a %NULL
|
|
* return like e.g. with malloc(). Instead, most systems probably handle it the same
|
|
* way as out of stack space situations from infinite function recursion, i.e.
|
|
* with a segmentation fault.
|
|
*
|
|
* - Special care has to be taken when mixing alloca() with GNU C variable sized arrays.
|
|
* Stack space allocated with alloca() in the same scope as a variable sized array
|
|
* will be freed together with the variable sized array upon exit of that scope, and
|
|
* not upon exit of the enclosing function scope.
|
|
*
|
|
* Returns: space for @size bytes, allocated on the stack
|
|
*/
|
|
#define g_alloca(size) alloca (size)
|
|
/**
|
|
* g_newa:
|
|
* @struct_type: Type of memory chunks to be allocated
|
|
* @n_structs: Number of chunks to be allocated
|
|
*
|
|
* Wraps g_alloca() in a more typesafe manner.
|
|
*
|
|
* Returns: Pointer to stack space for @n_structs chunks of type @struct_type
|
|
*/
|
|
#define g_newa(struct_type, n_structs) ((struct_type*) g_alloca (sizeof (struct_type) * (gsize) (n_structs)))
|
|
|
|
#endif /* __G_ALLOCA_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_ARRAY_H__
|
|
#define __G_ARRAY_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GBytes GBytes;
|
|
typedef struct _GArray GArray;
|
|
typedef struct _GByteArray GByteArray;
|
|
typedef struct _GPtrArray GPtrArray;
|
|
|
|
struct _GArray
|
|
{
|
|
gchar *data;
|
|
guint len;
|
|
};
|
|
|
|
struct _GByteArray
|
|
{
|
|
guint8 *data;
|
|
guint len;
|
|
};
|
|
|
|
struct _GPtrArray
|
|
{
|
|
gpointer *pdata;
|
|
guint len;
|
|
};
|
|
|
|
/* Resizable arrays. remove fills any cleared spot and shortens the
|
|
* array, while preserving the order. remove_fast will distort the
|
|
* order by moving the last element to the position of the removed.
|
|
*/
|
|
|
|
#define g_array_append_val(a,v) g_array_append_vals (a, &(v), 1)
|
|
#define g_array_prepend_val(a,v) g_array_prepend_vals (a, &(v), 1)
|
|
#define g_array_insert_val(a,i,v) g_array_insert_vals (a, i, &(v), 1)
|
|
#define g_array_index(a,t,i) (((t*) (void *) (a)->data) [(i)])
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GArray* g_array_new (gboolean zero_terminated,
|
|
gboolean clear_,
|
|
guint element_size);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GArray* g_array_sized_new (gboolean zero_terminated,
|
|
gboolean clear_,
|
|
guint element_size,
|
|
guint reserved_size);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_array_free (GArray *array,
|
|
gboolean free_segment);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GArray *g_array_ref (GArray *array);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_array_unref (GArray *array);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_array_get_element_size (GArray *array);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GArray* g_array_append_vals (GArray *array,
|
|
gconstpointer data,
|
|
guint len);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GArray* g_array_prepend_vals (GArray *array,
|
|
gconstpointer data,
|
|
guint len);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GArray* g_array_insert_vals (GArray *array,
|
|
guint index_,
|
|
gconstpointer data,
|
|
guint len);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GArray* g_array_set_size (GArray *array,
|
|
guint length);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GArray* g_array_remove_index (GArray *array,
|
|
guint index_);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GArray* g_array_remove_index_fast (GArray *array,
|
|
guint index_);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GArray* g_array_remove_range (GArray *array,
|
|
guint index_,
|
|
guint length);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_array_sort (GArray *array,
|
|
GCompareFunc compare_func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_array_sort_with_data (GArray *array,
|
|
GCompareDataFunc compare_func,
|
|
gpointer user_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_array_set_clear_func (GArray *array,
|
|
GDestroyNotify clear_func);
|
|
|
|
/* Resizable pointer array. This interface is much less complicated
|
|
* than the above. Add appends a pointer. Remove fills any cleared
|
|
* spot and shortens the array. remove_fast will again distort order.
|
|
*/
|
|
#define g_ptr_array_index(array,index_) ((array)->pdata)[index_]
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GPtrArray* g_ptr_array_new (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GPtrArray* g_ptr_array_new_with_free_func (GDestroyNotify element_free_func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GPtrArray* g_ptr_array_sized_new (guint reserved_size);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GPtrArray* g_ptr_array_new_full (guint reserved_size,
|
|
GDestroyNotify element_free_func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer* g_ptr_array_free (GPtrArray *array,
|
|
gboolean free_seg);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GPtrArray* g_ptr_array_ref (GPtrArray *array);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_ptr_array_unref (GPtrArray *array);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_ptr_array_set_free_func (GPtrArray *array,
|
|
GDestroyNotify element_free_func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_ptr_array_set_size (GPtrArray *array,
|
|
gint length);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_ptr_array_remove_index (GPtrArray *array,
|
|
guint index_);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_ptr_array_remove_index_fast (GPtrArray *array,
|
|
guint index_);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_ptr_array_remove (GPtrArray *array,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_ptr_array_remove_fast (GPtrArray *array,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GPtrArray *g_ptr_array_remove_range (GPtrArray *array,
|
|
guint index_,
|
|
guint length);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_ptr_array_add (GPtrArray *array,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_2_40
|
|
void g_ptr_array_insert (GPtrArray *array,
|
|
gint index_,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_ptr_array_sort (GPtrArray *array,
|
|
GCompareFunc compare_func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_ptr_array_sort_with_data (GPtrArray *array,
|
|
GCompareDataFunc compare_func,
|
|
gpointer user_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_ptr_array_foreach (GPtrArray *array,
|
|
GFunc func,
|
|
gpointer user_data);
|
|
|
|
|
|
/* Byte arrays, an array of guint8. Implemented as a GArray,
|
|
* but type-safe.
|
|
*/
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GByteArray* g_byte_array_new (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GByteArray* g_byte_array_new_take (guint8 *data,
|
|
gsize len);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GByteArray* g_byte_array_sized_new (guint reserved_size);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint8* g_byte_array_free (GByteArray *array,
|
|
gboolean free_segment);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GBytes* g_byte_array_free_to_bytes (GByteArray *array);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GByteArray *g_byte_array_ref (GByteArray *array);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_byte_array_unref (GByteArray *array);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GByteArray* g_byte_array_append (GByteArray *array,
|
|
const guint8 *data,
|
|
guint len);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GByteArray* g_byte_array_prepend (GByteArray *array,
|
|
const guint8 *data,
|
|
guint len);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GByteArray* g_byte_array_set_size (GByteArray *array,
|
|
guint length);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GByteArray* g_byte_array_remove_index (GByteArray *array,
|
|
guint index_);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GByteArray* g_byte_array_remove_index_fast (GByteArray *array,
|
|
guint index_);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GByteArray* g_byte_array_remove_range (GByteArray *array,
|
|
guint index_,
|
|
guint length);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_byte_array_sort (GByteArray *array,
|
|
GCompareFunc compare_func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_byte_array_sort_with_data (GByteArray *array,
|
|
GCompareDataFunc compare_func,
|
|
gpointer user_data);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_ARRAY_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_ASYNCQUEUE_H__
|
|
#define __G_ASYNCQUEUE_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
/* 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 Lesser General Public License as
|
|
* published by the Free Software Foundation; either version 2 of the
|
|
* licence, 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_THREAD_H__
|
|
#define __G_THREAD_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
/*
|
|
* Copyright © 2011 Ryan Lortie
|
|
*
|
|
* This library is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License as
|
|
* published by the Free Software Foundation; either version 2 of the
|
|
* licence, 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* Author: Ryan Lortie <desrt@desrt.ca>
|
|
*/
|
|
|
|
#ifndef __G_ATOMIC_H__
|
|
#define __G_ATOMIC_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_atomic_int_get (const volatile gint *atomic);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_atomic_int_set (volatile gint *atomic,
|
|
gint newval);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_atomic_int_inc (volatile gint *atomic);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_atomic_int_dec_and_test (volatile gint *atomic);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_atomic_int_compare_and_exchange (volatile gint *atomic,
|
|
gint oldval,
|
|
gint newval);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_atomic_int_add (volatile gint *atomic,
|
|
gint val);
|
|
GLIB_AVAILABLE_IN_2_30
|
|
guint g_atomic_int_and (volatile guint *atomic,
|
|
guint val);
|
|
GLIB_AVAILABLE_IN_2_30
|
|
guint g_atomic_int_or (volatile guint *atomic,
|
|
guint val);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_atomic_int_xor (volatile guint *atomic,
|
|
guint val);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_atomic_pointer_get (const volatile void *atomic);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_atomic_pointer_set (volatile void *atomic,
|
|
gpointer newval);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_atomic_pointer_compare_and_exchange (volatile void *atomic,
|
|
gpointer oldval,
|
|
gpointer newval);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gssize g_atomic_pointer_add (volatile void *atomic,
|
|
gssize val);
|
|
GLIB_AVAILABLE_IN_2_30
|
|
gsize g_atomic_pointer_and (volatile void *atomic,
|
|
gsize val);
|
|
GLIB_AVAILABLE_IN_2_30
|
|
gsize g_atomic_pointer_or (volatile void *atomic,
|
|
gsize val);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gsize g_atomic_pointer_xor (volatile void *atomic,
|
|
gsize val);
|
|
|
|
GLIB_DEPRECATED_IN_2_30_FOR(g_atomic_int_add)
|
|
gint g_atomic_int_exchange_and_add (volatile gint *atomic,
|
|
gint val);
|
|
|
|
G_END_DECLS
|
|
|
|
#if defined(G_ATOMIC_LOCK_FREE) && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)
|
|
|
|
/* We prefer the new C11-style atomic extension of GCC if available */
|
|
#if defined(__ATOMIC_SEQ_CST) && !defined(__clang__)
|
|
|
|
/* This assumes sizeof(int) is 4: gatomic.c statically
|
|
* asserts that (using G_STATIC_ASSERT at top-level in a header was
|
|
* problematic, see #730932) */
|
|
|
|
#define g_atomic_int_get(atomic) \
|
|
(lG_GNUC_EXTENSION ({ \
|
|
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \
|
|
(void) (0 ? *(atomic) ^ *(atomic) : 0); \
|
|
(gint) __atomic_load_4 ((atomic), __ATOMIC_SEQ_CST); \
|
|
}))
|
|
#define g_atomic_int_set(atomic, newval) \
|
|
(lG_GNUC_EXTENSION ({ \
|
|
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \
|
|
(void) (0 ? *(atomic) ^ (newval) : 0); \
|
|
__atomic_store_4 ((atomic), (newval), __ATOMIC_SEQ_CST); \
|
|
}))
|
|
|
|
#if GLIB_SIZEOF_VOID_P == 8
|
|
|
|
#define g_atomic_pointer_get(atomic) \
|
|
(lG_GNUC_EXTENSION ({ \
|
|
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \
|
|
(gpointer) __atomic_load_8 ((atomic), __ATOMIC_SEQ_CST); \
|
|
}))
|
|
#define g_atomic_pointer_set(atomic, newval) \
|
|
(lG_GNUC_EXTENSION ({ \
|
|
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \
|
|
(void) (0 ? (gpointer) *(atomic) : 0); \
|
|
__atomic_store_8 ((atomic), (gsize) (newval), __ATOMIC_SEQ_CST); \
|
|
}))
|
|
|
|
#else /* GLIB_SIZEOF_VOID_P == 8 */
|
|
|
|
/* This assumes that if sizeof(void *) is not 8, then it is 4:
|
|
* gatomic.c statically asserts that (using G_STATIC_ASSERT
|
|
* at top-level in a header was problematic, see #730932) */
|
|
|
|
#define g_atomic_pointer_get(atomic) \
|
|
(lG_GNUC_EXTENSION ({ \
|
|
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \
|
|
(gpointer) __atomic_load_4 ((atomic), __ATOMIC_SEQ_CST); \
|
|
}))
|
|
#define g_atomic_pointer_set(atomic, newval) \
|
|
(lG_GNUC_EXTENSION ({ \
|
|
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \
|
|
(void) (0 ? (gpointer) *(atomic) : 0); \
|
|
__atomic_store_4 ((atomic), (gsize) (newval), __ATOMIC_SEQ_CST); \
|
|
}))
|
|
|
|
#endif /* GLIB_SIZEOF_VOID_P == 8 */
|
|
|
|
#else /* defined(__ATOMIC_SEQ_CST) */
|
|
|
|
#define g_atomic_int_get(atomic) \
|
|
(lG_GNUC_EXTENSION ({ \
|
|
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \
|
|
(void) (0 ? *(atomic) ^ *(atomic) : 0); \
|
|
__sync_synchronize (); \
|
|
(gint) *(atomic); \
|
|
}))
|
|
#define g_atomic_int_set(atomic, newval) \
|
|
(lG_GNUC_EXTENSION ({ \
|
|
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \
|
|
(void) (0 ? *(atomic) ^ (newval) : 0); \
|
|
*(atomic) = (newval); \
|
|
__sync_synchronize (); \
|
|
}))
|
|
#define g_atomic_pointer_get(atomic) \
|
|
(lG_GNUC_EXTENSION ({ \
|
|
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \
|
|
__sync_synchronize (); \
|
|
(gpointer) *(atomic); \
|
|
}))
|
|
#define g_atomic_pointer_set(atomic, newval) \
|
|
(lG_GNUC_EXTENSION ({ \
|
|
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \
|
|
(void) (0 ? (gpointer) *(atomic) : 0); \
|
|
*(atomic) = (__typeof__ (*(atomic))) (gsize) (newval); \
|
|
__sync_synchronize (); \
|
|
}))
|
|
|
|
#endif /* !defined(__ATOMIC_SEQ_CST) */
|
|
|
|
#define g_atomic_int_inc(atomic) \
|
|
(lG_GNUC_EXTENSION ({ \
|
|
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \
|
|
(void) (0 ? *(atomic) ^ *(atomic) : 0); \
|
|
(void) __sync_fetch_and_add ((atomic), 1); \
|
|
}))
|
|
#define g_atomic_int_dec_and_test(atomic) \
|
|
(lG_GNUC_EXTENSION ({ \
|
|
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \
|
|
(void) (0 ? *(atomic) ^ *(atomic) : 0); \
|
|
__sync_fetch_and_sub ((atomic), 1) == 1; \
|
|
}))
|
|
#define g_atomic_int_compare_and_exchange(atomic, oldval, newval) \
|
|
(lG_GNUC_EXTENSION ({ \
|
|
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \
|
|
(void) (0 ? *(atomic) ^ (newval) ^ (oldval) : 0); \
|
|
(gboolean) __sync_bool_compare_and_swap ((atomic), (oldval), (newval)); \
|
|
}))
|
|
#define g_atomic_int_add(atomic, val) \
|
|
(lG_GNUC_EXTENSION ({ \
|
|
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \
|
|
(void) (0 ? *(atomic) ^ (val) : 0); \
|
|
(gint) __sync_fetch_and_add ((atomic), (val)); \
|
|
}))
|
|
#define g_atomic_int_and(atomic, val) \
|
|
(lG_GNUC_EXTENSION ({ \
|
|
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \
|
|
(void) (0 ? *(atomic) ^ (val) : 0); \
|
|
(guint) __sync_fetch_and_and ((atomic), (val)); \
|
|
}))
|
|
#define g_atomic_int_or(atomic, val) \
|
|
(lG_GNUC_EXTENSION ({ \
|
|
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \
|
|
(void) (0 ? *(atomic) ^ (val) : 0); \
|
|
(guint) __sync_fetch_and_or ((atomic), (val)); \
|
|
}))
|
|
#define g_atomic_int_xor(atomic, val) \
|
|
(lG_GNUC_EXTENSION ({ \
|
|
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \
|
|
(void) (0 ? *(atomic) ^ (val) : 0); \
|
|
(guint) __sync_fetch_and_xor ((atomic), (val)); \
|
|
}))
|
|
|
|
#define g_atomic_pointer_compare_and_exchange(atomic, oldval, newval) \
|
|
(lG_GNUC_EXTENSION ({ \
|
|
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \
|
|
(void) (0 ? (gpointer) *(atomic) : 0); \
|
|
(gboolean) __sync_bool_compare_and_swap ((atomic), (oldval), (newval)); \
|
|
}))
|
|
#define g_atomic_pointer_add(atomic, val) \
|
|
(lG_GNUC_EXTENSION ({ \
|
|
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \
|
|
(void) (0 ? (gpointer) *(atomic) : 0); \
|
|
(void) (0 ? (val) ^ (val) : 0); \
|
|
(gssize) __sync_fetch_and_add ((atomic), (val)); \
|
|
}))
|
|
#define g_atomic_pointer_and(atomic, val) \
|
|
(lG_GNUC_EXTENSION ({ \
|
|
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \
|
|
(void) (0 ? (gpointer) *(atomic) : 0); \
|
|
(void) (0 ? (val) ^ (val) : 0); \
|
|
(gsize) __sync_fetch_and_and ((atomic), (val)); \
|
|
}))
|
|
#define g_atomic_pointer_or(atomic, val) \
|
|
(lG_GNUC_EXTENSION ({ \
|
|
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \
|
|
(void) (0 ? (gpointer) *(atomic) : 0); \
|
|
(void) (0 ? (val) ^ (val) : 0); \
|
|
(gsize) __sync_fetch_and_or ((atomic), (val)); \
|
|
}))
|
|
#define g_atomic_pointer_xor(atomic, val) \
|
|
(lG_GNUC_EXTENSION ({ \
|
|
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \
|
|
(void) (0 ? (gpointer) *(atomic) : 0); \
|
|
(void) (0 ? (val) ^ (val) : 0); \
|
|
(gsize) __sync_fetch_and_xor ((atomic), (val)); \
|
|
}))
|
|
|
|
#else /* defined(G_ATOMIC_LOCK_FREE) && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) */
|
|
|
|
#define g_atomic_int_get(atomic) \
|
|
(g_atomic_int_get ((gint *) (atomic)))
|
|
#define g_atomic_int_set(atomic, newval) \
|
|
(g_atomic_int_set ((gint *) (atomic), (gint) (newval)))
|
|
#define g_atomic_int_compare_and_exchange(atomic, oldval, newval) \
|
|
(g_atomic_int_compare_and_exchange ((gint *) (atomic), (oldval), (newval)))
|
|
#define g_atomic_int_add(atomic, val) \
|
|
(g_atomic_int_add ((gint *) (atomic), (val)))
|
|
#define g_atomic_int_and(atomic, val) \
|
|
(g_atomic_int_and ((guint *) (atomic), (val)))
|
|
#define g_atomic_int_or(atomic, val) \
|
|
(g_atomic_int_or ((guint *) (atomic), (val)))
|
|
#define g_atomic_int_xor(atomic, val) \
|
|
(g_atomic_int_xor ((guint *) (atomic), (val)))
|
|
#define g_atomic_int_inc(atomic) \
|
|
(g_atomic_int_inc ((gint *) (atomic)))
|
|
#define g_atomic_int_dec_and_test(atomic) \
|
|
(g_atomic_int_dec_and_test ((gint *) (atomic)))
|
|
|
|
#define g_atomic_pointer_get(atomic) \
|
|
(g_atomic_pointer_get (atomic))
|
|
#define g_atomic_pointer_set(atomic, newval) \
|
|
(g_atomic_pointer_set ((atomic), (gpointer) (newval)))
|
|
#define g_atomic_pointer_compare_and_exchange(atomic, oldval, newval) \
|
|
(g_atomic_pointer_compare_and_exchange ((atomic), (gpointer) (oldval), (gpointer) (newval)))
|
|
#define g_atomic_pointer_add(atomic, val) \
|
|
(g_atomic_pointer_add ((atomic), (gssize) (val)))
|
|
#define g_atomic_pointer_and(atomic, val) \
|
|
(g_atomic_pointer_and ((atomic), (gsize) (val)))
|
|
#define g_atomic_pointer_or(atomic, val) \
|
|
(g_atomic_pointer_or ((atomic), (gsize) (val)))
|
|
#define g_atomic_pointer_xor(atomic, val) \
|
|
(g_atomic_pointer_xor ((atomic), (gsize) (val)))
|
|
|
|
#endif /* defined(__GNUC__) && defined(G_ATOMIC_OP_USE_GCC_BUILTINS) */
|
|
|
|
#endif /* __G_ATOMIC_H__ */
|
|
/* gerror.h - Error reporting system
|
|
*
|
|
* Copyright 2000 Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __G_ERROR_H__
|
|
#define __G_ERROR_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
#include <stdarg.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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_QUARK_H__
|
|
#define __G_QUARK_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef guint32 GQuark;
|
|
|
|
/* Quarks (string<->id association)
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GQuark g_quark_try_string (const gchar *string);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GQuark g_quark_from_static_string (const gchar *string);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GQuark g_quark_from_string (const gchar *string);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_quark_to_string (GQuark quark) G_GNUC_CONST;
|
|
|
|
#define G_DEFINE_QUARK(QN, q_n) \
|
|
GQuark \
|
|
q_n##_quark (void) \
|
|
{ \
|
|
static GQuark q; \
|
|
\
|
|
if G_UNLIKELY (q == 0) \
|
|
q = g_quark_from_static_string (#QN); \
|
|
\
|
|
return q; \
|
|
}
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_intern_string (const gchar *string);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * lg_intern_static_string (const gchar *string);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_QUARK_H__ */
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/**
|
|
* GError:
|
|
* @domain: error domain, e.g. #G_FILE_ERROR
|
|
* @code: error code, e.g. %G_FILE_ERROR_NOENT
|
|
* @message: human-readable informative error message
|
|
*
|
|
* The `GError` structure contains information about
|
|
* an error that has occurred.
|
|
*/
|
|
typedef struct _GError GError;
|
|
|
|
struct _GError
|
|
{
|
|
GQuark domain;
|
|
gint code;
|
|
gchar *message;
|
|
};
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GError* g_error_new (GQuark domain,
|
|
gint code,
|
|
const gchar *format,
|
|
...) G_GNUC_PRINTF (3, 4);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GError* g_error_new_literal (GQuark domain,
|
|
gint code,
|
|
const gchar *message);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GError* g_error_new_valist (GQuark domain,
|
|
gint code,
|
|
const gchar *format,
|
|
va_list args) G_GNUC_PRINTF(3, 0);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_error_free (GError *error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GError* g_error_copy (const GError *error);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_error_matches (const GError *error,
|
|
GQuark domain,
|
|
gint code);
|
|
|
|
/* if (err) *err = g_error_new(domain, code, format, ...), also has
|
|
* some sanity checks.
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_set_error (GError **err,
|
|
GQuark domain,
|
|
gint code,
|
|
const gchar *format,
|
|
...) G_GNUC_PRINTF (4, 5);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_set_error_literal (GError **err,
|
|
GQuark domain,
|
|
gint code,
|
|
const gchar *message);
|
|
|
|
/* if (dest) *dest = src; also has some sanity checks.
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_propagate_error (GError **dest,
|
|
GError *src);
|
|
|
|
/* if (err && *err) { g_error_free(*err); *err = NULL; } */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_clear_error (GError **err);
|
|
|
|
/* if (err) prefix the formatted string to the ->message */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_prefix_error (GError **err,
|
|
const gchar *format,
|
|
...) G_GNUC_PRINTF (2, 3);
|
|
|
|
/* g_propagate_error then g_error_prefix on dest */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_propagate_prefixed_error (GError **dest,
|
|
GError *src,
|
|
const gchar *format,
|
|
...) G_GNUC_PRINTF (3, 4);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_ERROR_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_UTILS_H__
|
|
#define __G_UTILS_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
#include <stdarg.h>
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/* 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) 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 */
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_get_user_name (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_get_real_name (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_get_home_dir (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_get_tmp_dir (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_get_host_name (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_get_prgname (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_set_prgname (const gchar *prgname);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_get_application_name (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_set_application_name (const gchar *application_name);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_reload_user_special_dirs_cache (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_get_user_data_dir (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_get_user_config_dir (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_get_user_cache_dir (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * const * g_get_system_data_dirs (void);
|
|
|
|
#ifdef G_OS_WIN32
|
|
/* This functions is not part of the public GLib API */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * const * g_win32_get_system_data_dirs_for_module (void (*address_of_function)(void));
|
|
#endif
|
|
|
|
#if defined (G_OS_WIN32) && defined (G_CAN_INLINE) && !defined (__cplusplus)
|
|
/* This function is not part of the public GLib API either. Just call
|
|
* g_get_system_data_dirs() in your code, never mind that that is
|
|
* actually a macro and you will in fact call this inline function.
|
|
*/
|
|
static inline const gchar * const *
|
|
_g_win32_get_system_data_dirs (void)
|
|
{
|
|
return g_win32_get_system_data_dirs_for_module ((void (*)(void)) &_g_win32_get_system_data_dirs);
|
|
}
|
|
#define g_get_system_data_dirs _g_win32_get_system_data_dirs
|
|
#endif
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * const * g_get_system_config_dirs (void);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_get_user_runtime_dir (void);
|
|
|
|
/**
|
|
* GUserDirectory:
|
|
* @G_USER_DIRECTORY_DESKTOP: the user's Desktop directory
|
|
* @G_USER_DIRECTORY_DOCUMENTS: the user's Documents directory
|
|
* @G_USER_DIRECTORY_DOWNLOAD: the user's Downloads directory
|
|
* @G_USER_DIRECTORY_MUSIC: the user's Music directory
|
|
* @G_USER_DIRECTORY_PICTURES: the user's Pictures directory
|
|
* @G_USER_DIRECTORY_PUBLIC_SHARE: the user's shared directory
|
|
* @G_USER_DIRECTORY_TEMPLATES: the user's Templates directory
|
|
* @G_USER_DIRECTORY_VIDEOS: the user's Movies directory
|
|
* @G_USER_N_DIRECTORIES: the number of enum values
|
|
*
|
|
* These are logical ids for special directories which are defined
|
|
* depending on the platform used. You should use g_get_user_special_dir()
|
|
* to retrieve the full path associated to the logical id.
|
|
*
|
|
* The #GUserDirectory enumeration can be extended at later date. Not
|
|
* every platform has a directory for every logical id in this
|
|
* enumeration.
|
|
*
|
|
* Since: 2.14
|
|
*/
|
|
typedef enum {
|
|
G_USER_DIRECTORY_DESKTOP,
|
|
G_USER_DIRECTORY_DOCUMENTS,
|
|
G_USER_DIRECTORY_DOWNLOAD,
|
|
G_USER_DIRECTORY_MUSIC,
|
|
G_USER_DIRECTORY_PICTURES,
|
|
G_USER_DIRECTORY_PUBLIC_SHARE,
|
|
G_USER_DIRECTORY_TEMPLATES,
|
|
G_USER_DIRECTORY_VIDEOS,
|
|
|
|
G_USER_N_DIRECTORIES
|
|
} GUserDirectory;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_get_user_special_dir (GUserDirectory directory);
|
|
|
|
/**
|
|
* GDebugKey:
|
|
* @key: the string
|
|
* @value: the flag
|
|
*
|
|
* Associates a string with a bit flag.
|
|
* Used in g_parse_debug_string().
|
|
*/
|
|
typedef struct _GDebugKey GDebugKey;
|
|
struct _GDebugKey
|
|
{
|
|
const gchar *key;
|
|
guint value;
|
|
};
|
|
|
|
/* Miscellaneous utility functions
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_parse_debug_string (const gchar *string,
|
|
const GDebugKey *keys,
|
|
guint nkeys);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_snprintf (gchar *string,
|
|
gulong n,
|
|
gchar const *format,
|
|
...) G_GNUC_PRINTF (3, 4);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_vsnprintf (gchar *string,
|
|
gulong n,
|
|
gchar const *format,
|
|
va_list args)
|
|
G_GNUC_PRINTF(3, 0);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_nullify_pointer (gpointer *nullify_location);
|
|
|
|
typedef enum
|
|
{
|
|
G_FORMAT_SIZE_DEFAULT = 0,
|
|
G_FORMAT_SIZE_LONG_FORMAT = 1 << 0,
|
|
G_FORMAT_SIZE_IEC_UNITS = 1 << 1
|
|
} GFormatSizeFlags;
|
|
|
|
GLIB_AVAILABLE_IN_2_30
|
|
gchar *g_format_size_full (guint64 size,
|
|
GFormatSizeFlags flags);
|
|
GLIB_AVAILABLE_IN_2_30
|
|
gchar *g_format_size (guint64 size);
|
|
|
|
GLIB_DEPRECATED_FOR(g_format_size)
|
|
gchar *g_format_size_for_display (goffset size);
|
|
|
|
#ifndef G_DISABLE_DEPRECATED
|
|
/**
|
|
* GVoidFunc:
|
|
*
|
|
* Declares a type of function which takes no arguments
|
|
* and has no return value. It is used to specify the type
|
|
* function passed to g_atexit().
|
|
*/
|
|
typedef void (*GVoidFunc) (void);
|
|
#define ATEXIT(proc) g_ATEXIT(proc)
|
|
GLIB_DEPRECATED
|
|
void g_atexit (GVoidFunc func);
|
|
|
|
#ifdef G_OS_WIN32
|
|
/* It's a bad idea to wrap atexit() on Windows. If the GLib DLL calls
|
|
* atexit(), the function will be called when the GLib DLL is detached
|
|
* from the program, which is not what the caller wants. The caller
|
|
* wants the function to be called when it *itself* exits (or is
|
|
* detached, in case the caller, too, is a DLL).
|
|
*/
|
|
#if (defined(__MINGW_H) && !defined(_STDLIB_H_)) || (defined(_MSC_VER) && !defined(_INC_STDLIB))
|
|
int atexit (void (*)(void));
|
|
#endif
|
|
#define g_atexit(func) atexit(func)
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
/* Look for an executable in PATH, following execvp() rules */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_find_program_in_path (const gchar *program);
|
|
|
|
/* Bit tests
|
|
*
|
|
* These are defined in a convoluted way because we want the compiler to
|
|
* be able to inline the code for performance reasons, but for
|
|
* historical reasons, we must continue to provide non-inline versions
|
|
* on our ABI.
|
|
*
|
|
* We define these as functions in gutils.c which are just implemented
|
|
* as calls to the _impl() versions in order to preserve the ABI.
|
|
*/
|
|
|
|
#define g_bit_nth_lsf(mask, nth_bit) g_bit_nth_lsf_impl(mask, nth_bit)
|
|
#define g_bit_nth_msf(mask, nth_bit) g_bit_nth_msf_impl(mask, nth_bit)
|
|
#define g_bit_storage(number) g_bit_storage_impl(number)
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint (g_bit_nth_lsf) (gulong mask,
|
|
gint nth_bit);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint (g_bit_nth_msf) (gulong mask,
|
|
gint nth_bit);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint (g_bit_storage) (gulong number);
|
|
|
|
static inline gint
|
|
g_bit_nth_lsf_impl (gulong mask,
|
|
gint nth_bit)
|
|
{
|
|
if (G_UNLIKELY (nth_bit < -1))
|
|
nth_bit = -1;
|
|
while (nth_bit < ((GLIB_SIZEOF_LONG * 8) - 1))
|
|
{
|
|
nth_bit++;
|
|
if (mask & (1UL << nth_bit))
|
|
return nth_bit;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
static inline gint
|
|
g_bit_nth_msf_impl (gulong mask,
|
|
gint nth_bit)
|
|
{
|
|
if (nth_bit < 0 || G_UNLIKELY (nth_bit > GLIB_SIZEOF_LONG * 8))
|
|
nth_bit = GLIB_SIZEOF_LONG * 8;
|
|
while (nth_bit > 0)
|
|
{
|
|
nth_bit--;
|
|
if (mask & (1UL << nth_bit))
|
|
return nth_bit;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
static inline guint
|
|
g_bit_storage_impl (gulong number)
|
|
{
|
|
#if defined(__GNUC__) && (__GNUC__ >= 4) && defined(__OPTIMIZE__)
|
|
return G_LIKELY (number) ?
|
|
((GLIB_SIZEOF_LONG * 8U - 1) ^ (guint) __builtin_clzl(number)) + 1 : 1;
|
|
#else
|
|
guint n_bits = 0;
|
|
|
|
do
|
|
{
|
|
n_bits++;
|
|
number >>= 1;
|
|
}
|
|
while (number);
|
|
return n_bits;
|
|
#endif
|
|
}
|
|
|
|
/* Crashes the program. */
|
|
#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_50
|
|
#ifndef G_OS_WIN32
|
|
# define g_abort() abort ()
|
|
#else
|
|
GLIB_AVAILABLE_IN_2_50
|
|
void g_abort (void) G_GNUC_NORETURN G_ANALYZER_NORETURN;
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef G_DISABLE_DEPRECATED
|
|
|
|
/*
|
|
* This macro is deprecated. This DllMain() is too complex. It is
|
|
* recommended to write an explicit minimal DLlMain() that just saves
|
|
* the handle to the DLL and then use that handle instead, for
|
|
* instance passing it to
|
|
* g_win32_get_package_installation_directory_of_module().
|
|
*
|
|
* On Windows, this macro defines a DllMain function that stores the
|
|
* actual DLL name that the code being compiled will be included in.
|
|
* STATIC should be empty or 'static'. DLL_NAME is the name of the
|
|
* (pointer to the) char array where the DLL name will be stored. If
|
|
* this is used, you must also include <windows.h>. If you need a more complex
|
|
* DLL entry point function, you cannot use this.
|
|
*
|
|
* On non-Windows platforms, expands to nothing.
|
|
*/
|
|
|
|
#ifndef G_PLATFORM_WIN32
|
|
# define G_WIN32_DLLMAIN_FOR_DLL_NAME(static, dll_name)
|
|
#else
|
|
# define G_WIN32_DLLMAIN_FOR_DLL_NAME(static, dll_name) \
|
|
static char *dll_name; \
|
|
\
|
|
BOOL WINAPI \
|
|
DllMain (HINSTANCE hinstDLL, \
|
|
DWORD fdwReason, \
|
|
LPVOID lpvReserved) \
|
|
{ \
|
|
wchar_t wcbfr[1000]; \
|
|
char *tem; \
|
|
switch (fdwReason) \
|
|
{ \
|
|
case DLL_PROCESS_ATTACH: \
|
|
GetModuleFileNameW ((HMODULE) hinstDLL, wcbfr, G_N_ELEMENTS (wcbfr)); \
|
|
tem = g_utf16_to_utf8 (wcbfr, -1, NULL, NULL, NULL); \
|
|
dll_name = g_path_get_basename (tem); \
|
|
g_free (tem); \
|
|
break; \
|
|
} \
|
|
\
|
|
return TRUE; \
|
|
}
|
|
|
|
#endif /* !G_DISABLE_DEPRECATED */
|
|
|
|
#endif /* G_PLATFORM_WIN32 */
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_UTILS_H__ */
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
#define G_THREAD_ERROR g_thread_error_quark ()
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GQuark g_thread_error_quark (void);
|
|
|
|
typedef enum
|
|
{
|
|
G_THREAD_ERROR_AGAIN /* Resource temporarily unavailable */
|
|
} GThreadError;
|
|
|
|
typedef gpointer (*GThreadFunc) (gpointer data);
|
|
|
|
typedef struct _GThreadCallbacks GThreadCallbacks;
|
|
typedef struct _GThread GThread;
|
|
|
|
typedef union _GMutex GMutex;
|
|
typedef struct _GRecMutex GRecMutex;
|
|
typedef struct _GRWLock GRWLock;
|
|
typedef struct _GCond GCond;
|
|
typedef struct _GPrivate GPrivate;
|
|
typedef struct _GOnce GOnce;
|
|
|
|
struct _GThreadCallbacks
|
|
{
|
|
void (*on_thread_init) (GThread *thread);
|
|
void (*on_thread_ready) (GThread *thread, GThreadFunc func, gpointer data,
|
|
const gchar *name);
|
|
void (*on_private_destructor_enter) (GPrivate *key, GDestroyNotify notify,
|
|
gpointer value);
|
|
void (*on_private_destructor_leave) (GPrivate *key, GDestroyNotify notify,
|
|
gpointer value);
|
|
};
|
|
|
|
union _GMutex
|
|
{
|
|
/*< private >*/
|
|
gpointer p;
|
|
guint i[2];
|
|
};
|
|
|
|
struct _GRWLock
|
|
{
|
|
/*< private >*/
|
|
gpointer p;
|
|
guint i[2];
|
|
};
|
|
|
|
struct _GCond
|
|
{
|
|
/*< private >*/
|
|
gpointer p;
|
|
guint i[2];
|
|
};
|
|
|
|
struct _GRecMutex
|
|
{
|
|
/*< private >*/
|
|
gpointer p;
|
|
guint i[2];
|
|
};
|
|
|
|
#define G_PRIVATE_INIT(notify) { NULL, (notify), { NULL, NULL } }
|
|
struct _GPrivate
|
|
{
|
|
/*< private >*/
|
|
gpointer p;
|
|
GDestroyNotify notify;
|
|
gpointer future[2];
|
|
};
|
|
|
|
typedef enum
|
|
{
|
|
G_ONCE_STATUS_NOTCALLED,
|
|
G_ONCE_STATUS_PROGRESS,
|
|
G_ONCE_STATUS_READY
|
|
} GOnceStatus;
|
|
|
|
#define G_ONCE_INIT { G_ONCE_STATUS_NOTCALLED, NULL }
|
|
struct _GOnce
|
|
{
|
|
volatile GOnceStatus status;
|
|
volatile gpointer retval;
|
|
};
|
|
|
|
#define G_LOCK_NAME(name) g__ ## name ## _lock
|
|
#define G_LOCK_DEFINE_STATIC(name) static G_LOCK_DEFINE (name)
|
|
#define G_LOCK_DEFINE(name) GMutex G_LOCK_NAME (name)
|
|
#define G_LOCK_EXTERN(name) extern GMutex G_LOCK_NAME (name)
|
|
|
|
#ifdef G_DEBUG_LOCKS
|
|
# define G_LOCK(name) G_STMT_START{ \
|
|
g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, \
|
|
"file %s: line %d (%s): locking: %s ", \
|
|
__FILE__, __LINE__, G_STRFUNC, \
|
|
#name); \
|
|
g_mutex_lock (&G_LOCK_NAME (name)); \
|
|
}G_STMT_END
|
|
# define G_UNLOCK(name) G_STMT_START{ \
|
|
g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, \
|
|
"file %s: line %d (%s): unlocking: %s ", \
|
|
__FILE__, __LINE__, G_STRFUNC, \
|
|
#name); \
|
|
g_mutex_unlock (&G_LOCK_NAME (name)); \
|
|
}G_STMT_END
|
|
# define G_TRYLOCK(name) \
|
|
(g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, \
|
|
"file %s: line %d (%s): try locking: %s ", \
|
|
__FILE__, __LINE__, G_STRFUNC, \
|
|
#name), g_mutex_trylock (&G_LOCK_NAME (name)))
|
|
#else /* !G_DEBUG_LOCKS */
|
|
# define G_LOCK(name) g_mutex_lock (&G_LOCK_NAME (name))
|
|
# define G_UNLOCK(name) g_mutex_unlock (&G_LOCK_NAME (name))
|
|
# define G_TRYLOCK(name) g_mutex_trylock (&G_LOCK_NAME (name))
|
|
#endif /* !G_DEBUG_LOCKS */
|
|
|
|
GLIB_VAR GThreadCallbacks *glib_thread_callbacks;
|
|
GLIB_AVAILABLE_IN_2_52
|
|
void g_thread_set_callbacks (GThreadCallbacks *callbacks);
|
|
|
|
GLIB_AVAILABLE_IN_2_32
|
|
GThread * g_thread_ref (GThread *thread);
|
|
GLIB_AVAILABLE_IN_2_32
|
|
void g_thread_unref (GThread *thread);
|
|
GLIB_AVAILABLE_IN_2_32
|
|
GThread * g_thread_new (const gchar *name,
|
|
GThreadFunc func,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_2_32
|
|
GThread * g_thread_try_new (const gchar *name,
|
|
GThreadFunc func,
|
|
gpointer data,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GThread * g_thread_self (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_thread_exit (gpointer retval);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_thread_join (GThread *thread);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_thread_yield (void);
|
|
|
|
|
|
GLIB_AVAILABLE_IN_2_32
|
|
void g_mutex_init (GMutex *mutex);
|
|
GLIB_AVAILABLE_IN_2_32
|
|
void g_mutex_clear (GMutex *mutex);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_mutex_lock (GMutex *mutex);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_mutex_trylock (GMutex *mutex);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_mutex_unlock (GMutex *mutex);
|
|
|
|
GLIB_AVAILABLE_IN_2_32
|
|
void g_rw_lock_init (GRWLock *rw_lock);
|
|
GLIB_AVAILABLE_IN_2_32
|
|
void g_rw_lock_clear (GRWLock *rw_lock);
|
|
GLIB_AVAILABLE_IN_2_32
|
|
void g_rw_lock_writer_lock (GRWLock *rw_lock);
|
|
GLIB_AVAILABLE_IN_2_32
|
|
gboolean g_rw_lock_writer_trylock (GRWLock *rw_lock);
|
|
GLIB_AVAILABLE_IN_2_32
|
|
void g_rw_lock_writer_unlock (GRWLock *rw_lock);
|
|
GLIB_AVAILABLE_IN_2_32
|
|
void g_rw_lock_reader_lock (GRWLock *rw_lock);
|
|
GLIB_AVAILABLE_IN_2_32
|
|
gboolean g_rw_lock_reader_trylock (GRWLock *rw_lock);
|
|
GLIB_AVAILABLE_IN_2_32
|
|
void g_rw_lock_reader_unlock (GRWLock *rw_lock);
|
|
|
|
GLIB_AVAILABLE_IN_2_32
|
|
void g_rec_mutex_init (GRecMutex *rec_mutex);
|
|
GLIB_AVAILABLE_IN_2_32
|
|
void g_rec_mutex_clear (GRecMutex *rec_mutex);
|
|
GLIB_AVAILABLE_IN_2_32
|
|
void g_rec_mutex_lock (GRecMutex *rec_mutex);
|
|
GLIB_AVAILABLE_IN_2_32
|
|
gboolean g_rec_mutex_trylock (GRecMutex *rec_mutex);
|
|
GLIB_AVAILABLE_IN_2_32
|
|
void g_rec_mutex_unlock (GRecMutex *rec_mutex);
|
|
|
|
GLIB_AVAILABLE_IN_2_32
|
|
void g_cond_init (GCond *cond);
|
|
GLIB_AVAILABLE_IN_2_32
|
|
void g_cond_clear (GCond *cond);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cond_wait (GCond *cond,
|
|
GMutex *mutex);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cond_signal (GCond *cond);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cond_broadcast (GCond *cond);
|
|
GLIB_AVAILABLE_IN_2_32
|
|
gboolean g_cond_wait_until (GCond *cond,
|
|
GMutex *mutex,
|
|
gint64 end_time);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_private_get (GPrivate *key);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_private_set (GPrivate *key,
|
|
gpointer value);
|
|
GLIB_AVAILABLE_IN_2_32
|
|
void g_private_replace (GPrivate *key,
|
|
gpointer value);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_once_impl (GOnce *once,
|
|
GThreadFunc func,
|
|
gpointer arg);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean lg_once_init_enter (volatile void *location);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void lg_once_init_leave (volatile void *location,
|
|
gsize result);
|
|
|
|
#ifdef G_ATOMIC_OP_MEMORY_BARRIER_NEEDED
|
|
# define g_once(once, func, arg) g_once_impl ((once), (func), (arg))
|
|
#else /* !G_ATOMIC_OP_MEMORY_BARRIER_NEEDED*/
|
|
# define g_once(once, func, arg) \
|
|
(((once)->status == G_ONCE_STATUS_READY) ? \
|
|
(once)->retval : \
|
|
g_once_impl ((once), (func), (arg)))
|
|
#endif /* G_ATOMIC_OP_MEMORY_BARRIER_NEEDED */
|
|
|
|
#ifdef __GNUC__
|
|
# define lg_once_init_enter(location) \
|
|
(lG_GNUC_EXTENSION ({ \
|
|
G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer)); \
|
|
(void) (0 ? (gpointer) *(location) : 0); \
|
|
(!g_atomic_pointer_get (location) && \
|
|
lg_once_init_enter (location)); \
|
|
}))
|
|
# define lg_once_init_leave(location, result) \
|
|
(lG_GNUC_EXTENSION ({ \
|
|
G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer)); \
|
|
(void) (0 ? *(location) = (result) : 0); \
|
|
lg_once_init_leave ((location), (gsize) (result)); \
|
|
}))
|
|
#else
|
|
# define lg_once_init_enter(location) \
|
|
(lg_once_init_enter((location)))
|
|
# define lg_once_init_leave(location, result) \
|
|
(lg_once_init_leave((location), (gsize) (result)))
|
|
#endif
|
|
|
|
GLIB_AVAILABLE_IN_2_36
|
|
guint g_get_num_processors (void);
|
|
|
|
/**
|
|
* GMutexLocker:
|
|
*
|
|
* Opaque type. See g_mutex_locker_new() for details.
|
|
* Since: 2.44
|
|
*/
|
|
typedef void GMutexLocker;
|
|
|
|
/**
|
|
* g_mutex_locker_new:
|
|
* @mutex: a mutex to lock
|
|
*
|
|
* Lock @mutex and return a new #GMutexLocker. Unlock with
|
|
* g_mutex_locker_free(). Using g_mutex_unlock() on @mutex
|
|
* while a #GMutexLocker exists can lead to undefined behaviour.
|
|
*
|
|
* This is intended to be used with g_autoptr(). Note that g_autoptr()
|
|
* is only available when using GCC or clang, so the following example
|
|
* will only work with those compilers:
|
|
* |[
|
|
* typedef struct
|
|
* {
|
|
* ...
|
|
* GMutex mutex;
|
|
* ...
|
|
* } MyObject;
|
|
*
|
|
* static void
|
|
* my_object_do_stuff (MyObject *self)
|
|
* {
|
|
* g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&self->mutex);
|
|
*
|
|
* // Code with mutex locked here
|
|
*
|
|
* if (cond)
|
|
* // No need to unlock
|
|
* return;
|
|
*
|
|
* // Optionally early unlock
|
|
* g_clear_pointer (&locker, g_mutex_locker_free);
|
|
*
|
|
* // Code with mutex unlocked here
|
|
* }
|
|
* ]|
|
|
*
|
|
* Returns: a #GMutexLocker
|
|
* Since: 2.44
|
|
*/
|
|
static inline GMutexLocker *
|
|
g_mutex_locker_new (GMutex *mutex)
|
|
{
|
|
g_mutex_lock (mutex);
|
|
return (GMutexLocker *) mutex;
|
|
}
|
|
|
|
/**
|
|
* g_mutex_locker_free:
|
|
* @locker: a GMutexLocker
|
|
*
|
|
* Unlock @locker's mutex. See g_mutex_locker_new() for details.
|
|
*
|
|
* Since: 2.44
|
|
*/
|
|
static inline void
|
|
g_mutex_locker_free (GMutexLocker *locker)
|
|
{
|
|
g_mutex_unlock ((GMutex *) locker);
|
|
}
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_THREAD_H__ */
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GAsyncQueue GAsyncQueue;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GAsyncQueue *g_async_queue_new (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GAsyncQueue *g_async_queue_new_full (GDestroyNotify item_free_func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_async_queue_lock (GAsyncQueue *queue);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_async_queue_unlock (GAsyncQueue *queue);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GAsyncQueue *g_async_queue_ref (GAsyncQueue *queue);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_async_queue_unref (GAsyncQueue *queue);
|
|
|
|
GLIB_DEPRECATED_FOR(g_async_queue_ref)
|
|
void g_async_queue_ref_unlocked (GAsyncQueue *queue);
|
|
|
|
GLIB_DEPRECATED_FOR(g_async_queue_unref)
|
|
void g_async_queue_unref_and_unlock (GAsyncQueue *queue);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_async_queue_push (GAsyncQueue *queue,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_async_queue_push_unlocked (GAsyncQueue *queue,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_async_queue_push_sorted (GAsyncQueue *queue,
|
|
gpointer data,
|
|
GCompareDataFunc func,
|
|
gpointer user_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_async_queue_push_sorted_unlocked (GAsyncQueue *queue,
|
|
gpointer data,
|
|
GCompareDataFunc func,
|
|
gpointer user_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_async_queue_pop (GAsyncQueue *queue);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_async_queue_pop_unlocked (GAsyncQueue *queue);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_async_queue_try_pop (GAsyncQueue *queue);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_async_queue_try_pop_unlocked (GAsyncQueue *queue);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_async_queue_timeout_pop (GAsyncQueue *queue,
|
|
guint64 timeout);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_async_queue_timeout_pop_unlocked (GAsyncQueue *queue,
|
|
guint64 timeout);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_async_queue_length (GAsyncQueue *queue);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_async_queue_length_unlocked (GAsyncQueue *queue);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_async_queue_sort (GAsyncQueue *queue,
|
|
GCompareDataFunc func,
|
|
gpointer user_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_async_queue_sort_unlocked (GAsyncQueue *queue,
|
|
GCompareDataFunc func,
|
|
gpointer user_data);
|
|
|
|
GLIB_AVAILABLE_IN_2_46
|
|
gboolean g_async_queue_remove (GAsyncQueue *queue,
|
|
gpointer item);
|
|
GLIB_AVAILABLE_IN_2_46
|
|
gboolean g_async_queue_remove_unlocked (GAsyncQueue *queue,
|
|
gpointer item);
|
|
GLIB_AVAILABLE_IN_2_46
|
|
void g_async_queue_push_front (GAsyncQueue *queue,
|
|
gpointer item);
|
|
GLIB_AVAILABLE_IN_2_46
|
|
void g_async_queue_push_front_unlocked (GAsyncQueue *queue,
|
|
gpointer item);
|
|
|
|
GLIB_DEPRECATED_FOR(g_async_queue_timeout_pop)
|
|
gpointer g_async_queue_timed_pop (GAsyncQueue *queue,
|
|
GTimeVal *end_time);
|
|
GLIB_DEPRECATED_FOR(g_async_queue_timeout_pop_unlocked)
|
|
gpointer g_async_queue_timed_pop_unlocked (GAsyncQueue *queue,
|
|
GTimeVal *end_time);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_ASYNCQUEUE_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_BACKTRACE_H__
|
|
#define __G_BACKTRACE_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
#include <signal.h>
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_on_error_query (const gchar *prg_name);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_on_error_stack_trace (const gchar *prg_name);
|
|
|
|
/**
|
|
* G_BREAKPOINT:
|
|
*
|
|
* Inserts a breakpoint instruction into the code.
|
|
*
|
|
* On x86 and alpha systems this is implemented as a soft interrupt
|
|
* and on other architectures it raises a `SIGTRAP` signal.
|
|
*/
|
|
#if (defined (__i386__) || defined (__x86_64__)) && defined (__GNUC__) && __GNUC__ >= 2
|
|
# define G_BREAKPOINT() G_STMT_START{ __asm__ __volatile__ ("int $03"); }G_STMT_END
|
|
#elif (defined (_MSC_VER) || defined (__DMC__)) && defined (_M_IX86)
|
|
# define G_BREAKPOINT() G_STMT_START{ __asm int 3h }G_STMT_END
|
|
#elif defined (_MSC_VER)
|
|
# define G_BREAKPOINT() G_STMT_START{ __debugbreak(); }G_STMT_END
|
|
#elif defined (__alpha__) && !defined(__osf__) && defined (__GNUC__) && __GNUC__ >= 2
|
|
# define G_BREAKPOINT() G_STMT_START{ __asm__ __volatile__ ("bpt"); }G_STMT_END
|
|
#elif defined (__APPLE__)
|
|
# define G_BREAKPOINT() G_STMT_START{ __builtin_trap(); }G_STMT_END
|
|
#else /* !__i386__ && !__alpha__ */
|
|
# define G_BREAKPOINT() G_STMT_START{ raise (SIGTRAP); }G_STMT_END
|
|
#endif /* __i386__ */
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_BACKTRACE_H__ */
|
|
/* gbase64.h - Base64 coding functions
|
|
*
|
|
* Copyright (C) 2005 Alexander Larsson <alexl@redhat.com>
|
|
*
|
|
* 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, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __G_BASE64_H__
|
|
#define __G_BASE64_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gsize g_base64_encode_step (const guchar *in,
|
|
gsize len,
|
|
gboolean break_lines,
|
|
gchar *out,
|
|
gint *state,
|
|
gint *save);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gsize g_base64_encode_close (gboolean break_lines,
|
|
gchar *out,
|
|
gint *state,
|
|
gint *save);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_base64_encode (const guchar *data,
|
|
gsize len) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gsize g_base64_decode_step (const gchar *in,
|
|
gsize len,
|
|
guchar *out,
|
|
gint *state,
|
|
guint *save);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guchar *g_base64_decode (const gchar *text,
|
|
gsize *out_len) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guchar *g_base64_decode_inplace (gchar *text,
|
|
gsize *out_len);
|
|
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_BASE64_H__ */
|
|
/*
|
|
* Copyright © 2008 Ryan Lortie
|
|
* Copyright © 2010 Codethink Limited
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the licence, 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* Author: Ryan Lortie <desrt@desrt.ca>
|
|
*/
|
|
|
|
#ifndef __G_BITLOCK_H__
|
|
#define __G_BITLOCK_H__
|
|
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_bit_lock (volatile gint *address,
|
|
gint lock_bit);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_bit_trylock (volatile gint *address,
|
|
gint lock_bit);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_bit_unlock (volatile gint *address,
|
|
gint lock_bit);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_pointer_bit_lock (volatile void *address,
|
|
gint lock_bit);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_pointer_bit_trylock (volatile void *address,
|
|
gint lock_bit);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_pointer_bit_unlock (volatile void *address,
|
|
gint lock_bit);
|
|
|
|
#ifdef __GNUC__
|
|
|
|
#define g_pointer_bit_lock(address, lock_bit) \
|
|
(lG_GNUC_EXTENSION ({ \
|
|
G_STATIC_ASSERT (sizeof *(address) == sizeof (gpointer)); \
|
|
g_pointer_bit_lock ((address), (lock_bit)); \
|
|
}))
|
|
|
|
#define g_pointer_bit_trylock(address, lock_bit) \
|
|
(lG_GNUC_EXTENSION ({ \
|
|
G_STATIC_ASSERT (sizeof *(address) == sizeof (gpointer)); \
|
|
g_pointer_bit_trylock ((address), (lock_bit)); \
|
|
}))
|
|
|
|
#define g_pointer_bit_unlock(address, lock_bit) \
|
|
(lG_GNUC_EXTENSION ({ \
|
|
G_STATIC_ASSERT (sizeof *(address) == sizeof (gpointer)); \
|
|
g_pointer_bit_unlock ((address), (lock_bit)); \
|
|
}))
|
|
|
|
#endif
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_BITLOCK_H_ */
|
|
/* gbookmarkfile.h: parsing and building desktop bookmarks
|
|
*
|
|
* Copyright (C) 2005-2006 Emmanuele Bassi
|
|
*
|
|
* 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, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __G_BOOKMARK_FILE_H__
|
|
#define __G_BOOKMARK_FILE_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
#include <time.h>
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/**
|
|
* G_BOOKMARK_FILE_ERROR:
|
|
*
|
|
* Error domain for bookmark file parsing.
|
|
* Errors in this domain will be from the #GBookmarkFileError
|
|
* enumeration. See #GError for information on error domains.
|
|
*/
|
|
#define G_BOOKMARK_FILE_ERROR (g_bookmark_file_error_quark ())
|
|
|
|
|
|
/**
|
|
* GBookmarkFileError:
|
|
* @G_BOOKMARK_FILE_ERROR_INVALID_URI: URI was ill-formed
|
|
* @G_BOOKMARK_FILE_ERROR_INVALID_VALUE: a requested field was not found
|
|
* @G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED: a requested application did
|
|
* not register a bookmark
|
|
* @G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND: a requested URI was not found
|
|
* @G_BOOKMARK_FILE_ERROR_READ: document was ill formed
|
|
* @G_BOOKMARK_FILE_ERROR_UNKNOWN_ENCODING: the text being parsed was
|
|
* in an unknown encoding
|
|
* @G_BOOKMARK_FILE_ERROR_WRITE: an error occurred while writing
|
|
* @G_BOOKMARK_FILE_ERROR_FILE_NOT_FOUND: requested file was not found
|
|
*
|
|
* Error codes returned by bookmark file parsing.
|
|
*/
|
|
typedef enum
|
|
{
|
|
G_BOOKMARK_FILE_ERROR_INVALID_URI,
|
|
G_BOOKMARK_FILE_ERROR_INVALID_VALUE,
|
|
G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED,
|
|
G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND,
|
|
G_BOOKMARK_FILE_ERROR_READ,
|
|
G_BOOKMARK_FILE_ERROR_UNKNOWN_ENCODING,
|
|
G_BOOKMARK_FILE_ERROR_WRITE,
|
|
G_BOOKMARK_FILE_ERROR_FILE_NOT_FOUND
|
|
} GBookmarkFileError;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GQuark g_bookmark_file_error_quark (void);
|
|
|
|
/**
|
|
* GBookmarkFile:
|
|
*
|
|
* The `GBookmarkFile` structure contains only
|
|
* private data and should not be directly accessed.
|
|
*/
|
|
typedef struct _GBookmarkFile GBookmarkFile;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GBookmarkFile *g_bookmark_file_new (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_bookmark_file_free (GBookmarkFile *bookmark);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_bookmark_file_load_from_file (GBookmarkFile *bookmark,
|
|
const gchar *filename,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_bookmark_file_load_from_data (GBookmarkFile *bookmark,
|
|
const gchar *data,
|
|
gsize length,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_bookmark_file_load_from_data_dirs (GBookmarkFile *bookmark,
|
|
const gchar *file,
|
|
gchar **full_path,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar * g_bookmark_file_to_data (GBookmarkFile *bookmark,
|
|
gsize *length,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_bookmark_file_to_file (GBookmarkFile *bookmark,
|
|
const gchar *filename,
|
|
GError **error);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_bookmark_file_set_title (GBookmarkFile *bookmark,
|
|
const gchar *uri,
|
|
const gchar *title);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar * g_bookmark_file_get_title (GBookmarkFile *bookmark,
|
|
const gchar *uri,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_bookmark_file_set_description (GBookmarkFile *bookmark,
|
|
const gchar *uri,
|
|
const gchar *description);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar * g_bookmark_file_get_description (GBookmarkFile *bookmark,
|
|
const gchar *uri,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_bookmark_file_set_mime_type (GBookmarkFile *bookmark,
|
|
const gchar *uri,
|
|
const gchar *mime_type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar * g_bookmark_file_get_mime_type (GBookmarkFile *bookmark,
|
|
const gchar *uri,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_bookmark_file_set_groups (GBookmarkFile *bookmark,
|
|
const gchar *uri,
|
|
const gchar **groups,
|
|
gsize length);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_bookmark_file_add_group (GBookmarkFile *bookmark,
|
|
const gchar *uri,
|
|
const gchar *group);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_bookmark_file_has_group (GBookmarkFile *bookmark,
|
|
const gchar *uri,
|
|
const gchar *group,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar ** g_bookmark_file_get_groups (GBookmarkFile *bookmark,
|
|
const gchar *uri,
|
|
gsize *length,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_bookmark_file_add_application (GBookmarkFile *bookmark,
|
|
const gchar *uri,
|
|
const gchar *name,
|
|
const gchar *exec);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_bookmark_file_has_application (GBookmarkFile *bookmark,
|
|
const gchar *uri,
|
|
const gchar *name,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar ** g_bookmark_file_get_applications (GBookmarkFile *bookmark,
|
|
const gchar *uri,
|
|
gsize *length,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_bookmark_file_set_app_info (GBookmarkFile *bookmark,
|
|
const gchar *uri,
|
|
const gchar *name,
|
|
const gchar *exec,
|
|
gint count,
|
|
time_t stamp,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_bookmark_file_get_app_info (GBookmarkFile *bookmark,
|
|
const gchar *uri,
|
|
const gchar *name,
|
|
gchar **exec,
|
|
guint *count,
|
|
time_t *stamp,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_bookmark_file_set_is_private (GBookmarkFile *bookmark,
|
|
const gchar *uri,
|
|
gboolean is_private);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_bookmark_file_get_is_private (GBookmarkFile *bookmark,
|
|
const gchar *uri,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_bookmark_file_set_icon (GBookmarkFile *bookmark,
|
|
const gchar *uri,
|
|
const gchar *href,
|
|
const gchar *mime_type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_bookmark_file_get_icon (GBookmarkFile *bookmark,
|
|
const gchar *uri,
|
|
gchar **href,
|
|
gchar **mime_type,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_bookmark_file_set_added (GBookmarkFile *bookmark,
|
|
const gchar *uri,
|
|
time_t added);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
time_t g_bookmark_file_get_added (GBookmarkFile *bookmark,
|
|
const gchar *uri,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_bookmark_file_set_modified (GBookmarkFile *bookmark,
|
|
const gchar *uri,
|
|
time_t modified);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
time_t g_bookmark_file_get_modified (GBookmarkFile *bookmark,
|
|
const gchar *uri,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_bookmark_file_set_visited (GBookmarkFile *bookmark,
|
|
const gchar *uri,
|
|
time_t visited);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
time_t g_bookmark_file_get_visited (GBookmarkFile *bookmark,
|
|
const gchar *uri,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_bookmark_file_has_item (GBookmarkFile *bookmark,
|
|
const gchar *uri);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_bookmark_file_get_size (GBookmarkFile *bookmark);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar ** g_bookmark_file_get_uris (GBookmarkFile *bookmark,
|
|
gsize *length) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_bookmark_file_remove_group (GBookmarkFile *bookmark,
|
|
const gchar *uri,
|
|
const gchar *group,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_bookmark_file_remove_application (GBookmarkFile *bookmark,
|
|
const gchar *uri,
|
|
const gchar *name,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_bookmark_file_remove_item (GBookmarkFile *bookmark,
|
|
const gchar *uri,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_bookmark_file_move_item (GBookmarkFile *bookmark,
|
|
const gchar *old_uri,
|
|
const gchar *new_uri,
|
|
GError **error);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_BOOKMARK_FILE_H__ */
|
|
/*
|
|
* Copyright © 2009, 2010 Codethink Limited
|
|
* Copyright © 2011 Collabora Ltd.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the licence, 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* Author: Ryan Lortie <desrt@desrt.ca>
|
|
* Stef Walter <stefw@collabora.co.uk>
|
|
*/
|
|
|
|
#ifndef __G_BYTES_H__
|
|
#define __G_BYTES_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GBytes * g_bytes_new (gconstpointer data,
|
|
gsize size);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GBytes * g_bytes_new_take (gpointer data,
|
|
gsize size);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GBytes * g_bytes_new_static (gconstpointer data,
|
|
gsize size);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GBytes * g_bytes_new_with_free_func (gconstpointer data,
|
|
gsize size,
|
|
GDestroyNotify free_func,
|
|
gpointer user_data);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GBytes * g_bytes_new_from_bytes (GBytes *bytes,
|
|
gsize offset,
|
|
gsize length);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gconstpointer g_bytes_get_data (GBytes *bytes,
|
|
gsize *size);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gsize g_bytes_get_size (GBytes *bytes);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GBytes * g_bytes_ref (GBytes *bytes);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_bytes_unref (GBytes *bytes);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_bytes_unref_to_data (GBytes *bytes,
|
|
gsize *size);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GByteArray * g_bytes_unref_to_array (GBytes *bytes);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_bytes_hash (gconstpointer bytes);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_bytes_equal (gconstpointer bytes1,
|
|
gconstpointer bytes2);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_bytes_compare (gconstpointer bytes1,
|
|
gconstpointer bytes2);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_BYTES_H__ */
|
|
/* gcharset.h - Charset functions
|
|
*
|
|
* Copyright (C) 2011 Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __G_CHARSET_H__
|
|
#define __G_CHARSET_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_get_charset (const char **charset);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar * g_get_codeset (void);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * const * g_get_language_names (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar ** g_get_locale_variants (const gchar *locale);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_CHARSET_H__ */
|
|
/* gchecksum.h - data hashing functions
|
|
*
|
|
* Copyright (C) 2007 Emmanuele Bassi <ebassi@gnome.org>
|
|
*
|
|
* 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, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __G_CHECKSUM_H__
|
|
#define __G_CHECKSUM_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/**
|
|
* GChecksumType:
|
|
* @G_CHECKSUM_MD5: Use the MD5 hashing algorithm
|
|
* @G_CHECKSUM_SHA1: Use the SHA-1 hashing algorithm
|
|
* @G_CHECKSUM_SHA256: Use the SHA-256 hashing algorithm
|
|
* @G_CHECKSUM_SHA384: Use the SHA-384 hashing algorithm (Since: 2.51)
|
|
* @G_CHECKSUM_SHA512: Use the SHA-512 hashing algorithm (Since: 2.36)
|
|
*
|
|
* The hashing algorithm to be used by #GChecksum when performing the
|
|
* digest of some data.
|
|
*
|
|
* Note that the #GChecksumType enumeration may be extended at a later
|
|
* date to include new hashing algorithm types.
|
|
*
|
|
* Since: 2.16
|
|
*/
|
|
typedef enum {
|
|
G_CHECKSUM_MD5,
|
|
G_CHECKSUM_SHA1,
|
|
G_CHECKSUM_SHA256,
|
|
G_CHECKSUM_SHA512,
|
|
G_CHECKSUM_SHA384
|
|
} GChecksumType;
|
|
|
|
/**
|
|
* GChecksum:
|
|
*
|
|
* An opaque structure representing a checksumming operation.
|
|
* To create a new GChecksum, use g_checksum_new(). To free
|
|
* a GChecksum, use g_checksum_free().
|
|
*
|
|
* Since: 2.16
|
|
*/
|
|
typedef struct _GChecksum GChecksum;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gssize g_checksum_type_get_length (GChecksumType checksum_type);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GChecksum * g_checksum_new (GChecksumType checksum_type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_checksum_reset (GChecksum *checksum);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GChecksum * g_checksum_copy (const GChecksum *checksum);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_checksum_free (GChecksum *checksum);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_checksum_update (GChecksum *checksum,
|
|
const guchar *data,
|
|
gssize length);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_checksum_get_string (GChecksum *checksum);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_checksum_get_digest (GChecksum *checksum,
|
|
guint8 *buffer,
|
|
gsize *digest_len);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_compute_checksum_for_data (GChecksumType checksum_type,
|
|
const guchar *data,
|
|
gsize length);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_compute_checksum_for_string (GChecksumType checksum_type,
|
|
const gchar *str,
|
|
gssize length);
|
|
|
|
GLIB_AVAILABLE_IN_2_34
|
|
gchar *g_compute_checksum_for_bytes (GChecksumType checksum_type,
|
|
GBytes *data);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_CHECKSUM_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_CONVERT_H__
|
|
#define __G_CONVERT_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/**
|
|
* GConvertError:
|
|
* @G_CONVERT_ERROR_NO_CONVERSION: Conversion between the requested character
|
|
* sets is not supported.
|
|
* @G_CONVERT_ERROR_ILLEGAL_SEQUENCE: Invalid byte sequence in conversion input.
|
|
* @G_CONVERT_ERROR_FAILED: Conversion failed for some reason.
|
|
* @G_CONVERT_ERROR_PARTIAL_INPUT: Partial character sequence at end of input.
|
|
* @G_CONVERT_ERROR_BAD_URI: URI is invalid.
|
|
* @G_CONVERT_ERROR_NOT_ABSOLUTE_PATH: Pathname is not an absolute path.
|
|
* @G_CONVERT_ERROR_NO_MEMORY: No memory available. Since: 2.40
|
|
*
|
|
* Error codes returned by character set conversion routines.
|
|
*/
|
|
typedef enum
|
|
{
|
|
G_CONVERT_ERROR_NO_CONVERSION,
|
|
G_CONVERT_ERROR_ILLEGAL_SEQUENCE,
|
|
G_CONVERT_ERROR_FAILED,
|
|
G_CONVERT_ERROR_PARTIAL_INPUT,
|
|
G_CONVERT_ERROR_BAD_URI,
|
|
G_CONVERT_ERROR_NOT_ABSOLUTE_PATH,
|
|
G_CONVERT_ERROR_NO_MEMORY
|
|
} GConvertError;
|
|
|
|
/**
|
|
* G_CONVERT_ERROR:
|
|
*
|
|
* Error domain for character set conversions. Errors in this domain will
|
|
* be from the #GConvertError enumeration. See #GError for information on
|
|
* error domains.
|
|
*/
|
|
#define G_CONVERT_ERROR g_convert_error_quark()
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GQuark g_convert_error_quark (void);
|
|
|
|
/**
|
|
* GIConv:
|
|
*
|
|
* The GIConv struct wraps an iconv() conversion descriptor. It contains
|
|
* private data and should only be accessed using the following functions.
|
|
*/
|
|
typedef struct _GIConv *GIConv;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GIConv g_iconv_open (const gchar *to_codeset,
|
|
const gchar *from_codeset);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gsize g_iconv (GIConv converter,
|
|
gchar **inbuf,
|
|
gsize *inbytes_left,
|
|
gchar **outbuf,
|
|
gsize *outbytes_left);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_iconv_close (GIConv converter);
|
|
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_convert (const gchar *str,
|
|
gssize len,
|
|
const gchar *to_codeset,
|
|
const gchar *from_codeset,
|
|
gsize *bytes_read,
|
|
gsize *bytes_written,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_convert_with_iconv (const gchar *str,
|
|
gssize len,
|
|
GIConv converter,
|
|
gsize *bytes_read,
|
|
gsize *bytes_written,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_convert_with_fallback (const gchar *str,
|
|
gssize len,
|
|
const gchar *to_codeset,
|
|
const gchar *from_codeset,
|
|
const gchar *fallback,
|
|
gsize *bytes_read,
|
|
gsize *bytes_written,
|
|
GError **error) G_GNUC_MALLOC;
|
|
|
|
|
|
/* Convert between libc's idea of strings and UTF-8.
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_locale_to_utf8 (const gchar *opsysstring,
|
|
gssize len,
|
|
gsize *bytes_read,
|
|
gsize *bytes_written,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_locale_from_utf8 (const gchar *utf8string,
|
|
gssize len,
|
|
gsize *bytes_read,
|
|
gsize *bytes_written,
|
|
GError **error) G_GNUC_MALLOC;
|
|
|
|
/* Convert between the operating system (or C runtime)
|
|
* representation of file names and UTF-8.
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_filename_to_utf8 (const gchar *opsysstring,
|
|
gssize len,
|
|
gsize *bytes_read,
|
|
gsize *bytes_written,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_filename_from_utf8 (const gchar *utf8string,
|
|
gssize len,
|
|
gsize *bytes_read,
|
|
gsize *bytes_written,
|
|
GError **error) G_GNUC_MALLOC;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_filename_from_uri (const gchar *uri,
|
|
gchar **hostname,
|
|
GError **error) G_GNUC_MALLOC;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_filename_to_uri (const gchar *filename,
|
|
const gchar *hostname,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_filename_display_name (const gchar *filename) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_get_filename_charsets (const gchar ***charsets);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_filename_display_basename (const gchar *filename) G_GNUC_MALLOC;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar **g_uri_list_extract_uris (const gchar *uri_list) G_GNUC_MALLOC;
|
|
|
|
#ifndef __GTK_DOC_IGNORE__
|
|
#ifdef G_OS_WIN32
|
|
#define g_filename_to_utf8 g_filename_to_utf8_utf8
|
|
#define g_filename_from_utf8 g_filename_from_utf8_utf8
|
|
#define g_filename_from_uri g_filename_from_uri_utf8
|
|
#define g_filename_to_uri g_filename_to_uri_utf8
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_filename_to_utf8_utf8 (const gchar *opsysstring,
|
|
gssize len,
|
|
gsize *bytes_read,
|
|
gsize *bytes_written,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_filename_from_utf8_utf8 (const gchar *utf8string,
|
|
gssize len,
|
|
gsize *bytes_read,
|
|
gsize *bytes_written,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_filename_from_uri_utf8 (const gchar *uri,
|
|
gchar **hostname,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_filename_to_uri_utf8 (const gchar *filename,
|
|
const gchar *hostname,
|
|
GError **error) G_GNUC_MALLOC;
|
|
#endif
|
|
#endif /* __GTK_DOC_IGNORE__ */
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_CONVERT_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_DATASET_H__
|
|
#define __G_DATASET_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GData GData;
|
|
|
|
typedef void (*GDataForeachFunc) (GQuark key_id,
|
|
gpointer data,
|
|
gpointer user_data);
|
|
|
|
/* Keyed Data List
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_datalist_init (GData **datalist);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_datalist_clear (GData **datalist);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_datalist_id_get_data (GData **datalist,
|
|
GQuark key_id);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_datalist_id_set_data_full (GData **datalist,
|
|
GQuark key_id,
|
|
gpointer data,
|
|
GDestroyNotify destroy_func);
|
|
|
|
typedef gpointer (*GDuplicateFunc) (gpointer data, gpointer user_data);
|
|
|
|
GLIB_AVAILABLE_IN_2_34
|
|
gpointer g_datalist_id_dup_data (GData **datalist,
|
|
GQuark key_id,
|
|
GDuplicateFunc dup_func,
|
|
gpointer user_data);
|
|
GLIB_AVAILABLE_IN_2_34
|
|
gboolean g_datalist_id_replace_data (GData **datalist,
|
|
GQuark key_id,
|
|
gpointer oldval,
|
|
gpointer newval,
|
|
GDestroyNotify destroy,
|
|
GDestroyNotify *old_destroy);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_datalist_id_remove_no_notify (GData **datalist,
|
|
GQuark key_id);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_datalist_foreach (GData **datalist,
|
|
GDataForeachFunc func,
|
|
gpointer user_data);
|
|
|
|
/**
|
|
* G_DATALIST_FLAGS_MASK:
|
|
*
|
|
* A bitmask that restricts the possible flags passed to
|
|
* g_datalist_set_flags(). Passing a flags value where
|
|
* flags & ~G_DATALIST_FLAGS_MASK != 0 is an error.
|
|
*/
|
|
#define G_DATALIST_FLAGS_MASK 0x3
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_datalist_set_flags (GData **datalist,
|
|
guint flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_datalist_unset_flags (GData **datalist,
|
|
guint flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_datalist_get_flags (GData **datalist);
|
|
|
|
#define g_datalist_id_set_data(dl, q, d) \
|
|
g_datalist_id_set_data_full ((dl), (q), (d), NULL)
|
|
#define g_datalist_id_remove_data(dl, q) \
|
|
g_datalist_id_set_data ((dl), (q), NULL)
|
|
#define g_datalist_set_data_full(dl, k, d, f) \
|
|
g_datalist_id_set_data_full ((dl), g_quark_from_string (k), (d), (f))
|
|
#define g_datalist_remove_no_notify(dl, k) \
|
|
g_datalist_id_remove_no_notify ((dl), g_quark_try_string (k))
|
|
#define g_datalist_set_data(dl, k, d) \
|
|
g_datalist_set_data_full ((dl), (k), (d), NULL)
|
|
#define g_datalist_remove_data(dl, k) \
|
|
g_datalist_id_set_data ((dl), g_quark_try_string (k), NULL)
|
|
|
|
/* Location Associated Keyed Data
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_dataset_destroy (gconstpointer dataset_location);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_dataset_id_get_data (gconstpointer dataset_location,
|
|
GQuark key_id);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_datalist_get_data (GData **datalist,
|
|
const gchar *key);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_dataset_id_set_data_full (gconstpointer dataset_location,
|
|
GQuark key_id,
|
|
gpointer data,
|
|
GDestroyNotify destroy_func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_dataset_id_remove_no_notify (gconstpointer dataset_location,
|
|
GQuark key_id);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_dataset_foreach (gconstpointer dataset_location,
|
|
GDataForeachFunc func,
|
|
gpointer user_data);
|
|
#define g_dataset_id_set_data(l, k, d) \
|
|
g_dataset_id_set_data_full ((l), (k), (d), NULL)
|
|
#define g_dataset_id_remove_data(l, k) \
|
|
g_dataset_id_set_data ((l), (k), NULL)
|
|
#define g_dataset_get_data(l, k) \
|
|
(g_dataset_id_get_data ((l), g_quark_try_string (k)))
|
|
#define g_dataset_set_data_full(l, k, d, f) \
|
|
g_dataset_id_set_data_full ((l), g_quark_from_string (k), (d), (f))
|
|
#define g_dataset_remove_no_notify(l, k) \
|
|
g_dataset_id_remove_no_notify ((l), g_quark_try_string (k))
|
|
#define g_dataset_set_data(l, k, d) \
|
|
g_dataset_set_data_full ((l), (k), (d), NULL)
|
|
#define g_dataset_remove_data(l, k) \
|
|
g_dataset_id_set_data ((l), g_quark_try_string (k), NULL)
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_DATASET_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_DATE_H__
|
|
#define __G_DATE_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
#include <time.h>
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/* GDate
|
|
*
|
|
* Date calculations (not time for now, to be resolved). These are a
|
|
* mutant combination of Steffen Beyer's DateCalc routines
|
|
* (http://www.perl.com/CPAN/authors/id/STBEY/) and Jon Trowbridge's
|
|
* date routines (written for in-house software). Written by Havoc
|
|
* Pennington <hp@pobox.com>
|
|
*/
|
|
|
|
typedef gint32 GTime;
|
|
typedef guint16 GDateYear;
|
|
typedef guint8 GDateDay; /* day of the month */
|
|
typedef struct _GDate GDate;
|
|
|
|
/* enum used to specify order of appearance in parsed date strings */
|
|
typedef enum
|
|
{
|
|
G_DATE_DAY = 0,
|
|
G_DATE_MONTH = 1,
|
|
G_DATE_YEAR = 2
|
|
} GDateDMY;
|
|
|
|
/* actual week and month values */
|
|
typedef enum
|
|
{
|
|
G_DATE_BAD_WEEKDAY = 0,
|
|
G_DATE_MONDAY = 1,
|
|
G_DATE_TUESDAY = 2,
|
|
G_DATE_WEDNESDAY = 3,
|
|
G_DATE_THURSDAY = 4,
|
|
G_DATE_FRIDAY = 5,
|
|
G_DATE_SATURDAY = 6,
|
|
G_DATE_SUNDAY = 7
|
|
} GDateWeekday;
|
|
typedef enum
|
|
{
|
|
G_DATE_BAD_MONTH = 0,
|
|
G_DATE_JANUARY = 1,
|
|
G_DATE_FEBRUARY = 2,
|
|
G_DATE_MARCH = 3,
|
|
G_DATE_APRIL = 4,
|
|
G_DATE_MAY = 5,
|
|
G_DATE_JUNE = 6,
|
|
G_DATE_JULY = 7,
|
|
G_DATE_AUGUST = 8,
|
|
G_DATE_SEPTEMBER = 9,
|
|
G_DATE_OCTOBER = 10,
|
|
G_DATE_NOVEMBER = 11,
|
|
G_DATE_DECEMBER = 12
|
|
} GDateMonth;
|
|
|
|
#define G_DATE_BAD_JULIAN 0U
|
|
#define G_DATE_BAD_DAY 0U
|
|
#define G_DATE_BAD_YEAR 0U
|
|
|
|
/* Note: directly manipulating structs is generally a bad idea, but
|
|
* in this case it's an *incredibly* bad idea, because all or part
|
|
* of this struct can be invalid at any given time. Use the functions,
|
|
* or you will get hosed, I promise.
|
|
*/
|
|
struct _GDate
|
|
{
|
|
guint julian_days : 32; /* julian days representation - we use a
|
|
* bitfield hoping that 64 bit platforms
|
|
* will pack this whole struct in one big
|
|
* int
|
|
*/
|
|
|
|
guint julian : 1; /* julian is valid */
|
|
guint dmy : 1; /* dmy is valid */
|
|
|
|
/* DMY representation */
|
|
guint day : 6;
|
|
guint month : 4;
|
|
guint year : 16;
|
|
};
|
|
|
|
/* g_date_new() returns an invalid date, you then have to _set() stuff
|
|
* to get a usable object. You can also allocate a GDate statically,
|
|
* then call g_date_clear() to initialize.
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GDate* g_date_new (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GDate* g_date_new_dmy (GDateDay day,
|
|
GDateMonth month,
|
|
GDateYear year);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GDate* g_date_new_julian (guint32 julian_day);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_date_free (GDate *date);
|
|
|
|
/* check g_date_valid() after doing an operation that might fail, like
|
|
* _parse. Almost all g_date operations are undefined on invalid
|
|
* dates (the exceptions are the mutators, since you need those to
|
|
* return to validity).
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_date_valid (const GDate *date);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_date_valid_day (GDateDay day) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_date_valid_month (GDateMonth month) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_date_valid_year (GDateYear year) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_date_valid_weekday (GDateWeekday weekday) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_date_valid_julian (guint32 julian_date) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_date_valid_dmy (GDateDay day,
|
|
GDateMonth month,
|
|
GDateYear year) G_GNUC_CONST;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GDateWeekday g_date_get_weekday (const GDate *date);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GDateMonth g_date_get_month (const GDate *date);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GDateYear g_date_get_year (const GDate *date);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GDateDay g_date_get_day (const GDate *date);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint32 g_date_get_julian (const GDate *date);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_date_get_day_of_year (const GDate *date);
|
|
/* First monday/sunday is the start of week 1; if we haven't reached
|
|
* that day, return 0. These are not ISO weeks of the year; that
|
|
* routine needs to be added.
|
|
* these functions return the number of weeks, starting on the
|
|
* corrsponding day
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_date_get_monday_week_of_year (const GDate *date);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_date_get_sunday_week_of_year (const GDate *date);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_date_get_iso8601_week_of_year (const GDate *date);
|
|
|
|
/* If you create a static date struct you need to clear it to get it
|
|
* in a sane state before use. You can clear a whole array at
|
|
* once with the ndates argument.
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_date_clear (GDate *date,
|
|
guint n_dates);
|
|
|
|
/* The parse routine is meant for dates typed in by a user, so it
|
|
* permits many formats but tries to catch common typos. If your data
|
|
* needs to be strictly validated, it is not an appropriate function.
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_date_set_parse (GDate *date,
|
|
const gchar *str);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_date_set_time_t (GDate *date,
|
|
time_t timet);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_date_set_time_val (GDate *date,
|
|
GTimeVal *timeval);
|
|
#ifndef G_DISABLE_DEPRECATED
|
|
GLIB_DEPRECATED_FOR(g_date_set_time_t)
|
|
void g_date_set_time (GDate *date,
|
|
GTime time_);
|
|
#endif
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_date_set_month (GDate *date,
|
|
GDateMonth month);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_date_set_day (GDate *date,
|
|
GDateDay day);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_date_set_year (GDate *date,
|
|
GDateYear year);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_date_set_dmy (GDate *date,
|
|
GDateDay day,
|
|
GDateMonth month,
|
|
GDateYear y);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_date_set_julian (GDate *date,
|
|
guint32 julian_date);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_date_is_first_of_month (const GDate *date);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_date_is_last_of_month (const GDate *date);
|
|
|
|
/* To go forward by some number of weeks just go forward weeks*7 days */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_date_add_days (GDate *date,
|
|
guint n_days);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_date_subtract_days (GDate *date,
|
|
guint n_days);
|
|
|
|
/* If you add/sub months while day > 28, the day might change */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_date_add_months (GDate *date,
|
|
guint n_months);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_date_subtract_months (GDate *date,
|
|
guint n_months);
|
|
|
|
/* If it's feb 29, changing years can move you to the 28th */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_date_add_years (GDate *date,
|
|
guint n_years);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_date_subtract_years (GDate *date,
|
|
guint n_years);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_date_is_leap_year (GDateYear year) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint8 g_date_get_days_in_month (GDateMonth month,
|
|
GDateYear year) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint8 g_date_get_monday_weeks_in_year (GDateYear year) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint8 g_date_get_sunday_weeks_in_year (GDateYear year) G_GNUC_CONST;
|
|
|
|
/* Returns the number of days between the two dates. If date2 comes
|
|
before date1, a negative value is return. */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_date_days_between (const GDate *date1,
|
|
const GDate *date2);
|
|
|
|
/* qsort-friendly (with a cast...) */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_date_compare (const GDate *lhs,
|
|
const GDate *rhs);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_date_to_struct_tm (const GDate *date,
|
|
struct tm *tm);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_date_clamp (GDate *date,
|
|
const GDate *min_date,
|
|
const GDate *max_date);
|
|
|
|
/* Swap date1 and date2's values if date1 > date2. */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_date_order (GDate *date1, GDate *date2);
|
|
|
|
/* Just like strftime() except you can only use date-related formats.
|
|
* Using a time format is undefined.
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gsize g_date_strftime (gchar *s,
|
|
gsize slen,
|
|
const gchar *format,
|
|
const GDate *date);
|
|
|
|
#ifndef G_DISABLE_DEPRECATED
|
|
|
|
#define g_date_weekday g_date_get_weekday
|
|
#define g_date_month g_date_get_month
|
|
#define g_date_year g_date_get_year
|
|
#define g_date_day g_date_get_day
|
|
#define g_date_julian g_date_get_julian
|
|
#define g_date_day_of_year g_date_get_day_of_year
|
|
#define g_date_monday_week_of_year g_date_get_monday_week_of_year
|
|
#define g_date_sunday_week_of_year g_date_get_sunday_week_of_year
|
|
#define g_date_days_in_month g_date_get_days_in_month
|
|
#define g_date_monday_weeks_in_year g_date_get_monday_weeks_in_year
|
|
#define g_date_sunday_weeks_in_year g_date_get_sunday_weeks_in_year
|
|
|
|
#endif /* G_DISABLE_DEPRECATED */
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_DATE_H__ */
|
|
/*
|
|
* Copyright (C) 2009-2010 Christian Hergert <chris@dronelabs.com>
|
|
* Copyright © 2010 Codethink Limited
|
|
*
|
|
* This library is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License as
|
|
* published by the Free Software Foundation; either version 2.1 of the
|
|
* licence, or (at your option) any later version.
|
|
*
|
|
* This 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 Lesser General Public
|
|
* License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* Authors: Christian Hergert <chris@dronelabs.com>
|
|
* Thiago Santos <thiago.sousa.santos@collabora.co.uk>
|
|
* Emmanuele Bassi <ebassi@linux.intel.com>
|
|
* Ryan Lortie <desrt@desrt.ca>
|
|
*/
|
|
|
|
#ifndef __G_DATE_TIME_H__
|
|
#define __G_DATE_TIME_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
/*
|
|
* Copyright © 2010 Codethink Limited
|
|
*
|
|
* This library is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License as
|
|
* published by the Free Software Foundation; either version 2 of the
|
|
* licence, 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* Author: Ryan Lortie <desrt@desrt.ca>
|
|
*/
|
|
|
|
#ifndef __G_TIME_ZONE_H__
|
|
#define __G_TIME_ZONE_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GTimeZone GTimeZone;
|
|
|
|
/**
|
|
* GTimeType:
|
|
* @G_TIME_TYPE_STANDARD: the time is in local standard time
|
|
* @G_TIME_TYPE_DAYLIGHT: the time is in local daylight time
|
|
* @G_TIME_TYPE_UNIVERSAL: the time is in UTC
|
|
*
|
|
* Disambiguates a given time in two ways.
|
|
*
|
|
* First, specifies if the given time is in universal or local time.
|
|
*
|
|
* Second, if the time is in local time, specifies if it is local
|
|
* standard time or local daylight time. This is important for the case
|
|
* where the same local time occurs twice (during daylight savings time
|
|
* transitions, for example).
|
|
*/
|
|
typedef enum
|
|
{
|
|
G_TIME_TYPE_STANDARD,
|
|
G_TIME_TYPE_DAYLIGHT,
|
|
G_TIME_TYPE_UNIVERSAL
|
|
} GTimeType;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GTimeZone * g_time_zone_new (const gchar *identifier);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GTimeZone * g_time_zone_new_utc (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GTimeZone * g_time_zone_new_local (void);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GTimeZone * g_time_zone_ref (GTimeZone *tz);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_time_zone_unref (GTimeZone *tz);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_time_zone_find_interval (GTimeZone *tz,
|
|
GTimeType type,
|
|
gint64 time_);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_time_zone_adjust_time (GTimeZone *tz,
|
|
GTimeType type,
|
|
gint64 *time_);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_time_zone_get_abbreviation (GTimeZone *tz,
|
|
gint interval);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint32 g_time_zone_get_offset (GTimeZone *tz,
|
|
gint interval);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_time_zone_is_dst (GTimeZone *tz,
|
|
gint interval);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_TIME_ZONE_H__ */
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/**
|
|
* G_TIME_SPAN_DAY:
|
|
*
|
|
* Evaluates to a time span of one day.
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
#define G_TIME_SPAN_DAY (G_GINT64_CONSTANT (86400000000))
|
|
|
|
/**
|
|
* G_TIME_SPAN_HOUR:
|
|
*
|
|
* Evaluates to a time span of one hour.
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
#define G_TIME_SPAN_HOUR (G_GINT64_CONSTANT (3600000000))
|
|
|
|
/**
|
|
* G_TIME_SPAN_MINUTE:
|
|
*
|
|
* Evaluates to a time span of one minute.
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
#define G_TIME_SPAN_MINUTE (G_GINT64_CONSTANT (60000000))
|
|
|
|
/**
|
|
* G_TIME_SPAN_SECOND:
|
|
*
|
|
* Evaluates to a time span of one second.
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
#define G_TIME_SPAN_SECOND (G_GINT64_CONSTANT (1000000))
|
|
|
|
/**
|
|
* G_TIME_SPAN_MILLISECOND:
|
|
*
|
|
* Evaluates to a time span of one millisecond.
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
#define G_TIME_SPAN_MILLISECOND (G_GINT64_CONSTANT (1000))
|
|
|
|
/**
|
|
* GTimeSpan:
|
|
*
|
|
* A value representing an interval of time, in microseconds.
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
typedef gint64 GTimeSpan;
|
|
|
|
/**
|
|
* GDateTime:
|
|
*
|
|
* `GDateTime` is an opaque structure whose members
|
|
* cannot be accessed directly.
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
typedef struct _GDateTime GDateTime;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_date_time_unref (GDateTime *datetime);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GDateTime * g_date_time_ref (GDateTime *datetime);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GDateTime * g_date_time_new_now (GTimeZone *tz);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GDateTime * g_date_time_new_now_local (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GDateTime * g_date_time_new_now_utc (void);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GDateTime * g_date_time_new_from_unix_local (gint64 t);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GDateTime * g_date_time_new_from_unix_utc (gint64 t);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GDateTime * g_date_time_new_from_timeval_local (const GTimeVal *tv);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GDateTime * g_date_time_new_from_timeval_utc (const GTimeVal *tv);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GDateTime * g_date_time_new (GTimeZone *tz,
|
|
gint year,
|
|
gint month,
|
|
gint day,
|
|
gint hour,
|
|
gint minute,
|
|
gdouble seconds);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GDateTime * g_date_time_new_local (gint year,
|
|
gint month,
|
|
gint day,
|
|
gint hour,
|
|
gint minute,
|
|
gdouble seconds);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GDateTime * g_date_time_new_utc (gint year,
|
|
gint month,
|
|
gint day,
|
|
gint hour,
|
|
gint minute,
|
|
gdouble seconds);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
G_GNUC_WARN_UNUSED_RESULT
|
|
GDateTime * g_date_time_add (GDateTime *datetime,
|
|
GTimeSpan timespan);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
G_GNUC_WARN_UNUSED_RESULT
|
|
GDateTime * g_date_time_add_years (GDateTime *datetime,
|
|
gint years);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
G_GNUC_WARN_UNUSED_RESULT
|
|
GDateTime * g_date_time_add_months (GDateTime *datetime,
|
|
gint months);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
G_GNUC_WARN_UNUSED_RESULT
|
|
GDateTime * g_date_time_add_weeks (GDateTime *datetime,
|
|
gint weeks);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
G_GNUC_WARN_UNUSED_RESULT
|
|
GDateTime * g_date_time_add_days (GDateTime *datetime,
|
|
gint days);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
G_GNUC_WARN_UNUSED_RESULT
|
|
GDateTime * g_date_time_add_hours (GDateTime *datetime,
|
|
gint hours);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
G_GNUC_WARN_UNUSED_RESULT
|
|
GDateTime * g_date_time_add_minutes (GDateTime *datetime,
|
|
gint minutes);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
G_GNUC_WARN_UNUSED_RESULT
|
|
GDateTime * g_date_time_add_seconds (GDateTime *datetime,
|
|
gdouble seconds);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
G_GNUC_WARN_UNUSED_RESULT
|
|
GDateTime * g_date_time_add_full (GDateTime *datetime,
|
|
gint years,
|
|
gint months,
|
|
gint days,
|
|
gint hours,
|
|
gint minutes,
|
|
gdouble seconds);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_date_time_compare (gconstpointer dt1,
|
|
gconstpointer dt2);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GTimeSpan g_date_time_difference (GDateTime *end,
|
|
GDateTime *begin);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_date_time_hash (gconstpointer datetime);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_date_time_equal (gconstpointer dt1,
|
|
gconstpointer dt2);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_date_time_get_ymd (GDateTime *datetime,
|
|
gint *year,
|
|
gint *month,
|
|
gint *day);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_date_time_get_year (GDateTime *datetime);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_date_time_get_month (GDateTime *datetime);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_date_time_get_day_of_month (GDateTime *datetime);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_date_time_get_week_numbering_year (GDateTime *datetime);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_date_time_get_week_of_year (GDateTime *datetime);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_date_time_get_day_of_week (GDateTime *datetime);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_date_time_get_day_of_year (GDateTime *datetime);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_date_time_get_hour (GDateTime *datetime);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_date_time_get_minute (GDateTime *datetime);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_date_time_get_second (GDateTime *datetime);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_date_time_get_microsecond (GDateTime *datetime);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gdouble g_date_time_get_seconds (GDateTime *datetime);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint64 g_date_time_to_unix (GDateTime *datetime);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_date_time_to_timeval (GDateTime *datetime,
|
|
GTimeVal *tv);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GTimeSpan g_date_time_get_utc_offset (GDateTime *datetime);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_date_time_get_timezone_abbreviation (GDateTime *datetime);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_date_time_is_daylight_savings (GDateTime *datetime);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GDateTime * g_date_time_to_timezone (GDateTime *datetime,
|
|
GTimeZone *tz);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GDateTime * g_date_time_to_local (GDateTime *datetime);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GDateTime * g_date_time_to_utc (GDateTime *datetime);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar * g_date_time_format (GDateTime *datetime,
|
|
const gchar *format) G_GNUC_MALLOC;
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_DATE_TIME_H__ */
|
|
/* GLIB - Library of useful routines for C programming
|
|
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
|
*
|
|
* gdir.c: Simplified wrapper around the DIRENT functions.
|
|
*
|
|
* Copyright 2001 Hans Breuer
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __G_DIR_H__
|
|
#define __G_DIR_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
#ifdef G_OS_UNIX
|
|
#include <dirent.h>
|
|
#endif
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GDir GDir;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GDir * g_dir_open (const gchar *path,
|
|
guint flags,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_dir_read_name (GDir *dir);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_dir_rewind (GDir *dir);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_dir_close (GDir *dir);
|
|
|
|
#ifndef __GTK_DOC_IGNORE__
|
|
#ifdef G_OS_WIN32
|
|
#define g_dir_open g_dir_open_utf8
|
|
#define g_dir_read_name g_dir_read_name_utf8
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GDir *g_dir_open_utf8 (const gchar *path,
|
|
guint flags,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar *g_dir_read_name_utf8 (GDir *dir);
|
|
#endif /* G_OS_WIN32 */
|
|
#endif /* __GTK_DOC_IGNORE__ */
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_DIR_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_ENVIRON_H__
|
|
#define __G_ENVIRON_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_getenv (const gchar *variable);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_setenv (const gchar *variable,
|
|
const gchar *value,
|
|
gboolean overwrite);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_unsetenv (const gchar *variable);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar ** g_listenv (void);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar ** g_get_environ (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_environ_getenv (gchar **envp,
|
|
const gchar *variable);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar ** g_environ_setenv (gchar **envp,
|
|
const gchar *variable,
|
|
const gchar *value,
|
|
gboolean overwrite) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar ** g_environ_unsetenv (gchar **envp,
|
|
const gchar *variable) G_GNUC_WARN_UNUSED_RESULT;
|
|
|
|
#ifndef __GTK_DOC_IGNORE__
|
|
#ifdef G_OS_WIN32
|
|
#define g_getenv g_getenv_utf8
|
|
#define g_setenv g_setenv_utf8
|
|
#define g_unsetenv g_unsetenv_utf8
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar *g_getenv_utf8 (const gchar *variable);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_setenv_utf8 (const gchar *variable,
|
|
const gchar *value,
|
|
gboolean overwrite);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_unsetenv_utf8 (const gchar *variable);
|
|
#endif
|
|
#endif /* __GTK_DOC_IGNORE__ */
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_ENVIRON_H__ */
|
|
/* gfileutils.h - File utility functions
|
|
*
|
|
* Copyright 2000 Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __G_FILEUTILS_H__
|
|
#define __G_FILEUTILS_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
#define G_FILE_ERROR g_file_error_quark ()
|
|
|
|
typedef enum
|
|
{
|
|
G_FILE_ERROR_EXIST,
|
|
G_FILE_ERROR_ISDIR,
|
|
G_FILE_ERROR_ACCES,
|
|
G_FILE_ERROR_NAMETOOLONG,
|
|
G_FILE_ERROR_NOENT,
|
|
G_FILE_ERROR_NOTDIR,
|
|
G_FILE_ERROR_NXIO,
|
|
G_FILE_ERROR_NODEV,
|
|
G_FILE_ERROR_ROFS,
|
|
G_FILE_ERROR_TXTBSY,
|
|
G_FILE_ERROR_FAULT,
|
|
G_FILE_ERROR_LOOP,
|
|
G_FILE_ERROR_NOSPC,
|
|
G_FILE_ERROR_NOMEM,
|
|
G_FILE_ERROR_MFILE,
|
|
G_FILE_ERROR_NFILE,
|
|
G_FILE_ERROR_BADF,
|
|
G_FILE_ERROR_INVAL,
|
|
G_FILE_ERROR_PIPE,
|
|
G_FILE_ERROR_AGAIN,
|
|
G_FILE_ERROR_INTR,
|
|
G_FILE_ERROR_IO,
|
|
G_FILE_ERROR_PERM,
|
|
G_FILE_ERROR_NOSYS,
|
|
G_FILE_ERROR_FAILED
|
|
} GFileError;
|
|
|
|
/* For backward-compat reasons, these are synced to an old
|
|
* anonymous enum in libgnome. But don't use that enum
|
|
* in new code.
|
|
*/
|
|
typedef enum
|
|
{
|
|
G_FILE_TEST_IS_REGULAR = 1 << 0,
|
|
G_FILE_TEST_IS_SYMLINK = 1 << 1,
|
|
G_FILE_TEST_IS_DIR = 1 << 2,
|
|
G_FILE_TEST_IS_EXECUTABLE = 1 << 3,
|
|
G_FILE_TEST_EXISTS = 1 << 4
|
|
} GFileTest;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GQuark g_file_error_quark (void);
|
|
/* So other code can generate a GFileError */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GFileError g_file_error_from_errno (gint err_no);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_file_test (const gchar *filename,
|
|
GFileTest test);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_file_get_contents (const gchar *filename,
|
|
gchar **contents,
|
|
gsize *length,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_file_set_contents (const gchar *filename,
|
|
const gchar *contents,
|
|
gssize length,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_file_read_link (const gchar *filename,
|
|
GError **error);
|
|
|
|
/* Wrapper / workalike for mkdtemp() */
|
|
GLIB_AVAILABLE_IN_2_30
|
|
gchar *g_mkdtemp (gchar *tmpl);
|
|
GLIB_AVAILABLE_IN_2_30
|
|
gchar *g_mkdtemp_full (gchar *tmpl,
|
|
gint mode);
|
|
|
|
/* Wrapper / workalike for mkstemp() */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_mkstemp (gchar *tmpl);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_mkstemp_full (gchar *tmpl,
|
|
gint flags,
|
|
gint mode);
|
|
|
|
/* Wrappers for g_mkstemp and g_mkdtemp() */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_file_open_tmp (const gchar *tmpl,
|
|
gchar **name_used,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_2_30
|
|
gchar *g_dir_make_tmp (const gchar *tmpl,
|
|
GError **error);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_build_path (const gchar *separator,
|
|
const gchar *first_element,
|
|
...) G_GNUC_MALLOC G_GNUC_NULL_TERMINATED;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_build_pathv (const gchar *separator,
|
|
gchar **args) G_GNUC_MALLOC;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_build_filename (const gchar *first_element,
|
|
...) G_GNUC_MALLOC G_GNUC_NULL_TERMINATED;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_build_filenamev (gchar **args) G_GNUC_MALLOC;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_mkdir_with_parents (const gchar *pathname,
|
|
gint mode);
|
|
|
|
#ifdef G_OS_WIN32
|
|
|
|
/* On Win32, the canonical directory separator is the backslash, and
|
|
* the search path separator is the semicolon. Note that also the
|
|
* (forward) slash works as directory separator.
|
|
*/
|
|
#define G_DIR_SEPARATOR '\\'
|
|
#define G_DIR_SEPARATOR_S "\\"
|
|
#define G_IS_DIR_SEPARATOR(c) ((c) == G_DIR_SEPARATOR || (c) == '/')
|
|
#define G_SEARCHPATH_SEPARATOR ';'
|
|
#define G_SEARCHPATH_SEPARATOR_S ";"
|
|
|
|
#else /* !G_OS_WIN32 */
|
|
|
|
#define G_DIR_SEPARATOR '/'
|
|
#define G_DIR_SEPARATOR_S "/"
|
|
#define G_IS_DIR_SEPARATOR(c) ((c) == G_DIR_SEPARATOR)
|
|
#define G_SEARCHPATH_SEPARATOR ':'
|
|
#define G_SEARCHPATH_SEPARATOR_S ":"
|
|
|
|
#endif /* !G_OS_WIN32 */
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_path_is_absolute (const gchar *file_name);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar *g_path_skip_root (const gchar *file_name);
|
|
|
|
GLIB_DEPRECATED_FOR(g_path_get_basename)
|
|
const gchar *g_basename (const gchar *file_name);
|
|
#ifndef G_DISABLE_DEPRECATED
|
|
#define g_dirname g_path_get_dirname
|
|
#endif
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_get_current_dir (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_path_get_basename (const gchar *file_name) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_path_get_dirname (const gchar *file_name) G_GNUC_MALLOC;
|
|
|
|
#ifndef __GTK_DOC_IGNORE__
|
|
#ifdef G_OS_WIN32
|
|
#define g_file_test g_file_test_utf8
|
|
#define g_file_get_contents g_file_get_contents_utf8
|
|
#define g_mkstemp g_mkstemp_utf8
|
|
#define g_file_open_tmp g_file_open_tmp_utf8
|
|
#define g_get_current_dir g_get_current_dir_utf8
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_file_test_utf8 (const gchar *filename,
|
|
GFileTest test);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_file_get_contents_utf8 (const gchar *filename,
|
|
gchar **contents,
|
|
gsize *length,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_mkstemp_utf8 (gchar *tmpl);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_file_open_tmp_utf8 (const gchar *tmpl,
|
|
gchar **name_used,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_get_current_dir_utf8 (void);
|
|
#endif /* G_OS_WIN32 */
|
|
#endif /* __GTK_DOC_IGNORE__ */
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_FILEUTILS_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_GETTEXT_H__
|
|
#define __G_GETTEXT_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar *g_strip_context (const gchar *msgid,
|
|
const gchar *msgval) G_GNUC_FORMAT(1);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar *g_dgettext (const gchar *domain,
|
|
const gchar *msgid) G_GNUC_FORMAT(2);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar *g_dcgettext (const gchar *domain,
|
|
const gchar *msgid,
|
|
gint category) G_GNUC_FORMAT(2);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar *g_dngettext (const gchar *domain,
|
|
const gchar *msgid,
|
|
const gchar *msgid_plural,
|
|
gulong n) G_GNUC_FORMAT(3);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar *g_dpgettext (const gchar *domain,
|
|
const gchar *msgctxtid,
|
|
gsize msgidoffset) G_GNUC_FORMAT(2);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar *g_dpgettext2 (const gchar *domain,
|
|
const gchar *context,
|
|
const gchar *msgid) G_GNUC_FORMAT(3);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_GETTEXT_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_HASH_H__
|
|
#define __G_HASH_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
/* 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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_LIST_H__
|
|
#define __G_LIST_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
/* 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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_MEM_H__
|
|
#define __G_MEM_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/**
|
|
* GMemVTable:
|
|
* @malloc: function to use for allocating memory.
|
|
* @realloc: function to use for reallocating memory.
|
|
* @free: function to use to free memory.
|
|
* @calloc: function to use for allocating zero-filled memory.
|
|
* @try_malloc: function to use for allocating memory without a default error handler.
|
|
* @try_realloc: function to use for reallocating memory without a default error handler.
|
|
*
|
|
* A set of functions used to perform memory allocation. The same #GMemVTable must
|
|
* be used for all allocations in the same program; a call to g_mem_set_vtable(),
|
|
* if it exists, should be prior to any use of GLib.
|
|
*/
|
|
typedef struct _GMemVTable GMemVTable;
|
|
|
|
|
|
#if GLIB_SIZEOF_VOID_P > GLIB_SIZEOF_LONG
|
|
/**
|
|
* G_MEM_ALIGN:
|
|
*
|
|
* Indicates the number of bytes to which memory will be aligned on the
|
|
* current platform.
|
|
*/
|
|
# define G_MEM_ALIGN GLIB_SIZEOF_VOID_P
|
|
#else /* GLIB_SIZEOF_VOID_P <= GLIB_SIZEOF_LONG */
|
|
# define G_MEM_ALIGN GLIB_SIZEOF_LONG
|
|
#endif /* GLIB_SIZEOF_VOID_P <= GLIB_SIZEOF_LONG */
|
|
|
|
|
|
/* Memory allocation functions
|
|
*/
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_free (gpointer mem);
|
|
|
|
GLIB_AVAILABLE_IN_2_34
|
|
void g_clear_pointer (gpointer *pp,
|
|
GDestroyNotify destroy);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_malloc (gsize n_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_malloc0 (gsize n_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_realloc (gpointer mem,
|
|
gsize n_bytes) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_try_malloc (gsize n_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_try_malloc0 (gsize n_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_try_realloc (gpointer mem,
|
|
gsize n_bytes) G_GNUC_WARN_UNUSED_RESULT;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_malloc_n (gsize n_blocks,
|
|
gsize n_block_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE2(1,2);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_malloc0_n (gsize n_blocks,
|
|
gsize n_block_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE2(1,2);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_realloc_n (gpointer mem,
|
|
gsize n_blocks,
|
|
gsize n_block_bytes) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_try_malloc_n (gsize n_blocks,
|
|
gsize n_block_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE2(1,2);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_try_malloc0_n (gsize n_blocks,
|
|
gsize n_block_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE2(1,2);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_try_realloc_n (gpointer mem,
|
|
gsize n_blocks,
|
|
gsize n_block_bytes) G_GNUC_WARN_UNUSED_RESULT;
|
|
|
|
#define g_clear_pointer(pp, destroy) \
|
|
G_STMT_START { \
|
|
G_STATIC_ASSERT (sizeof *(pp) == sizeof (gpointer)); \
|
|
/* Only one access, please */ \
|
|
gpointer *_pp = (gpointer *) (pp); \
|
|
gpointer _p; \
|
|
/* This assignment is needed to avoid a gcc warning */ \
|
|
GDestroyNotify _destroy = (GDestroyNotify) (destroy); \
|
|
\
|
|
_p = *_pp; \
|
|
if (_p) \
|
|
{ \
|
|
*_pp = NULL; \
|
|
_destroy (_p); \
|
|
} \
|
|
} G_STMT_END
|
|
|
|
/**
|
|
* g_steal_pointer:
|
|
* @pp: (not nullable): a pointer to a pointer
|
|
*
|
|
* Sets @pp to %NULL, returning the value that was there before.
|
|
*
|
|
* Conceptually, this transfers the ownership of the pointer from the
|
|
* referenced variable to the "caller" of the macro (ie: "steals" the
|
|
* reference).
|
|
*
|
|
* The return value will be properly typed, according to the type of
|
|
* @pp.
|
|
*
|
|
* This can be very useful when combined with g_autoptr() to prevent the
|
|
* return value of a function from being automatically freed. Consider
|
|
* the following example (which only works on GCC and clang):
|
|
*
|
|
* |[
|
|
* GObject *
|
|
* create_object (void)
|
|
* {
|
|
* g_autoptr(GObject) obj = lg_object_new (G_TYPE_OBJECT, NULL);
|
|
*
|
|
* if (early_error_case)
|
|
* return NULL;
|
|
*
|
|
* return g_steal_pointer (&obj);
|
|
* }
|
|
* ]|
|
|
*
|
|
* It can also be used in similar ways for 'out' parameters and is
|
|
* particularly useful for dealing with optional out parameters:
|
|
*
|
|
* |[
|
|
* gboolean
|
|
* get_object (GObject **obj_out)
|
|
* {
|
|
* g_autoptr(GObject) obj = lg_object_new (G_TYPE_OBJECT, NULL);
|
|
*
|
|
* if (early_error_case)
|
|
* return FALSE;
|
|
*
|
|
* if (obj_out)
|
|
* *obj_out = g_steal_pointer (&obj);
|
|
*
|
|
* return TRUE;
|
|
* }
|
|
* ]|
|
|
*
|
|
* In the above example, the object will be automatically freed in the
|
|
* early error case and also in the case that %NULL was given for
|
|
* @obj_out.
|
|
*
|
|
* Since: 2.44
|
|
*/
|
|
static inline gpointer
|
|
g_steal_pointer (gpointer pp)
|
|
{
|
|
gpointer *ptr = (gpointer *) pp;
|
|
gpointer ref;
|
|
|
|
ref = *ptr;
|
|
*ptr = NULL;
|
|
|
|
return ref;
|
|
}
|
|
|
|
/* type safety */
|
|
#define g_steal_pointer(pp) \
|
|
(0 ? (*(pp)) : (g_steal_pointer) (pp))
|
|
|
|
/* Optimise: avoid the call to the (slower) _n function if we can
|
|
* determine at compile-time that no overflow happens.
|
|
*/
|
|
#if defined (__GNUC__) && (__GNUC__ >= 2) && defined (__OPTIMIZE__)
|
|
# define _G_NEW(struct_type, n_structs, func) \
|
|
(struct_type *) (lG_GNUC_EXTENSION ({ \
|
|
gsize __n = (gsize) (n_structs); \
|
|
gsize __s = sizeof (struct_type); \
|
|
gpointer __p; \
|
|
if (__s == 1) \
|
|
__p = g_##func (__n); \
|
|
else if (__builtin_constant_p (__n) && \
|
|
(__s == 0 || __n <= G_MAXSIZE / __s)) \
|
|
__p = g_##func (__n * __s); \
|
|
else \
|
|
__p = g_##func##_n (__n, __s); \
|
|
__p; \
|
|
}))
|
|
# define _G_RENEW(struct_type, mem, n_structs, func) \
|
|
(struct_type *) (lG_GNUC_EXTENSION ({ \
|
|
gsize __n = (gsize) (n_structs); \
|
|
gsize __s = sizeof (struct_type); \
|
|
gpointer __p = (gpointer) (mem); \
|
|
if (__s == 1) \
|
|
__p = g_##func (__p, __n); \
|
|
else if (__builtin_constant_p (__n) && \
|
|
(__s == 0 || __n <= G_MAXSIZE / __s)) \
|
|
__p = g_##func (__p, __n * __s); \
|
|
else \
|
|
__p = g_##func##_n (__p, __n, __s); \
|
|
__p; \
|
|
}))
|
|
|
|
#else
|
|
|
|
/* Unoptimised version: always call the _n() function. */
|
|
|
|
#define _G_NEW(struct_type, n_structs, func) \
|
|
((struct_type *) g_##func##_n ((n_structs), sizeof (struct_type)))
|
|
#define _G_RENEW(struct_type, mem, n_structs, func) \
|
|
((struct_type *) g_##func##_n (mem, (n_structs), sizeof (struct_type)))
|
|
|
|
#endif
|
|
|
|
/**
|
|
* g_new:
|
|
* @struct_type: the type of the elements to allocate
|
|
* @n_structs: the number of elements to allocate
|
|
*
|
|
* Allocates @n_structs elements of type @struct_type.
|
|
* The returned pointer is cast to a pointer to the given type.
|
|
* If @n_structs is 0 it returns %NULL.
|
|
* Care is taken to avoid overflow when calculating the size of the allocated block.
|
|
*
|
|
* Since the returned pointer is already casted to the right type,
|
|
* it is normally unnecessary to cast it explicitly, and doing
|
|
* so might hide memory allocation errors.
|
|
*
|
|
* Returns: a pointer to the allocated memory, cast to a pointer to @struct_type
|
|
*/
|
|
#define g_new(struct_type, n_structs) _G_NEW (struct_type, n_structs, malloc)
|
|
/**
|
|
* g_new0:
|
|
* @struct_type: the type of the elements to allocate.
|
|
* @n_structs: the number of elements to allocate.
|
|
*
|
|
* Allocates @n_structs elements of type @struct_type, initialized to 0's.
|
|
* The returned pointer is cast to a pointer to the given type.
|
|
* If @n_structs is 0 it returns %NULL.
|
|
* Care is taken to avoid overflow when calculating the size of the allocated block.
|
|
*
|
|
* Since the returned pointer is already casted to the right type,
|
|
* it is normally unnecessary to cast it explicitly, and doing
|
|
* so might hide memory allocation errors.
|
|
*
|
|
* Returns: a pointer to the allocated memory, cast to a pointer to @struct_type.
|
|
*/
|
|
#define g_new0(struct_type, n_structs) _G_NEW (struct_type, n_structs, malloc0)
|
|
/**
|
|
* g_renew:
|
|
* @struct_type: the type of the elements to allocate
|
|
* @mem: the currently allocated memory
|
|
* @n_structs: the number of elements to allocate
|
|
*
|
|
* Reallocates the memory pointed to by @mem, so that it now has space for
|
|
* @n_structs elements of type @struct_type. It returns the new address of
|
|
* the memory, which may have been moved.
|
|
* Care is taken to avoid overflow when calculating the size of the allocated block.
|
|
*
|
|
* Returns: a pointer to the new allocated memory, cast to a pointer to @struct_type
|
|
*/
|
|
#define g_renew(struct_type, mem, n_structs) _G_RENEW (struct_type, mem, n_structs, realloc)
|
|
/**
|
|
* g_try_new:
|
|
* @struct_type: the type of the elements to allocate
|
|
* @n_structs: the number of elements to allocate
|
|
*
|
|
* Attempts to allocate @n_structs elements of type @struct_type, and returns
|
|
* %NULL on failure. Contrast with g_new(), which aborts the program on failure.
|
|
* The returned pointer is cast to a pointer to the given type.
|
|
* The function returns %NULL when @n_structs is 0 of if an overflow occurs.
|
|
*
|
|
* Since: 2.8
|
|
* Returns: a pointer to the allocated memory, cast to a pointer to @struct_type
|
|
*/
|
|
#define g_try_new(struct_type, n_structs) _G_NEW (struct_type, n_structs, try_malloc)
|
|
/**
|
|
* g_try_new0:
|
|
* @struct_type: the type of the elements to allocate
|
|
* @n_structs: the number of elements to allocate
|
|
*
|
|
* Attempts to allocate @n_structs elements of type @struct_type, initialized
|
|
* to 0's, and returns %NULL on failure. Contrast with g_new0(), which aborts
|
|
* the program on failure.
|
|
* The returned pointer is cast to a pointer to the given type.
|
|
* The function returns %NULL when @n_structs is 0 or if an overflow occurs.
|
|
*
|
|
* Since: 2.8
|
|
* Returns: a pointer to the allocated memory, cast to a pointer to @struct_type
|
|
*/
|
|
#define g_try_new0(struct_type, n_structs) _G_NEW (struct_type, n_structs, try_malloc0)
|
|
/**
|
|
* g_try_renew:
|
|
* @struct_type: the type of the elements to allocate
|
|
* @mem: the currently allocated memory
|
|
* @n_structs: the number of elements to allocate
|
|
*
|
|
* Attempts to reallocate the memory pointed to by @mem, so that it now has
|
|
* space for @n_structs elements of type @struct_type, and returns %NULL on
|
|
* failure. Contrast with g_renew(), which aborts the program on failure.
|
|
* It returns the new address of the memory, which may have been moved.
|
|
* The function returns %NULL if an overflow occurs.
|
|
*
|
|
* Since: 2.8
|
|
* Returns: a pointer to the new allocated memory, cast to a pointer to @struct_type
|
|
*/
|
|
#define g_try_renew(struct_type, mem, n_structs) _G_RENEW (struct_type, mem, n_structs, try_realloc)
|
|
|
|
|
|
/* Memory allocation virtualization for debugging purposes
|
|
* g_mem_set_vtable() has to be the very first GLib function called
|
|
* if being used
|
|
*/
|
|
struct _GMemVTable {
|
|
gpointer (*malloc) (gsize n_bytes);
|
|
gpointer (*realloc) (gpointer mem,
|
|
gsize n_bytes);
|
|
void (*free) (gpointer mem);
|
|
/* optional; set to NULL if not used ! */
|
|
gpointer (*calloc) (gsize n_blocks,
|
|
gsize n_block_bytes);
|
|
gpointer (*try_malloc) (gsize n_bytes);
|
|
gpointer (*try_realloc) (gpointer mem,
|
|
gsize n_bytes);
|
|
};
|
|
GLIB_VAR GMemVTable *glib_mem_table;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_mem_set_vtable (GMemVTable *vtable);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_mem_is_system_malloc (void);
|
|
|
|
GLIB_VAR gboolean g_mem_gc_friendly;
|
|
|
|
/* Memory profiler and checker, has to be enabled via g_mem_set_vtable()
|
|
*/
|
|
GLIB_VAR GMemVTable *glib_mem_profiler_table;
|
|
GLIB_DEPRECATED_IN_2_46
|
|
void g_mem_profile (void);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_MEM_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_NODE_H__
|
|
#define __G_NODE_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GNode GNode;
|
|
|
|
/* Tree traverse flags */
|
|
typedef enum
|
|
{
|
|
G_TRAVERSE_LEAVES = 1 << 0,
|
|
G_TRAVERSE_NON_LEAVES = 1 << 1,
|
|
G_TRAVERSE_ALL = G_TRAVERSE_LEAVES | G_TRAVERSE_NON_LEAVES,
|
|
G_TRAVERSE_MASK = 0x03,
|
|
G_TRAVERSE_LEAFS = G_TRAVERSE_LEAVES,
|
|
G_TRAVERSE_NON_LEAFS = G_TRAVERSE_NON_LEAVES
|
|
} GTraverseFlags;
|
|
|
|
/* Tree traverse orders */
|
|
typedef enum
|
|
{
|
|
G_IN_ORDER,
|
|
G_PRE_ORDER,
|
|
G_POST_ORDER,
|
|
G_LEVEL_ORDER
|
|
} GTraverseType;
|
|
|
|
typedef gboolean (*GNodeTraverseFunc) (GNode *node,
|
|
gpointer data);
|
|
typedef void (*GNodeForeachFunc) (GNode *node,
|
|
gpointer data);
|
|
|
|
/**
|
|
* GCopyFunc:
|
|
* @src: (not nullable): A pointer to the data which should be copied
|
|
* @data: Additional data
|
|
*
|
|
* A function of this signature is used to copy the node data
|
|
* when doing a deep-copy of a tree.
|
|
*
|
|
* Returns: (not nullable): A pointer to the copy
|
|
*
|
|
* Since: 2.4
|
|
*/
|
|
typedef gpointer (*GCopyFunc) (gconstpointer src,
|
|
gpointer data);
|
|
|
|
/* N-way tree implementation
|
|
*/
|
|
struct _GNode
|
|
{
|
|
gpointer data;
|
|
GNode *next;
|
|
GNode *prev;
|
|
GNode *parent;
|
|
GNode *children;
|
|
};
|
|
|
|
/**
|
|
* G_NODE_IS_ROOT:
|
|
* @node: a #GNode
|
|
*
|
|
* Returns %TRUE if a #GNode is the root of a tree.
|
|
*
|
|
* Returns: %TRUE if the #GNode is the root of a tree
|
|
* (i.e. it has no parent or siblings)
|
|
*/
|
|
#define G_NODE_IS_ROOT(node) (((GNode*) (node))->parent == NULL && \
|
|
((GNode*) (node))->prev == NULL && \
|
|
((GNode*) (node))->next == NULL)
|
|
|
|
/**
|
|
* G_NODE_IS_LEAF:
|
|
* @node: a #GNode
|
|
*
|
|
* Returns %TRUE if a #GNode is a leaf node.
|
|
*
|
|
* Returns: %TRUE if the #GNode is a leaf node
|
|
* (i.e. it has no children)
|
|
*/
|
|
#define G_NODE_IS_LEAF(node) (((GNode*) (node))->children == NULL)
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GNode* g_node_new (gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_node_destroy (GNode *root);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_node_unlink (GNode *node);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GNode* g_node_copy_deep (GNode *node,
|
|
GCopyFunc copy_func,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GNode* g_node_copy (GNode *node);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GNode* g_node_insert (GNode *parent,
|
|
gint position,
|
|
GNode *node);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GNode* g_node_insert_before (GNode *parent,
|
|
GNode *sibling,
|
|
GNode *node);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GNode* g_node_insert_after (GNode *parent,
|
|
GNode *sibling,
|
|
GNode *node);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GNode* g_node_prepend (GNode *parent,
|
|
GNode *node);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_node_n_nodes (GNode *root,
|
|
GTraverseFlags flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GNode* g_node_get_root (GNode *node);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_node_is_ancestor (GNode *node,
|
|
GNode *descendant);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_node_depth (GNode *node);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GNode* g_node_find (GNode *root,
|
|
GTraverseType order,
|
|
GTraverseFlags flags,
|
|
gpointer data);
|
|
|
|
/* convenience macros */
|
|
/**
|
|
* g_node_append:
|
|
* @parent: the #GNode to place the new #GNode under
|
|
* @node: the #GNode to insert
|
|
*
|
|
* Inserts a #GNode as the last child of the given parent.
|
|
*
|
|
* Returns: the inserted #GNode
|
|
*/
|
|
#define g_node_append(parent, node) \
|
|
g_node_insert_before ((parent), NULL, (node))
|
|
|
|
/**
|
|
* g_node_insert_data:
|
|
* @parent: the #GNode to place the new #GNode under
|
|
* @position: the position to place the new #GNode at. If position is -1,
|
|
* the new #GNode is inserted as the last child of @parent
|
|
* @data: the data for the new #GNode
|
|
*
|
|
* Inserts a new #GNode at the given position.
|
|
*
|
|
* Returns: the new #GNode
|
|
*/
|
|
#define g_node_insert_data(parent, position, data) \
|
|
g_node_insert ((parent), (position), g_node_new (data))
|
|
|
|
/**
|
|
* g_node_insert_data_after:
|
|
* @parent: the #GNode to place the new #GNode under
|
|
* @sibling: the sibling #GNode to place the new #GNode after
|
|
* @data: the data for the new #GNode
|
|
*
|
|
* Inserts a new #GNode after the given sibling.
|
|
*
|
|
* Returns: the new #GNode
|
|
*/
|
|
|
|
#define g_node_insert_data_after(parent, sibling, data) \
|
|
g_node_insert_after ((parent), (sibling), g_node_new (data))
|
|
/**
|
|
* g_node_insert_data_before:
|
|
* @parent: the #GNode to place the new #GNode under
|
|
* @sibling: the sibling #GNode to place the new #GNode before
|
|
* @data: the data for the new #GNode
|
|
*
|
|
* Inserts a new #GNode before the given sibling.
|
|
*
|
|
* Returns: the new #GNode
|
|
*/
|
|
#define g_node_insert_data_before(parent, sibling, data) \
|
|
g_node_insert_before ((parent), (sibling), g_node_new (data))
|
|
|
|
/**
|
|
* g_node_prepend_data:
|
|
* @parent: the #GNode to place the new #GNode under
|
|
* @data: the data for the new #GNode
|
|
*
|
|
* Inserts a new #GNode as the first child of the given parent.
|
|
*
|
|
* Returns: the new #GNode
|
|
*/
|
|
#define g_node_prepend_data(parent, data) \
|
|
g_node_prepend ((parent), g_node_new (data))
|
|
|
|
/**
|
|
* g_node_append_data:
|
|
* @parent: the #GNode to place the new #GNode under
|
|
* @data: the data for the new #GNode
|
|
*
|
|
* Inserts a new #GNode as the last child of the given parent.
|
|
*
|
|
* Returns: the new #GNode
|
|
*/
|
|
#define g_node_append_data(parent, data) \
|
|
g_node_insert_before ((parent), NULL, g_node_new (data))
|
|
|
|
/* traversal function, assumes that 'node' is root
|
|
* (only traverses 'node' and its subtree).
|
|
* this function is just a high level interface to
|
|
* low level traversal functions, optimized for speed.
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_node_traverse (GNode *root,
|
|
GTraverseType order,
|
|
GTraverseFlags flags,
|
|
gint max_depth,
|
|
GNodeTraverseFunc func,
|
|
gpointer data);
|
|
|
|
/* return the maximum tree height starting with 'node', this is an expensive
|
|
* operation, since we need to visit all nodes. this could be shortened by
|
|
* adding 'guint height' to struct _GNode, but then again, this is not very
|
|
* often needed, and would make g_node_insert() more time consuming.
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_node_max_height (GNode *root);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_node_children_foreach (GNode *node,
|
|
GTraverseFlags flags,
|
|
GNodeForeachFunc func,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_node_reverse_children (GNode *node);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_node_n_children (GNode *node);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GNode* g_node_nth_child (GNode *node,
|
|
guint n);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GNode* g_node_last_child (GNode *node);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GNode* g_node_find_child (GNode *node,
|
|
GTraverseFlags flags,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_node_child_position (GNode *node,
|
|
GNode *child);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_node_child_index (GNode *node,
|
|
gpointer data);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GNode* g_node_first_sibling (GNode *node);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GNode* g_node_last_sibling (GNode *node);
|
|
|
|
/**
|
|
* g_node_prev_sibling:
|
|
* @node: a #GNode
|
|
*
|
|
* Gets the previous sibling of a #GNode.
|
|
*
|
|
* Returns: the previous sibling of @node, or %NULL if @node is the first
|
|
* node or %NULL
|
|
*/
|
|
#define g_node_prev_sibling(node) ((node) ? \
|
|
((GNode*) (node))->prev : NULL)
|
|
|
|
/**
|
|
* g_node_next_sibling:
|
|
* @node: a #GNode
|
|
*
|
|
* Gets the next sibling of a #GNode.
|
|
*
|
|
* Returns: the next sibling of @node, or %NULL if @node is the last node
|
|
* or %NULL
|
|
*/
|
|
#define g_node_next_sibling(node) ((node) ? \
|
|
((GNode*) (node))->next : NULL)
|
|
|
|
/**
|
|
* g_node_first_child:
|
|
* @node: a #GNode
|
|
*
|
|
* Gets the first child of a #GNode.
|
|
*
|
|
* Returns: the first child of @node, or %NULL if @node is %NULL
|
|
* or has no children
|
|
*/
|
|
#define g_node_first_child(node) ((node) ? \
|
|
((GNode*) (node))->children : NULL)
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_NODE_H__ */
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GList GList;
|
|
|
|
struct _GList
|
|
{
|
|
gpointer data;
|
|
GList *next;
|
|
GList *prev;
|
|
};
|
|
|
|
/* Doubly linked lists
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_list_alloc (void) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_list_free (GList *list);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_list_free_1 (GList *list);
|
|
#define g_list_free1 g_list_free_1
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_list_free_full (GList *list,
|
|
GDestroyNotify free_func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_list_append (GList *list,
|
|
gpointer data) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_list_prepend (GList *list,
|
|
gpointer data) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_list_insert (GList *list,
|
|
gpointer data,
|
|
gint position) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_list_insert_sorted (GList *list,
|
|
gpointer data,
|
|
GCompareFunc func) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_list_insert_sorted_with_data (GList *list,
|
|
gpointer data,
|
|
GCompareDataFunc func,
|
|
gpointer user_data) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_list_insert_before (GList *list,
|
|
GList *sibling,
|
|
gpointer data) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_list_concat (GList *list1,
|
|
GList *list2) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_list_remove (GList *list,
|
|
gconstpointer data) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_list_remove_all (GList *list,
|
|
gconstpointer data) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_list_remove_link (GList *list,
|
|
GList *llink) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_list_delete_link (GList *list,
|
|
GList *link_) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_list_reverse (GList *list) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_list_copy (GList *list) G_GNUC_WARN_UNUSED_RESULT;
|
|
|
|
GLIB_AVAILABLE_IN_2_34
|
|
GList* g_list_copy_deep (GList *list,
|
|
GCopyFunc func,
|
|
gpointer user_data) G_GNUC_WARN_UNUSED_RESULT;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_list_nth (GList *list,
|
|
guint n);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_list_nth_prev (GList *list,
|
|
guint n);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_list_find (GList *list,
|
|
gconstpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_list_find_custom (GList *list,
|
|
gconstpointer data,
|
|
GCompareFunc func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_list_position (GList *list,
|
|
GList *llink);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_list_index (GList *list,
|
|
gconstpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_list_last (GList *list);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_list_first (GList *list);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_list_length (GList *list);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_list_foreach (GList *list,
|
|
GFunc func,
|
|
gpointer user_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_list_sort (GList *list,
|
|
GCompareFunc compare_func) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_list_sort_with_data (GList *list,
|
|
GCompareDataFunc compare_func,
|
|
gpointer user_data) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_list_nth_data (GList *list,
|
|
guint n);
|
|
|
|
|
|
#define g_list_previous(list) ((list) ? (((GList *)(list))->prev) : NULL)
|
|
#define g_list_next(list) ((list) ? (((GList *)(list))->next) : NULL)
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_LIST_H__ */
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GHashTable GHashTable;
|
|
|
|
typedef gboolean (*GHRFunc) (gpointer key,
|
|
gpointer value,
|
|
gpointer user_data);
|
|
|
|
typedef struct _GHashTableIter GHashTableIter;
|
|
|
|
struct _GHashTableIter
|
|
{
|
|
/*< private >*/
|
|
gpointer dummy1;
|
|
gpointer dummy2;
|
|
gpointer dummy3;
|
|
int dummy4;
|
|
gboolean dummy5;
|
|
gpointer dummy6;
|
|
};
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GHashTable* g_hash_table_new (GHashFunc hash_func,
|
|
GEqualFunc key_equal_func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GHashTable* g_hash_table_new_full (GHashFunc hash_func,
|
|
GEqualFunc key_equal_func,
|
|
GDestroyNotify key_destroy_func,
|
|
GDestroyNotify value_destroy_func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_hash_table_destroy (GHashTable *hash_table);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_hash_table_insert (GHashTable *hash_table,
|
|
gpointer key,
|
|
gpointer value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_hash_table_replace (GHashTable *hash_table,
|
|
gpointer key,
|
|
gpointer value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_hash_table_add (GHashTable *hash_table,
|
|
gpointer key);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_hash_table_remove (GHashTable *hash_table,
|
|
gconstpointer key);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_hash_table_remove_all (GHashTable *hash_table);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_hash_table_steal (GHashTable *hash_table,
|
|
gconstpointer key);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_hash_table_steal_all (GHashTable *hash_table);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_hash_table_lookup (GHashTable *hash_table,
|
|
gconstpointer key);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_hash_table_contains (GHashTable *hash_table,
|
|
gconstpointer key);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_hash_table_lookup_extended (GHashTable *hash_table,
|
|
gconstpointer lookup_key,
|
|
gpointer *orig_key,
|
|
gpointer *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_hash_table_foreach (GHashTable *hash_table,
|
|
GHFunc func,
|
|
gpointer user_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_hash_table_find (GHashTable *hash_table,
|
|
GHRFunc predicate,
|
|
gpointer user_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_hash_table_foreach_remove (GHashTable *hash_table,
|
|
GHRFunc func,
|
|
gpointer user_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_hash_table_foreach_steal (GHashTable *hash_table,
|
|
GHRFunc func,
|
|
gpointer user_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_hash_table_size (GHashTable *hash_table);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList * g_hash_table_get_keys (GHashTable *hash_table);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList * g_hash_table_get_values (GHashTable *hash_table);
|
|
GLIB_AVAILABLE_IN_2_40
|
|
gpointer * g_hash_table_get_keys_as_array (GHashTable *hash_table,
|
|
guint *length);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_hash_table_iter_init (GHashTableIter *iter,
|
|
GHashTable *hash_table);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_hash_table_iter_next (GHashTableIter *iter,
|
|
gpointer *key,
|
|
gpointer *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GHashTable* g_hash_table_iter_get_hash_table (GHashTableIter *iter);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_hash_table_iter_remove (GHashTableIter *iter);
|
|
GLIB_AVAILABLE_IN_2_30
|
|
void g_hash_table_iter_replace (GHashTableIter *iter,
|
|
gpointer value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_hash_table_iter_steal (GHashTableIter *iter);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GHashTable* g_hash_table_ref (GHashTable *hash_table);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_hash_table_unref (GHashTable *hash_table);
|
|
|
|
#ifndef G_DISABLE_DEPRECATED
|
|
#define g_hash_table_freeze(hash_table) ((void)0)
|
|
#define g_hash_table_thaw(hash_table) ((void)0)
|
|
#endif
|
|
|
|
/* Hash Functions
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_str_equal (gconstpointer v1,
|
|
gconstpointer v2);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_str_hash (gconstpointer v);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_int_equal (gconstpointer v1,
|
|
gconstpointer v2);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_int_hash (gconstpointer v);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_int64_equal (gconstpointer v1,
|
|
gconstpointer v2);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_int64_hash (gconstpointer v);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_double_equal (gconstpointer v1,
|
|
gconstpointer v2);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_double_hash (gconstpointer v);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_direct_hash (gconstpointer v) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_direct_equal (gconstpointer v1,
|
|
gconstpointer v2) G_GNUC_CONST;
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_HASH_H__ */
|
|
/* ghmac.h - secure data hashing
|
|
*
|
|
* Copyright (C) 2011 Stef Walter <stefw@collabora.co.uk>
|
|
*
|
|
* 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, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __G_HMAC_H__
|
|
#define __G_HMAC_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/**
|
|
* GHmac:
|
|
*
|
|
* An opaque structure representing a HMAC operation.
|
|
* To create a new GHmac, use g_hmac_new(). To free
|
|
* a GHmac, use g_hmac_unref().
|
|
*
|
|
* Since: 2.30
|
|
*/
|
|
typedef struct _GHmac GHmac;
|
|
|
|
GLIB_AVAILABLE_IN_2_30
|
|
GHmac * g_hmac_new (GChecksumType digest_type,
|
|
const guchar *key,
|
|
gsize key_len);
|
|
GLIB_AVAILABLE_IN_2_30
|
|
GHmac * g_hmac_copy (const GHmac *hmac);
|
|
GLIB_AVAILABLE_IN_2_30
|
|
GHmac * g_hmac_ref (GHmac *hmac);
|
|
GLIB_AVAILABLE_IN_2_30
|
|
void g_hmac_unref (GHmac *hmac);
|
|
GLIB_AVAILABLE_IN_2_30
|
|
void g_hmac_update (GHmac *hmac,
|
|
const guchar *data,
|
|
gssize length);
|
|
GLIB_AVAILABLE_IN_2_30
|
|
const gchar * g_hmac_get_string (GHmac *hmac);
|
|
GLIB_AVAILABLE_IN_2_30
|
|
void g_hmac_get_digest (GHmac *hmac,
|
|
guint8 *buffer,
|
|
gsize *digest_len);
|
|
|
|
GLIB_AVAILABLE_IN_2_30
|
|
gchar *g_compute_hmac_for_data (GChecksumType digest_type,
|
|
const guchar *key,
|
|
gsize key_len,
|
|
const guchar *data,
|
|
gsize length);
|
|
GLIB_AVAILABLE_IN_2_30
|
|
gchar *g_compute_hmac_for_string (GChecksumType digest_type,
|
|
const guchar *key,
|
|
gsize key_len,
|
|
const gchar *str,
|
|
gssize length);
|
|
GLIB_AVAILABLE_IN_2_50
|
|
gchar *g_compute_hmac_for_bytes (GChecksumType digest_type,
|
|
GBytes *key,
|
|
GBytes *data);
|
|
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_CHECKSUM_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_HOOK_H__
|
|
#define __G_HOOK_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
|
|
/* --- typedefs --- */
|
|
typedef struct _GHook GHook;
|
|
typedef struct _GHookList GHookList;
|
|
|
|
typedef gint (*GHookCompareFunc) (GHook *new_hook,
|
|
GHook *sibling);
|
|
typedef gboolean (*GHookFindFunc) (GHook *hook,
|
|
gpointer data);
|
|
typedef void (*GHookMarshaller) (GHook *hook,
|
|
gpointer marshal_data);
|
|
typedef gboolean (*GHookCheckMarshaller) (GHook *hook,
|
|
gpointer marshal_data);
|
|
typedef void (*GHookFunc) (gpointer data);
|
|
typedef gboolean (*GHookCheckFunc) (gpointer data);
|
|
typedef void (*GHookFinalizeFunc) (GHookList *hook_list,
|
|
GHook *hook);
|
|
typedef enum
|
|
{
|
|
G_HOOK_FLAG_ACTIVE = 1 << 0,
|
|
G_HOOK_FLAG_IN_CALL = 1 << 1,
|
|
G_HOOK_FLAG_MASK = 0x0f
|
|
} GHookFlagMask;
|
|
#define G_HOOK_FLAG_USER_SHIFT (4)
|
|
|
|
|
|
/* --- structures --- */
|
|
struct _GHookList
|
|
{
|
|
gulong seq_id;
|
|
guint hook_size : 16;
|
|
guint is_setup : 1;
|
|
GHook *hooks;
|
|
gpointer dummy3;
|
|
GHookFinalizeFunc finalize_hook;
|
|
gpointer dummy[2];
|
|
};
|
|
struct _GHook
|
|
{
|
|
gpointer data;
|
|
GHook *next;
|
|
GHook *prev;
|
|
guint ref_count;
|
|
gulong hook_id;
|
|
guint flags;
|
|
gpointer func;
|
|
GDestroyNotify destroy;
|
|
};
|
|
|
|
|
|
/* --- macros --- */
|
|
#define G_HOOK(hook) ((GHook*) (hook))
|
|
#define G_HOOK_FLAGS(hook) (G_HOOK (hook)->flags)
|
|
#define G_HOOK_ACTIVE(hook) ((G_HOOK_FLAGS (hook) & \
|
|
G_HOOK_FLAG_ACTIVE) != 0)
|
|
#define G_HOOK_IN_CALL(hook) ((G_HOOK_FLAGS (hook) & \
|
|
G_HOOK_FLAG_IN_CALL) != 0)
|
|
#define G_HOOK_IS_VALID(hook) (G_HOOK (hook)->hook_id != 0 && \
|
|
(G_HOOK_FLAGS (hook) & \
|
|
G_HOOK_FLAG_ACTIVE))
|
|
#define G_HOOK_IS_UNLINKED(hook) (G_HOOK (hook)->next == NULL && \
|
|
G_HOOK (hook)->prev == NULL && \
|
|
G_HOOK (hook)->hook_id == 0 && \
|
|
G_HOOK (hook)->ref_count == 0)
|
|
|
|
|
|
/* --- prototypes --- */
|
|
/* callback maintenance functions */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_hook_list_init (GHookList *hook_list,
|
|
guint hook_size);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_hook_list_clear (GHookList *hook_list);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GHook* g_hook_alloc (GHookList *hook_list);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_hook_free (GHookList *hook_list,
|
|
GHook *hook);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GHook * g_hook_ref (GHookList *hook_list,
|
|
GHook *hook);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_hook_unref (GHookList *hook_list,
|
|
GHook *hook);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_hook_destroy (GHookList *hook_list,
|
|
gulong hook_id);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_hook_destroy_link (GHookList *hook_list,
|
|
GHook *hook);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_hook_prepend (GHookList *hook_list,
|
|
GHook *hook);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_hook_insert_before (GHookList *hook_list,
|
|
GHook *sibling,
|
|
GHook *hook);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_hook_insert_sorted (GHookList *hook_list,
|
|
GHook *hook,
|
|
GHookCompareFunc func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GHook* g_hook_get (GHookList *hook_list,
|
|
gulong hook_id);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GHook* g_hook_find (GHookList *hook_list,
|
|
gboolean need_valids,
|
|
GHookFindFunc func,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GHook* g_hook_find_data (GHookList *hook_list,
|
|
gboolean need_valids,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GHook* g_hook_find_func (GHookList *hook_list,
|
|
gboolean need_valids,
|
|
gpointer func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GHook* g_hook_find_func_data (GHookList *hook_list,
|
|
gboolean need_valids,
|
|
gpointer func,
|
|
gpointer data);
|
|
/* return the first valid hook, and increment its reference count */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GHook* g_hook_first_valid (GHookList *hook_list,
|
|
gboolean may_be_in_call);
|
|
/* return the next valid hook with incremented reference count, and
|
|
* decrement the reference count of the original hook
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GHook* g_hook_next_valid (GHookList *hook_list,
|
|
GHook *hook,
|
|
gboolean may_be_in_call);
|
|
/* GHookCompareFunc implementation to insert hooks sorted by their id */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_hook_compare_ids (GHook *new_hook,
|
|
GHook *sibling);
|
|
/* convenience macros */
|
|
#define g_hook_append( hook_list, hook ) \
|
|
g_hook_insert_before ((hook_list), NULL, (hook))
|
|
/* invoke all valid hooks with the (*GHookFunc) signature.
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_hook_list_invoke (GHookList *hook_list,
|
|
gboolean may_recurse);
|
|
/* invoke all valid hooks with the (*GHookCheckFunc) signature,
|
|
* and destroy the hook if FALSE is returned.
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_hook_list_invoke_check (GHookList *hook_list,
|
|
gboolean may_recurse);
|
|
/* invoke a marshaller on all valid hooks.
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_hook_list_marshal (GHookList *hook_list,
|
|
gboolean may_recurse,
|
|
GHookMarshaller marshaller,
|
|
gpointer marshal_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_hook_list_marshal_check (GHookList *hook_list,
|
|
gboolean may_recurse,
|
|
GHookCheckMarshaller marshaller,
|
|
gpointer marshal_data);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_HOOK_H__ */
|
|
/* GLIB - Library of useful routines for C programming
|
|
* Copyright (C) 2008 Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General
|
|
* Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __G_HOST_UTILS_H__
|
|
#define __G_HOST_UTILS_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_hostname_is_non_ascii (const gchar *hostname);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_hostname_is_ascii_encoded (const gchar *hostname);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_hostname_is_ip_address (const gchar *hostname);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_hostname_to_ascii (const gchar *hostname);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_hostname_to_unicode (const gchar *hostname);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_HOST_UTILS_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_IOCHANNEL_H__
|
|
#define __G_IOCHANNEL_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
/* gmain.h - the GLib Main loop
|
|
* Copyright (C) 1998-2000 Red Hat, Inc.
|
|
*
|
|
* 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, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __G_MAIN_H__
|
|
#define __G_MAIN_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
/* gpoll.h - poll(2) support
|
|
* Copyright (C) 2008 Red Hat, Inc.
|
|
*
|
|
* 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, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __G_POLL_H__
|
|
#define __G_POLL_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (__G_MAIN_H__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/* Any definitions using GPollFD or GPollFunc are primarily
|
|
* for Unix and not guaranteed to be the compatible on all
|
|
* operating systems on which GLib runs. Right now, the
|
|
* GLib does use these functions on Win32 as well, but interprets
|
|
* them in a fairly different way than on Unix. If you use
|
|
* these definitions, you are should be prepared to recode
|
|
* for different operating systems.
|
|
*
|
|
* Note that on systems with a working poll(2), that function is used
|
|
* in place of g_poll(). Thus g_poll() must have the same signature as
|
|
* poll(), meaning GPollFD must have the same layout as struct pollfd.
|
|
*
|
|
* On Win32, the fd in a GPollFD should be Win32 HANDLE (*not* a file
|
|
* descriptor as provided by the C runtime) that can be used by
|
|
* MsgWaitForMultipleObjects. This does *not* include file handles
|
|
* from CreateFile, SOCKETs, nor pipe handles. (But you can use
|
|
* WSAEventSelect to signal events when a SOCKET is readable).
|
|
*
|
|
* On Win32, fd can also be the special value G_WIN32_MSG_HANDLE to
|
|
* indicate polling for messages.
|
|
*
|
|
* But note that G_WIN32_MSG_HANDLE GPollFDs should not be used by GDK
|
|
* (GTK) programs, as GDK itself wants to read messages and convert them
|
|
* to GDK events.
|
|
*
|
|
* So, unless you really know what you are doing, it's best not to try
|
|
* to use the main loop polling stuff for your own needs on
|
|
* Windows.
|
|
*/
|
|
typedef struct _GPollFD GPollFD;
|
|
|
|
/**
|
|
* GPollFunc:
|
|
* @ufds: an array of #GPollFD elements
|
|
* @nfsd: the number of elements in @ufds
|
|
* @timeout_: the maximum time to wait for an event of the file descriptors.
|
|
* A negative value indicates an infinite timeout.
|
|
*
|
|
* Specifies the type of function passed to g_main_context_set_poll_func().
|
|
* The semantics of the function should match those of the poll() system call.
|
|
*
|
|
* Returns: the number of #GPollFD elements which have events or errors
|
|
* reported, or -1 if an error occurred.
|
|
*/
|
|
typedef gint (*GPollFunc) (GPollFD *ufds,
|
|
guint nfsd,
|
|
gint timeout_);
|
|
|
|
/**
|
|
* GPollFD:
|
|
* @fd: the file descriptor to poll (or a HANDLE on Win32)
|
|
* @events: a bitwise combination from #GIOCondition, specifying which
|
|
* events should be polled for. Typically for reading from a file
|
|
* descriptor you would use %G_IO_IN | %G_IO_HUP | %G_IO_ERR, and
|
|
* for writing you would use %G_IO_OUT | %G_IO_ERR.
|
|
* @revents: a bitwise combination of flags from #GIOCondition, returned
|
|
* from the poll() function to indicate which events occurred.
|
|
*
|
|
* Represents a file descriptor, which events to poll for, and which events
|
|
* occurred.
|
|
*/
|
|
struct _GPollFD
|
|
{
|
|
#if defined (G_OS_WIN32) && GLIB_SIZEOF_VOID_P == 8
|
|
#ifndef __GTK_DOC_IGNORE__
|
|
gint64 fd;
|
|
#endif
|
|
#else
|
|
gint fd;
|
|
#endif
|
|
gushort events;
|
|
gushort revents;
|
|
};
|
|
|
|
/**
|
|
* G_POLLFD_FORMAT:
|
|
*
|
|
* A format specifier that can be used in printf()-style format strings
|
|
* when printing the @fd member of a #GPollFD.
|
|
*/
|
|
/* defined in glibconfig.h */
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint
|
|
g_poll (GPollFD *fds,
|
|
guint nfds,
|
|
gint timeout);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_POLL_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_SLIST_H__
|
|
#define __G_SLIST_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GSList GSList;
|
|
|
|
struct _GSList
|
|
{
|
|
gpointer data;
|
|
GSList *next;
|
|
};
|
|
|
|
/* Singly linked lists
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSList* g_slist_alloc (void) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_slist_free (GSList *list);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_slist_free_1 (GSList *list);
|
|
#define g_slist_free1 g_slist_free_1
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_slist_free_full (GSList *list,
|
|
GDestroyNotify free_func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSList* g_slist_append (GSList *list,
|
|
gpointer data) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSList* g_slist_prepend (GSList *list,
|
|
gpointer data) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSList* g_slist_insert (GSList *list,
|
|
gpointer data,
|
|
gint position) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSList* g_slist_insert_sorted (GSList *list,
|
|
gpointer data,
|
|
GCompareFunc func) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSList* g_slist_insert_sorted_with_data (GSList *list,
|
|
gpointer data,
|
|
GCompareDataFunc func,
|
|
gpointer user_data) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSList* g_slist_insert_before (GSList *slist,
|
|
GSList *sibling,
|
|
gpointer data) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSList* g_slist_concat (GSList *list1,
|
|
GSList *list2) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSList* g_slist_remove (GSList *list,
|
|
gconstpointer data) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSList* g_slist_remove_all (GSList *list,
|
|
gconstpointer data) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSList* g_slist_remove_link (GSList *list,
|
|
GSList *link_) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSList* g_slist_delete_link (GSList *list,
|
|
GSList *link_) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSList* g_slist_reverse (GSList *list) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSList* g_slist_copy (GSList *list) G_GNUC_WARN_UNUSED_RESULT;
|
|
|
|
GLIB_AVAILABLE_IN_2_34
|
|
GSList* g_slist_copy_deep (GSList *list,
|
|
GCopyFunc func,
|
|
gpointer user_data) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSList* g_slist_nth (GSList *list,
|
|
guint n);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSList* g_slist_find (GSList *list,
|
|
gconstpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSList* g_slist_find_custom (GSList *list,
|
|
gconstpointer data,
|
|
GCompareFunc func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_slist_position (GSList *list,
|
|
GSList *llink);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_slist_index (GSList *list,
|
|
gconstpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSList* g_slist_last (GSList *list);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_slist_length (GSList *list);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_slist_foreach (GSList *list,
|
|
GFunc func,
|
|
gpointer user_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSList* g_slist_sort (GSList *list,
|
|
GCompareFunc compare_func) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSList* g_slist_sort_with_data (GSList *list,
|
|
GCompareDataFunc compare_func,
|
|
gpointer user_data) G_GNUC_WARN_UNUSED_RESULT;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_slist_nth_data (GSList *list,
|
|
guint n);
|
|
|
|
#define g_slist_next(slist) ((slist) ? (((GSList *)(slist))->next) : NULL)
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_SLIST_H__ */
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef enum /*< flags >*/
|
|
{
|
|
G_IO_IN GLIB_SYSDEF_POLLIN,
|
|
G_IO_OUT GLIB_SYSDEF_POLLOUT,
|
|
G_IO_PRI GLIB_SYSDEF_POLLPRI,
|
|
G_IO_ERR GLIB_SYSDEF_POLLERR,
|
|
G_IO_HUP GLIB_SYSDEF_POLLHUP,
|
|
G_IO_NVAL GLIB_SYSDEF_POLLNVAL
|
|
} GIOCondition;
|
|
|
|
|
|
/**
|
|
* GMainContext:
|
|
*
|
|
* The `GMainContext` struct is an opaque data
|
|
* type representing a set of sources to be handled in a main loop.
|
|
*/
|
|
typedef struct _GMainContext GMainContext;
|
|
|
|
/**
|
|
* GMainLoop:
|
|
*
|
|
* The `GMainLoop` struct is an opaque data type
|
|
* representing the main event loop of a GLib or GTK+ application.
|
|
*/
|
|
typedef struct _GMainLoop GMainLoop;
|
|
|
|
/**
|
|
* GSource:
|
|
*
|
|
* The `GSource` struct is an opaque data type
|
|
* representing an event source.
|
|
*/
|
|
typedef struct _GSource GSource;
|
|
typedef struct _GSourcePrivate GSourcePrivate;
|
|
|
|
/**
|
|
* GSourceCallbackFuncs:
|
|
* @ref: Called when a reference is added to the callback object
|
|
* @unref: Called when a reference to the callback object is dropped
|
|
* @get: Called to extract the callback function and data from the
|
|
* callback object.
|
|
|
|
* The `GSourceCallbackFuncs` struct contains
|
|
* functions for managing callback objects.
|
|
*/
|
|
typedef struct _GSourceCallbackFuncs GSourceCallbackFuncs;
|
|
|
|
/**
|
|
* GSourceFuncs:
|
|
* @prepare: Called before all the file descriptors are polled. If the
|
|
* source can determine that it is ready here (without waiting for the
|
|
* results of the poll() call) it should return %TRUE. It can also return
|
|
* a @timeout_ value which should be the maximum timeout (in milliseconds)
|
|
* which should be passed to the poll() call. The actual timeout used will
|
|
* be -1 if all sources returned -1, or it will be the minimum of all
|
|
* the @timeout_ values returned which were >= 0. Since 2.36 this may
|
|
* be %NULL, in which case the effect is as if the function always returns
|
|
* %FALSE with a timeout of -1. If @prepare returns a
|
|
* timeout and the source also has a 'ready time' set then the
|
|
* nearer of the two will be used.
|
|
* @check: Called after all the file descriptors are polled. The source
|
|
* should return %TRUE if it is ready to be dispatched. Note that some
|
|
* time may have passed since the previous prepare function was called,
|
|
* so the source should be checked again here. Since 2.36 this may
|
|
* be %NULL, in which case the effect is as if the function always returns
|
|
* %FALSE.
|
|
* @dispatch: Called to dispatch the event source, after it has returned
|
|
* %TRUE in either its @prepare or its @check function. The @dispatch
|
|
* function is passed in a callback function and data. The callback
|
|
* function may be %NULL if the source was never connected to a callback
|
|
* using g_source_set_callback(). The @dispatch function should call the
|
|
* callback function with @user_data and whatever additional parameters
|
|
* are needed for this type of event source. The return value of the
|
|
* @dispatch function should be #G_SOURCE_REMOVE if the source should be
|
|
* removed or #G_SOURCE_CONTINUE to keep it.
|
|
* @finalize: Called when the source is finalized.
|
|
*
|
|
* The `GSourceFuncs` struct contains a table of
|
|
* functions used to handle event sources in a generic manner.
|
|
*
|
|
* For idle sources, the prepare and check functions always return %TRUE
|
|
* to indicate that the source is always ready to be processed. The prepare
|
|
* function also returns a timeout value of 0 to ensure that the poll() call
|
|
* doesn't block (since that would be time wasted which could have been spent
|
|
* running the idle function).
|
|
*
|
|
* For timeout sources, the prepare and check functions both return %TRUE
|
|
* if the timeout interval has expired. The prepare function also returns
|
|
* a timeout value to ensure that the poll() call doesn't block too long
|
|
* and miss the next timeout.
|
|
*
|
|
* For file descriptor sources, the prepare function typically returns %FALSE,
|
|
* since it must wait until poll() has been called before it knows whether
|
|
* any events need to be processed. It sets the returned timeout to -1 to
|
|
* indicate that it doesn't mind how long the poll() call blocks. In the
|
|
* check function, it tests the results of the poll() call to see if the
|
|
* required condition has been met, and returns %TRUE if so.
|
|
*/
|
|
typedef struct _GSourceFuncs GSourceFuncs;
|
|
|
|
/**
|
|
* GPid:
|
|
*
|
|
* A type which is used to hold a process identification.
|
|
*
|
|
* On UNIX, processes are identified by a process id (an integer),
|
|
* while Windows uses process handles (which are pointers).
|
|
*
|
|
* GPid is used in GLib only for descendant processes spawned with
|
|
* the g_spawn functions.
|
|
*/
|
|
/* defined in glibconfig.h */
|
|
|
|
/**
|
|
* G_PID_FORMAT:
|
|
*
|
|
* A format specifier that can be used in printf()-style format strings
|
|
* when printing a #GPid.
|
|
*
|
|
* Since: 2.50
|
|
*/
|
|
/* defined in glibconfig.h */
|
|
|
|
/**
|
|
* GSourceFunc:
|
|
* @user_data: data passed to the function, set when the source was
|
|
* created with one of the above functions
|
|
*
|
|
* Specifies the type of function passed to g_timeout_add(),
|
|
* g_timeout_add_full(), g_idle_add(), and g_idle_add_full().
|
|
*
|
|
* Returns: %FALSE if the source should be removed. #G_SOURCE_CONTINUE and
|
|
* #G_SOURCE_REMOVE are more memorable names for the return value.
|
|
*/
|
|
typedef gboolean (*GSourceFunc) (gpointer user_data);
|
|
|
|
/**
|
|
* GChildWatchFunc:
|
|
* @pid: the process id of the child process
|
|
* @status: Status information about the child process, encoded
|
|
* in a platform-specific manner
|
|
* @user_data: user data passed to g_child_watch_add()
|
|
*
|
|
* Prototype of a #GChildWatchSource callback, called when a child
|
|
* process has exited. To interpret @status, see the documentation
|
|
* for g_spawn_check_exit_status().
|
|
*/
|
|
typedef void (*GChildWatchFunc) (GPid pid,
|
|
gint status,
|
|
gpointer user_data);
|
|
struct _GSource
|
|
{
|
|
/*< private >*/
|
|
gpointer callback_data;
|
|
GSourceCallbackFuncs *callback_funcs;
|
|
|
|
const GSourceFuncs *source_funcs;
|
|
guint ref_count;
|
|
|
|
GMainContext *context;
|
|
|
|
gint priority;
|
|
guint flags;
|
|
guint source_id;
|
|
|
|
GSList *poll_fds;
|
|
|
|
GSource *prev;
|
|
GSource *next;
|
|
|
|
char *name;
|
|
|
|
GSourcePrivate *priv;
|
|
};
|
|
|
|
struct _GSourceCallbackFuncs
|
|
{
|
|
void (*ref) (gpointer cb_data);
|
|
void (*unref) (gpointer cb_data);
|
|
void (*get) (gpointer cb_data,
|
|
GSource *source,
|
|
GSourceFunc *func,
|
|
gpointer *data);
|
|
};
|
|
|
|
/**
|
|
* GSourceDummyMarshal:
|
|
*
|
|
* This is just a placeholder for #GClosureMarshal,
|
|
* which cannot be used here for dependency reasons.
|
|
*/
|
|
typedef void (*GSourceDummyMarshal) (void);
|
|
|
|
struct _GSourceFuncs
|
|
{
|
|
gboolean (*prepare) (GSource *source,
|
|
gint *timeout_);
|
|
gboolean (*check) (GSource *source);
|
|
gboolean (*dispatch) (GSource *source,
|
|
GSourceFunc callback,
|
|
gpointer user_data);
|
|
void (*finalize) (GSource *source); /* Can be NULL */
|
|
|
|
/*< private >*/
|
|
/* For use by g_source_set_closure */
|
|
GSourceFunc closure_callback;
|
|
GSourceDummyMarshal closure_marshal; /* Really is of type GClosureMarshal */
|
|
};
|
|
|
|
/* Standard priorities */
|
|
|
|
/**
|
|
* G_PRIORITY_HIGH:
|
|
*
|
|
* Use this for high priority event sources.
|
|
*
|
|
* It is not used within GLib or GTK+.
|
|
*/
|
|
#define G_PRIORITY_HIGH -100
|
|
|
|
/**
|
|
* G_PRIORITY_DEFAULT:
|
|
*
|
|
* Use this for default priority event sources.
|
|
*
|
|
* In GLib this priority is used when adding timeout functions
|
|
* with g_timeout_add(). In GDK this priority is used for events
|
|
* from the X server.
|
|
*/
|
|
#define G_PRIORITY_DEFAULT 0
|
|
|
|
/**
|
|
* G_PRIORITY_HIGH_IDLE:
|
|
*
|
|
* Use this for high priority idle functions.
|
|
*
|
|
* GTK+ uses #G_PRIORITY_HIGH_IDLE + 10 for resizing operations,
|
|
* and #G_PRIORITY_HIGH_IDLE + 20 for redrawing operations. (This is
|
|
* done to ensure that any pending resizes are processed before any
|
|
* pending redraws, so that widgets are not redrawn twice unnecessarily.)
|
|
*/
|
|
#define G_PRIORITY_HIGH_IDLE 100
|
|
|
|
/**
|
|
* G_PRIORITY_DEFAULT_IDLE:
|
|
*
|
|
* Use this for default priority idle functions.
|
|
*
|
|
* In GLib this priority is used when adding idle functions with
|
|
* g_idle_add().
|
|
*/
|
|
#define G_PRIORITY_DEFAULT_IDLE 200
|
|
|
|
/**
|
|
* G_PRIORITY_LOW:
|
|
*
|
|
* Use this for very low priority background tasks.
|
|
*
|
|
* It is not used within GLib or GTK+.
|
|
*/
|
|
#define G_PRIORITY_LOW 300
|
|
|
|
/**
|
|
* G_SOURCE_REMOVE:
|
|
*
|
|
* Use this macro as the return value of a #GSourceFunc to remove
|
|
* the #GSource from the main loop.
|
|
*
|
|
* Since: 2.32
|
|
*/
|
|
#define G_SOURCE_REMOVE FALSE
|
|
|
|
/**
|
|
* G_SOURCE_CONTINUE:
|
|
*
|
|
* Use this macro as the return value of a #GSourceFunc to leave
|
|
* the #GSource in the main loop.
|
|
*
|
|
* Since: 2.32
|
|
*/
|
|
#define G_SOURCE_CONTINUE TRUE
|
|
|
|
/* GMainContext: */
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GMainContext *g_main_context_new (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GMainContext *g_main_context_ref (GMainContext *context);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_main_context_unref (GMainContext *context);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GMainContext *g_main_context_default (void);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_main_context_iteration (GMainContext *context,
|
|
gboolean may_block);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_main_context_pending (GMainContext *context);
|
|
|
|
/* For implementation of legacy interfaces
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSource *g_main_context_find_source_by_id (GMainContext *context,
|
|
guint source_id);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSource *g_main_context_find_source_by_user_data (GMainContext *context,
|
|
gpointer user_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSource *g_main_context_find_source_by_funcs_user_data (GMainContext *context,
|
|
GSourceFuncs *funcs,
|
|
gpointer user_data);
|
|
|
|
/* Low level functions for implementing custom main loops.
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_main_context_wakeup (GMainContext *context);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_main_context_acquire (GMainContext *context);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_main_context_release (GMainContext *context);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_main_context_is_owner (GMainContext *context);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_main_context_wait (GMainContext *context,
|
|
GCond *cond,
|
|
GMutex *mutex);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_main_context_prepare (GMainContext *context,
|
|
gint *priority);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_main_context_query (GMainContext *context,
|
|
gint max_priority,
|
|
gint *timeout_,
|
|
GPollFD *fds,
|
|
gint n_fds);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_main_context_check (GMainContext *context,
|
|
gint max_priority,
|
|
GPollFD *fds,
|
|
gint n_fds);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_main_context_dispatch (GMainContext *context);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_main_context_set_poll_func (GMainContext *context,
|
|
GPollFunc func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GPollFunc g_main_context_get_poll_func (GMainContext *context);
|
|
|
|
/* Low level functions for use by source implementations
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_main_context_add_poll (GMainContext *context,
|
|
GPollFD *fd,
|
|
gint priority);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_main_context_remove_poll (GMainContext *context,
|
|
GPollFD *fd);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_main_depth (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSource *g_main_current_source (void);
|
|
|
|
/* GMainContexts for other threads
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_main_context_push_thread_default (GMainContext *context);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_main_context_pop_thread_default (GMainContext *context);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GMainContext *g_main_context_get_thread_default (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GMainContext *g_main_context_ref_thread_default (void);
|
|
|
|
/* GMainLoop: */
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GMainLoop *g_main_loop_new (GMainContext *context,
|
|
gboolean is_running);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_main_loop_run (GMainLoop *loop);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_main_loop_quit (GMainLoop *loop);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GMainLoop *g_main_loop_ref (GMainLoop *loop);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_main_loop_unref (GMainLoop *loop);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_main_loop_is_running (GMainLoop *loop);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GMainContext *g_main_loop_get_context (GMainLoop *loop);
|
|
|
|
/* GSource: */
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSource *g_source_new (GSourceFuncs *source_funcs,
|
|
guint struct_size);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSource *g_source_ref (GSource *source);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_source_unref (GSource *source);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_source_attach (GSource *source,
|
|
GMainContext *context);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_source_destroy (GSource *source);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_source_set_priority (GSource *source,
|
|
gint priority);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_source_get_priority (GSource *source);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_source_set_can_recurse (GSource *source,
|
|
gboolean can_recurse);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_source_get_can_recurse (GSource *source);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_source_get_id (GSource *source);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GMainContext *g_source_get_context (GSource *source);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_source_set_callback (GSource *source,
|
|
GSourceFunc func,
|
|
gpointer data,
|
|
GDestroyNotify notify);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_source_set_funcs (GSource *source,
|
|
GSourceFuncs *funcs);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_source_is_destroyed (GSource *source);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_source_set_name (GSource *source,
|
|
const char *name);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const char * g_source_get_name (GSource *source);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_source_set_name_by_id (guint tag,
|
|
const char *name);
|
|
|
|
GLIB_AVAILABLE_IN_2_36
|
|
void g_source_set_ready_time (GSource *source,
|
|
gint64 ready_time);
|
|
GLIB_AVAILABLE_IN_2_36
|
|
gint64 g_source_get_ready_time (GSource *source);
|
|
|
|
#ifdef G_OS_UNIX
|
|
GLIB_AVAILABLE_IN_2_36
|
|
gpointer g_source_add_unix_fd (GSource *source,
|
|
gint fd,
|
|
GIOCondition events);
|
|
GLIB_AVAILABLE_IN_2_36
|
|
void g_source_modify_unix_fd (GSource *source,
|
|
gpointer tag,
|
|
GIOCondition new_events);
|
|
GLIB_AVAILABLE_IN_2_36
|
|
void g_source_remove_unix_fd (GSource *source,
|
|
gpointer tag);
|
|
GLIB_AVAILABLE_IN_2_36
|
|
GIOCondition g_source_query_unix_fd (GSource *source,
|
|
gpointer tag);
|
|
#endif
|
|
|
|
/* Used to implement g_source_connect_closure and internally*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_source_set_callback_indirect (GSource *source,
|
|
gpointer callback_data,
|
|
GSourceCallbackFuncs *callback_funcs);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_source_add_poll (GSource *source,
|
|
GPollFD *fd);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_source_remove_poll (GSource *source,
|
|
GPollFD *fd);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_source_add_child_source (GSource *source,
|
|
GSource *child_source);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_source_remove_child_source (GSource *source,
|
|
GSource *child_source);
|
|
|
|
GLIB_DEPRECATED_IN_2_28_FOR(g_source_get_time)
|
|
void g_source_get_current_time (GSource *source,
|
|
GTimeVal *timeval);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint64 g_source_get_time (GSource *source);
|
|
|
|
/* void g_source_connect_closure (GSource *source,
|
|
GClosure *closure);
|
|
*/
|
|
|
|
/* Specific source types
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSource *g_idle_source_new (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSource *g_child_watch_source_new (GPid pid);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSource *g_timeout_source_new (guint interval);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSource *g_timeout_source_new_seconds (guint interval);
|
|
|
|
/* Miscellaneous functions
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_get_current_time (GTimeVal *result);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint64 g_get_monotonic_time (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint64 g_get_real_time (void);
|
|
|
|
|
|
/* Source manipulation by ID */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_source_remove (guint tag);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_source_remove_by_user_data (gpointer user_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_source_remove_by_funcs_user_data (GSourceFuncs *funcs,
|
|
gpointer user_data);
|
|
|
|
/* Idles, child watchers and timeouts */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_timeout_add_full (gint priority,
|
|
guint interval,
|
|
GSourceFunc function,
|
|
gpointer data,
|
|
GDestroyNotify notify);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_timeout_add (guint interval,
|
|
GSourceFunc function,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_timeout_add_seconds_full (gint priority,
|
|
guint interval,
|
|
GSourceFunc function,
|
|
gpointer data,
|
|
GDestroyNotify notify);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_timeout_add_seconds (guint interval,
|
|
GSourceFunc function,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_child_watch_add_full (gint priority,
|
|
GPid pid,
|
|
GChildWatchFunc function,
|
|
gpointer data,
|
|
GDestroyNotify notify);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_child_watch_add (GPid pid,
|
|
GChildWatchFunc function,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_idle_add (GSourceFunc function,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_idle_add_full (gint priority,
|
|
GSourceFunc function,
|
|
gpointer data,
|
|
GDestroyNotify notify);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_idle_remove_by_data (gpointer data);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_main_context_invoke_full (GMainContext *context,
|
|
gint priority,
|
|
GSourceFunc function,
|
|
gpointer data,
|
|
GDestroyNotify notify);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_main_context_invoke (GMainContext *context,
|
|
GSourceFunc function,
|
|
gpointer data);
|
|
|
|
/* Hook for GClosure / GSource integration. Don't touch */
|
|
GLIB_VAR GSourceFuncs g_timeout_funcs;
|
|
GLIB_VAR GSourceFuncs g_child_watch_funcs;
|
|
GLIB_VAR GSourceFuncs g_idle_funcs;
|
|
#ifdef G_OS_UNIX
|
|
GLIB_VAR GSourceFuncs g_unix_signal_funcs;
|
|
GLIB_VAR GSourceFuncs g_unix_fd_source_funcs;
|
|
#endif
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_MAIN_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_STRING_H__
|
|
#define __G_STRING_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
/* gunicode.h - Unicode manipulation functions
|
|
*
|
|
* Copyright (C) 1999, 2000 Tom Tromey
|
|
* Copyright 2000, 2005 Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __G_UNICODE_H__
|
|
#define __G_UNICODE_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/**
|
|
* gunichar:
|
|
*
|
|
* A type which can hold any UTF-32 or UCS-4 character code,
|
|
* also known as a Unicode code point.
|
|
*
|
|
* If you want to produce the UTF-8 representation of a #gunichar,
|
|
* use g_ucs4_to_utf8(). See also g_utf8_to_ucs4() for the reverse
|
|
* process.
|
|
*
|
|
* To print/scan values of this type as integer, use
|
|
* %G_GINT32_MODIFIER and/or %G_GUINT32_FORMAT.
|
|
*
|
|
* The notation to express a Unicode code point in running text is
|
|
* as a hexadecimal number with four to six digits and uppercase
|
|
* letters, prefixed by the string "U+". Leading zeros are omitted,
|
|
* unless the code point would have fewer than four hexadecimal digits.
|
|
* For example, "U+0041 LATIN CAPITAL LETTER A". To print a code point
|
|
* in the U+-notation, use the format string "U+\%04"G_GINT32_FORMAT"X".
|
|
* To scan, use the format string "U+\%06"G_GINT32_FORMAT"X".
|
|
*
|
|
* |[
|
|
* gunichar c;
|
|
* sscanf ("U+0041", "U+%06"G_GINT32_FORMAT"X", &c)
|
|
* g_print ("Read U+%04"G_GINT32_FORMAT"X", c);
|
|
* ]|
|
|
*/
|
|
typedef guint32 gunichar;
|
|
|
|
/**
|
|
* gunichar2:
|
|
*
|
|
* A type which can hold any UTF-16 code
|
|
* point<footnote id="utf16_surrogate_pairs">UTF-16 also has so called
|
|
* <firstterm>surrogate pairs</firstterm> to encode characters beyond
|
|
* the BMP as pairs of 16bit numbers. Surrogate pairs cannot be stored
|
|
* in a single gunichar2 field, but all GLib functions accepting gunichar2
|
|
* arrays will correctly interpret surrogate pairs.</footnote>.
|
|
*
|
|
* To print/scan values of this type to/from text you need to convert
|
|
* to/from UTF-8, using g_utf16_to_utf8()/g_utf8_to_utf16().
|
|
*
|
|
* To print/scan values of this type as integer, use
|
|
* %G_GINT16_MODIFIER and/or %G_GUINT16_FORMAT.
|
|
*/
|
|
typedef guint16 gunichar2;
|
|
|
|
/**
|
|
* GUnicodeType:
|
|
* @G_UNICODE_CONTROL: General category "Other, Control" (Cc)
|
|
* @G_UNICODE_FORMAT: General category "Other, Format" (Cf)
|
|
* @G_UNICODE_UNASSIGNED: General category "Other, Not Assigned" (Cn)
|
|
* @G_UNICODE_PRIVATE_USE: General category "Other, Private Use" (Co)
|
|
* @G_UNICODE_SURROGATE: General category "Other, Surrogate" (Cs)
|
|
* @G_UNICODE_LOWERCASE_LETTER: General category "Letter, Lowercase" (Ll)
|
|
* @G_UNICODE_MODIFIER_LETTER: General category "Letter, Modifier" (Lm)
|
|
* @G_UNICODE_OTHER_LETTER: General category "Letter, Other" (Lo)
|
|
* @G_UNICODE_TITLECASE_LETTER: General category "Letter, Titlecase" (Lt)
|
|
* @G_UNICODE_UPPERCASE_LETTER: General category "Letter, Uppercase" (Lu)
|
|
* @G_UNICODE_SPACING_MARK: General category "Mark, Spacing" (Mc)
|
|
* @G_UNICODE_ENCLOSING_MARK: General category "Mark, Enclosing" (Me)
|
|
* @G_UNICODE_NON_SPACING_MARK: General category "Mark, Nonspacing" (Mn)
|
|
* @G_UNICODE_DECIMAL_NUMBER: General category "Number, Decimal Digit" (Nd)
|
|
* @G_UNICODE_LETTER_NUMBER: General category "Number, Letter" (Nl)
|
|
* @G_UNICODE_OTHER_NUMBER: General category "Number, Other" (No)
|
|
* @G_UNICODE_CONNECT_PUNCTUATION: General category "Punctuation, Connector" (Pc)
|
|
* @G_UNICODE_DASH_PUNCTUATION: General category "Punctuation, Dash" (Pd)
|
|
* @G_UNICODE_CLOSE_PUNCTUATION: General category "Punctuation, Close" (Pe)
|
|
* @G_UNICODE_FINAL_PUNCTUATION: General category "Punctuation, Final quote" (Pf)
|
|
* @G_UNICODE_INITIAL_PUNCTUATION: General category "Punctuation, Initial quote" (Pi)
|
|
* @G_UNICODE_OTHER_PUNCTUATION: General category "Punctuation, Other" (Po)
|
|
* @G_UNICODE_OPEN_PUNCTUATION: General category "Punctuation, Open" (Ps)
|
|
* @G_UNICODE_CURRENCY_SYMBOL: General category "Symbol, Currency" (Sc)
|
|
* @G_UNICODE_MODIFIER_SYMBOL: General category "Symbol, Modifier" (Sk)
|
|
* @G_UNICODE_MATH_SYMBOL: General category "Symbol, Math" (Sm)
|
|
* @G_UNICODE_OTHER_SYMBOL: General category "Symbol, Other" (So)
|
|
* @G_UNICODE_LINE_SEPARATOR: General category "Separator, Line" (Zl)
|
|
* @G_UNICODE_PARAGRAPH_SEPARATOR: General category "Separator, Paragraph" (Zp)
|
|
* @G_UNICODE_SPACE_SEPARATOR: General category "Separator, Space" (Zs)
|
|
*
|
|
* These are the possible character classifications from the
|
|
* Unicode specification.
|
|
* See <ulink url="http://www.unicode.org/reports/tr44/#General_Category_Values">Unicode Character Database</unlink>.
|
|
*/
|
|
typedef enum
|
|
{
|
|
G_UNICODE_CONTROL,
|
|
G_UNICODE_FORMAT,
|
|
G_UNICODE_UNASSIGNED,
|
|
G_UNICODE_PRIVATE_USE,
|
|
G_UNICODE_SURROGATE,
|
|
G_UNICODE_LOWERCASE_LETTER,
|
|
G_UNICODE_MODIFIER_LETTER,
|
|
G_UNICODE_OTHER_LETTER,
|
|
G_UNICODE_TITLECASE_LETTER,
|
|
G_UNICODE_UPPERCASE_LETTER,
|
|
G_UNICODE_SPACING_MARK,
|
|
G_UNICODE_ENCLOSING_MARK,
|
|
G_UNICODE_NON_SPACING_MARK,
|
|
G_UNICODE_DECIMAL_NUMBER,
|
|
G_UNICODE_LETTER_NUMBER,
|
|
G_UNICODE_OTHER_NUMBER,
|
|
G_UNICODE_CONNECT_PUNCTUATION,
|
|
G_UNICODE_DASH_PUNCTUATION,
|
|
G_UNICODE_CLOSE_PUNCTUATION,
|
|
G_UNICODE_FINAL_PUNCTUATION,
|
|
G_UNICODE_INITIAL_PUNCTUATION,
|
|
G_UNICODE_OTHER_PUNCTUATION,
|
|
G_UNICODE_OPEN_PUNCTUATION,
|
|
G_UNICODE_CURRENCY_SYMBOL,
|
|
G_UNICODE_MODIFIER_SYMBOL,
|
|
G_UNICODE_MATH_SYMBOL,
|
|
G_UNICODE_OTHER_SYMBOL,
|
|
G_UNICODE_LINE_SEPARATOR,
|
|
G_UNICODE_PARAGRAPH_SEPARATOR,
|
|
G_UNICODE_SPACE_SEPARATOR
|
|
} GUnicodeType;
|
|
|
|
/**
|
|
* G_UNICODE_COMBINING_MARK:
|
|
*
|
|
* Older name for %G_UNICODE_SPACING_MARK.
|
|
*
|
|
* Deprecated: 2.30: Use %G_UNICODE_SPACING_MARK.
|
|
*/
|
|
#ifndef G_DISABLE_DEPRECATED
|
|
#define G_UNICODE_COMBINING_MARK G_UNICODE_SPACING_MARK
|
|
#endif
|
|
|
|
/**
|
|
* GUnicodeBreakType:
|
|
* @G_UNICODE_BREAK_MANDATORY: Mandatory Break (BK)
|
|
* @G_UNICODE_BREAK_CARRIAGE_RETURN: Carriage Return (CR)
|
|
* @G_UNICODE_BREAK_LINE_FEED: Line Feed (LF)
|
|
* @G_UNICODE_BREAK_COMBINING_MARK: Attached Characters and Combining Marks (CM)
|
|
* @G_UNICODE_BREAK_SURROGATE: Surrogates (SG)
|
|
* @G_UNICODE_BREAK_ZERO_WIDTH_SPACE: Zero Width Space (ZW)
|
|
* @G_UNICODE_BREAK_INSEPARABLE: Inseparable (IN)
|
|
* @G_UNICODE_BREAK_NON_BREAKING_GLUE: Non-breaking ("Glue") (GL)
|
|
* @G_UNICODE_BREAK_CONTINGENT: Contingent Break Opportunity (CB)
|
|
* @G_UNICODE_BREAK_SPACE: Space (SP)
|
|
* @G_UNICODE_BREAK_AFTER: Break Opportunity After (BA)
|
|
* @G_UNICODE_BREAK_BEFORE: Break Opportunity Before (BB)
|
|
* @G_UNICODE_BREAK_BEFORE_AND_AFTER: Break Opportunity Before and After (B2)
|
|
* @G_UNICODE_BREAK_HYPHEN: Hyphen (HY)
|
|
* @G_UNICODE_BREAK_NON_STARTER: Nonstarter (NS)
|
|
* @G_UNICODE_BREAK_OPEN_PUNCTUATION: Opening Punctuation (OP)
|
|
* @G_UNICODE_BREAK_CLOSE_PUNCTUATION: Closing Punctuation (CL)
|
|
* @G_UNICODE_BREAK_QUOTATION: Ambiguous Quotation (QU)
|
|
* @G_UNICODE_BREAK_EXCLAMATION: Exclamation/Interrogation (EX)
|
|
* @G_UNICODE_BREAK_IDEOGRAPHIC: Ideographic (ID)
|
|
* @G_UNICODE_BREAK_NUMERIC: Numeric (NU)
|
|
* @G_UNICODE_BREAK_INFIX_SEPARATOR: Infix Separator (Numeric) (IS)
|
|
* @G_UNICODE_BREAK_SYMBOL: Symbols Allowing Break After (SY)
|
|
* @G_UNICODE_BREAK_ALPHABETIC: Ordinary Alphabetic and Symbol Characters (AL)
|
|
* @G_UNICODE_BREAK_PREFIX: Prefix (Numeric) (PR)
|
|
* @G_UNICODE_BREAK_POSTFIX: Postfix (Numeric) (PO)
|
|
* @G_UNICODE_BREAK_COMPLEX_CONTEXT: Complex Content Dependent (South East Asian) (SA)
|
|
* @G_UNICODE_BREAK_AMBIGUOUS: Ambiguous (Alphabetic or Ideographic) (AI)
|
|
* @G_UNICODE_BREAK_UNKNOWN: Unknown (XX)
|
|
* @G_UNICODE_BREAK_NEXT_LINE: Next Line (NL)
|
|
* @G_UNICODE_BREAK_WORD_JOINER: Word Joiner (WJ)
|
|
* @G_UNICODE_BREAK_HANGUL_L_JAMO: Hangul L Jamo (JL)
|
|
* @G_UNICODE_BREAK_HANGUL_V_JAMO: Hangul V Jamo (JV)
|
|
* @G_UNICODE_BREAK_HANGUL_T_JAMO: Hangul T Jamo (JT)
|
|
* @G_UNICODE_BREAK_HANGUL_LV_SYLLABLE: Hangul LV Syllable (H2)
|
|
* @G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE: Hangul LVT Syllable (H3)
|
|
* @G_UNICODE_BREAK_CLOSE_PARANTHESIS: Closing Parenthesis (CP). Since 2.28
|
|
* @G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER: Conditional Japanese Starter (CJ). Since: 2.32
|
|
* @G_UNICODE_BREAK_HEBREW_LETTER: Hebrew Letter (HL). Since: 2.32
|
|
* @G_UNICODE_BREAK_REGIONAL_INDICATOR: Regional Indicator (RI). Since: 2.36
|
|
* @G_UNICODE_BREAK_EMOJI_BASE: Emoji Base (EB). Since: 2.50
|
|
* @G_UNICODE_BREAK_EMOJI_MODIFIER: Emoji Modifier (EM). Since: 2.50
|
|
* @G_UNICODE_BREAK_ZERO_WIDTH_JOINER: Zero Width Joiner (ZWJ). Since: 2.50
|
|
*
|
|
* These are the possible line break classifications.
|
|
*
|
|
* Since new unicode versions may add new types here, applications should be ready
|
|
* to handle unknown values. They may be regarded as %G_UNICODE_BREAK_UNKNOWN.
|
|
*
|
|
* See <ulink url="http://www.unicode.org/unicode/reports/tr14/">http://www.unicode.org/unicode/reports/tr14/</ulink>.
|
|
*/
|
|
typedef enum
|
|
{
|
|
G_UNICODE_BREAK_MANDATORY,
|
|
G_UNICODE_BREAK_CARRIAGE_RETURN,
|
|
G_UNICODE_BREAK_LINE_FEED,
|
|
G_UNICODE_BREAK_COMBINING_MARK,
|
|
G_UNICODE_BREAK_SURROGATE,
|
|
G_UNICODE_BREAK_ZERO_WIDTH_SPACE,
|
|
G_UNICODE_BREAK_INSEPARABLE,
|
|
G_UNICODE_BREAK_NON_BREAKING_GLUE,
|
|
G_UNICODE_BREAK_CONTINGENT,
|
|
G_UNICODE_BREAK_SPACE,
|
|
G_UNICODE_BREAK_AFTER,
|
|
G_UNICODE_BREAK_BEFORE,
|
|
G_UNICODE_BREAK_BEFORE_AND_AFTER,
|
|
G_UNICODE_BREAK_HYPHEN,
|
|
G_UNICODE_BREAK_NON_STARTER,
|
|
G_UNICODE_BREAK_OPEN_PUNCTUATION,
|
|
G_UNICODE_BREAK_CLOSE_PUNCTUATION,
|
|
G_UNICODE_BREAK_QUOTATION,
|
|
G_UNICODE_BREAK_EXCLAMATION,
|
|
G_UNICODE_BREAK_IDEOGRAPHIC,
|
|
G_UNICODE_BREAK_NUMERIC,
|
|
G_UNICODE_BREAK_INFIX_SEPARATOR,
|
|
G_UNICODE_BREAK_SYMBOL,
|
|
G_UNICODE_BREAK_ALPHABETIC,
|
|
G_UNICODE_BREAK_PREFIX,
|
|
G_UNICODE_BREAK_POSTFIX,
|
|
G_UNICODE_BREAK_COMPLEX_CONTEXT,
|
|
G_UNICODE_BREAK_AMBIGUOUS,
|
|
G_UNICODE_BREAK_UNKNOWN,
|
|
G_UNICODE_BREAK_NEXT_LINE,
|
|
G_UNICODE_BREAK_WORD_JOINER,
|
|
G_UNICODE_BREAK_HANGUL_L_JAMO,
|
|
G_UNICODE_BREAK_HANGUL_V_JAMO,
|
|
G_UNICODE_BREAK_HANGUL_T_JAMO,
|
|
G_UNICODE_BREAK_HANGUL_LV_SYLLABLE,
|
|
G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
|
|
G_UNICODE_BREAK_CLOSE_PARANTHESIS,
|
|
G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER,
|
|
G_UNICODE_BREAK_HEBREW_LETTER,
|
|
G_UNICODE_BREAK_REGIONAL_INDICATOR,
|
|
G_UNICODE_BREAK_EMOJI_BASE,
|
|
G_UNICODE_BREAK_EMOJI_MODIFIER,
|
|
G_UNICODE_BREAK_ZERO_WIDTH_JOINER
|
|
} GUnicodeBreakType;
|
|
|
|
/**
|
|
* GUnicodeScript:
|
|
* @G_UNICODE_SCRIPT_INVALID_CODE:
|
|
* a value never returned from g_unichar_get_script()
|
|
* @G_UNICODE_SCRIPT_COMMON: a character used by multiple different scripts
|
|
* @G_UNICODE_SCRIPT_INHERITED: a mark glyph that takes its script from the
|
|
* base glyph to which it is attached
|
|
* @G_UNICODE_SCRIPT_ARABIC: Arabic
|
|
* @G_UNICODE_SCRIPT_ARMENIAN: Armenian
|
|
* @G_UNICODE_SCRIPT_BENGALI: Bengali
|
|
* @G_UNICODE_SCRIPT_BOPOMOFO: Bopomofo
|
|
* @G_UNICODE_SCRIPT_CHEROKEE: Cherokee
|
|
* @G_UNICODE_SCRIPT_COPTIC: Coptic
|
|
* @G_UNICODE_SCRIPT_CYRILLIC: Cyrillic
|
|
* @G_UNICODE_SCRIPT_DESERET: Deseret
|
|
* @G_UNICODE_SCRIPT_DEVANAGARI: Devanagari
|
|
* @G_UNICODE_SCRIPT_ETHIOPIC: Ethiopic
|
|
* @G_UNICODE_SCRIPT_GEORGIAN: Georgian
|
|
* @G_UNICODE_SCRIPT_GOTHIC: Gothic
|
|
* @G_UNICODE_SCRIPT_GREEK: Greek
|
|
* @G_UNICODE_SCRIPT_GUJARATI: Gujarati
|
|
* @G_UNICODE_SCRIPT_GURMUKHI: Gurmukhi
|
|
* @G_UNICODE_SCRIPT_HAN: Han
|
|
* @G_UNICODE_SCRIPT_HANGUL: Hangul
|
|
* @G_UNICODE_SCRIPT_HEBREW: Hebrew
|
|
* @G_UNICODE_SCRIPT_HIRAGANA: Hiragana
|
|
* @G_UNICODE_SCRIPT_KANNADA: Kannada
|
|
* @G_UNICODE_SCRIPT_KATAKANA: Katakana
|
|
* @G_UNICODE_SCRIPT_KHMER: Khmer
|
|
* @G_UNICODE_SCRIPT_LAO: Lao
|
|
* @G_UNICODE_SCRIPT_LATIN: Latin
|
|
* @G_UNICODE_SCRIPT_MALAYALAM: Malayalam
|
|
* @G_UNICODE_SCRIPT_MONGOLIAN: Mongolian
|
|
* @G_UNICODE_SCRIPT_MYANMAR: Myanmar
|
|
* @G_UNICODE_SCRIPT_OGHAM: Ogham
|
|
* @G_UNICODE_SCRIPT_OLD_ITALIC: Old Italic
|
|
* @G_UNICODE_SCRIPT_ORIYA: Oriya
|
|
* @G_UNICODE_SCRIPT_RUNIC: Runic
|
|
* @G_UNICODE_SCRIPT_SINHALA: Sinhala
|
|
* @G_UNICODE_SCRIPT_SYRIAC: Syriac
|
|
* @G_UNICODE_SCRIPT_TAMIL: Tamil
|
|
* @G_UNICODE_SCRIPT_TELUGU: Telugu
|
|
* @G_UNICODE_SCRIPT_THAANA: Thaana
|
|
* @G_UNICODE_SCRIPT_THAI: Thai
|
|
* @G_UNICODE_SCRIPT_TIBETAN: Tibetan
|
|
* @G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL:
|
|
* Canadian Aboriginal
|
|
* @G_UNICODE_SCRIPT_YI: Yi
|
|
* @G_UNICODE_SCRIPT_TAGALOG: Tagalog
|
|
* @G_UNICODE_SCRIPT_HANUNOO: Hanunoo
|
|
* @G_UNICODE_SCRIPT_BUHID: Buhid
|
|
* @G_UNICODE_SCRIPT_TAGBANWA: Tagbanwa
|
|
* @G_UNICODE_SCRIPT_BRAILLE: Braille
|
|
* @G_UNICODE_SCRIPT_CYPRIOT: Cypriot
|
|
* @G_UNICODE_SCRIPT_LIMBU: Limbu
|
|
* @G_UNICODE_SCRIPT_OSMANYA: Osmanya
|
|
* @G_UNICODE_SCRIPT_SHAVIAN: Shavian
|
|
* @G_UNICODE_SCRIPT_LINEAR_B: Linear B
|
|
* @G_UNICODE_SCRIPT_TAI_LE: Tai Le
|
|
* @G_UNICODE_SCRIPT_UGARITIC: Ugaritic
|
|
* @G_UNICODE_SCRIPT_NEW_TAI_LUE:
|
|
* New Tai Lue
|
|
* @G_UNICODE_SCRIPT_BUGINESE: Buginese
|
|
* @G_UNICODE_SCRIPT_GLAGOLITIC: Glagolitic
|
|
* @G_UNICODE_SCRIPT_TIFINAGH: Tifinagh
|
|
* @G_UNICODE_SCRIPT_SYLOTI_NAGRI:
|
|
* Syloti Nagri
|
|
* @G_UNICODE_SCRIPT_OLD_PERSIAN:
|
|
* Old Persian
|
|
* @G_UNICODE_SCRIPT_KHAROSHTHI: Kharoshthi
|
|
* @G_UNICODE_SCRIPT_UNKNOWN: an unassigned code point
|
|
* @G_UNICODE_SCRIPT_BALINESE: Balinese
|
|
* @G_UNICODE_SCRIPT_CUNEIFORM: Cuneiform
|
|
* @G_UNICODE_SCRIPT_PHOENICIAN: Phoenician
|
|
* @G_UNICODE_SCRIPT_PHAGS_PA: Phags-pa
|
|
* @G_UNICODE_SCRIPT_NKO: N'Ko
|
|
* @G_UNICODE_SCRIPT_KAYAH_LI: Kayah Li. Since 2.16.3
|
|
* @G_UNICODE_SCRIPT_LEPCHA: Lepcha. Since 2.16.3
|
|
* @G_UNICODE_SCRIPT_REJANG: Rejang. Since 2.16.3
|
|
* @G_UNICODE_SCRIPT_SUNDANESE: Sundanese. Since 2.16.3
|
|
* @G_UNICODE_SCRIPT_SAURASHTRA: Saurashtra. Since 2.16.3
|
|
* @G_UNICODE_SCRIPT_CHAM: Cham. Since 2.16.3
|
|
* @G_UNICODE_SCRIPT_OL_CHIKI: Ol Chiki. Since 2.16.3
|
|
* @G_UNICODE_SCRIPT_VAI: Vai. Since 2.16.3
|
|
* @G_UNICODE_SCRIPT_CARIAN: Carian. Since 2.16.3
|
|
* @G_UNICODE_SCRIPT_LYCIAN: Lycian. Since 2.16.3
|
|
* @G_UNICODE_SCRIPT_LYDIAN: Lydian. Since 2.16.3
|
|
* @G_UNICODE_SCRIPT_AVESTAN: Avestan. Since 2.26
|
|
* @G_UNICODE_SCRIPT_BAMUM: Bamum. Since 2.26
|
|
* @G_UNICODE_SCRIPT_EGYPTIAN_HIEROGLYPHS:
|
|
* Egyptian Hieroglpyhs. Since 2.26
|
|
* @G_UNICODE_SCRIPT_IMPERIAL_ARAMAIC:
|
|
* Imperial Aramaic. Since 2.26
|
|
* @G_UNICODE_SCRIPT_INSCRIPTIONAL_PAHLAVI:
|
|
* Inscriptional Pahlavi. Since 2.26
|
|
* @G_UNICODE_SCRIPT_INSCRIPTIONAL_PARTHIAN:
|
|
* Inscriptional Parthian. Since 2.26
|
|
* @G_UNICODE_SCRIPT_JAVANESE: Javanese. Since 2.26
|
|
* @G_UNICODE_SCRIPT_KAITHI: Kaithi. Since 2.26
|
|
* @G_UNICODE_SCRIPT_LISU: Lisu. Since 2.26
|
|
* @G_UNICODE_SCRIPT_MEETEI_MAYEK:
|
|
* Meetei Mayek. Since 2.26
|
|
* @G_UNICODE_SCRIPT_OLD_SOUTH_ARABIAN:
|
|
* Old South Arabian. Since 2.26
|
|
* @G_UNICODE_SCRIPT_OLD_TURKIC: Old Turkic. Since 2.28
|
|
* @G_UNICODE_SCRIPT_SAMARITAN: Samaritan. Since 2.26
|
|
* @G_UNICODE_SCRIPT_TAI_THAM: Tai Tham. Since 2.26
|
|
* @G_UNICODE_SCRIPT_TAI_VIET: Tai Viet. Since 2.26
|
|
* @G_UNICODE_SCRIPT_BATAK: Batak. Since 2.28
|
|
* @G_UNICODE_SCRIPT_BRAHMI: Brahmi. Since 2.28
|
|
* @G_UNICODE_SCRIPT_MANDAIC: Mandaic. Since 2.28
|
|
* @G_UNICODE_SCRIPT_CHAKMA: Chakma. Since: 2.32
|
|
* @G_UNICODE_SCRIPT_MEROITIC_CURSIVE: Meroitic Cursive. Since: 2.32
|
|
* @G_UNICODE_SCRIPT_MEROITIC_HIEROGLYPHS: Meroitic Hieroglyphs. Since: 2.32
|
|
* @G_UNICODE_SCRIPT_MIAO: Miao. Since: 2.32
|
|
* @G_UNICODE_SCRIPT_SHARADA: Sharada. Since: 2.32
|
|
* @G_UNICODE_SCRIPT_SORA_SOMPENG: Sora Sompeng. Since: 2.32
|
|
* @G_UNICODE_SCRIPT_TAKRI: Takri. Since: 2.32
|
|
* @G_UNICODE_SCRIPT_BASSA_VAH: Bassa. Since: 2.42
|
|
* @G_UNICODE_SCRIPT_CAUCASIAN_ALBANIAN: Caucasian Albanian. Since: 2.42
|
|
* @G_UNICODE_SCRIPT_DUPLOYAN: Duployan. Since: 2.42
|
|
* @G_UNICODE_SCRIPT_ELBASAN: Elbasan. Since: 2.42
|
|
* @G_UNICODE_SCRIPT_GRANTHA: Grantha. Since: 2.42
|
|
* @G_UNICODE_SCRIPT_KHOJKI: Kjohki. Since: 2.42
|
|
* @G_UNICODE_SCRIPT_KHUDAWADI: Khudawadi, Sindhi. Since: 2.42
|
|
* @G_UNICODE_SCRIPT_LINEAR_A: Linear A. Since: 2.42
|
|
* @G_UNICODE_SCRIPT_MAHAJANI: Mahajani. Since: 2.42
|
|
* @G_UNICODE_SCRIPT_MANICHAEAN: Manichaean. Since: 2.42
|
|
* @G_UNICODE_SCRIPT_MENDE_KIKAKUI: Mende Kikakui. Since: 2.42
|
|
* @G_UNICODE_SCRIPT_MODI: Modi. Since: 2.42
|
|
* @G_UNICODE_SCRIPT_MRO: Mro. Since: 2.42
|
|
* @G_UNICODE_SCRIPT_NABATAEAN: Nabataean. Since: 2.42
|
|
* @G_UNICODE_SCRIPT_OLD_NORTH_ARABIAN: Old North Arabian. Since: 2.42
|
|
* @G_UNICODE_SCRIPT_OLD_PERMIC: Old Permic. Since: 2.42
|
|
* @G_UNICODE_SCRIPT_PAHAWH_HMONG: Pahawh Hmong. Since: 2.42
|
|
* @G_UNICODE_SCRIPT_PALMYRENE: Palmyrene. Since: 2.42
|
|
* @G_UNICODE_SCRIPT_PAU_CIN_HAU: Pau Cin Hau. Since: 2.42
|
|
* @G_UNICODE_SCRIPT_PSALTER_PAHLAVI: Psalter Pahlavi. Since: 2.42
|
|
* @G_UNICODE_SCRIPT_SIDDHAM: Siddham. Since: 2.42
|
|
* @G_UNICODE_SCRIPT_TIRHUTA: Tirhuta. Since: 2.42
|
|
* @G_UNICODE_SCRIPT_WARANG_CITI: Warang Citi. Since: 2.42
|
|
* @G_UNICODE_SCRIPT_AHOM: Ahom. Since: 2.48
|
|
* @G_UNICODE_SCRIPT_ANATOLIAN_HIEROGLYPHS: Anatolian Hieroglyphs. Since: 2.48
|
|
* @G_UNICODE_SCRIPT_HATRAN: Hatran. Since: 2.48
|
|
* @G_UNICODE_SCRIPT_MULTANI: Multani. Since: 2.48
|
|
* @G_UNICODE_SCRIPT_OLD_HUNGARIAN: Old Hungarian. Since: 2.48
|
|
* @G_UNICODE_SCRIPT_SIGNWRITING: Signwriting. Since: 2.48
|
|
* @G_UNICODE_SCRIPT_ADLAM: Adlam. Since: 2.50
|
|
* @G_UNICODE_SCRIPT_BHAIKSUKI: Bhaiksuki. Since: 2.50
|
|
* @G_UNICODE_SCRIPT_MARCHEN: Marchen. Since: 2.50
|
|
* @G_UNICODE_SCRIPT_NEWA: Newa. Since: 2.50
|
|
* @G_UNICODE_SCRIPT_OSAGE: Osage. Since: 2.50
|
|
* @G_UNICODE_SCRIPT_TANGUT: Tangut. Since: 2.50
|
|
*
|
|
* The #GUnicodeScript enumeration identifies different writing
|
|
* systems. The values correspond to the names as defined in the
|
|
* Unicode standard. The enumeration has been added in GLib 2.14,
|
|
* and is interchangeable with #PangoScript.
|
|
*
|
|
* Note that new types may be added in the future. Applications
|
|
* should be ready to handle unknown values.
|
|
* See <ulink
|
|
* url="http://www.unicode.org/reports/tr24/">Unicode Standard Annex
|
|
* #24: Script names</ulink>.
|
|
*/
|
|
typedef enum
|
|
{ /* ISO 15924 code */
|
|
G_UNICODE_SCRIPT_INVALID_CODE = -1,
|
|
G_UNICODE_SCRIPT_COMMON = 0, /* Zyyy */
|
|
G_UNICODE_SCRIPT_INHERITED, /* Zinh (Qaai) */
|
|
G_UNICODE_SCRIPT_ARABIC, /* Arab */
|
|
G_UNICODE_SCRIPT_ARMENIAN, /* Armn */
|
|
G_UNICODE_SCRIPT_BENGALI, /* Beng */
|
|
G_UNICODE_SCRIPT_BOPOMOFO, /* Bopo */
|
|
G_UNICODE_SCRIPT_CHEROKEE, /* Cher */
|
|
G_UNICODE_SCRIPT_COPTIC, /* Copt (Qaac) */
|
|
G_UNICODE_SCRIPT_CYRILLIC, /* Cyrl (Cyrs) */
|
|
G_UNICODE_SCRIPT_DESERET, /* Dsrt */
|
|
G_UNICODE_SCRIPT_DEVANAGARI, /* Deva */
|
|
G_UNICODE_SCRIPT_ETHIOPIC, /* Ethi */
|
|
G_UNICODE_SCRIPT_GEORGIAN, /* Geor (Geon, Geoa) */
|
|
G_UNICODE_SCRIPT_GOTHIC, /* Goth */
|
|
G_UNICODE_SCRIPT_GREEK, /* Grek */
|
|
G_UNICODE_SCRIPT_GUJARATI, /* Gujr */
|
|
G_UNICODE_SCRIPT_GURMUKHI, /* Guru */
|
|
G_UNICODE_SCRIPT_HAN, /* Hani */
|
|
G_UNICODE_SCRIPT_HANGUL, /* Hang */
|
|
G_UNICODE_SCRIPT_HEBREW, /* Hebr */
|
|
G_UNICODE_SCRIPT_HIRAGANA, /* Hira */
|
|
G_UNICODE_SCRIPT_KANNADA, /* Knda */
|
|
G_UNICODE_SCRIPT_KATAKANA, /* Kana */
|
|
G_UNICODE_SCRIPT_KHMER, /* Khmr */
|
|
G_UNICODE_SCRIPT_LAO, /* Laoo */
|
|
G_UNICODE_SCRIPT_LATIN, /* Latn (Latf, Latg) */
|
|
G_UNICODE_SCRIPT_MALAYALAM, /* Mlym */
|
|
G_UNICODE_SCRIPT_MONGOLIAN, /* Mong */
|
|
G_UNICODE_SCRIPT_MYANMAR, /* Mymr */
|
|
G_UNICODE_SCRIPT_OGHAM, /* Ogam */
|
|
G_UNICODE_SCRIPT_OLD_ITALIC, /* Ital */
|
|
G_UNICODE_SCRIPT_ORIYA, /* Orya */
|
|
G_UNICODE_SCRIPT_RUNIC, /* Runr */
|
|
G_UNICODE_SCRIPT_SINHALA, /* Sinh */
|
|
G_UNICODE_SCRIPT_SYRIAC, /* Syrc (Syrj, Syrn, Syre) */
|
|
G_UNICODE_SCRIPT_TAMIL, /* Taml */
|
|
G_UNICODE_SCRIPT_TELUGU, /* Telu */
|
|
G_UNICODE_SCRIPT_THAANA, /* Thaa */
|
|
G_UNICODE_SCRIPT_THAI, /* Thai */
|
|
G_UNICODE_SCRIPT_TIBETAN, /* Tibt */
|
|
G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, /* Cans */
|
|
G_UNICODE_SCRIPT_YI, /* Yiii */
|
|
G_UNICODE_SCRIPT_TAGALOG, /* Tglg */
|
|
G_UNICODE_SCRIPT_HANUNOO, /* Hano */
|
|
G_UNICODE_SCRIPT_BUHID, /* Buhd */
|
|
G_UNICODE_SCRIPT_TAGBANWA, /* Tagb */
|
|
|
|
/* Unicode-4.0 additions */
|
|
G_UNICODE_SCRIPT_BRAILLE, /* Brai */
|
|
G_UNICODE_SCRIPT_CYPRIOT, /* Cprt */
|
|
G_UNICODE_SCRIPT_LIMBU, /* Limb */
|
|
G_UNICODE_SCRIPT_OSMANYA, /* Osma */
|
|
G_UNICODE_SCRIPT_SHAVIAN, /* Shaw */
|
|
G_UNICODE_SCRIPT_LINEAR_B, /* Linb */
|
|
G_UNICODE_SCRIPT_TAI_LE, /* Tale */
|
|
G_UNICODE_SCRIPT_UGARITIC, /* Ugar */
|
|
|
|
/* Unicode-4.1 additions */
|
|
G_UNICODE_SCRIPT_NEW_TAI_LUE, /* Talu */
|
|
G_UNICODE_SCRIPT_BUGINESE, /* Bugi */
|
|
G_UNICODE_SCRIPT_GLAGOLITIC, /* Glag */
|
|
G_UNICODE_SCRIPT_TIFINAGH, /* Tfng */
|
|
G_UNICODE_SCRIPT_SYLOTI_NAGRI, /* Sylo */
|
|
G_UNICODE_SCRIPT_OLD_PERSIAN, /* Xpeo */
|
|
G_UNICODE_SCRIPT_KHAROSHTHI, /* Khar */
|
|
|
|
/* Unicode-5.0 additions */
|
|
G_UNICODE_SCRIPT_UNKNOWN, /* Zzzz */
|
|
G_UNICODE_SCRIPT_BALINESE, /* Bali */
|
|
G_UNICODE_SCRIPT_CUNEIFORM, /* Xsux */
|
|
G_UNICODE_SCRIPT_PHOENICIAN, /* Phnx */
|
|
G_UNICODE_SCRIPT_PHAGS_PA, /* Phag */
|
|
G_UNICODE_SCRIPT_NKO, /* Nkoo */
|
|
|
|
/* Unicode-5.1 additions */
|
|
G_UNICODE_SCRIPT_KAYAH_LI, /* Kali */
|
|
G_UNICODE_SCRIPT_LEPCHA, /* Lepc */
|
|
G_UNICODE_SCRIPT_REJANG, /* Rjng */
|
|
G_UNICODE_SCRIPT_SUNDANESE, /* Sund */
|
|
G_UNICODE_SCRIPT_SAURASHTRA, /* Saur */
|
|
G_UNICODE_SCRIPT_CHAM, /* Cham */
|
|
G_UNICODE_SCRIPT_OL_CHIKI, /* Olck */
|
|
G_UNICODE_SCRIPT_VAI, /* Vaii */
|
|
G_UNICODE_SCRIPT_CARIAN, /* Cari */
|
|
G_UNICODE_SCRIPT_LYCIAN, /* Lyci */
|
|
G_UNICODE_SCRIPT_LYDIAN, /* Lydi */
|
|
|
|
/* Unicode-5.2 additions */
|
|
G_UNICODE_SCRIPT_AVESTAN, /* Avst */
|
|
G_UNICODE_SCRIPT_BAMUM, /* Bamu */
|
|
G_UNICODE_SCRIPT_EGYPTIAN_HIEROGLYPHS, /* Egyp */
|
|
G_UNICODE_SCRIPT_IMPERIAL_ARAMAIC, /* Armi */
|
|
G_UNICODE_SCRIPT_INSCRIPTIONAL_PAHLAVI, /* Phli */
|
|
G_UNICODE_SCRIPT_INSCRIPTIONAL_PARTHIAN, /* Prti */
|
|
G_UNICODE_SCRIPT_JAVANESE, /* Java */
|
|
G_UNICODE_SCRIPT_KAITHI, /* Kthi */
|
|
G_UNICODE_SCRIPT_LISU, /* Lisu */
|
|
G_UNICODE_SCRIPT_MEETEI_MAYEK, /* Mtei */
|
|
G_UNICODE_SCRIPT_OLD_SOUTH_ARABIAN, /* Sarb */
|
|
G_UNICODE_SCRIPT_OLD_TURKIC, /* Orkh */
|
|
G_UNICODE_SCRIPT_SAMARITAN, /* Samr */
|
|
G_UNICODE_SCRIPT_TAI_THAM, /* Lana */
|
|
G_UNICODE_SCRIPT_TAI_VIET, /* Tavt */
|
|
|
|
/* Unicode-6.0 additions */
|
|
G_UNICODE_SCRIPT_BATAK, /* Batk */
|
|
G_UNICODE_SCRIPT_BRAHMI, /* Brah */
|
|
G_UNICODE_SCRIPT_MANDAIC, /* Mand */
|
|
|
|
/* Unicode-6.1 additions */
|
|
G_UNICODE_SCRIPT_CHAKMA, /* Cakm */
|
|
G_UNICODE_SCRIPT_MEROITIC_CURSIVE, /* Merc */
|
|
G_UNICODE_SCRIPT_MEROITIC_HIEROGLYPHS, /* Mero */
|
|
G_UNICODE_SCRIPT_MIAO, /* Plrd */
|
|
G_UNICODE_SCRIPT_SHARADA, /* Shrd */
|
|
G_UNICODE_SCRIPT_SORA_SOMPENG, /* Sora */
|
|
G_UNICODE_SCRIPT_TAKRI, /* Takr */
|
|
|
|
/* Unicode 7.0 additions */
|
|
G_UNICODE_SCRIPT_BASSA_VAH, /* Bass */
|
|
G_UNICODE_SCRIPT_CAUCASIAN_ALBANIAN, /* Aghb */
|
|
G_UNICODE_SCRIPT_DUPLOYAN, /* Dupl */
|
|
G_UNICODE_SCRIPT_ELBASAN, /* Elba */
|
|
G_UNICODE_SCRIPT_GRANTHA, /* Gran */
|
|
G_UNICODE_SCRIPT_KHOJKI, /* Khoj */
|
|
G_UNICODE_SCRIPT_KHUDAWADI, /* Sind */
|
|
G_UNICODE_SCRIPT_LINEAR_A, /* Lina */
|
|
G_UNICODE_SCRIPT_MAHAJANI, /* Mahj */
|
|
G_UNICODE_SCRIPT_MANICHAEAN, /* Manu */
|
|
G_UNICODE_SCRIPT_MENDE_KIKAKUI, /* Mend */
|
|
G_UNICODE_SCRIPT_MODI, /* Modi */
|
|
G_UNICODE_SCRIPT_MRO, /* Mroo */
|
|
G_UNICODE_SCRIPT_NABATAEAN, /* Nbat */
|
|
G_UNICODE_SCRIPT_OLD_NORTH_ARABIAN, /* Narb */
|
|
G_UNICODE_SCRIPT_OLD_PERMIC, /* Perm */
|
|
G_UNICODE_SCRIPT_PAHAWH_HMONG, /* Hmng */
|
|
G_UNICODE_SCRIPT_PALMYRENE, /* Palm */
|
|
G_UNICODE_SCRIPT_PAU_CIN_HAU, /* Pauc */
|
|
G_UNICODE_SCRIPT_PSALTER_PAHLAVI, /* Phlp */
|
|
G_UNICODE_SCRIPT_SIDDHAM, /* Sidd */
|
|
G_UNICODE_SCRIPT_TIRHUTA, /* Tirh */
|
|
G_UNICODE_SCRIPT_WARANG_CITI, /* Wara */
|
|
|
|
/* Unicode 8.0 additions */
|
|
G_UNICODE_SCRIPT_AHOM, /* Ahom */
|
|
G_UNICODE_SCRIPT_ANATOLIAN_HIEROGLYPHS, /* Hluw */
|
|
G_UNICODE_SCRIPT_HATRAN, /* Hatr */
|
|
G_UNICODE_SCRIPT_MULTANI, /* Mult */
|
|
G_UNICODE_SCRIPT_OLD_HUNGARIAN, /* Hung */
|
|
G_UNICODE_SCRIPT_SIGNWRITING, /* Sgnw */
|
|
|
|
/* Unicode 9.0 additions */
|
|
G_UNICODE_SCRIPT_ADLAM, /* Adlm */
|
|
G_UNICODE_SCRIPT_BHAIKSUKI, /* Bhks */
|
|
G_UNICODE_SCRIPT_MARCHEN, /* Marc */
|
|
G_UNICODE_SCRIPT_NEWA, /* Newa */
|
|
G_UNICODE_SCRIPT_OSAGE, /* Osge */
|
|
G_UNICODE_SCRIPT_TANGUT /* Tang */
|
|
} GUnicodeScript;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint32 g_unicode_script_to_iso15924 (GUnicodeScript script);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GUnicodeScript g_unicode_script_from_iso15924 (guint32 iso15924);
|
|
|
|
/* These are all analogs of the <ctype.h> functions.
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_unichar_isalnum (gunichar c) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_unichar_isalpha (gunichar c) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_unichar_iscntrl (gunichar c) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_unichar_isdigit (gunichar c) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_unichar_isgraph (gunichar c) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_unichar_islower (gunichar c) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_unichar_isprint (gunichar c) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_unichar_ispunct (gunichar c) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_unichar_isspace (gunichar c) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_unichar_isupper (gunichar c) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_unichar_isxdigit (gunichar c) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_unichar_istitle (gunichar c) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_unichar_isdefined (gunichar c) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_unichar_iswide (gunichar c) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_unichar_iswide_cjk(gunichar c) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_unichar_iszerowidth(gunichar c) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_unichar_ismark (gunichar c) G_GNUC_CONST;
|
|
|
|
/* More <ctype.h> functions. These convert between the three cases.
|
|
* See the Unicode book to understand title case. */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gunichar g_unichar_toupper (gunichar c) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gunichar g_unichar_tolower (gunichar c) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gunichar g_unichar_totitle (gunichar c) G_GNUC_CONST;
|
|
|
|
/* If C is a digit (according to 'g_unichar_isdigit'), then return its
|
|
numeric value. Otherwise return -1. */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_unichar_digit_value (gunichar c) G_GNUC_CONST;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_unichar_xdigit_value (gunichar c) G_GNUC_CONST;
|
|
|
|
/* Return the Unicode character type of a given character. */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GUnicodeType g_unichar_type (gunichar c) G_GNUC_CONST;
|
|
|
|
/* Return the line break property for a given character */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GUnicodeBreakType g_unichar_break_type (gunichar c) G_GNUC_CONST;
|
|
|
|
/* Returns the combining class for a given character */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_unichar_combining_class (gunichar uc) G_GNUC_CONST;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_unichar_get_mirror_char (gunichar ch,
|
|
gunichar *mirrored_ch);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GUnicodeScript g_unichar_get_script (gunichar ch) G_GNUC_CONST;
|
|
|
|
/* Validate a Unicode character */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_unichar_validate (gunichar ch) G_GNUC_CONST;
|
|
|
|
/* Pairwise canonical compose/decompose */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_unichar_compose (gunichar a,
|
|
gunichar b,
|
|
gunichar *ch);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_unichar_decompose (gunichar ch,
|
|
gunichar *a,
|
|
gunichar *b);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gsize g_unichar_fully_decompose (gunichar ch,
|
|
gboolean compat,
|
|
gunichar *result,
|
|
gsize result_len);
|
|
|
|
/**
|
|
* G_UNICHAR_MAX_DECOMPOSITION_LENGTH:
|
|
*
|
|
* The maximum length (in codepoints) of a compatibility or canonical
|
|
* decomposition of a single Unicode character.
|
|
*
|
|
* This is as defined by Unicode 6.1.
|
|
*
|
|
* Since: 2.32
|
|
*/
|
|
#define G_UNICHAR_MAX_DECOMPOSITION_LENGTH 18 /* codepoints */
|
|
|
|
/* Compute canonical ordering of a string in-place. This rearranges
|
|
decomposed characters in the string according to their combining
|
|
classes. See the Unicode manual for more information. */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_unicode_canonical_ordering (gunichar *string,
|
|
gsize len);
|
|
|
|
|
|
GLIB_DEPRECATED_IN_2_30
|
|
gunichar *g_unicode_canonical_decomposition (gunichar ch,
|
|
gsize *result_len) G_GNUC_MALLOC;
|
|
|
|
/* Array of skip-bytes-per-initial character.
|
|
*/
|
|
GLIB_VAR const gchar * const g_utf8_skip;
|
|
|
|
/**
|
|
* g_utf8_next_char:
|
|
* @p: Pointer to the start of a valid UTF-8 character
|
|
*
|
|
* Skips to the next character in a UTF-8 string. The string must be
|
|
* valid; this macro is as fast as possible, and has no error-checking.
|
|
* You would use this macro to iterate over a string character by
|
|
* character. The macro returns the start of the next UTF-8 character.
|
|
* Before using this macro, use g_utf8_validate() to validate strings
|
|
* that may contain invalid UTF-8.
|
|
*/
|
|
#define g_utf8_next_char(p) (char *)((p) + g_utf8_skip[*(const guchar *)(p)])
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gunichar g_utf8_get_char (const gchar *p) G_GNUC_PURE;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gunichar g_utf8_get_char_validated (const gchar *p,
|
|
gssize max_len) G_GNUC_PURE;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_utf8_offset_to_pointer (const gchar *str,
|
|
glong offset) G_GNUC_PURE;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
glong g_utf8_pointer_to_offset (const gchar *str,
|
|
const gchar *pos) G_GNUC_PURE;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_utf8_prev_char (const gchar *p) G_GNUC_PURE;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_utf8_find_next_char (const gchar *p,
|
|
const gchar *end) G_GNUC_PURE;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_utf8_find_prev_char (const gchar *str,
|
|
const gchar *p) G_GNUC_PURE;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
glong g_utf8_strlen (const gchar *p,
|
|
gssize max) G_GNUC_PURE;
|
|
|
|
GLIB_AVAILABLE_IN_2_30
|
|
gchar *g_utf8_substring (const gchar *str,
|
|
glong start_pos,
|
|
glong end_pos) G_GNUC_MALLOC;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_utf8_strncpy (gchar *dest,
|
|
const gchar *src,
|
|
gsize n);
|
|
|
|
/* Find the UTF-8 character corresponding to ch, in string p. These
|
|
functions are equivalants to strchr and strrchr */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_utf8_strchr (const gchar *p,
|
|
gssize len,
|
|
gunichar c);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_utf8_strrchr (const gchar *p,
|
|
gssize len,
|
|
gunichar c);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_utf8_strreverse (const gchar *str,
|
|
gssize len);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gunichar2 *g_utf8_to_utf16 (const gchar *str,
|
|
glong len,
|
|
glong *items_read,
|
|
glong *items_written,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gunichar * g_utf8_to_ucs4 (const gchar *str,
|
|
glong len,
|
|
glong *items_read,
|
|
glong *items_written,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gunichar * g_utf8_to_ucs4_fast (const gchar *str,
|
|
glong len,
|
|
glong *items_written) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gunichar * g_utf16_to_ucs4 (const gunichar2 *str,
|
|
glong len,
|
|
glong *items_read,
|
|
glong *items_written,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_utf16_to_utf8 (const gunichar2 *str,
|
|
glong len,
|
|
glong *items_read,
|
|
glong *items_written,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gunichar2 *g_ucs4_to_utf16 (const gunichar *str,
|
|
glong len,
|
|
glong *items_read,
|
|
glong *items_written,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_ucs4_to_utf8 (const gunichar *str,
|
|
glong len,
|
|
glong *items_read,
|
|
glong *items_written,
|
|
GError **error) G_GNUC_MALLOC;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_unichar_to_utf8 (gunichar c,
|
|
gchar *outbuf);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_utf8_validate (const gchar *str,
|
|
gssize max_len,
|
|
const gchar **end);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_utf8_strup (const gchar *str,
|
|
gssize len) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_utf8_strdown (const gchar *str,
|
|
gssize len) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_utf8_casefold (const gchar *str,
|
|
gssize len) G_GNUC_MALLOC;
|
|
|
|
/**
|
|
* GNormalizeMode:
|
|
* @G_NORMALIZE_DEFAULT: standardize differences that do not affect the
|
|
* text content, such as the above-mentioned accent representation
|
|
* @G_NORMALIZE_NFD: another name for %G_NORMALIZE_DEFAULT
|
|
* @G_NORMALIZE_DEFAULT_COMPOSE: like %G_NORMALIZE_DEFAULT, but with
|
|
* composed forms rather than a maximally decomposed form
|
|
* @G_NORMALIZE_NFC: another name for %G_NORMALIZE_DEFAULT_COMPOSE
|
|
* @G_NORMALIZE_ALL: beyond %G_NORMALIZE_DEFAULT also standardize the
|
|
* "compatibility" characters in Unicode, such as SUPERSCRIPT THREE
|
|
* to the standard forms (in this case DIGIT THREE). Formatting
|
|
* information may be lost but for most text operations such
|
|
* characters should be considered the same
|
|
* @G_NORMALIZE_NFKD: another name for %G_NORMALIZE_ALL
|
|
* @G_NORMALIZE_ALL_COMPOSE: like %G_NORMALIZE_ALL, but with composed
|
|
* forms rather than a maximally decomposed form
|
|
* @G_NORMALIZE_NFKC: another name for %G_NORMALIZE_ALL_COMPOSE
|
|
*
|
|
* Defines how a Unicode string is transformed in a canonical
|
|
* form, standardizing such issues as whether a character with
|
|
* an accent is represented as a base character and combining
|
|
* accent or as a single precomposed character. Unicode strings
|
|
* should generally be normalized before comparing them.
|
|
*/
|
|
typedef enum {
|
|
G_NORMALIZE_DEFAULT,
|
|
G_NORMALIZE_NFD = G_NORMALIZE_DEFAULT,
|
|
G_NORMALIZE_DEFAULT_COMPOSE,
|
|
G_NORMALIZE_NFC = G_NORMALIZE_DEFAULT_COMPOSE,
|
|
G_NORMALIZE_ALL,
|
|
G_NORMALIZE_NFKD = G_NORMALIZE_ALL,
|
|
G_NORMALIZE_ALL_COMPOSE,
|
|
G_NORMALIZE_NFKC = G_NORMALIZE_ALL_COMPOSE
|
|
} GNormalizeMode;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_utf8_normalize (const gchar *str,
|
|
gssize len,
|
|
GNormalizeMode mode) G_GNUC_MALLOC;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_utf8_collate (const gchar *str1,
|
|
const gchar *str2) G_GNUC_PURE;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_utf8_collate_key (const gchar *str,
|
|
gssize len) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_utf8_collate_key_for_filename (const gchar *str,
|
|
gssize len) G_GNUC_MALLOC;
|
|
|
|
GLIB_AVAILABLE_IN_2_52
|
|
gchar *g_utf8_make_valid (const gchar *str,
|
|
gssize len) G_GNUC_MALLOC;
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_UNICODE_H__ */
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GString GString;
|
|
|
|
struct _GString
|
|
{
|
|
gchar *str;
|
|
gsize len;
|
|
gsize allocated_len;
|
|
};
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GString* g_string_new (const gchar *init);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GString* g_string_new_len (const gchar *init,
|
|
gssize len);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GString* g_string_sized_new (gsize dfl_size);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_string_free (GString *string,
|
|
gboolean free_segment);
|
|
GLIB_AVAILABLE_IN_2_34
|
|
GBytes* g_string_free_to_bytes (GString *string);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_string_equal (const GString *v,
|
|
const GString *v2);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_string_hash (const GString *str);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GString* g_string_assign (GString *string,
|
|
const gchar *rval);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GString* g_string_truncate (GString *string,
|
|
gsize len);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GString* g_string_set_size (GString *string,
|
|
gsize len);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GString* g_string_insert_len (GString *string,
|
|
gssize pos,
|
|
const gchar *val,
|
|
gssize len);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GString* g_string_append (GString *string,
|
|
const gchar *val);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GString* g_string_append_len (GString *string,
|
|
const gchar *val,
|
|
gssize len);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GString* g_string_append_c (GString *string,
|
|
gchar c);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GString* g_string_append_unichar (GString *string,
|
|
gunichar wc);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GString* g_string_prepend (GString *string,
|
|
const gchar *val);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GString* g_string_prepend_c (GString *string,
|
|
gchar c);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GString* g_string_prepend_unichar (GString *string,
|
|
gunichar wc);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GString* g_string_prepend_len (GString *string,
|
|
const gchar *val,
|
|
gssize len);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GString* g_string_insert (GString *string,
|
|
gssize pos,
|
|
const gchar *val);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GString* g_string_insert_c (GString *string,
|
|
gssize pos,
|
|
gchar c);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GString* g_string_insert_unichar (GString *string,
|
|
gssize pos,
|
|
gunichar wc);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GString* g_string_overwrite (GString *string,
|
|
gsize pos,
|
|
const gchar *val);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GString* g_string_overwrite_len (GString *string,
|
|
gsize pos,
|
|
const gchar *val,
|
|
gssize len);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GString* g_string_erase (GString *string,
|
|
gssize pos,
|
|
gssize len);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GString* g_string_ascii_down (GString *string);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GString* g_string_ascii_up (GString *string);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_string_vprintf (GString *string,
|
|
const gchar *format,
|
|
va_list args)
|
|
G_GNUC_PRINTF(2, 0);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_string_printf (GString *string,
|
|
const gchar *format,
|
|
...) G_GNUC_PRINTF (2, 3);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_string_append_vprintf (GString *string,
|
|
const gchar *format,
|
|
va_list args)
|
|
G_GNUC_PRINTF(2, 0);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_string_append_printf (GString *string,
|
|
const gchar *format,
|
|
...) G_GNUC_PRINTF (2, 3);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GString* g_string_append_uri_escaped (GString *string,
|
|
const gchar *unescaped,
|
|
const gchar *reserved_chars_allowed,
|
|
gboolean allow_utf8);
|
|
|
|
/* -- optimize g_strig_append_c --- */
|
|
#ifdef G_CAN_INLINE
|
|
static inline GString*
|
|
g_string_append_c_inline (GString *gstring,
|
|
gchar c)
|
|
{
|
|
if (gstring->len + 1 < gstring->allocated_len)
|
|
{
|
|
gstring->str[gstring->len++] = c;
|
|
gstring->str[gstring->len] = 0;
|
|
}
|
|
else
|
|
g_string_insert_c (gstring, -1, c);
|
|
return gstring;
|
|
}
|
|
#define g_string_append_c(gstr,c) g_string_append_c_inline (gstr, c)
|
|
#endif /* G_CAN_INLINE */
|
|
|
|
|
|
GLIB_DEPRECATED
|
|
GString *g_string_down (GString *string);
|
|
GLIB_DEPRECATED
|
|
GString *g_string_up (GString *string);
|
|
|
|
#ifndef G_DISABLE_DEPRECATED
|
|
#define g_string_sprintf g_string_printf
|
|
#define g_string_sprintfa g_string_append_printf
|
|
#endif
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_STRING_H__ */
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/* GIOChannel
|
|
*/
|
|
|
|
typedef struct _GIOChannel GIOChannel;
|
|
typedef struct _GIOFuncs GIOFuncs;
|
|
|
|
typedef void (* GIOChannelCloseConvertersFunc) (GIOChannel * channel);
|
|
typedef void (* GIOChannelResetConvertersFunc) (GIOChannel * channel);
|
|
|
|
typedef enum
|
|
{
|
|
G_IO_ERROR_NONE,
|
|
G_IO_ERROR_AGAIN,
|
|
G_IO_ERROR_INVAL,
|
|
G_IO_ERROR_UNKNOWN
|
|
} GIOError;
|
|
|
|
#define G_IO_CHANNEL_ERROR g_io_channel_error_quark()
|
|
|
|
typedef enum
|
|
{
|
|
/* Derived from errno */
|
|
G_IO_CHANNEL_ERROR_FBIG,
|
|
G_IO_CHANNEL_ERROR_INVAL,
|
|
G_IO_CHANNEL_ERROR_IO,
|
|
G_IO_CHANNEL_ERROR_ISDIR,
|
|
G_IO_CHANNEL_ERROR_NOSPC,
|
|
G_IO_CHANNEL_ERROR_NXIO,
|
|
G_IO_CHANNEL_ERROR_OVERFLOW,
|
|
G_IO_CHANNEL_ERROR_PIPE,
|
|
/* Other */
|
|
G_IO_CHANNEL_ERROR_FAILED
|
|
} GIOChannelError;
|
|
|
|
typedef enum
|
|
{
|
|
G_IO_STATUS_ERROR,
|
|
G_IO_STATUS_NORMAL,
|
|
G_IO_STATUS_EOF,
|
|
G_IO_STATUS_AGAIN
|
|
} GIOStatus;
|
|
|
|
typedef enum
|
|
{
|
|
G_SEEK_CUR,
|
|
G_SEEK_SET,
|
|
G_SEEK_END
|
|
} GSeekType;
|
|
|
|
typedef enum
|
|
{
|
|
G_IO_FLAG_APPEND = 1 << 0,
|
|
G_IO_FLAG_NONBLOCK = 1 << 1,
|
|
G_IO_FLAG_IS_READABLE = 1 << 2, /* Read only flag */
|
|
G_IO_FLAG_IS_WRITABLE = 1 << 3, /* Read only flag */
|
|
G_IO_FLAG_IS_WRITEABLE = 1 << 3, /* Misspelling in 2.29.10 and earlier */
|
|
G_IO_FLAG_IS_SEEKABLE = 1 << 4, /* Read only flag */
|
|
G_IO_FLAG_MASK = (1 << 5) - 1,
|
|
G_IO_FLAG_GET_MASK = G_IO_FLAG_MASK,
|
|
G_IO_FLAG_SET_MASK = G_IO_FLAG_APPEND | G_IO_FLAG_NONBLOCK
|
|
} GIOFlags;
|
|
|
|
struct _GIOChannel
|
|
{
|
|
/*< private >*/
|
|
gint ref_count;
|
|
GIOFuncs *funcs;
|
|
|
|
gchar *encoding;
|
|
GIConv read_cd;
|
|
GIConv write_cd;
|
|
gchar *line_term; /* String which indicates the end of a line of text */
|
|
guint line_term_len; /* So we can have null in the line term */
|
|
|
|
gsize buf_size;
|
|
GString *read_buf; /* Raw data from the channel */
|
|
GString *encoded_read_buf; /* Channel data converted to UTF-8 */
|
|
GString *write_buf; /* Data ready to be written to the file */
|
|
gchar partial_write_buf[6]; /* UTF-8 partial characters, null terminated */
|
|
|
|
/* Group the flags together, immediately after partial_write_buf, to save memory */
|
|
|
|
guint use_buffer : 1; /* The encoding uses the buffers */
|
|
guint do_encode : 1; /* The encoding uses the GIConv coverters */
|
|
guint close_on_unref : 1; /* Close the channel on final unref */
|
|
guint is_readable : 1; /* Cached GIOFlag */
|
|
guint is_writeable : 1; /* ditto */
|
|
guint is_seekable : 1; /* ditto */
|
|
|
|
GIOChannelCloseConvertersFunc close_converters;
|
|
GIOChannelResetConvertersFunc reset_converters;
|
|
};
|
|
|
|
typedef gboolean (*GIOFunc) (GIOChannel *source,
|
|
GIOCondition condition,
|
|
gpointer data);
|
|
struct _GIOFuncs
|
|
{
|
|
GIOStatus (*io_read) (GIOChannel *channel,
|
|
gchar *buf,
|
|
gsize count,
|
|
gsize *bytes_read,
|
|
GError **err);
|
|
GIOStatus (*io_write) (GIOChannel *channel,
|
|
const gchar *buf,
|
|
gsize count,
|
|
gsize *bytes_written,
|
|
GError **err);
|
|
GIOStatus (*io_seek) (GIOChannel *channel,
|
|
gint64 offset,
|
|
GSeekType type,
|
|
GError **err);
|
|
GIOStatus (*io_close) (GIOChannel *channel,
|
|
GError **err);
|
|
GSource* (*io_create_watch) (GIOChannel *channel,
|
|
GIOCondition condition);
|
|
void (*io_free) (GIOChannel *channel);
|
|
GIOStatus (*io_set_flags) (GIOChannel *channel,
|
|
GIOFlags flags,
|
|
GError **err);
|
|
GIOFlags (*io_get_flags) (GIOChannel *channel);
|
|
};
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_io_channel_init (GIOChannel *channel);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GIOChannel *g_io_channel_ref (GIOChannel *channel);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_io_channel_unref (GIOChannel *channel);
|
|
|
|
GLIB_DEPRECATED_FOR(g_io_channel_read_chars)
|
|
GIOError g_io_channel_read (GIOChannel *channel,
|
|
gchar *buf,
|
|
gsize count,
|
|
gsize *bytes_read);
|
|
|
|
GLIB_DEPRECATED_FOR(g_io_channel_write_chars)
|
|
GIOError g_io_channel_write (GIOChannel *channel,
|
|
const gchar *buf,
|
|
gsize count,
|
|
gsize *bytes_written);
|
|
|
|
GLIB_DEPRECATED_FOR(g_io_channel_seek_position)
|
|
GIOError g_io_channel_seek (GIOChannel *channel,
|
|
gint64 offset,
|
|
GSeekType type);
|
|
|
|
GLIB_DEPRECATED_FOR(g_io_channel_shutdown)
|
|
void g_io_channel_close (GIOChannel *channel);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GIOStatus g_io_channel_shutdown (GIOChannel *channel,
|
|
gboolean flush,
|
|
GError **err);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_io_add_watch_full (GIOChannel *channel,
|
|
gint priority,
|
|
GIOCondition condition,
|
|
GIOFunc func,
|
|
gpointer user_data,
|
|
GDestroyNotify notify);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSource * g_io_create_watch (GIOChannel *channel,
|
|
GIOCondition condition);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_io_add_watch (GIOChannel *channel,
|
|
GIOCondition condition,
|
|
GIOFunc func,
|
|
gpointer user_data);
|
|
|
|
/* character encoding conversion involved functions.
|
|
*/
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_io_channel_set_buffer_size (GIOChannel *channel,
|
|
gsize size);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gsize g_io_channel_get_buffer_size (GIOChannel *channel);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GIOCondition g_io_channel_get_buffer_condition (GIOChannel *channel);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GIOStatus g_io_channel_set_flags (GIOChannel *channel,
|
|
GIOFlags flags,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GIOFlags g_io_channel_get_flags (GIOChannel *channel);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_io_channel_set_line_term (GIOChannel *channel,
|
|
const gchar *line_term,
|
|
gint length);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_io_channel_get_line_term (GIOChannel *channel,
|
|
gint *length);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_io_channel_set_buffered (GIOChannel *channel,
|
|
gboolean buffered);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_io_channel_get_buffered (GIOChannel *channel);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GIOStatus g_io_channel_set_encoding (GIOChannel *channel,
|
|
const gchar *encoding,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_io_channel_get_encoding (GIOChannel *channel);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_io_channel_set_close_on_unref (GIOChannel *channel,
|
|
gboolean do_close);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_io_channel_get_close_on_unref (GIOChannel *channel);
|
|
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GIOStatus g_io_channel_flush (GIOChannel *channel,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GIOStatus g_io_channel_read_line (GIOChannel *channel,
|
|
gchar **str_return,
|
|
gsize *length,
|
|
gsize *terminator_pos,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GIOStatus g_io_channel_read_line_string (GIOChannel *channel,
|
|
GString *buffer,
|
|
gsize *terminator_pos,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GIOStatus g_io_channel_read_to_end (GIOChannel *channel,
|
|
gchar **str_return,
|
|
gsize *length,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GIOStatus g_io_channel_read_chars (GIOChannel *channel,
|
|
gchar *buf,
|
|
gsize count,
|
|
gsize *bytes_read,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GIOStatus g_io_channel_read_unichar (GIOChannel *channel,
|
|
gunichar *thechar,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GIOStatus g_io_channel_write_chars (GIOChannel *channel,
|
|
const gchar *buf,
|
|
gssize count,
|
|
gsize *bytes_written,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GIOStatus g_io_channel_write_unichar (GIOChannel *channel,
|
|
gunichar thechar,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GIOStatus g_io_channel_seek_position (GIOChannel *channel,
|
|
gint64 offset,
|
|
GSeekType type,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GIOChannel* g_io_channel_new_file (const gchar *filename,
|
|
const gchar *mode,
|
|
GError **error);
|
|
|
|
/* Error handling */
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GQuark g_io_channel_error_quark (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GIOChannelError g_io_channel_error_from_errno (gint en);
|
|
|
|
/* On Unix, IO channels created with this function for any file
|
|
* descriptor or socket.
|
|
*
|
|
* On Win32, this can be used either for files opened with the MSVCRT
|
|
* (the Microsoft run-time C library) _open() or _pipe, including file
|
|
* descriptors 0, 1 and 2 (corresponding to stdin, stdout and stderr),
|
|
* or for Winsock SOCKETs. If the parameter is a legal file
|
|
* descriptor, it is assumed to be such, otherwise it should be a
|
|
* SOCKET. This relies on SOCKETs and file descriptors not
|
|
* overlapping. If you want to be certain, call either
|
|
* g_io_channel_win32_new_fd() or g_io_channel_win32_new_socket()
|
|
* instead as appropriate.
|
|
*
|
|
* The term file descriptor as used in the context of Win32 refers to
|
|
* the emulated Unix-like file descriptors MSVCRT provides. The native
|
|
* corresponding concept is file HANDLE. There isn't as of yet a way to
|
|
* get GIOChannels for Win32 file HANDLEs.
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GIOChannel* g_io_channel_unix_new (int fd);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_io_channel_unix_get_fd (GIOChannel *channel);
|
|
|
|
|
|
/* Hook for GClosure / GSource integration. Don't touch */
|
|
GLIB_VAR GSourceFuncs g_io_watch_funcs;
|
|
|
|
#ifdef G_OS_WIN32
|
|
|
|
/* You can use this "pseudo file descriptor" in a GPollFD to add
|
|
* polling for Windows messages. GTK applications should not do that.
|
|
*/
|
|
|
|
#define G_WIN32_MSG_HANDLE 19981206
|
|
|
|
/* Use this to get a GPollFD from a GIOChannel, so that you can call
|
|
* g_io_channel_win32_poll(). After calling this you should only use
|
|
* g_io_channel_read() to read from the GIOChannel, i.e. never read()
|
|
* from the underlying file descriptor. For SOCKETs, it is possible to call
|
|
* recv().
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_io_channel_win32_make_pollfd (GIOChannel *channel,
|
|
GIOCondition condition,
|
|
GPollFD *fd);
|
|
|
|
/* This can be used to wait a until at least one of the channels is readable.
|
|
* On Unix you would do a select() on the file descriptors of the channels.
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_io_channel_win32_poll (GPollFD *fds,
|
|
gint n_fds,
|
|
gint timeout_);
|
|
|
|
/* Create an IO channel for Windows messages for window handle hwnd. */
|
|
#if GLIB_SIZEOF_VOID_P == 8
|
|
/* We use gsize here so that it is still an integer type and not a
|
|
* pointer, like the guint in the traditional prototype. We can't use
|
|
* intptr_t as that is not portable enough.
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GIOChannel *g_io_channel_win32_new_messages (gsize hwnd);
|
|
#else
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GIOChannel *g_io_channel_win32_new_messages (guint hwnd);
|
|
#endif
|
|
|
|
/* Create an IO channel for C runtime (emulated Unix-like) file
|
|
* descriptors. After calling g_io_add_watch() on a IO channel
|
|
* returned by this function, you shouldn't call read() on the file
|
|
* descriptor. This is because adding polling for a file descriptor is
|
|
* implemented on Win32 by starting a thread that sits blocked in a
|
|
* read() from the file descriptor most of the time. All reads from
|
|
* the file descriptor should be done by this internal GLib
|
|
* thread. Your code should call only g_io_channel_read_chars().
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GIOChannel* g_io_channel_win32_new_fd (gint fd);
|
|
|
|
/* Get the C runtime file descriptor of a channel. */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_io_channel_win32_get_fd (GIOChannel *channel);
|
|
|
|
/* Create an IO channel for a winsock socket. The parameter should be
|
|
* a SOCKET. Contrary to IO channels for file descriptors (on *Win32),
|
|
* you can use normal recv() or recvfrom() on sockets even if GLib
|
|
* is polling them.
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GIOChannel *g_io_channel_win32_new_socket (gint socket);
|
|
|
|
GLIB_DEPRECATED_FOR(g_io_channel_win32_new_socket)
|
|
GIOChannel *g_io_channel_win32_new_stream_socket (gint socket);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_io_channel_win32_set_debug (GIOChannel *channel,
|
|
gboolean flag);
|
|
|
|
#endif
|
|
|
|
#ifndef __GTK_DOC_IGNORE__
|
|
#ifdef G_OS_WIN32
|
|
#define g_io_channel_new_file g_io_channel_new_file_utf8
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GIOChannel *g_io_channel_new_file_utf8 (const gchar *filename,
|
|
const gchar *mode,
|
|
GError **error);
|
|
#endif
|
|
#endif /* __GTK_DOC_IGNORE__ */
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_IOCHANNEL_H__ */
|
|
/* gkeyfile.h - desktop entry file parser
|
|
*
|
|
* Copyright 2004 Red Hat, Inc.
|
|
*
|
|
* Ray Strode <halfline@hawaii.rr.com>
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __G_KEY_FILE_H__
|
|
#define __G_KEY_FILE_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef enum
|
|
{
|
|
G_KEY_FILE_ERROR_UNKNOWN_ENCODING,
|
|
G_KEY_FILE_ERROR_PARSE,
|
|
G_KEY_FILE_ERROR_NOT_FOUND,
|
|
G_KEY_FILE_ERROR_KEY_NOT_FOUND,
|
|
G_KEY_FILE_ERROR_GROUP_NOT_FOUND,
|
|
G_KEY_FILE_ERROR_INVALID_VALUE
|
|
} GKeyFileError;
|
|
|
|
#define G_KEY_FILE_ERROR g_key_file_error_quark()
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GQuark g_key_file_error_quark (void);
|
|
|
|
typedef struct _GKeyFile GKeyFile;
|
|
|
|
typedef enum
|
|
{
|
|
G_KEY_FILE_NONE = 0,
|
|
G_KEY_FILE_KEEP_COMMENTS = 1 << 0,
|
|
G_KEY_FILE_KEEP_TRANSLATIONS = 1 << 1
|
|
} GKeyFileFlags;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GKeyFile *g_key_file_new (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GKeyFile *g_key_file_ref (GKeyFile *key_file);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_key_file_unref (GKeyFile *key_file);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_key_file_free (GKeyFile *key_file);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_key_file_set_list_separator (GKeyFile *key_file,
|
|
gchar separator);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_key_file_load_from_file (GKeyFile *key_file,
|
|
const gchar *file,
|
|
GKeyFileFlags flags,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_key_file_load_from_data (GKeyFile *key_file,
|
|
const gchar *data,
|
|
gsize length,
|
|
GKeyFileFlags flags,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_2_50
|
|
gboolean g_key_file_load_from_bytes (GKeyFile *key_file,
|
|
GBytes *bytes,
|
|
GKeyFileFlags flags,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_key_file_load_from_dirs (GKeyFile *key_file,
|
|
const gchar *file,
|
|
const gchar **search_dirs,
|
|
gchar **full_path,
|
|
GKeyFileFlags flags,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_key_file_load_from_data_dirs (GKeyFile *key_file,
|
|
const gchar *file,
|
|
gchar **full_path,
|
|
GKeyFileFlags flags,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_key_file_to_data (GKeyFile *key_file,
|
|
gsize *length,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_2_40
|
|
gboolean g_key_file_save_to_file (GKeyFile *key_file,
|
|
const gchar *filename,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_key_file_get_start_group (GKeyFile *key_file) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar **g_key_file_get_groups (GKeyFile *key_file,
|
|
gsize *length) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar **g_key_file_get_keys (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
gsize *length,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_key_file_has_group (GKeyFile *key_file,
|
|
const gchar *group_name);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_key_file_has_key (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_key_file_get_value (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_key_file_set_value (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
const gchar *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_key_file_get_string (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_key_file_set_string (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
const gchar *string);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_key_file_get_locale_string (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
const gchar *locale,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_key_file_set_locale_string (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
const gchar *locale,
|
|
const gchar *string);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_key_file_get_boolean (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_key_file_set_boolean (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
gboolean value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_key_file_get_integer (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_key_file_set_integer (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
gint value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint64 g_key_file_get_int64 (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_key_file_set_int64 (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
gint64 value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint64 g_key_file_get_uint64 (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_key_file_set_uint64 (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
guint64 value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gdouble g_key_file_get_double (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_key_file_set_double (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
gdouble value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar **g_key_file_get_string_list (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
gsize *length,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_key_file_set_string_list (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
const gchar * const list[],
|
|
gsize length);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar **g_key_file_get_locale_string_list (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
const gchar *locale,
|
|
gsize *length,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_key_file_set_locale_string_list (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
const gchar *locale,
|
|
const gchar * const list[],
|
|
gsize length);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean *g_key_file_get_boolean_list (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
gsize *length,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_key_file_set_boolean_list (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
gboolean list[],
|
|
gsize length);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint *g_key_file_get_integer_list (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
gsize *length,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_key_file_set_double_list (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
gdouble list[],
|
|
gsize length);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gdouble *g_key_file_get_double_list (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
gsize *length,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_key_file_set_integer_list (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
gint list[],
|
|
gsize length);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_key_file_set_comment (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
const gchar *comment,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_key_file_get_comment (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
GError **error) G_GNUC_MALLOC;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_key_file_remove_comment (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_key_file_remove_key (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
const gchar *key,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_key_file_remove_group (GKeyFile *key_file,
|
|
const gchar *group_name,
|
|
GError **error);
|
|
|
|
/* Defines for handling freedesktop.org Desktop files */
|
|
#define G_KEY_FILE_DESKTOP_GROUP "Desktop Entry"
|
|
|
|
#define G_KEY_FILE_DESKTOP_KEY_TYPE "Type"
|
|
#define G_KEY_FILE_DESKTOP_KEY_VERSION "Version"
|
|
#define G_KEY_FILE_DESKTOP_KEY_NAME "Name"
|
|
#define G_KEY_FILE_DESKTOP_KEY_GENERIC_NAME "GenericName"
|
|
#define G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY "NoDisplay"
|
|
#define G_KEY_FILE_DESKTOP_KEY_COMMENT "Comment"
|
|
#define G_KEY_FILE_DESKTOP_KEY_ICON "Icon"
|
|
#define G_KEY_FILE_DESKTOP_KEY_HIDDEN "Hidden"
|
|
#define G_KEY_FILE_DESKTOP_KEY_ONLY_SHOW_IN "OnlyShowIn"
|
|
#define G_KEY_FILE_DESKTOP_KEY_NOT_SHOW_IN "NotShowIn"
|
|
#define G_KEY_FILE_DESKTOP_KEY_TRY_EXEC "TryExec"
|
|
#define G_KEY_FILE_DESKTOP_KEY_EXEC "Exec"
|
|
#define G_KEY_FILE_DESKTOP_KEY_PATH "Path"
|
|
#define G_KEY_FILE_DESKTOP_KEY_TERMINAL "Terminal"
|
|
#define G_KEY_FILE_DESKTOP_KEY_MIME_TYPE "MimeType"
|
|
#define G_KEY_FILE_DESKTOP_KEY_CATEGORIES "Categories"
|
|
#define G_KEY_FILE_DESKTOP_KEY_STARTUP_NOTIFY "StartupNotify"
|
|
#define G_KEY_FILE_DESKTOP_KEY_STARTUP_WM_CLASS "StartupWMClass"
|
|
#define G_KEY_FILE_DESKTOP_KEY_URL "URL"
|
|
#define G_KEY_FILE_DESKTOP_KEY_DBUS_ACTIVATABLE "DBusActivatable"
|
|
#define G_KEY_FILE_DESKTOP_KEY_ACTIONS "Actions"
|
|
|
|
#define G_KEY_FILE_DESKTOP_TYPE_APPLICATION "Application"
|
|
#define G_KEY_FILE_DESKTOP_TYPE_LINK "Link"
|
|
#define G_KEY_FILE_DESKTOP_TYPE_DIRECTORY "Directory"
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_KEY_FILE_H__ */
|
|
/* GLIB - Library of useful routines for C programming
|
|
* gmappedfile.h: Simplified wrapper around the mmap function
|
|
*
|
|
* Copyright 2005 Matthias Clasen
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __G_MAPPED_FILE_H__
|
|
#define __G_MAPPED_FILE_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GMappedFile GMappedFile;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GMappedFile *g_mapped_file_new (const gchar *filename,
|
|
gboolean writable,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GMappedFile *g_mapped_file_new_from_fd (gint fd,
|
|
gboolean writable,
|
|
GError **error) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gsize g_mapped_file_get_length (GMappedFile *file);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_mapped_file_get_contents (GMappedFile *file);
|
|
GLIB_AVAILABLE_IN_2_34
|
|
GBytes * g_mapped_file_get_bytes (GMappedFile *file);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GMappedFile *g_mapped_file_ref (GMappedFile *file);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_mapped_file_unref (GMappedFile *file);
|
|
|
|
GLIB_DEPRECATED_FOR(g_mapped_file_unref)
|
|
void g_mapped_file_free (GMappedFile *file);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_MAPPED_FILE_H__ */
|
|
/* gmarkup.h - Simple XML-like string parser/writer
|
|
*
|
|
* Copyright 2000 Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __G_MARKUP_H__
|
|
#define __G_MARKUP_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
#include <stdarg.h>
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/**
|
|
* GMarkupError:
|
|
* @G_MARKUP_ERROR_BAD_UTF8: text being parsed was not valid UTF-8
|
|
* @G_MARKUP_ERROR_EMPTY: document contained nothing, or only whitespace
|
|
* @G_MARKUP_ERROR_PARSE: document was ill-formed
|
|
* @G_MARKUP_ERROR_UNKNOWN_ELEMENT: error should be set by #GMarkupParser
|
|
* functions; element wasn't known
|
|
* @G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE: error should be set by #GMarkupParser
|
|
* functions; attribute wasn't known
|
|
* @G_MARKUP_ERROR_INVALID_CONTENT: error should be set by #GMarkupParser
|
|
* functions; content was invalid
|
|
* @G_MARKUP_ERROR_MISSING_ATTRIBUTE: error should be set by #GMarkupParser
|
|
* functions; a required attribute was missing
|
|
*
|
|
* Error codes returned by markup parsing.
|
|
*/
|
|
typedef enum
|
|
{
|
|
G_MARKUP_ERROR_BAD_UTF8,
|
|
G_MARKUP_ERROR_EMPTY,
|
|
G_MARKUP_ERROR_PARSE,
|
|
/* The following are primarily intended for specific GMarkupParser
|
|
* implementations to set.
|
|
*/
|
|
G_MARKUP_ERROR_UNKNOWN_ELEMENT,
|
|
G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE,
|
|
G_MARKUP_ERROR_INVALID_CONTENT,
|
|
G_MARKUP_ERROR_MISSING_ATTRIBUTE
|
|
} GMarkupError;
|
|
|
|
/**
|
|
* G_MARKUP_ERROR:
|
|
*
|
|
* Error domain for markup parsing.
|
|
* Errors in this domain will be from the #GMarkupError enumeration.
|
|
* See #GError for information on error domains.
|
|
*/
|
|
#define G_MARKUP_ERROR g_markup_error_quark ()
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GQuark g_markup_error_quark (void);
|
|
|
|
/**
|
|
* GMarkupParseFlags:
|
|
* @G_MARKUP_DO_NOT_USE_THIS_UNSUPPORTED_FLAG: flag you should not use
|
|
* @G_MARKUP_TREAT_CDATA_AS_TEXT: When this flag is set, CDATA marked
|
|
* sections are not passed literally to the @passthrough function of
|
|
* the parser. Instead, the content of the section (without the
|
|
* `<![CDATA[` and `]]>`) is
|
|
* passed to the @text function. This flag was added in GLib 2.12
|
|
* @G_MARKUP_PREFIX_ERROR_POSITION: Normally errors caught by GMarkup
|
|
* itself have line/column information prefixed to them to let the
|
|
* caller know the location of the error. When this flag is set the
|
|
* location information is also prefixed to errors generated by the
|
|
* #GMarkupParser implementation functions
|
|
* @G_MARKUP_IGNORE_QUALIFIED: Ignore (don't report) qualified
|
|
* attributes and tags, along with their contents. A qualified
|
|
* attribute or tag is one that contains ':' in its name (ie: is in
|
|
* another namespace). Since: 2.40.
|
|
*
|
|
* Flags that affect the behaviour of the parser.
|
|
*/
|
|
typedef enum
|
|
{
|
|
G_MARKUP_DO_NOT_USE_THIS_UNSUPPORTED_FLAG = 1 << 0,
|
|
G_MARKUP_TREAT_CDATA_AS_TEXT = 1 << 1,
|
|
G_MARKUP_PREFIX_ERROR_POSITION = 1 << 2,
|
|
G_MARKUP_IGNORE_QUALIFIED = 1 << 3
|
|
} GMarkupParseFlags;
|
|
|
|
/**
|
|
* GMarkupParseContext:
|
|
*
|
|
* A parse context is used to parse a stream of bytes that
|
|
* you expect to contain marked-up text.
|
|
*
|
|
* See g_markup_parse_context_new(), #GMarkupParser, and so
|
|
* on for more details.
|
|
*/
|
|
typedef struct _GMarkupParseContext GMarkupParseContext;
|
|
typedef struct _GMarkupParser GMarkupParser;
|
|
|
|
/**
|
|
* GMarkupParser:
|
|
* @start_element: Callback to invoke when the opening tag of an element
|
|
* is seen. The callback's @attribute_names and @attribute_values parameters
|
|
* are %NULL-terminated.
|
|
* @end_element: Callback to invoke when the closing tag of an element
|
|
* is seen. Note that this is also called for empty tags like
|
|
* `<empty/>`.
|
|
* @text: Callback to invoke when some text is seen (text is always
|
|
* inside an element). Note that the text of an element may be spread
|
|
* over multiple calls of this function. If the
|
|
* %G_MARKUP_TREAT_CDATA_AS_TEXT flag is set, this function is also
|
|
* called for the content of CDATA marked sections.
|
|
* @passthrough: Callback to invoke for comments, processing instructions
|
|
* and doctype declarations; if you're re-writing the parsed document,
|
|
* write the passthrough text back out in the same position. If the
|
|
* %G_MARKUP_TREAT_CDATA_AS_TEXT flag is not set, this function is also
|
|
* called for CDATA marked sections.
|
|
* @error: Callback to invoke when an error occurs.
|
|
*
|
|
* Any of the fields in #GMarkupParser can be %NULL, in which case they
|
|
* will be ignored. Except for the @error function, any of these callbacks
|
|
* can set an error; in particular the %G_MARKUP_ERROR_UNKNOWN_ELEMENT,
|
|
* %G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, and %G_MARKUP_ERROR_INVALID_CONTENT
|
|
* errors are intended to be set from these callbacks. If you set an error
|
|
* from a callback, g_markup_parse_context_parse() will report that error
|
|
* back to its caller.
|
|
*/
|
|
struct _GMarkupParser
|
|
{
|
|
/* Called for open tags <foo bar="baz"> */
|
|
void (*start_element) (GMarkupParseContext *context,
|
|
const gchar *element_name,
|
|
const gchar **attribute_names,
|
|
const gchar **attribute_values,
|
|
gpointer user_data,
|
|
GError **error);
|
|
|
|
/* Called for close tags </foo> */
|
|
void (*end_element) (GMarkupParseContext *context,
|
|
const gchar *element_name,
|
|
gpointer user_data,
|
|
GError **error);
|
|
|
|
/* Called for character data */
|
|
/* text is not nul-terminated */
|
|
void (*text) (GMarkupParseContext *context,
|
|
const gchar *text,
|
|
gsize text_len,
|
|
gpointer user_data,
|
|
GError **error);
|
|
|
|
/* Called for strings that should be re-saved verbatim in this same
|
|
* position, but are not otherwise interpretable. At the moment
|
|
* this includes comments and processing instructions.
|
|
*/
|
|
/* text is not nul-terminated. */
|
|
void (*passthrough) (GMarkupParseContext *context,
|
|
const gchar *passthrough_text,
|
|
gsize text_len,
|
|
gpointer user_data,
|
|
GError **error);
|
|
|
|
/* Called on error, including one set by other
|
|
* methods in the vtable. The GError should not be freed.
|
|
*/
|
|
void (*error) (GMarkupParseContext *context,
|
|
GError *error,
|
|
gpointer user_data);
|
|
};
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GMarkupParseContext *g_markup_parse_context_new (const GMarkupParser *parser,
|
|
GMarkupParseFlags flags,
|
|
gpointer user_data,
|
|
GDestroyNotify user_data_dnotify);
|
|
GLIB_AVAILABLE_IN_2_36
|
|
GMarkupParseContext *g_markup_parse_context_ref (GMarkupParseContext *context);
|
|
GLIB_AVAILABLE_IN_2_36
|
|
void g_markup_parse_context_unref (GMarkupParseContext *context);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_markup_parse_context_free (GMarkupParseContext *context);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_markup_parse_context_parse (GMarkupParseContext *context,
|
|
const gchar *text,
|
|
gssize text_len,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_markup_parse_context_push (GMarkupParseContext *context,
|
|
const GMarkupParser *parser,
|
|
gpointer user_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_markup_parse_context_pop (GMarkupParseContext *context);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_markup_parse_context_end_parse (GMarkupParseContext *context,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_markup_parse_context_get_element (GMarkupParseContext *context);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const GSList * g_markup_parse_context_get_element_stack (GMarkupParseContext *context);
|
|
|
|
/* For user-constructed error messages, has no precise semantics */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_markup_parse_context_get_position (GMarkupParseContext *context,
|
|
gint *line_number,
|
|
gint *char_number);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_markup_parse_context_get_user_data (GMarkupParseContext *context);
|
|
|
|
/* useful when saving */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_markup_escape_text (const gchar *text,
|
|
gssize length);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_markup_printf_escaped (const char *format,
|
|
...) G_GNUC_PRINTF (1, 2);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_markup_vprintf_escaped (const char *format,
|
|
va_list args) G_GNUC_PRINTF(1, 0);
|
|
|
|
typedef enum
|
|
{
|
|
G_MARKUP_COLLECT_INVALID,
|
|
G_MARKUP_COLLECT_STRING,
|
|
G_MARKUP_COLLECT_STRDUP,
|
|
G_MARKUP_COLLECT_BOOLEAN,
|
|
G_MARKUP_COLLECT_TRISTATE,
|
|
|
|
G_MARKUP_COLLECT_OPTIONAL = (1 << 16)
|
|
} GMarkupCollectType;
|
|
|
|
|
|
/* useful from start_element */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_markup_collect_attributes (const gchar *element_name,
|
|
const gchar **attribute_names,
|
|
const gchar **attribute_values,
|
|
GError **error,
|
|
GMarkupCollectType first_type,
|
|
const gchar *first_attr,
|
|
...);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_MARKUP_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_MESSAGES_H__
|
|
#define __G_MESSAGES_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
#include <stdarg.h>
|
|
/*
|
|
* Copyright © 2007, 2008 Ryan Lortie
|
|
* Copyright © 2009, 2010 Codethink Limited
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the licence, 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* Author: Ryan Lortie <desrt@desrt.ca>
|
|
*/
|
|
|
|
#ifndef __G_VARIANT_H__
|
|
#define __G_VARIANT_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
/*
|
|
* Copyright © 2007, 2008 Ryan Lortie
|
|
* Copyright © 2009, 2010 Codethink Limited
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the licence, 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* Author: Ryan Lortie <desrt@desrt.ca>
|
|
*/
|
|
|
|
#ifndef __G_VARIANT_TYPE_H__
|
|
#define __G_VARIANT_TYPE_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/**
|
|
* GVariantType:
|
|
*
|
|
* A type in the GVariant type system.
|
|
*
|
|
* Two types may not be compared by value; use g_variant_type_equal() or
|
|
* g_variant_type_is_subtype_of(). May be copied using
|
|
* g_variant_type_copy() and freed using g_variant_type_free().
|
|
**/
|
|
typedef struct _GVariantType GVariantType;
|
|
|
|
/**
|
|
* G_VARIANT_TYPE_BOOLEAN:
|
|
*
|
|
* The type of a value that can be either %TRUE or %FALSE.
|
|
**/
|
|
#define G_VARIANT_TYPE_BOOLEAN ((const GVariantType *) "b")
|
|
|
|
/**
|
|
* G_VARIANT_TYPE_BYTE:
|
|
*
|
|
* The type of an integer value that can range from 0 to 255.
|
|
**/
|
|
#define G_VARIANT_TYPE_BYTE ((const GVariantType *) "y")
|
|
|
|
/**
|
|
* G_VARIANT_TYPE_INT16:
|
|
*
|
|
* The type of an integer value that can range from -32768 to 32767.
|
|
**/
|
|
#define G_VARIANT_TYPE_INT16 ((const GVariantType *) "n")
|
|
|
|
/**
|
|
* G_VARIANT_TYPE_UINT16:
|
|
*
|
|
* The type of an integer value that can range from 0 to 65535.
|
|
* There were about this many people living in Toronto in the 1870s.
|
|
**/
|
|
#define G_VARIANT_TYPE_UINT16 ((const GVariantType *) "q")
|
|
|
|
/**
|
|
* G_VARIANT_TYPE_INT32:
|
|
*
|
|
* The type of an integer value that can range from -2147483648 to
|
|
* 2147483647.
|
|
**/
|
|
#define G_VARIANT_TYPE_INT32 ((const GVariantType *) "i")
|
|
|
|
/**
|
|
* G_VARIANT_TYPE_UINT32:
|
|
*
|
|
* The type of an integer value that can range from 0 to 4294967295.
|
|
* That's one number for everyone who was around in the late 1970s.
|
|
**/
|
|
#define G_VARIANT_TYPE_UINT32 ((const GVariantType *) "u")
|
|
|
|
/**
|
|
* G_VARIANT_TYPE_INT64:
|
|
*
|
|
* The type of an integer value that can range from
|
|
* -9223372036854775808 to 9223372036854775807.
|
|
**/
|
|
#define G_VARIANT_TYPE_INT64 ((const GVariantType *) "x")
|
|
|
|
/**
|
|
* G_VARIANT_TYPE_UINT64:
|
|
*
|
|
* The type of an integer value that can range from 0 to
|
|
* 18446744073709551616. That's a really big number, but a Rubik's
|
|
* cube can have a bit more than twice as many possible positions.
|
|
**/
|
|
#define G_VARIANT_TYPE_UINT64 ((const GVariantType *) "t")
|
|
|
|
/**
|
|
* G_VARIANT_TYPE_DOUBLE:
|
|
*
|
|
* The type of a double precision IEEE754 floating point number.
|
|
* These guys go up to about 1.80e308 (plus and minus) but miss out on
|
|
* some numbers in between. In any case, that's far greater than the
|
|
* estimated number of fundamental particles in the observable
|
|
* universe.
|
|
**/
|
|
#define G_VARIANT_TYPE_DOUBLE ((const GVariantType *) "d")
|
|
|
|
/**
|
|
* G_VARIANT_TYPE_STRING:
|
|
*
|
|
* The type of a string. "" is a string. %NULL is not a string.
|
|
**/
|
|
#define G_VARIANT_TYPE_STRING ((const GVariantType *) "s")
|
|
|
|
/**
|
|
* G_VARIANT_TYPE_OBJECT_PATH:
|
|
*
|
|
* The type of a D-Bus object reference. These are strings of a
|
|
* specific format used to identify objects at a given destination on
|
|
* the bus.
|
|
*
|
|
* If you are not interacting with D-Bus, then there is no reason to make
|
|
* use of this type. If you are, then the D-Bus specification contains a
|
|
* precise description of valid object paths.
|
|
**/
|
|
#define G_VARIANT_TYPE_OBJECT_PATH ((const GVariantType *) "o")
|
|
|
|
/**
|
|
* G_VARIANT_TYPE_SIGNATURE:
|
|
*
|
|
* The type of a D-Bus type signature. These are strings of a specific
|
|
* format used as type signatures for D-Bus methods and messages.
|
|
*
|
|
* If you are not interacting with D-Bus, then there is no reason to make
|
|
* use of this type. If you are, then the D-Bus specification contains a
|
|
* precise description of valid signature strings.
|
|
**/
|
|
#define G_VARIANT_TYPE_SIGNATURE ((const GVariantType *) "g")
|
|
|
|
/**
|
|
* G_VARIANT_TYPE_VARIANT:
|
|
*
|
|
* The type of a box that contains any other value (including another
|
|
* variant).
|
|
**/
|
|
#define G_VARIANT_TYPE_VARIANT ((const GVariantType *) "v")
|
|
|
|
/**
|
|
* G_VARIANT_TYPE_HANDLE:
|
|
*
|
|
* The type of a 32bit signed integer value, that by convention, is used
|
|
* as an index into an array of file descriptors that are sent alongside
|
|
* a D-Bus message.
|
|
*
|
|
* If you are not interacting with D-Bus, then there is no reason to make
|
|
* use of this type.
|
|
**/
|
|
#define G_VARIANT_TYPE_HANDLE ((const GVariantType *) "h")
|
|
|
|
/**
|
|
* G_VARIANT_TYPE_UNIT:
|
|
*
|
|
* The empty tuple type. Has only one instance. Known also as "triv"
|
|
* or "void".
|
|
**/
|
|
#define G_VARIANT_TYPE_UNIT ((const GVariantType *) "()")
|
|
|
|
/**
|
|
* G_VARIANT_TYPE_ANY:
|
|
*
|
|
* An indefinite type that is a supertype of every type (including
|
|
* itself).
|
|
**/
|
|
#define G_VARIANT_TYPE_ANY ((const GVariantType *) "*")
|
|
|
|
/**
|
|
* G_VARIANT_TYPE_BASIC:
|
|
*
|
|
* An indefinite type that is a supertype of every basic (ie:
|
|
* non-container) type.
|
|
**/
|
|
#define G_VARIANT_TYPE_BASIC ((const GVariantType *) "?")
|
|
|
|
/**
|
|
* G_VARIANT_TYPE_MAYBE:
|
|
*
|
|
* An indefinite type that is a supertype of every maybe type.
|
|
**/
|
|
#define G_VARIANT_TYPE_MAYBE ((const GVariantType *) "m*")
|
|
|
|
/**
|
|
* G_VARIANT_TYPE_ARRAY:
|
|
*
|
|
* An indefinite type that is a supertype of every array type.
|
|
**/
|
|
#define G_VARIANT_TYPE_ARRAY ((const GVariantType *) "a*")
|
|
|
|
/**
|
|
* G_VARIANT_TYPE_TUPLE:
|
|
*
|
|
* An indefinite type that is a supertype of every tuple type,
|
|
* regardless of the number of items in the tuple.
|
|
**/
|
|
#define G_VARIANT_TYPE_TUPLE ((const GVariantType *) "r")
|
|
|
|
/**
|
|
* G_VARIANT_TYPE_DICT_ENTRY:
|
|
*
|
|
* An indefinite type that is a supertype of every dictionary entry
|
|
* type.
|
|
**/
|
|
#define G_VARIANT_TYPE_DICT_ENTRY ((const GVariantType *) "{?*}")
|
|
|
|
/**
|
|
* G_VARIANT_TYPE_DICTIONARY:
|
|
*
|
|
* An indefinite type that is a supertype of every dictionary type --
|
|
* that is, any array type that has an element type equal to any
|
|
* dictionary entry type.
|
|
**/
|
|
#define G_VARIANT_TYPE_DICTIONARY ((const GVariantType *) "a{?*}")
|
|
|
|
/**
|
|
* G_VARIANT_TYPE_STRING_ARRAY:
|
|
*
|
|
* The type of an array of strings.
|
|
**/
|
|
#define G_VARIANT_TYPE_STRING_ARRAY ((const GVariantType *) "as")
|
|
|
|
/**
|
|
* G_VARIANT_TYPE_OBJECT_PATH_ARRAY:
|
|
*
|
|
* The type of an array of object paths.
|
|
**/
|
|
#define G_VARIANT_TYPE_OBJECT_PATH_ARRAY ((const GVariantType *) "ao")
|
|
|
|
/**
|
|
* G_VARIANT_TYPE_BYTESTRING:
|
|
*
|
|
* The type of an array of bytes. This type is commonly used to pass
|
|
* around strings that may not be valid utf8. In that case, the
|
|
* convention is that the nul terminator character should be included as
|
|
* the last character in the array.
|
|
**/
|
|
#define G_VARIANT_TYPE_BYTESTRING ((const GVariantType *) "ay")
|
|
|
|
/**
|
|
* G_VARIANT_TYPE_BYTESTRING_ARRAY:
|
|
*
|
|
* The type of an array of byte strings (an array of arrays of bytes).
|
|
**/
|
|
#define G_VARIANT_TYPE_BYTESTRING_ARRAY ((const GVariantType *) "aay")
|
|
|
|
/**
|
|
* G_VARIANT_TYPE_VARDICT:
|
|
*
|
|
* The type of a dictionary mapping strings to variants (the ubiquitous
|
|
* "a{sv}" type).
|
|
*
|
|
* Since: 2.30
|
|
**/
|
|
#define G_VARIANT_TYPE_VARDICT ((const GVariantType *) "a{sv}")
|
|
|
|
|
|
/**
|
|
* G_VARIANT_TYPE:
|
|
* @type_string: a well-formed #GVariantType type string
|
|
*
|
|
* Converts a string to a const #GVariantType. Depending on the
|
|
* current debugging level, this function may perform a runtime check
|
|
* to ensure that @string is a valid GVariant type string.
|
|
*
|
|
* It is always a programmer error to use this macro with an invalid
|
|
* type string. If in doubt, use g_variant_type_string_is_valid() to
|
|
* check if the string is valid.
|
|
*
|
|
* Since 2.24
|
|
**/
|
|
#ifndef G_DISABLE_CHECKS
|
|
# define G_VARIANT_TYPE(type_string) (g_variant_type_checked_ ((type_string)))
|
|
#else
|
|
# define G_VARIANT_TYPE(type_string) ((const GVariantType *) (type_string))
|
|
#endif
|
|
|
|
/* type string checking */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_variant_type_string_is_valid (const gchar *type_string);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_variant_type_string_scan (const gchar *string,
|
|
const gchar *limit,
|
|
const gchar **endptr);
|
|
|
|
/* create/destroy */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_variant_type_free (GVariantType *type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariantType * g_variant_type_copy (const GVariantType *type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariantType * g_variant_type_new (const gchar *type_string);
|
|
|
|
/* getters */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gsize g_variant_type_get_string_length (const GVariantType *type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_variant_type_peek_string (const GVariantType *type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar * g_variant_type_dup_string (const GVariantType *type);
|
|
|
|
/* classification */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_variant_type_is_definite (const GVariantType *type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_variant_type_is_container (const GVariantType *type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_variant_type_is_basic (const GVariantType *type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_variant_type_is_maybe (const GVariantType *type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_variant_type_is_array (const GVariantType *type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_variant_type_is_tuple (const GVariantType *type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_variant_type_is_dict_entry (const GVariantType *type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_variant_type_is_variant (const GVariantType *type);
|
|
|
|
/* for hash tables */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_variant_type_hash (gconstpointer type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_variant_type_equal (gconstpointer type1,
|
|
gconstpointer type2);
|
|
|
|
/* subtypes */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_variant_type_is_subtype_of (const GVariantType *type,
|
|
const GVariantType *supertype);
|
|
|
|
/* type iterator interface */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const GVariantType * g_variant_type_element (const GVariantType *type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const GVariantType * g_variant_type_first (const GVariantType *type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const GVariantType * g_variant_type_next (const GVariantType *type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gsize g_variant_type_n_items (const GVariantType *type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const GVariantType * g_variant_type_key (const GVariantType *type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const GVariantType * g_variant_type_value (const GVariantType *type);
|
|
|
|
/* constructors */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariantType * g_variant_type_new_array (const GVariantType *element);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariantType * g_variant_type_new_maybe (const GVariantType *element);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariantType * g_variant_type_new_tuple (const GVariantType * const *items,
|
|
gint length);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariantType * g_variant_type_new_dict_entry (const GVariantType *key,
|
|
const GVariantType *value);
|
|
|
|
/*< private >*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const GVariantType * g_variant_type_checked_ (const gchar *);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_VARIANT_TYPE_H__ */
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GVariant GVariant;
|
|
|
|
typedef enum
|
|
{
|
|
G_VARIANT_CLASS_BOOLEAN = 'b',
|
|
G_VARIANT_CLASS_BYTE = 'y',
|
|
G_VARIANT_CLASS_INT16 = 'n',
|
|
G_VARIANT_CLASS_UINT16 = 'q',
|
|
G_VARIANT_CLASS_INT32 = 'i',
|
|
G_VARIANT_CLASS_UINT32 = 'u',
|
|
G_VARIANT_CLASS_INT64 = 'x',
|
|
G_VARIANT_CLASS_UINT64 = 't',
|
|
G_VARIANT_CLASS_HANDLE = 'h',
|
|
G_VARIANT_CLASS_DOUBLE = 'd',
|
|
G_VARIANT_CLASS_STRING = 's',
|
|
G_VARIANT_CLASS_OBJECT_PATH = 'o',
|
|
G_VARIANT_CLASS_SIGNATURE = 'g',
|
|
G_VARIANT_CLASS_VARIANT = 'v',
|
|
G_VARIANT_CLASS_MAYBE = 'm',
|
|
G_VARIANT_CLASS_ARRAY = 'a',
|
|
G_VARIANT_CLASS_TUPLE = '(',
|
|
G_VARIANT_CLASS_DICT_ENTRY = '{'
|
|
} GVariantClass;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_variant_unref (GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_ref (GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_ref_sink (GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_variant_is_floating (GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_take_ref (GVariant *value);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const GVariantType * g_variant_get_type (GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_variant_get_type_string (GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_variant_is_of_type (GVariant *value,
|
|
const GVariantType *type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_variant_is_container (GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariantClass g_variant_classify (GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_new_boolean (gboolean value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_new_byte (guchar value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_new_int16 (gint16 value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_new_uint16 (guint16 value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_new_int32 (gint32 value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_new_uint32 (guint32 value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_new_int64 (gint64 value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_new_uint64 (guint64 value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_new_handle (gint32 value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_new_double (gdouble value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_new_string (const gchar *string);
|
|
GLIB_AVAILABLE_IN_2_38
|
|
GVariant * g_variant_new_take_string (gchar *string);
|
|
GLIB_AVAILABLE_IN_2_38
|
|
GVariant * g_variant_new_printf (const gchar *format_string,
|
|
...) G_GNUC_PRINTF (1, 2);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_new_object_path (const gchar *object_path);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_variant_is_object_path (const gchar *string);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_new_signature (const gchar *signature);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_variant_is_signature (const gchar *string);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_new_variant (GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_new_strv (const gchar * const *strv,
|
|
gssize length);
|
|
GLIB_AVAILABLE_IN_2_30
|
|
GVariant * g_variant_new_objv (const gchar * const *strv,
|
|
gssize length);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_new_bytestring (const gchar *string);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_new_bytestring_array (const gchar * const *strv,
|
|
gssize length);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_new_fixed_array (const GVariantType *element_type,
|
|
gconstpointer elements,
|
|
gsize n_elements,
|
|
gsize element_size);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_variant_get_boolean (GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guchar g_variant_get_byte (GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint16 g_variant_get_int16 (GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint16 g_variant_get_uint16 (GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint32 g_variant_get_int32 (GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint32 g_variant_get_uint32 (GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint64 g_variant_get_int64 (GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint64 g_variant_get_uint64 (GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint32 g_variant_get_handle (GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gdouble g_variant_get_double (GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_get_variant (GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_variant_get_string (GVariant *value,
|
|
gsize *length);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar * g_variant_dup_string (GVariant *value,
|
|
gsize *length);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar ** g_variant_get_strv (GVariant *value,
|
|
gsize *length);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar ** g_variant_dup_strv (GVariant *value,
|
|
gsize *length);
|
|
GLIB_AVAILABLE_IN_2_30
|
|
const gchar ** g_variant_get_objv (GVariant *value,
|
|
gsize *length);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar ** g_variant_dup_objv (GVariant *value,
|
|
gsize *length);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_variant_get_bytestring (GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar * g_variant_dup_bytestring (GVariant *value,
|
|
gsize *length);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar ** g_variant_get_bytestring_array (GVariant *value,
|
|
gsize *length);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar ** g_variant_dup_bytestring_array (GVariant *value,
|
|
gsize *length);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_new_maybe (const GVariantType *child_type,
|
|
GVariant *child);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_new_array (const GVariantType *child_type,
|
|
GVariant * const *children,
|
|
gsize n_children);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_new_tuple (GVariant * const *children,
|
|
gsize n_children);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_new_dict_entry (GVariant *key,
|
|
GVariant *value);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_get_maybe (GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gsize g_variant_n_children (GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_variant_get_child (GVariant *value,
|
|
gsize index_,
|
|
const gchar *format_string,
|
|
...);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_get_child_value (GVariant *value,
|
|
gsize index_);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_variant_lookup (GVariant *dictionary,
|
|
const gchar *key,
|
|
const gchar *format_string,
|
|
...);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_lookup_value (GVariant *dictionary,
|
|
const gchar *key,
|
|
const GVariantType *expected_type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gconstpointer g_variant_get_fixed_array (GVariant *value,
|
|
gsize *n_elements,
|
|
gsize element_size);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gsize g_variant_get_size (GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gconstpointer g_variant_get_data (GVariant *value);
|
|
GLIB_AVAILABLE_IN_2_36
|
|
GBytes * g_variant_get_data_as_bytes (GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_variant_store (GVariant *value,
|
|
gpointer data);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar * g_variant_print (GVariant *value,
|
|
gboolean type_annotate);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GString * g_variant_print_string (GVariant *value,
|
|
GString *string,
|
|
gboolean type_annotate);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_variant_hash (gconstpointer value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_variant_equal (gconstpointer one,
|
|
gconstpointer two);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_get_normal_form (GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_variant_is_normal_form (GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_byteswap (GVariant *value);
|
|
|
|
GLIB_AVAILABLE_IN_2_36
|
|
GVariant * g_variant_new_from_bytes (const GVariantType *type,
|
|
GBytes *bytes,
|
|
gboolean trusted);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_new_from_data (const GVariantType *type,
|
|
gconstpointer data,
|
|
gsize size,
|
|
gboolean trusted,
|
|
GDestroyNotify notify,
|
|
gpointer user_data);
|
|
|
|
typedef struct _GVariantIter GVariantIter;
|
|
struct _GVariantIter {
|
|
/*< private >*/
|
|
gsize x[16];
|
|
};
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariantIter * g_variant_iter_new (GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gsize g_variant_iter_init (GVariantIter *iter,
|
|
GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariantIter * g_variant_iter_copy (GVariantIter *iter);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gsize g_variant_iter_n_children (GVariantIter *iter);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_variant_iter_free (GVariantIter *iter);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_iter_next_value (GVariantIter *iter);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_variant_iter_next (GVariantIter *iter,
|
|
const gchar *format_string,
|
|
...);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_variant_iter_loop (GVariantIter *iter,
|
|
const gchar *format_string,
|
|
...);
|
|
|
|
|
|
typedef struct _GVariantBuilder GVariantBuilder;
|
|
struct _GVariantBuilder {
|
|
/*< private >*/
|
|
union
|
|
{
|
|
struct {
|
|
gsize partial_magic;
|
|
const GVariantType *type;
|
|
gsize y[14];
|
|
} s;
|
|
gsize x[16];
|
|
} u;
|
|
};
|
|
|
|
typedef enum
|
|
{
|
|
G_VARIANT_PARSE_ERROR_FAILED,
|
|
G_VARIANT_PARSE_ERROR_BASIC_TYPE_EXPECTED,
|
|
G_VARIANT_PARSE_ERROR_CANNOT_INFER_TYPE,
|
|
G_VARIANT_PARSE_ERROR_DEFINITE_TYPE_EXPECTED,
|
|
G_VARIANT_PARSE_ERROR_INPUT_NOT_AT_END,
|
|
G_VARIANT_PARSE_ERROR_INVALID_CHARACTER,
|
|
G_VARIANT_PARSE_ERROR_INVALID_FORMAT_STRING,
|
|
G_VARIANT_PARSE_ERROR_INVALID_OBJECT_PATH,
|
|
G_VARIANT_PARSE_ERROR_INVALID_SIGNATURE,
|
|
G_VARIANT_PARSE_ERROR_INVALID_TYPE_STRING,
|
|
G_VARIANT_PARSE_ERROR_NO_COMMON_TYPE,
|
|
G_VARIANT_PARSE_ERROR_NUMBER_OUT_OF_RANGE,
|
|
G_VARIANT_PARSE_ERROR_NUMBER_TOO_BIG,
|
|
G_VARIANT_PARSE_ERROR_TYPE_ERROR,
|
|
G_VARIANT_PARSE_ERROR_UNEXPECTED_TOKEN,
|
|
G_VARIANT_PARSE_ERROR_UNKNOWN_KEYWORD,
|
|
G_VARIANT_PARSE_ERROR_UNTERMINATED_STRING_CONSTANT,
|
|
G_VARIANT_PARSE_ERROR_VALUE_EXPECTED
|
|
} GVariantParseError;
|
|
#define G_VARIANT_PARSE_ERROR (g_variant_parse_error_quark ())
|
|
|
|
GLIB_DEPRECATED_IN_2_38_FOR(g_variant_parse_error_quark)
|
|
GQuark g_variant_parser_get_error_quark (void);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GQuark g_variant_parse_error_quark (void);
|
|
|
|
/**
|
|
* G_VARIANT_BUILDER_INIT:
|
|
* @variant_type: a const GVariantType*
|
|
*
|
|
* A stack-allocated #GVariantBuilder must be initialized if it is
|
|
* used together with g_auto() to avoid warnings or crashes if
|
|
* function returns before g_variant_builder_init() is called on the
|
|
* builder. This macro can be used as initializer instead of an
|
|
* explicit zeroing a variable when declaring it and a following
|
|
* g_variant_builder_init(), but it cannot be assigned to a variable.
|
|
*
|
|
* The passed @variant_type should be a static GVariantType to avoid
|
|
* lifetime issues, as copying the @variant_type does not happen in
|
|
* the G_VARIANT_BUILDER_INIT() call, but rather in functions that
|
|
* make sure that #GVariantBuilder is valid.
|
|
*
|
|
* |[
|
|
* g_auto(GVariantBuilder) builder = G_VARIANT_BUILDER_INIT (G_VARIANT_TYPE_BYTESTRING);
|
|
* ]|
|
|
*
|
|
* Since: 2.50
|
|
*/
|
|
#define G_VARIANT_BUILDER_INIT(variant_type) { { { 2942751021u, variant_type, { 0, } } } }
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariantBuilder * g_variant_builder_new (const GVariantType *type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_variant_builder_unref (GVariantBuilder *builder);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariantBuilder * g_variant_builder_ref (GVariantBuilder *builder);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_variant_builder_init (GVariantBuilder *builder,
|
|
const GVariantType *type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_builder_end (GVariantBuilder *builder);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_variant_builder_clear (GVariantBuilder *builder);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_variant_builder_open (GVariantBuilder *builder,
|
|
const GVariantType *type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_variant_builder_close (GVariantBuilder *builder);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_variant_builder_add_value (GVariantBuilder *builder,
|
|
GVariant *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_variant_builder_add (GVariantBuilder *builder,
|
|
const gchar *format_string,
|
|
...);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_variant_builder_add_parsed (GVariantBuilder *builder,
|
|
const gchar *format,
|
|
...);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_new (const gchar *format_string,
|
|
...);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_variant_get (GVariant *value,
|
|
const gchar *format_string,
|
|
...);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_new_va (const gchar *format_string,
|
|
const gchar **endptr,
|
|
va_list *app);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_variant_get_va (GVariant *value,
|
|
const gchar *format_string,
|
|
const gchar **endptr,
|
|
va_list *app);
|
|
GLIB_AVAILABLE_IN_2_34
|
|
gboolean g_variant_check_format_string (GVariant *value,
|
|
const gchar *format_string,
|
|
gboolean copy_only);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_parse (const GVariantType *type,
|
|
const gchar *text,
|
|
const gchar *limit,
|
|
const gchar **endptr,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_new_parsed (const gchar *format,
|
|
...);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant * g_variant_new_parsed_va (const gchar *format,
|
|
va_list *app);
|
|
|
|
GLIB_AVAILABLE_IN_2_40
|
|
gchar * g_variant_parse_error_print_context (GError *error,
|
|
const gchar *source_str);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_variant_compare (gconstpointer one,
|
|
gconstpointer two);
|
|
|
|
typedef struct _GVariantDict GVariantDict;
|
|
struct _GVariantDict {
|
|
/*< private >*/
|
|
union
|
|
{
|
|
struct {
|
|
GVariant *asv;
|
|
gsize partial_magic;
|
|
gsize y[14];
|
|
} s;
|
|
gsize x[16];
|
|
} u;
|
|
};
|
|
|
|
/**
|
|
* G_VARIANT_DICT_INIT:
|
|
* @asv: (nullable): a GVariant*
|
|
*
|
|
* A stack-allocated #GVariantDict must be initialized if it is used
|
|
* together with g_auto() to avoid warnings or crashes if function
|
|
* returns before g_variant_dict_init() is called on the builder.
|
|
* This macro can be used as initializer instead of an explicit
|
|
* zeroing a variable when declaring it and a following
|
|
* g_variant_dict_init(), but it cannot be assigned to a variable.
|
|
*
|
|
* The passed @asv has to live long enough for #GVariantDict to gather
|
|
* the entries from, as the gathering does not happen in the
|
|
* G_VARIANT_DICT_INIT() call, but rather in functions that make sure
|
|
* that #GVariantDict is valid. In context where the initialization
|
|
* value has to be a constant expression, the only possible value of
|
|
* @asv is %NULL. It is still possible to call g_variant_dict_init()
|
|
* safely with a different @asv right after the variable was
|
|
* initialized with G_VARIANT_DICT_INIT().
|
|
*
|
|
* |[
|
|
* g_autoptr(GVariant) variant = get_asv_variant ();
|
|
* g_auto(GVariantDict) dict = G_VARIANT_DICT_INIT (variant);
|
|
* ]|
|
|
*
|
|
* Since: 2.50
|
|
*/
|
|
#define G_VARIANT_DICT_INIT(asv) { { { asv, 3488698669u, { 0, } } } }
|
|
|
|
GLIB_AVAILABLE_IN_2_40
|
|
GVariantDict * g_variant_dict_new (GVariant *from_asv);
|
|
|
|
GLIB_AVAILABLE_IN_2_40
|
|
void g_variant_dict_init (GVariantDict *dict,
|
|
GVariant *from_asv);
|
|
|
|
GLIB_AVAILABLE_IN_2_40
|
|
gboolean g_variant_dict_lookup (GVariantDict *dict,
|
|
const gchar *key,
|
|
const gchar *format_string,
|
|
...);
|
|
GLIB_AVAILABLE_IN_2_40
|
|
GVariant * g_variant_dict_lookup_value (GVariantDict *dict,
|
|
const gchar *key,
|
|
const GVariantType *expected_type);
|
|
GLIB_AVAILABLE_IN_2_40
|
|
gboolean g_variant_dict_contains (GVariantDict *dict,
|
|
const gchar *key);
|
|
GLIB_AVAILABLE_IN_2_40
|
|
void g_variant_dict_insert (GVariantDict *dict,
|
|
const gchar *key,
|
|
const gchar *format_string,
|
|
...);
|
|
GLIB_AVAILABLE_IN_2_40
|
|
void g_variant_dict_insert_value (GVariantDict *dict,
|
|
const gchar *key,
|
|
GVariant *value);
|
|
GLIB_AVAILABLE_IN_2_40
|
|
gboolean g_variant_dict_remove (GVariantDict *dict,
|
|
const gchar *key);
|
|
GLIB_AVAILABLE_IN_2_40
|
|
void g_variant_dict_clear (GVariantDict *dict);
|
|
GLIB_AVAILABLE_IN_2_40
|
|
GVariant * g_variant_dict_end (GVariantDict *dict);
|
|
GLIB_AVAILABLE_IN_2_40
|
|
GVariantDict * g_variant_dict_ref (GVariantDict *dict);
|
|
GLIB_AVAILABLE_IN_2_40
|
|
void g_variant_dict_unref (GVariantDict *dict);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_VARIANT_H__ */
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/* calculate a string size, guaranteed to fit format + args.
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gsize g_printf_string_upper_bound (const gchar* format,
|
|
va_list args) G_GNUC_PRINTF(1, 0);
|
|
|
|
/* Log level shift offset for user defined
|
|
* log levels (0-7 are used by GLib).
|
|
*/
|
|
#define G_LOG_LEVEL_USER_SHIFT (8)
|
|
|
|
/* Glib log levels and flags.
|
|
*/
|
|
typedef enum
|
|
{
|
|
/* log flags */
|
|
G_LOG_FLAG_RECURSION = 1 << 0,
|
|
G_LOG_FLAG_FATAL = 1 << 1,
|
|
|
|
/* GLib log levels */
|
|
G_LOG_LEVEL_ERROR = 1 << 2, /* always fatal */
|
|
G_LOG_LEVEL_CRITICAL = 1 << 3,
|
|
G_LOG_LEVEL_WARNING = 1 << 4,
|
|
G_LOG_LEVEL_MESSAGE = 1 << 5,
|
|
G_LOG_LEVEL_INFO = 1 << 6,
|
|
G_LOG_LEVEL_DEBUG = 1 << 7,
|
|
|
|
G_LOG_LEVEL_MASK = ~(G_LOG_FLAG_RECURSION | G_LOG_FLAG_FATAL)
|
|
} GLogLevelFlags;
|
|
|
|
/* GLib log levels that are considered fatal by default */
|
|
#define G_LOG_FATAL_MASK (G_LOG_FLAG_RECURSION | G_LOG_LEVEL_ERROR)
|
|
|
|
typedef void (*GLogFunc) (const gchar *log_domain,
|
|
GLogLevelFlags log_level,
|
|
const gchar *message,
|
|
gpointer user_data);
|
|
|
|
/* Logging mechanism
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_log_set_handler (const gchar *log_domain,
|
|
GLogLevelFlags log_levels,
|
|
GLogFunc log_func,
|
|
gpointer user_data);
|
|
GLIB_AVAILABLE_IN_2_46
|
|
guint g_log_set_handler_full (const gchar *log_domain,
|
|
GLogLevelFlags log_levels,
|
|
GLogFunc log_func,
|
|
gpointer user_data,
|
|
GDestroyNotify destroy);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_log_remove_handler (const gchar *log_domain,
|
|
guint handler_id);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_log_default_handler (const gchar *log_domain,
|
|
GLogLevelFlags log_level,
|
|
const gchar *message,
|
|
gpointer unused_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GLogFunc g_log_set_default_handler (GLogFunc log_func,
|
|
gpointer user_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_log (const gchar *log_domain,
|
|
GLogLevelFlags log_level,
|
|
const gchar *format,
|
|
...) G_GNUC_PRINTF (3, 4);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_logv (const gchar *log_domain,
|
|
GLogLevelFlags log_level,
|
|
const gchar *format,
|
|
va_list args) G_GNUC_PRINTF(3, 0);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GLogLevelFlags g_log_set_fatal_mask (const gchar *log_domain,
|
|
GLogLevelFlags fatal_mask);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GLogLevelFlags g_log_set_always_fatal (GLogLevelFlags fatal_mask);
|
|
|
|
/* Structured logging mechanism. */
|
|
|
|
/**
|
|
* GLogWriterOutput:
|
|
* @G_LOG_WRITER_HANDLED: Log writer has handled the log entry.
|
|
* @G_LOG_WRITER_UNHANDLED: Log writer could not handle the log entry.
|
|
*
|
|
* Return values from #GLogWriterFuncs to indicate whether the given log entry
|
|
* was successfully handled by the writer, or whether there was an error in
|
|
* handling it (and hence a fallback writer should be used).
|
|
*
|
|
* If a #GLogWriterFunc ignores a log entry, it should return
|
|
* %G_LOG_WRITER_HANDLED.
|
|
*
|
|
* Since: 2.50
|
|
*/
|
|
typedef enum
|
|
{
|
|
G_LOG_WRITER_HANDLED = 1,
|
|
G_LOG_WRITER_UNHANDLED = 0,
|
|
} GLogWriterOutput;
|
|
|
|
/**
|
|
* GLogField:
|
|
* @key: field name (UTF-8 string)
|
|
* @value: field value (arbitrary bytes)
|
|
* @length: length of @value, in bytes, or -1 if it is nul-terminated
|
|
*
|
|
* Structure representing a single field in a structured log entry. See
|
|
* g_log_structured() for details.
|
|
*
|
|
* Log fields may contain arbitrary values, including binary with embedded nul
|
|
* bytes. If the field contains a string, the string must be UTF-8 encoded and
|
|
* have a trailing nul byte. Otherwise, @length must be set to a non-negative
|
|
* value.
|
|
*
|
|
* Since: 2.50
|
|
*/
|
|
typedef struct _GLogField GLogField;
|
|
struct _GLogField
|
|
{
|
|
const gchar *key;
|
|
gconstpointer value;
|
|
gssize length;
|
|
};
|
|
|
|
/**
|
|
* GLogWriterFunc:
|
|
* @log_level: log level of the message
|
|
* @fields: (array length=n_fields): fields forming the message
|
|
* @n_fields: number of @fields
|
|
* @user_data: user data passed to g_log_set_writer_func()
|
|
*
|
|
* Writer function for log entries. A log entry is a collection of one or more
|
|
* #GLogFields, using the standard [field names from journal
|
|
* specification](https://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html).
|
|
* See g_log_structured() for more information.
|
|
*
|
|
* Writer functions must ignore fields which they do not recognise, unless they
|
|
* can write arbitrary binary output, as field values may be arbitrary binary.
|
|
*
|
|
* @log_level is guaranteed to be included in @fields as the `PRIORITY` field,
|
|
* but is provided separately for convenience of deciding whether or where to
|
|
* output the log entry.
|
|
*
|
|
* Returns: %G_LOG_WRITER_HANDLED if the log entry was handled successfully;
|
|
* %G_LOG_WRITER_UNHANDLED otherwise
|
|
* Since: 2.50
|
|
*/
|
|
typedef GLogWriterOutput (*GLogWriterFunc) (GLogLevelFlags log_level,
|
|
const GLogField *fields,
|
|
gsize n_fields,
|
|
gpointer user_data);
|
|
|
|
GLIB_AVAILABLE_IN_2_50
|
|
void g_log_structured (const gchar *log_domain,
|
|
GLogLevelFlags log_level,
|
|
...);
|
|
GLIB_AVAILABLE_IN_2_50
|
|
void g_log_structured_array (GLogLevelFlags log_level,
|
|
const GLogField *fields,
|
|
gsize n_fields);
|
|
|
|
GLIB_AVAILABLE_IN_2_50
|
|
void g_log_variant (const gchar *log_domain,
|
|
GLogLevelFlags log_level,
|
|
GVariant *fields);
|
|
|
|
GLIB_AVAILABLE_IN_2_50
|
|
void g_log_set_writer_func (GLogWriterFunc func,
|
|
gpointer user_data,
|
|
GDestroyNotify user_data_free);
|
|
|
|
GLIB_AVAILABLE_IN_2_50
|
|
gboolean g_log_writer_supports_color (gint output_fd);
|
|
GLIB_AVAILABLE_IN_2_50
|
|
gboolean g_log_writer_is_journald (gint output_fd);
|
|
|
|
GLIB_AVAILABLE_IN_2_50
|
|
gchar *g_log_writer_format_fields (GLogLevelFlags log_level,
|
|
const GLogField *fields,
|
|
gsize n_fields,
|
|
gboolean use_color);
|
|
|
|
GLIB_AVAILABLE_IN_2_50
|
|
GLogWriterOutput g_log_writer_journald (GLogLevelFlags log_level,
|
|
const GLogField *fields,
|
|
gsize n_fields,
|
|
gpointer user_data);
|
|
GLIB_AVAILABLE_IN_2_50
|
|
GLogWriterOutput g_log_writer_standard_streams (GLogLevelFlags log_level,
|
|
const GLogField *fields,
|
|
gsize n_fields,
|
|
gpointer user_data);
|
|
GLIB_AVAILABLE_IN_2_50
|
|
GLogWriterOutput g_log_writer_default (GLogLevelFlags log_level,
|
|
const GLogField *fields,
|
|
gsize n_fields,
|
|
gpointer user_data);
|
|
|
|
/**
|
|
* G_DEBUG_HERE:
|
|
*
|
|
* A convenience form of g_log_structured(), recommended to be added to
|
|
* functions when debugging. It prints the current monotonic time and the code
|
|
* location using %G_STRLOC.
|
|
*
|
|
* Since: 2.50
|
|
*/
|
|
#define G_DEBUG_HERE() \
|
|
g_log_structured (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, \
|
|
"CODE_FILE", __FILE__, \
|
|
"CODE_LINE", G_STRINGIFY (__LINE__), \
|
|
"CODE_FUNC", G_STRFUNC, \
|
|
"MESSAGE", "%" G_GINT64_FORMAT ": %s", \
|
|
g_get_monotonic_time (), G_STRLOC)
|
|
|
|
/* internal */
|
|
void _g_log_fallback_handler (const gchar *log_domain,
|
|
GLogLevelFlags log_level,
|
|
const gchar *message,
|
|
gpointer unused_data);
|
|
|
|
/* Internal functions, used to implement the following macros */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_return_if_fail_warning (const char *log_domain,
|
|
const char *pretty_function,
|
|
const char *expression) G_ANALYZER_NORETURN;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_warn_message (const char *domain,
|
|
const char *file,
|
|
int line,
|
|
const char *func,
|
|
const char *warnexpr) G_ANALYZER_NORETURN;
|
|
GLIB_DEPRECATED
|
|
void g_assert_warning (const char *log_domain,
|
|
const char *file,
|
|
const int line,
|
|
const char *pretty_function,
|
|
const char *expression) G_GNUC_NORETURN;
|
|
|
|
|
|
#ifndef G_LOG_DOMAIN
|
|
#define G_LOG_DOMAIN ((gchar*) 0)
|
|
#endif /* G_LOG_DOMAIN */
|
|
|
|
#if defined(G_HAVE_ISO_VARARGS) && !G_ANALYZER_ANALYZING
|
|
#ifdef G_LOG_USE_STRUCTURED
|
|
#define g_error(...) G_STMT_START { \
|
|
g_log_structured (G_LOG_DOMAIN, G_LOG_LEVEL_ERROR, \
|
|
"CODE_FILE", __FILE__, \
|
|
"CODE_LINE", G_STRINGIFY (__LINE__), \
|
|
"CODE_FUNC", G_STRFUNC, \
|
|
"MESSAGE", __VA_ARGS__); \
|
|
for (;;) ; \
|
|
} G_STMT_END
|
|
#define g_message(...) g_log_structured (G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE, \
|
|
"CODE_FILE", __FILE__, \
|
|
"CODE_LINE", G_STRINGIFY (__LINE__), \
|
|
"CODE_FUNC", G_STRFUNC, \
|
|
"MESSAGE", __VA_ARGS__)
|
|
#define g_critical(...) g_log_structured (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, \
|
|
"CODE_FILE", __FILE__, \
|
|
"CODE_LINE", G_STRINGIFY (__LINE__), \
|
|
"CODE_FUNC", G_STRFUNC, \
|
|
"MESSAGE", __VA_ARGS__)
|
|
#define g_warning(...) g_log_structured (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, \
|
|
"CODE_FILE", __FILE__, \
|
|
"CODE_LINE", G_STRINGIFY (__LINE__), \
|
|
"CODE_FUNC", G_STRFUNC, \
|
|
"MESSAGE", __VA_ARGS__)
|
|
#define g_info(...) g_log_structured (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, \
|
|
"CODE_FILE", __FILE__, \
|
|
"CODE_LINE", G_STRINGIFY (__LINE__), \
|
|
"CODE_FUNC", G_STRFUNC, \
|
|
"MESSAGE", __VA_ARGS__)
|
|
#define g_debug(...) g_log_structured (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, \
|
|
"CODE_FILE", __FILE__, \
|
|
"CODE_LINE", G_STRINGIFY (__LINE__), \
|
|
"CODE_FUNC", G_STRFUNC, \
|
|
"MESSAGE", __VA_ARGS__)
|
|
#else
|
|
/* for(;;) ; so that GCC knows that control doesn't go past g_error().
|
|
* Put space before ending semicolon to avoid C++ build warnings.
|
|
*/
|
|
#define g_error(...) G_STMT_START { \
|
|
g_log (G_LOG_DOMAIN, \
|
|
G_LOG_LEVEL_ERROR, \
|
|
__VA_ARGS__); \
|
|
for (;;) ; \
|
|
} G_STMT_END
|
|
#define g_message(...) g_log (G_LOG_DOMAIN, \
|
|
G_LOG_LEVEL_MESSAGE, \
|
|
__VA_ARGS__)
|
|
#define g_critical(...) g_log (G_LOG_DOMAIN, \
|
|
G_LOG_LEVEL_CRITICAL, \
|
|
__VA_ARGS__)
|
|
#define g_warning(...) g_log (G_LOG_DOMAIN, \
|
|
G_LOG_LEVEL_WARNING, \
|
|
__VA_ARGS__)
|
|
#define g_info(...) g_log (G_LOG_DOMAIN, \
|
|
G_LOG_LEVEL_INFO, \
|
|
__VA_ARGS__)
|
|
#define g_debug(...) g_log (G_LOG_DOMAIN, \
|
|
G_LOG_LEVEL_DEBUG, \
|
|
__VA_ARGS__)
|
|
#endif
|
|
#elif defined(G_HAVE_GNUC_VARARGS) && !G_ANALYZER_ANALYZING
|
|
#ifdef G_LOG_USE_STRUCTURED
|
|
#define g_error(format...) G_STMT_START { \
|
|
g_log_structured (G_LOG_DOMAIN, G_LOG_LEVEL_ERROR, \
|
|
"CODE_FILE", __FILE__, \
|
|
"CODE_LINE", G_STRINGIFY (__LINE__), \
|
|
"CODE_FUNC", G_STRFUNC, \
|
|
"MESSAGE", format); \
|
|
for (;;) ; \
|
|
} G_STMT_END
|
|
#define g_message(format...) g_log_structured (G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE, \
|
|
"CODE_FILE", __FILE__, \
|
|
"CODE_LINE", G_STRINGIFY (__LINE__), \
|
|
"CODE_FUNC", G_STRFUNC, \
|
|
"MESSAGE", format)
|
|
#define g_critical(format...) g_log_structured (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, \
|
|
"CODE_FILE", __FILE__, \
|
|
"CODE_LINE", G_STRINGIFY (__LINE__), \
|
|
"CODE_FUNC", G_STRFUNC, \
|
|
"MESSAGE", format)
|
|
#define g_warning(format...) g_log_structured (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, \
|
|
"CODE_FILE", __FILE__, \
|
|
"CODE_LINE", G_STRINGIFY (__LINE__), \
|
|
"CODE_FUNC", G_STRFUNC, \
|
|
"MESSAGE", format)
|
|
#define g_info(format...) g_log_structured (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, \
|
|
"CODE_FILE", __FILE__, \
|
|
"CODE_LINE", G_STRINGIFY (__LINE__), \
|
|
"CODE_FUNC", G_STRFUNC, \
|
|
"MESSAGE", format)
|
|
#define g_debug(format...) g_log_structured (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, \
|
|
"CODE_FILE", __FILE__, \
|
|
"CODE_LINE", G_STRINGIFY (__LINE__), \
|
|
"CODE_FUNC", G_STRFUNC, \
|
|
"MESSAGE", format)
|
|
#else
|
|
#define g_error(format...) G_STMT_START { \
|
|
g_log (G_LOG_DOMAIN, \
|
|
G_LOG_LEVEL_ERROR, \
|
|
format); \
|
|
for (;;) ; \
|
|
} G_STMT_END
|
|
|
|
#define g_message(format...) g_log (G_LOG_DOMAIN, \
|
|
G_LOG_LEVEL_MESSAGE, \
|
|
format)
|
|
#define g_critical(format...) g_log (G_LOG_DOMAIN, \
|
|
G_LOG_LEVEL_CRITICAL, \
|
|
format)
|
|
#define g_warning(format...) g_log (G_LOG_DOMAIN, \
|
|
G_LOG_LEVEL_WARNING, \
|
|
format)
|
|
#define g_info(format...) g_log (G_LOG_DOMAIN, \
|
|
G_LOG_LEVEL_INFO, \
|
|
format)
|
|
#define g_debug(format...) g_log (G_LOG_DOMAIN, \
|
|
G_LOG_LEVEL_DEBUG, \
|
|
format)
|
|
#endif
|
|
#else /* no varargs macros */
|
|
static void g_error (const gchar *format, ...) G_GNUC_NORETURN G_ANALYZER_NORETURN;
|
|
static void g_critical (const gchar *format, ...) G_ANALYZER_NORETURN;
|
|
|
|
static void
|
|
g_error (const gchar *format,
|
|
...)
|
|
{
|
|
va_list args;
|
|
va_start (args, format);
|
|
g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_ERROR, format, args);
|
|
va_end (args);
|
|
|
|
for(;;) ;
|
|
}
|
|
static void
|
|
g_message (const gchar *format,
|
|
...)
|
|
{
|
|
va_list args;
|
|
va_start (args, format);
|
|
g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE, format, args);
|
|
va_end (args);
|
|
}
|
|
static void
|
|
g_critical (const gchar *format,
|
|
...)
|
|
{
|
|
va_list args;
|
|
va_start (args, format);
|
|
g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, format, args);
|
|
va_end (args);
|
|
}
|
|
static void
|
|
g_warning (const gchar *format,
|
|
...)
|
|
{
|
|
va_list args;
|
|
va_start (args, format);
|
|
g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, format, args);
|
|
va_end (args);
|
|
}
|
|
static void
|
|
g_info (const gchar *format,
|
|
...)
|
|
{
|
|
va_list args;
|
|
va_start (args, format);
|
|
g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format, args);
|
|
va_end (args);
|
|
}
|
|
static void
|
|
g_debug (const gchar *format,
|
|
...)
|
|
{
|
|
va_list args;
|
|
va_start (args, format);
|
|
g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, format, args);
|
|
va_end (args);
|
|
}
|
|
#endif /* !__GNUC__ */
|
|
|
|
/**
|
|
* GPrintFunc:
|
|
* @string: the message to output
|
|
*
|
|
* Specifies the type of the print handler functions.
|
|
* These are called with the complete formatted string to output.
|
|
*/
|
|
typedef void (*GPrintFunc) (const gchar *string);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_print (const gchar *format,
|
|
...) G_GNUC_PRINTF (1, 2);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GPrintFunc g_set_print_handler (GPrintFunc func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_printerr (const gchar *format,
|
|
...) G_GNUC_PRINTF (1, 2);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GPrintFunc g_set_printerr_handler (GPrintFunc func);
|
|
|
|
/**
|
|
* g_warn_if_reached:
|
|
*
|
|
* Logs a warning.
|
|
*
|
|
* Since: 2.16
|
|
*/
|
|
#define g_warn_if_reached() \
|
|
do { \
|
|
g_warn_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, NULL); \
|
|
} while (0)
|
|
|
|
/**
|
|
* g_warn_if_fail:
|
|
* @expr: the expression to check
|
|
*
|
|
* Logs a warning if the expression is not true.
|
|
*
|
|
* Since: 2.16
|
|
*/
|
|
#define g_warn_if_fail(expr) \
|
|
do { \
|
|
if G_LIKELY (expr) ; \
|
|
else g_warn_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, #expr); \
|
|
} while (0)
|
|
|
|
#ifdef G_DISABLE_CHECKS
|
|
|
|
/**
|
|
* g_return_if_fail:
|
|
* @expr: the expression to check
|
|
*
|
|
* Verifies that the expression @expr, usually representing a precondition,
|
|
* evaluates to %TRUE. If the function returns a value, use
|
|
* g_return_val_if_fail() instead.
|
|
*
|
|
* If @expr evaluates to %FALSE, the current function should be considered to
|
|
* have undefined behaviour (a programmer error). The only correct solution
|
|
* to such an error is to change the module that is calling the current
|
|
* function, so that it avoids this incorrect call.
|
|
*
|
|
* To make this undefined behaviour visible, if @expr evaluates to %FALSE,
|
|
* the result is usually that a critical message is logged and the current
|
|
* function returns.
|
|
*
|
|
* If G_DISABLE_CHECKS is defined then the check is not performed. You
|
|
* should therefore not depend on any side effects of @expr.
|
|
*/
|
|
#define g_return_if_fail(expr) G_STMT_START{ (void)0; }G_STMT_END
|
|
|
|
/**
|
|
* g_return_val_if_fail:
|
|
* @expr: the expression to check
|
|
* @val: the value to return from the current function
|
|
* if the expression is not true
|
|
*
|
|
* Verifies that the expression @expr, usually representing a precondition,
|
|
* evaluates to %TRUE. If the function does not return a value, use
|
|
* g_return_if_fail() instead.
|
|
*
|
|
* If @expr evaluates to %FALSE, the current function should be considered to
|
|
* have undefined behaviour (a programmer error). The only correct solution
|
|
* to such an error is to change the module that is calling the current
|
|
* function, so that it avoids this incorrect call.
|
|
*
|
|
* To make this undefined behaviour visible, if @expr evaluates to %FALSE,
|
|
* the result is usually that a critical message is logged and @val is
|
|
* returned from the current function.
|
|
*
|
|
* If G_DISABLE_CHECKS is defined then the check is not performed. You
|
|
* should therefore not depend on any side effects of @expr.
|
|
*/
|
|
#define g_return_val_if_fail(expr,val) G_STMT_START{ (void)0; }G_STMT_END
|
|
|
|
/**
|
|
* g_return_if_reached:
|
|
*
|
|
* Logs a critical message and returns from the current function.
|
|
* This can only be used in functions which do not return a value.
|
|
*/
|
|
#define g_return_if_reached() G_STMT_START{ return; }G_STMT_END
|
|
|
|
/**
|
|
* g_return_val_if_reached:
|
|
* @val: the value to return from the current function
|
|
*
|
|
* Logs a critical message and returns @val.
|
|
*/
|
|
#define g_return_val_if_reached(val) G_STMT_START{ return (val); }G_STMT_END
|
|
|
|
#else /* !G_DISABLE_CHECKS */
|
|
|
|
#define g_return_if_fail(expr) G_STMT_START{ \
|
|
if G_LIKELY(expr) { } else \
|
|
{ \
|
|
g_return_if_fail_warning (G_LOG_DOMAIN, \
|
|
G_STRFUNC, \
|
|
#expr); \
|
|
return; \
|
|
}; }G_STMT_END
|
|
|
|
#define g_return_val_if_fail(expr,val) G_STMT_START{ \
|
|
if G_LIKELY(expr) { } else \
|
|
{ \
|
|
g_return_if_fail_warning (G_LOG_DOMAIN, \
|
|
G_STRFUNC, \
|
|
#expr); \
|
|
return (val); \
|
|
}; }G_STMT_END
|
|
|
|
#define g_return_if_reached() G_STMT_START{ \
|
|
g_log (G_LOG_DOMAIN, \
|
|
G_LOG_LEVEL_CRITICAL, \
|
|
"file %s: line %d (%s): should not be reached", \
|
|
__FILE__, \
|
|
__LINE__, \
|
|
G_STRFUNC); \
|
|
return; }G_STMT_END
|
|
|
|
#define g_return_val_if_reached(val) G_STMT_START{ \
|
|
g_log (G_LOG_DOMAIN, \
|
|
G_LOG_LEVEL_CRITICAL, \
|
|
"file %s: line %d (%s): should not be reached", \
|
|
__FILE__, \
|
|
__LINE__, \
|
|
G_STRFUNC); \
|
|
return (val); }G_STMT_END
|
|
|
|
#endif /* !G_DISABLE_CHECKS */
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_MESSAGES_H__ */
|
|
/* goption.h - Option parser
|
|
*
|
|
* Copyright (C) 2004 Anders Carlsson <andersca@gnome.org>
|
|
*
|
|
* 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, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __G_OPTION_H__
|
|
#define __G_OPTION_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/**
|
|
* GOptionContext:
|
|
*
|
|
* A `GOptionContext` struct defines which options
|
|
* are accepted by the commandline option parser. The struct has only private
|
|
* fields and should not be directly accessed.
|
|
*/
|
|
typedef struct _GOptionContext GOptionContext;
|
|
|
|
/**
|
|
* GOptionGroup:
|
|
*
|
|
* A `GOptionGroup` struct defines the options in a single
|
|
* group. The struct has only private fields and should not be directly accessed.
|
|
*
|
|
* All options in a group share the same translation function. Libraries which
|
|
* need to parse commandline options are expected to provide a function for
|
|
* getting a `GOptionGroup` holding their options, which
|
|
* the application can then add to its #GOptionContext.
|
|
*/
|
|
typedef struct _GOptionGroup GOptionGroup;
|
|
typedef struct _GOptionEntry GOptionEntry;
|
|
|
|
/**
|
|
* GOptionFlags:
|
|
* @G_OPTION_FLAG_NONE: No flags. Since: 2.42.
|
|
* @G_OPTION_FLAG_HIDDEN: The option doesn't appear in `--help` output.
|
|
* @G_OPTION_FLAG_IN_MAIN: The option appears in the main section of the
|
|
* `--help` output, even if it is defined in a group.
|
|
* @G_OPTION_FLAG_REVERSE: For options of the %G_OPTION_ARG_NONE kind, this
|
|
* flag indicates that the sense of the option is reversed.
|
|
* @G_OPTION_FLAG_NO_ARG: For options of the %G_OPTION_ARG_CALLBACK kind,
|
|
* this flag indicates that the callback does not take any argument
|
|
* (like a %G_OPTION_ARG_NONE option). Since 2.8
|
|
* @G_OPTION_FLAG_FILENAME: For options of the %G_OPTION_ARG_CALLBACK
|
|
* kind, this flag indicates that the argument should be passed to the
|
|
* callback in the GLib filename encoding rather than UTF-8. Since 2.8
|
|
* @G_OPTION_FLAG_OPTIONAL_ARG: For options of the %G_OPTION_ARG_CALLBACK
|
|
* kind, this flag indicates that the argument supply is optional.
|
|
* If no argument is given then data of %GOptionParseFunc will be
|
|
* set to NULL. Since 2.8
|
|
* @G_OPTION_FLAG_NOALIAS: This flag turns off the automatic conflict
|
|
* resolution which prefixes long option names with `groupname-` if
|
|
* there is a conflict. This option should only be used in situations
|
|
* where aliasing is necessary to model some legacy commandline interface.
|
|
* It is not safe to use this option, unless all option groups are under
|
|
* your direct control. Since 2.8.
|
|
*
|
|
* Flags which modify individual options.
|
|
*/
|
|
typedef enum
|
|
{
|
|
G_OPTION_FLAG_NONE = 0,
|
|
G_OPTION_FLAG_HIDDEN = 1 << 0,
|
|
G_OPTION_FLAG_IN_MAIN = 1 << 1,
|
|
G_OPTION_FLAG_REVERSE = 1 << 2,
|
|
G_OPTION_FLAG_NO_ARG = 1 << 3,
|
|
G_OPTION_FLAG_FILENAME = 1 << 4,
|
|
G_OPTION_FLAG_OPTIONAL_ARG = 1 << 5,
|
|
G_OPTION_FLAG_NOALIAS = 1 << 6
|
|
} GOptionFlags;
|
|
|
|
/**
|
|
* GOptionArg:
|
|
* @G_OPTION_ARG_NONE: No extra argument. This is useful for simple flags.
|
|
* @G_OPTION_ARG_STRING: The option takes a string argument.
|
|
* @G_OPTION_ARG_INT: The option takes an integer argument.
|
|
* @G_OPTION_ARG_CALLBACK: The option provides a callback (of type
|
|
* #GOptionArgFunc) to parse the extra argument.
|
|
* @G_OPTION_ARG_FILENAME: The option takes a filename as argument.
|
|
* @G_OPTION_ARG_STRING_ARRAY: The option takes a string argument, multiple
|
|
* uses of the option are collected into an array of strings.
|
|
* @G_OPTION_ARG_FILENAME_ARRAY: The option takes a filename as argument,
|
|
* multiple uses of the option are collected into an array of strings.
|
|
* @G_OPTION_ARG_DOUBLE: The option takes a double argument. The argument
|
|
* can be formatted either for the user's locale or for the "C" locale.
|
|
* Since 2.12
|
|
* @G_OPTION_ARG_INT64: The option takes a 64-bit integer. Like
|
|
* %G_OPTION_ARG_INT but for larger numbers. The number can be in
|
|
* decimal base, or in hexadecimal (when prefixed with `0x`, for
|
|
* example, `0xffffffff`). Since 2.12
|
|
*
|
|
* The #GOptionArg enum values determine which type of extra argument the
|
|
* options expect to find. If an option expects an extra argument, it can
|
|
* be specified in several ways; with a short option: `-x arg`, with a long
|
|
* option: `--name arg` or combined in a single argument: `--name=arg`.
|
|
*/
|
|
typedef enum
|
|
{
|
|
G_OPTION_ARG_NONE,
|
|
G_OPTION_ARG_STRING,
|
|
G_OPTION_ARG_INT,
|
|
G_OPTION_ARG_CALLBACK,
|
|
G_OPTION_ARG_FILENAME,
|
|
G_OPTION_ARG_STRING_ARRAY,
|
|
G_OPTION_ARG_FILENAME_ARRAY,
|
|
G_OPTION_ARG_DOUBLE,
|
|
G_OPTION_ARG_INT64
|
|
} GOptionArg;
|
|
|
|
/**
|
|
* GOptionArgFunc:
|
|
* @option_name: The name of the option being parsed. This will be either a
|
|
* single dash followed by a single letter (for a short name) or two dashes
|
|
* followed by a long option name.
|
|
* @value: The value to be parsed.
|
|
* @data: User data added to the #GOptionGroup containing the option when it
|
|
* was created with g_option_group_new()
|
|
* @error: A return location for errors. The error code %G_OPTION_ERROR_FAILED
|
|
* is intended to be used for errors in #GOptionArgFunc callbacks.
|
|
*
|
|
* The type of function to be passed as callback for %G_OPTION_ARG_CALLBACK
|
|
* options.
|
|
*
|
|
* Returns: %TRUE if the option was successfully parsed, %FALSE if an error
|
|
* occurred, in which case @error should be set with g_set_error()
|
|
*/
|
|
typedef gboolean (*GOptionArgFunc) (const gchar *option_name,
|
|
const gchar *value,
|
|
gpointer data,
|
|
GError **error);
|
|
|
|
/**
|
|
* GOptionParseFunc:
|
|
* @context: The active #GOptionContext
|
|
* @group: The group to which the function belongs
|
|
* @data: User data added to the #GOptionGroup containing the option when it
|
|
* was created with g_option_group_new()
|
|
* @error: A return location for error details
|
|
*
|
|
* The type of function that can be called before and after parsing.
|
|
*
|
|
* Returns: %TRUE if the function completed successfully, %FALSE if an error
|
|
* occurred, in which case @error should be set with g_set_error()
|
|
*/
|
|
typedef gboolean (*GOptionParseFunc) (GOptionContext *context,
|
|
GOptionGroup *group,
|
|
gpointer data,
|
|
GError **error);
|
|
|
|
/**
|
|
* GOptionErrorFunc:
|
|
* @context: The active #GOptionContext
|
|
* @group: The group to which the function belongs
|
|
* @data: User data added to the #GOptionGroup containing the option when it
|
|
* was created with g_option_group_new()
|
|
* @error: The #GError containing details about the parse error
|
|
*
|
|
* The type of function to be used as callback when a parse error occurs.
|
|
*/
|
|
typedef void (*GOptionErrorFunc) (GOptionContext *context,
|
|
GOptionGroup *group,
|
|
gpointer data,
|
|
GError **error);
|
|
|
|
/**
|
|
* G_OPTION_ERROR:
|
|
*
|
|
* Error domain for option parsing. Errors in this domain will
|
|
* be from the #GOptionError enumeration. See #GError for information on
|
|
* error domains.
|
|
*/
|
|
#define G_OPTION_ERROR (g_option_error_quark ())
|
|
|
|
/**
|
|
* GOptionError:
|
|
* @G_OPTION_ERROR_UNKNOWN_OPTION: An option was not known to the parser.
|
|
* This error will only be reported, if the parser hasn't been instructed
|
|
* to ignore unknown options, see g_option_context_set_ignore_unknown_options().
|
|
* @G_OPTION_ERROR_BAD_VALUE: A value couldn't be parsed.
|
|
* @G_OPTION_ERROR_FAILED: A #GOptionArgFunc callback failed.
|
|
*
|
|
* Error codes returned by option parsing.
|
|
*/
|
|
typedef enum
|
|
{
|
|
G_OPTION_ERROR_UNKNOWN_OPTION,
|
|
G_OPTION_ERROR_BAD_VALUE,
|
|
G_OPTION_ERROR_FAILED
|
|
} GOptionError;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GQuark g_option_error_quark (void);
|
|
|
|
/**
|
|
* GOptionEntry:
|
|
* @long_name: The long name of an option can be used to specify it
|
|
* in a commandline as `--long_name`. Every option must have a
|
|
* long name. To resolve conflicts if multiple option groups contain
|
|
* the same long name, it is also possible to specify the option as
|
|
* `--groupname-long_name`.
|
|
* @short_name: If an option has a short name, it can be specified
|
|
* `-short_name` in a commandline. @short_name must be a printable
|
|
* ASCII character different from '-', or zero if the option has no
|
|
* short name.
|
|
* @flags: Flags from #GOptionFlags
|
|
* @arg: The type of the option, as a #GOptionArg
|
|
* @arg_data: If the @arg type is %G_OPTION_ARG_CALLBACK, then @arg_data
|
|
* must point to a #GOptionArgFunc callback function, which will be
|
|
* called to handle the extra argument. Otherwise, @arg_data is a
|
|
* pointer to a location to store the value, the required type of
|
|
* the location depends on the @arg type:
|
|
* - %G_OPTION_ARG_NONE: %gboolean
|
|
* - %G_OPTION_ARG_STRING: %gchar*
|
|
* - %G_OPTION_ARG_INT: %gint
|
|
* - %G_OPTION_ARG_FILENAME: %gchar*
|
|
* - %G_OPTION_ARG_STRING_ARRAY: %gchar**
|
|
* - %G_OPTION_ARG_FILENAME_ARRAY: %gchar**
|
|
* - %G_OPTION_ARG_DOUBLE: %gdouble
|
|
* If @arg type is %G_OPTION_ARG_STRING or %G_OPTION_ARG_FILENAME,
|
|
* the location will contain a newly allocated string if the option
|
|
* was given. That string needs to be freed by the callee using g_free().
|
|
* Likewise if @arg type is %G_OPTION_ARG_STRING_ARRAY or
|
|
* %G_OPTION_ARG_FILENAME_ARRAY, the data should be freed using g_strfreev().
|
|
* @description: the description for the option in `--help`
|
|
* output. The @description is translated using the @translate_func
|
|
* of the group, see g_option_group_set_translation_domain().
|
|
* @arg_description: The placeholder to use for the extra argument parsed
|
|
* by the option in `--help` output. The @arg_description is translated
|
|
* using the @translate_func of the group, see
|
|
* g_option_group_set_translation_domain().
|
|
*
|
|
* A GOptionEntry struct defines a single option. To have an effect, they
|
|
* must be added to a #GOptionGroup with g_option_context_add_main_entries()
|
|
* or g_option_group_add_entries().
|
|
*/
|
|
struct _GOptionEntry
|
|
{
|
|
const gchar *long_name;
|
|
gchar short_name;
|
|
gint flags;
|
|
|
|
GOptionArg arg;
|
|
gpointer arg_data;
|
|
|
|
const gchar *description;
|
|
const gchar *arg_description;
|
|
};
|
|
|
|
/**
|
|
* G_OPTION_REMAINING:
|
|
*
|
|
* If a long option in the main group has this name, it is not treated as a
|
|
* regular option. Instead it collects all non-option arguments which would
|
|
* otherwise be left in `argv`. The option must be of type
|
|
* %G_OPTION_ARG_CALLBACK, %G_OPTION_ARG_STRING_ARRAY
|
|
* or %G_OPTION_ARG_FILENAME_ARRAY.
|
|
*
|
|
*
|
|
* Using #G_OPTION_REMAINING instead of simply scanning `argv`
|
|
* for leftover arguments has the advantage that GOption takes care of
|
|
* necessary encoding conversions for strings or filenames.
|
|
*
|
|
* Since: 2.6
|
|
*/
|
|
#define G_OPTION_REMAINING ""
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GOptionContext *g_option_context_new (const gchar *parameter_string);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_option_context_set_summary (GOptionContext *context,
|
|
const gchar *summary);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_option_context_get_summary (GOptionContext *context);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_option_context_set_description (GOptionContext *context,
|
|
const gchar *description);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_option_context_get_description (GOptionContext *context);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_option_context_free (GOptionContext *context);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_option_context_set_help_enabled (GOptionContext *context,
|
|
gboolean help_enabled);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_option_context_get_help_enabled (GOptionContext *context);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_option_context_set_ignore_unknown_options (GOptionContext *context,
|
|
gboolean ignore_unknown);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_option_context_get_ignore_unknown_options (GOptionContext *context);
|
|
|
|
GLIB_AVAILABLE_IN_2_44
|
|
void g_option_context_set_strict_posix (GOptionContext *context,
|
|
gboolean strict_posix);
|
|
GLIB_AVAILABLE_IN_2_44
|
|
gboolean g_option_context_get_strict_posix (GOptionContext *context);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_option_context_add_main_entries (GOptionContext *context,
|
|
const GOptionEntry *entries,
|
|
const gchar *translation_domain);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_option_context_parse (GOptionContext *context,
|
|
gint *argc,
|
|
gchar ***argv,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_2_40
|
|
gboolean g_option_context_parse_strv (GOptionContext *context,
|
|
gchar ***arguments,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_option_context_set_translate_func (GOptionContext *context,
|
|
GTranslateFunc func,
|
|
gpointer data,
|
|
GDestroyNotify destroy_notify);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_option_context_set_translation_domain (GOptionContext *context,
|
|
const gchar *domain);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_option_context_add_group (GOptionContext *context,
|
|
GOptionGroup *group);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_option_context_set_main_group (GOptionContext *context,
|
|
GOptionGroup *group);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GOptionGroup *g_option_context_get_main_group (GOptionContext *context);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_option_context_get_help (GOptionContext *context,
|
|
gboolean main_help,
|
|
GOptionGroup *group);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GOptionGroup *g_option_group_new (const gchar *name,
|
|
const gchar *description,
|
|
const gchar *help_description,
|
|
gpointer user_data,
|
|
GDestroyNotify destroy);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_option_group_set_parse_hooks (GOptionGroup *group,
|
|
GOptionParseFunc pre_parse_func,
|
|
GOptionParseFunc post_parse_func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_option_group_set_error_hook (GOptionGroup *group,
|
|
GOptionErrorFunc error_func);
|
|
GLIB_DEPRECATED_IN_2_44
|
|
void g_option_group_free (GOptionGroup *group);
|
|
GLIB_AVAILABLE_IN_2_44
|
|
GOptionGroup *g_option_group_ref (GOptionGroup *group);
|
|
GLIB_AVAILABLE_IN_2_44
|
|
void g_option_group_unref (GOptionGroup *group);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_option_group_add_entries (GOptionGroup *group,
|
|
const GOptionEntry *entries);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_option_group_set_translate_func (GOptionGroup *group,
|
|
GTranslateFunc func,
|
|
gpointer data,
|
|
GDestroyNotify destroy_notify);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_option_group_set_translation_domain (GOptionGroup *group,
|
|
const gchar *domain);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_OPTION_H__ */
|
|
/* GLIB - Library of useful routines for C programming
|
|
* Copyright (C) 1995-1997, 1999 Peter Mattis, Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __G_PATTERN_H__
|
|
#define __G_PATTERN_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
|
|
typedef struct _GPatternSpec GPatternSpec;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GPatternSpec* g_pattern_spec_new (const gchar *pattern);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_pattern_spec_free (GPatternSpec *pspec);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_pattern_spec_equal (GPatternSpec *pspec1,
|
|
GPatternSpec *pspec2);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_pattern_match (GPatternSpec *pspec,
|
|
guint string_length,
|
|
const gchar *string,
|
|
const gchar *string_reversed);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_pattern_match_string (GPatternSpec *pspec,
|
|
const gchar *string);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_pattern_match_simple (const gchar *pattern,
|
|
const gchar *string);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_PATTERN_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_PRIMES_H__
|
|
#define __G_PRIMES_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/* Prime numbers.
|
|
*/
|
|
|
|
/* This function returns prime numbers spaced by approximately 1.5-2.0
|
|
* and is for use in resizing data structures which prefer
|
|
* prime-valued sizes. The closest spaced prime function returns the
|
|
* next largest prime, or the highest it knows about which is about
|
|
* MAXINT/4.
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_spaced_primes_closest (guint num) G_GNUC_CONST;
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_PRIMES_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_QSORT_H__
|
|
#define __G_QSORT_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_qsort_with_data (gconstpointer pbase,
|
|
gint total_elems,
|
|
gsize size,
|
|
GCompareDataFunc compare_func,
|
|
gpointer user_data);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_QSORT_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_QUEUE_H__
|
|
#define __G_QUEUE_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GQueue GQueue;
|
|
|
|
/**
|
|
* GQueue:
|
|
* @head: a pointer to the first element of the queue
|
|
* @tail: a pointer to the last element of the queue
|
|
* @length: the number of elements in the queue
|
|
*
|
|
* Contains the public fields of a
|
|
* [Queue][glib-Double-ended-Queues].
|
|
*/
|
|
struct _GQueue
|
|
{
|
|
GList *head;
|
|
GList *tail;
|
|
guint length;
|
|
};
|
|
|
|
/**
|
|
* G_QUEUE_INIT:
|
|
*
|
|
* A statically-allocated #GQueue must be initialized with this
|
|
* macro before it can be used. This macro can be used to initialize
|
|
* a variable, but it cannot be assigned to a variable. In that case
|
|
* you have to use g_queue_init().
|
|
*
|
|
* |[
|
|
* GQueue my_queue = G_QUEUE_INIT;
|
|
* ]|
|
|
*
|
|
* Since: 2.14
|
|
*/
|
|
#define G_QUEUE_INIT { NULL, NULL, 0 }
|
|
|
|
/* Queues
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GQueue* g_queue_new (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_queue_free (GQueue *queue);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_queue_free_full (GQueue *queue,
|
|
GDestroyNotify free_func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_queue_init (GQueue *queue);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_queue_clear (GQueue *queue);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_queue_is_empty (GQueue *queue);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_queue_get_length (GQueue *queue);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_queue_reverse (GQueue *queue);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GQueue * g_queue_copy (GQueue *queue);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_queue_foreach (GQueue *queue,
|
|
GFunc func,
|
|
gpointer user_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList * g_queue_find (GQueue *queue,
|
|
gconstpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList * g_queue_find_custom (GQueue *queue,
|
|
gconstpointer data,
|
|
GCompareFunc func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_queue_sort (GQueue *queue,
|
|
GCompareDataFunc compare_func,
|
|
gpointer user_data);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_queue_push_head (GQueue *queue,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_queue_push_tail (GQueue *queue,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_queue_push_nth (GQueue *queue,
|
|
gpointer data,
|
|
gint n);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_queue_pop_head (GQueue *queue);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_queue_pop_tail (GQueue *queue);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_queue_pop_nth (GQueue *queue,
|
|
guint n);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_queue_peek_head (GQueue *queue);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_queue_peek_tail (GQueue *queue);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_queue_peek_nth (GQueue *queue,
|
|
guint n);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_queue_index (GQueue *queue,
|
|
gconstpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_queue_remove (GQueue *queue,
|
|
gconstpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_queue_remove_all (GQueue *queue,
|
|
gconstpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_queue_insert_before (GQueue *queue,
|
|
GList *sibling,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_queue_insert_after (GQueue *queue,
|
|
GList *sibling,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_queue_insert_sorted (GQueue *queue,
|
|
gpointer data,
|
|
GCompareDataFunc func,
|
|
gpointer user_data);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_queue_push_head_link (GQueue *queue,
|
|
GList *link_);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_queue_push_tail_link (GQueue *queue,
|
|
GList *link_);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_queue_push_nth_link (GQueue *queue,
|
|
gint n,
|
|
GList *link_);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_queue_pop_head_link (GQueue *queue);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_queue_pop_tail_link (GQueue *queue);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_queue_pop_nth_link (GQueue *queue,
|
|
guint n);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_queue_peek_head_link (GQueue *queue);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_queue_peek_tail_link (GQueue *queue);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_queue_peek_nth_link (GQueue *queue,
|
|
guint n);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_queue_link_index (GQueue *queue,
|
|
GList *link_);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_queue_unlink (GQueue *queue,
|
|
GList *link_);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_queue_delete_link (GQueue *queue,
|
|
GList *link_);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_QUEUE_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_RAND_H__
|
|
#define __G_RAND_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GRand GRand;
|
|
|
|
/* GRand - a good and fast random number generator: Mersenne Twister
|
|
* see http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html for more info.
|
|
* The range functions return a value in the intervall [begin, end).
|
|
* int -> [0..2^32-1]
|
|
* int_range -> [begin..end-1]
|
|
* double -> [0..1)
|
|
* double_range -> [begin..end)
|
|
*/
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GRand* g_rand_new_with_seed (guint32 seed);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GRand* g_rand_new_with_seed_array (const guint32 *seed,
|
|
guint seed_length);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GRand* g_rand_new (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_rand_free (GRand *rand_);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GRand* g_rand_copy (GRand *rand_);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_rand_set_seed (GRand *rand_,
|
|
guint32 seed);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_rand_set_seed_array (GRand *rand_,
|
|
const guint32 *seed,
|
|
guint seed_length);
|
|
|
|
#define g_rand_boolean(rand_) ((g_rand_int (rand_) & (1 << 15)) != 0)
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint32 g_rand_int (GRand *rand_);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint32 g_rand_int_range (GRand *rand_,
|
|
gint32 begin,
|
|
gint32 end);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gdouble g_rand_double (GRand *rand_);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gdouble g_rand_double_range (GRand *rand_,
|
|
gdouble begin,
|
|
gdouble end);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_random_set_seed (guint32 seed);
|
|
|
|
#define g_random_boolean() ((g_random_int () & (1 << 15)) != 0)
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint32 g_random_int (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint32 g_random_int_range (gint32 begin,
|
|
gint32 end);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gdouble g_random_double (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gdouble g_random_double_range (gdouble begin,
|
|
gdouble end);
|
|
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_RAND_H__ */
|
|
/* GRegex -- regular expression API wrapper around PCRE.
|
|
*
|
|
* Copyright (C) 1999, 2000 Scott Wimer
|
|
* Copyright (C) 2004, Matthias Clasen <mclasen@redhat.com>
|
|
* Copyright (C) 2005 - 2007, Marco Barisione <marco@barisione.org>
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __G_REGEX_H__
|
|
#define __G_REGEX_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/**
|
|
* GRegexError:
|
|
* @G_REGEX_ERROR_COMPILE: Compilation of the regular expression failed.
|
|
* @G_REGEX_ERROR_OPTIMIZE: Optimization of the regular expression failed.
|
|
* @G_REGEX_ERROR_REPLACE: Replacement failed due to an ill-formed replacement
|
|
* string.
|
|
* @G_REGEX_ERROR_MATCH: The match process failed.
|
|
* @G_REGEX_ERROR_INTERNAL: Internal error of the regular expression engine.
|
|
* Since 2.16
|
|
* @G_REGEX_ERROR_STRAY_BACKSLASH: "\\" at end of pattern. Since 2.16
|
|
* @G_REGEX_ERROR_MISSING_CONTROL_CHAR: "\\c" at end of pattern. Since 2.16
|
|
* @G_REGEX_ERROR_UNRECOGNIZED_ESCAPE: Unrecognized character follows "\\".
|
|
* Since 2.16
|
|
* @G_REGEX_ERROR_QUANTIFIERS_OUT_OF_ORDER: Numbers out of order in "{}"
|
|
* quantifier. Since 2.16
|
|
* @G_REGEX_ERROR_QUANTIFIER_TOO_BIG: Number too big in "{}" quantifier.
|
|
* Since 2.16
|
|
* @G_REGEX_ERROR_UNTERMINATED_CHARACTER_CLASS: Missing terminating "]" for
|
|
* character class. Since 2.16
|
|
* @G_REGEX_ERROR_INVALID_ESCAPE_IN_CHARACTER_CLASS: Invalid escape sequence
|
|
* in character class. Since 2.16
|
|
* @G_REGEX_ERROR_RANGE_OUT_OF_ORDER: Range out of order in character class.
|
|
* Since 2.16
|
|
* @G_REGEX_ERROR_NOTHING_TO_REPEAT: Nothing to repeat. Since 2.16
|
|
* @G_REGEX_ERROR_UNRECOGNIZED_CHARACTER: Unrecognized character after "(?",
|
|
* "(?<" or "(?P". Since 2.16
|
|
* @G_REGEX_ERROR_POSIX_NAMED_CLASS_OUTSIDE_CLASS: POSIX named classes are
|
|
* supported only within a class. Since 2.16
|
|
* @G_REGEX_ERROR_UNMATCHED_PARENTHESIS: Missing terminating ")" or ")"
|
|
* without opening "(". Since 2.16
|
|
* @G_REGEX_ERROR_INEXISTENT_SUBPATTERN_REFERENCE: Reference to non-existent
|
|
* subpattern. Since 2.16
|
|
* @G_REGEX_ERROR_UNTERMINATED_COMMENT: Missing terminating ")" after comment.
|
|
* Since 2.16
|
|
* @G_REGEX_ERROR_EXPRESSION_TOO_LARGE: Regular expression too large.
|
|
* Since 2.16
|
|
* @G_REGEX_ERROR_MEMORY_ERROR: Failed to get memory. Since 2.16
|
|
* @G_REGEX_ERROR_VARIABLE_LENGTH_LOOKBEHIND: Lookbehind assertion is not
|
|
* fixed length. Since 2.16
|
|
* @G_REGEX_ERROR_MALFORMED_CONDITION: Malformed number or name after "(?(".
|
|
* Since 2.16
|
|
* @G_REGEX_ERROR_TOO_MANY_CONDITIONAL_BRANCHES: Conditional group contains
|
|
* more than two branches. Since 2.16
|
|
* @G_REGEX_ERROR_ASSERTION_EXPECTED: Assertion expected after "(?(".
|
|
* Since 2.16
|
|
* @G_REGEX_ERROR_UNKNOWN_POSIX_CLASS_NAME: Unknown POSIX class name.
|
|
* Since 2.16
|
|
* @G_REGEX_ERROR_POSIX_COLLATING_ELEMENTS_NOT_SUPPORTED: POSIX collating
|
|
* elements are not supported. Since 2.16
|
|
* @G_REGEX_ERROR_HEX_CODE_TOO_LARGE: Character value in "\\x{...}" sequence
|
|
* is too large. Since 2.16
|
|
* @G_REGEX_ERROR_INVALID_CONDITION: Invalid condition "(?(0)". Since 2.16
|
|
* @G_REGEX_ERROR_SINGLE_BYTE_MATCH_IN_LOOKBEHIND: \\C not allowed in
|
|
* lookbehind assertion. Since 2.16
|
|
* @G_REGEX_ERROR_INFINITE_LOOP: Recursive call could loop indefinitely.
|
|
* Since 2.16
|
|
* @G_REGEX_ERROR_MISSING_SUBPATTERN_NAME_TERMINATOR: Missing terminator
|
|
* in subpattern name. Since 2.16
|
|
* @G_REGEX_ERROR_DUPLICATE_SUBPATTERN_NAME: Two named subpatterns have
|
|
* the same name. Since 2.16
|
|
* @G_REGEX_ERROR_MALFORMED_PROPERTY: Malformed "\\P" or "\\p" sequence.
|
|
* Since 2.16
|
|
* @G_REGEX_ERROR_UNKNOWN_PROPERTY: Unknown property name after "\\P" or
|
|
* "\\p". Since 2.16
|
|
* @G_REGEX_ERROR_SUBPATTERN_NAME_TOO_LONG: Subpattern name is too long
|
|
* (maximum 32 characters). Since 2.16
|
|
* @G_REGEX_ERROR_TOO_MANY_SUBPATTERNS: Too many named subpatterns (maximum
|
|
* 10,000). Since 2.16
|
|
* @G_REGEX_ERROR_INVALID_OCTAL_VALUE: Octal value is greater than "\\377".
|
|
* Since 2.16
|
|
* @G_REGEX_ERROR_TOO_MANY_BRANCHES_IN_DEFINE: "DEFINE" group contains more
|
|
* than one branch. Since 2.16
|
|
* @G_REGEX_ERROR_DEFINE_REPETION: Repeating a "DEFINE" group is not allowed.
|
|
* This error is never raised. Since: 2.16 Deprecated: 2.34
|
|
* @G_REGEX_ERROR_INCONSISTENT_NEWLINE_OPTIONS: Inconsistent newline options.
|
|
* Since 2.16
|
|
* @G_REGEX_ERROR_MISSING_BACK_REFERENCE: "\\g" is not followed by a braced,
|
|
* angle-bracketed, or quoted name or number, or by a plain number. Since: 2.16
|
|
* @G_REGEX_ERROR_INVALID_RELATIVE_REFERENCE: relative reference must not be zero. Since: 2.34
|
|
* @G_REGEX_ERROR_BACKTRACKING_CONTROL_VERB_ARGUMENT_FORBIDDEN: the backtracing
|
|
* control verb used does not allow an argument. Since: 2.34
|
|
* @G_REGEX_ERROR_UNKNOWN_BACKTRACKING_CONTROL_VERB: unknown backtracing
|
|
* control verb. Since: 2.34
|
|
* @G_REGEX_ERROR_NUMBER_TOO_BIG: number is too big in escape sequence. Since: 2.34
|
|
* @G_REGEX_ERROR_MISSING_SUBPATTERN_NAME: Missing subpattern name. Since: 2.34
|
|
* @G_REGEX_ERROR_MISSING_DIGIT: Missing digit. Since 2.34
|
|
* @G_REGEX_ERROR_INVALID_DATA_CHARACTER: In JavaScript compatibility mode,
|
|
* "[" is an invalid data character. Since: 2.34
|
|
* @G_REGEX_ERROR_EXTRA_SUBPATTERN_NAME: different names for subpatterns of the
|
|
* same number are not allowed. Since: 2.34
|
|
* @G_REGEX_ERROR_BACKTRACKING_CONTROL_VERB_ARGUMENT_REQUIRED: the backtracing control
|
|
* verb requires an argument. Since: 2.34
|
|
* @G_REGEX_ERROR_INVALID_CONTROL_CHAR: "\\c" must be followed by an ASCII
|
|
* character. Since: 2.34
|
|
* @G_REGEX_ERROR_MISSING_NAME: "\\k" is not followed by a braced, angle-bracketed, or
|
|
* quoted name. Since: 2.34
|
|
* @G_REGEX_ERROR_NOT_SUPPORTED_IN_CLASS: "\\N" is not supported in a class. Since: 2.34
|
|
* @G_REGEX_ERROR_TOO_MANY_FORWARD_REFERENCES: too many forward references. Since: 2.34
|
|
* @G_REGEX_ERROR_NAME_TOO_LONG: the name is too long in "(*MARK)", "(*PRUNE)",
|
|
* "(*SKIP)", or "(*THEN)". Since: 2.34
|
|
* @G_REGEX_ERROR_CHARACTER_VALUE_TOO_LARGE: the character value in the \\u sequence is
|
|
* too large. Since: 2.34
|
|
*
|
|
* Error codes returned by regular expressions functions.
|
|
*
|
|
* Since: 2.14
|
|
*/
|
|
typedef enum
|
|
{
|
|
G_REGEX_ERROR_COMPILE,
|
|
G_REGEX_ERROR_OPTIMIZE,
|
|
G_REGEX_ERROR_REPLACE,
|
|
G_REGEX_ERROR_MATCH,
|
|
G_REGEX_ERROR_INTERNAL,
|
|
|
|
/* These are the error codes from PCRE + 100 */
|
|
G_REGEX_ERROR_STRAY_BACKSLASH = 101,
|
|
G_REGEX_ERROR_MISSING_CONTROL_CHAR = 102,
|
|
G_REGEX_ERROR_UNRECOGNIZED_ESCAPE = 103,
|
|
G_REGEX_ERROR_QUANTIFIERS_OUT_OF_ORDER = 104,
|
|
G_REGEX_ERROR_QUANTIFIER_TOO_BIG = 105,
|
|
G_REGEX_ERROR_UNTERMINATED_CHARACTER_CLASS = 106,
|
|
G_REGEX_ERROR_INVALID_ESCAPE_IN_CHARACTER_CLASS = 107,
|
|
G_REGEX_ERROR_RANGE_OUT_OF_ORDER = 108,
|
|
G_REGEX_ERROR_NOTHING_TO_REPEAT = 109,
|
|
G_REGEX_ERROR_UNRECOGNIZED_CHARACTER = 112,
|
|
G_REGEX_ERROR_POSIX_NAMED_CLASS_OUTSIDE_CLASS = 113,
|
|
G_REGEX_ERROR_UNMATCHED_PARENTHESIS = 114,
|
|
G_REGEX_ERROR_INEXISTENT_SUBPATTERN_REFERENCE = 115,
|
|
G_REGEX_ERROR_UNTERMINATED_COMMENT = 118,
|
|
G_REGEX_ERROR_EXPRESSION_TOO_LARGE = 120,
|
|
G_REGEX_ERROR_MEMORY_ERROR = 121,
|
|
G_REGEX_ERROR_VARIABLE_LENGTH_LOOKBEHIND = 125,
|
|
G_REGEX_ERROR_MALFORMED_CONDITION = 126,
|
|
G_REGEX_ERROR_TOO_MANY_CONDITIONAL_BRANCHES = 127,
|
|
G_REGEX_ERROR_ASSERTION_EXPECTED = 128,
|
|
G_REGEX_ERROR_UNKNOWN_POSIX_CLASS_NAME = 130,
|
|
G_REGEX_ERROR_POSIX_COLLATING_ELEMENTS_NOT_SUPPORTED = 131,
|
|
G_REGEX_ERROR_HEX_CODE_TOO_LARGE = 134,
|
|
G_REGEX_ERROR_INVALID_CONDITION = 135,
|
|
G_REGEX_ERROR_SINGLE_BYTE_MATCH_IN_LOOKBEHIND = 136,
|
|
G_REGEX_ERROR_INFINITE_LOOP = 140,
|
|
G_REGEX_ERROR_MISSING_SUBPATTERN_NAME_TERMINATOR = 142,
|
|
G_REGEX_ERROR_DUPLICATE_SUBPATTERN_NAME = 143,
|
|
G_REGEX_ERROR_MALFORMED_PROPERTY = 146,
|
|
G_REGEX_ERROR_UNKNOWN_PROPERTY = 147,
|
|
G_REGEX_ERROR_SUBPATTERN_NAME_TOO_LONG = 148,
|
|
G_REGEX_ERROR_TOO_MANY_SUBPATTERNS = 149,
|
|
G_REGEX_ERROR_INVALID_OCTAL_VALUE = 151,
|
|
G_REGEX_ERROR_TOO_MANY_BRANCHES_IN_DEFINE = 154,
|
|
G_REGEX_ERROR_DEFINE_REPETION = 155,
|
|
G_REGEX_ERROR_INCONSISTENT_NEWLINE_OPTIONS = 156,
|
|
G_REGEX_ERROR_MISSING_BACK_REFERENCE = 157,
|
|
G_REGEX_ERROR_INVALID_RELATIVE_REFERENCE = 158,
|
|
G_REGEX_ERROR_BACKTRACKING_CONTROL_VERB_ARGUMENT_FORBIDDEN = 159,
|
|
G_REGEX_ERROR_UNKNOWN_BACKTRACKING_CONTROL_VERB = 160,
|
|
G_REGEX_ERROR_NUMBER_TOO_BIG = 161,
|
|
G_REGEX_ERROR_MISSING_SUBPATTERN_NAME = 162,
|
|
G_REGEX_ERROR_MISSING_DIGIT = 163,
|
|
G_REGEX_ERROR_INVALID_DATA_CHARACTER = 164,
|
|
G_REGEX_ERROR_EXTRA_SUBPATTERN_NAME = 165,
|
|
G_REGEX_ERROR_BACKTRACKING_CONTROL_VERB_ARGUMENT_REQUIRED = 166,
|
|
G_REGEX_ERROR_INVALID_CONTROL_CHAR = 168,
|
|
G_REGEX_ERROR_MISSING_NAME = 169,
|
|
G_REGEX_ERROR_NOT_SUPPORTED_IN_CLASS = 171,
|
|
G_REGEX_ERROR_TOO_MANY_FORWARD_REFERENCES = 172,
|
|
G_REGEX_ERROR_NAME_TOO_LONG = 175,
|
|
G_REGEX_ERROR_CHARACTER_VALUE_TOO_LARGE = 176
|
|
} GRegexError;
|
|
|
|
/**
|
|
* G_REGEX_ERROR:
|
|
*
|
|
* Error domain for regular expressions. Errors in this domain will be
|
|
* from the #GRegexError enumeration. See #GError for information on
|
|
* error domains.
|
|
*
|
|
* Since: 2.14
|
|
*/
|
|
#define G_REGEX_ERROR g_regex_error_quark ()
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GQuark g_regex_error_quark (void);
|
|
|
|
/**
|
|
* GRegexCompileFlags:
|
|
* @G_REGEX_CASELESS: Letters in the pattern match both upper- and
|
|
* lowercase letters. This option can be changed within a pattern
|
|
* by a "(?i)" option setting.
|
|
* @G_REGEX_MULTILINE: By default, GRegex treats the strings as consisting
|
|
* of a single line of characters (even if it actually contains
|
|
* newlines). The "start of line" metacharacter ("^") matches only
|
|
* at the start of the string, while the "end of line" metacharacter
|
|
* ("$") matches only at the end of the string, or before a terminating
|
|
* newline (unless #G_REGEX_DOLLAR_ENDONLY is set). When
|
|
* #G_REGEX_MULTILINE is set, the "start of line" and "end of line"
|
|
* constructs match immediately following or immediately before any
|
|
* newline in the string, respectively, as well as at the very start
|
|
* and end. This can be changed within a pattern by a "(?m)" option
|
|
* setting.
|
|
* @G_REGEX_DOTALL: A dot metacharater (".") in the pattern matches all
|
|
* characters, including newlines. Without it, newlines are excluded.
|
|
* This option can be changed within a pattern by a ("?s") option setting.
|
|
* @G_REGEX_EXTENDED: Whitespace data characters in the pattern are
|
|
* totally ignored except when escaped or inside a character class.
|
|
* Whitespace does not include the VT character (code 11). In addition,
|
|
* characters between an unescaped "#" outside a character class and
|
|
* the next newline character, inclusive, are also ignored. This can
|
|
* be changed within a pattern by a "(?x)" option setting.
|
|
* @G_REGEX_ANCHORED: The pattern is forced to be "anchored", that is,
|
|
* it is constrained to match only at the first matching point in the
|
|
* string that is being searched. This effect can also be achieved by
|
|
* appropriate constructs in the pattern itself such as the "^"
|
|
* metacharater.
|
|
* @G_REGEX_DOLLAR_ENDONLY: A dollar metacharacter ("$") in the pattern
|
|
* matches only at the end of the string. Without this option, a
|
|
* dollar also matches immediately before the final character if
|
|
* it is a newline (but not before any other newlines). This option
|
|
* is ignored if #G_REGEX_MULTILINE is set.
|
|
* @G_REGEX_UNGREEDY: Inverts the "greediness" of the quantifiers so that
|
|
* they are not greedy by default, but become greedy if followed by "?".
|
|
* It can also be set by a "(?U)" option setting within the pattern.
|
|
* @G_REGEX_RAW: Usually strings must be valid UTF-8 strings, using this
|
|
* flag they are considered as a raw sequence of bytes.
|
|
* @G_REGEX_NO_AUTO_CAPTURE: Disables the use of numbered capturing
|
|
* parentheses in the pattern. Any opening parenthesis that is not
|
|
* followed by "?" behaves as if it were followed by "?:" but named
|
|
* parentheses can still be used for capturing (and they acquire numbers
|
|
* in the usual way).
|
|
* @G_REGEX_OPTIMIZE: Optimize the regular expression. If the pattern will
|
|
* be used many times, then it may be worth the effort to optimize it
|
|
* to improve the speed of matches.
|
|
* @G_REGEX_FIRSTLINE: Limits an unanchored pattern to match before (or at) the
|
|
* first newline. Since: 2.34
|
|
* @G_REGEX_DUPNAMES: Names used to identify capturing subpatterns need not
|
|
* be unique. This can be helpful for certain types of pattern when it
|
|
* is known that only one instance of the named subpattern can ever be
|
|
* matched.
|
|
* @G_REGEX_NEWLINE_CR: Usually any newline character or character sequence is
|
|
* recognized. If this option is set, the only recognized newline character
|
|
* is '\r'.
|
|
* @G_REGEX_NEWLINE_LF: Usually any newline character or character sequence is
|
|
* recognized. If this option is set, the only recognized newline character
|
|
* is '\n'.
|
|
* @G_REGEX_NEWLINE_CRLF: Usually any newline character or character sequence is
|
|
* recognized. If this option is set, the only recognized newline character
|
|
* sequence is '\r\n'.
|
|
* @G_REGEX_NEWLINE_ANYCRLF: Usually any newline character or character sequence
|
|
* is recognized. If this option is set, the only recognized newline character
|
|
* sequences are '\r', '\n', and '\r\n'. Since: 2.34
|
|
* @G_REGEX_BSR_ANYCRLF: Usually any newline character or character sequence
|
|
* is recognised. If this option is set, then "\R" only recognizes the newline
|
|
* characters '\r', '\n' and '\r\n'. Since: 2.34
|
|
* @G_REGEX_JAVASCRIPT_COMPAT: Changes behaviour so that it is compatible with
|
|
* JavaScript rather than PCRE. Since: 2.34
|
|
*
|
|
* Flags specifying compile-time options.
|
|
*
|
|
* Since: 2.14
|
|
*/
|
|
/* Remember to update G_REGEX_COMPILE_MASK in gregex.c after
|
|
* adding a new flag.
|
|
*/
|
|
typedef enum
|
|
{
|
|
G_REGEX_CASELESS = 1 << 0,
|
|
G_REGEX_MULTILINE = 1 << 1,
|
|
G_REGEX_DOTALL = 1 << 2,
|
|
G_REGEX_EXTENDED = 1 << 3,
|
|
G_REGEX_ANCHORED = 1 << 4,
|
|
G_REGEX_DOLLAR_ENDONLY = 1 << 5,
|
|
G_REGEX_UNGREEDY = 1 << 9,
|
|
G_REGEX_RAW = 1 << 11,
|
|
G_REGEX_NO_AUTO_CAPTURE = 1 << 12,
|
|
G_REGEX_OPTIMIZE = 1 << 13,
|
|
G_REGEX_FIRSTLINE = 1 << 18,
|
|
G_REGEX_DUPNAMES = 1 << 19,
|
|
G_REGEX_NEWLINE_CR = 1 << 20,
|
|
G_REGEX_NEWLINE_LF = 1 << 21,
|
|
G_REGEX_NEWLINE_CRLF = G_REGEX_NEWLINE_CR | G_REGEX_NEWLINE_LF,
|
|
G_REGEX_NEWLINE_ANYCRLF = G_REGEX_NEWLINE_CR | 1 << 22,
|
|
G_REGEX_BSR_ANYCRLF = 1 << 23,
|
|
G_REGEX_JAVASCRIPT_COMPAT = 1 << 25
|
|
} GRegexCompileFlags;
|
|
|
|
/**
|
|
* GRegexMatchFlags:
|
|
* @G_REGEX_MATCH_ANCHORED: The pattern is forced to be "anchored", that is,
|
|
* it is constrained to match only at the first matching point in the
|
|
* string that is being searched. This effect can also be achieved by
|
|
* appropriate constructs in the pattern itself such as the "^"
|
|
* metacharater.
|
|
* @G_REGEX_MATCH_NOTBOL: Specifies that first character of the string is
|
|
* not the beginning of a line, so the circumflex metacharacter should
|
|
* not match before it. Setting this without #G_REGEX_MULTILINE (at
|
|
* compile time) causes circumflex never to match. This option affects
|
|
* only the behaviour of the circumflex metacharacter, it does not
|
|
* affect "\A".
|
|
* @G_REGEX_MATCH_NOTEOL: Specifies that the end of the subject string is
|
|
* not the end of a line, so the dollar metacharacter should not match
|
|
* it nor (except in multiline mode) a newline immediately before it.
|
|
* Setting this without #G_REGEX_MULTILINE (at compile time) causes
|
|
* dollar never to match. This option affects only the behaviour of
|
|
* the dollar metacharacter, it does not affect "\Z" or "\z".
|
|
* @G_REGEX_MATCH_NOTEMPTY: An empty string is not considered to be a valid
|
|
* match if this option is set. If there are alternatives in the pattern,
|
|
* they are tried. If all the alternatives match the empty string, the
|
|
* entire match fails. For example, if the pattern "a?b?" is applied to
|
|
* a string not beginning with "a" or "b", it matches the empty string
|
|
* at the start of the string. With this flag set, this match is not
|
|
* valid, so GRegex searches further into the string for occurrences
|
|
* of "a" or "b".
|
|
* @G_REGEX_MATCH_PARTIAL: Turns on the partial matching feature, for more
|
|
* documentation on partial matching see g_match_info_is_partial_match().
|
|
* @G_REGEX_MATCH_NEWLINE_CR: Overrides the newline definition set when
|
|
* creating a new #GRegex, setting the '\r' character as line terminator.
|
|
* @G_REGEX_MATCH_NEWLINE_LF: Overrides the newline definition set when
|
|
* creating a new #GRegex, setting the '\n' character as line terminator.
|
|
* @G_REGEX_MATCH_NEWLINE_CRLF: Overrides the newline definition set when
|
|
* creating a new #GRegex, setting the '\r\n' characters sequence as line terminator.
|
|
* @G_REGEX_MATCH_NEWLINE_ANY: Overrides the newline definition set when
|
|
* creating a new #GRegex, any Unicode newline sequence
|
|
* is recognised as a newline. These are '\r', '\n' and '\rn', and the
|
|
* single characters U+000B LINE TABULATION, U+000C FORM FEED (FF),
|
|
* U+0085 NEXT LINE (NEL), U+2028 LINE SEPARATOR and
|
|
* U+2029 PARAGRAPH SEPARATOR.
|
|
* @G_REGEX_MATCH_NEWLINE_ANYCRLF: Overrides the newline definition set when
|
|
* creating a new #GRegex; any '\r', '\n', or '\r\n' character sequence
|
|
* is recognized as a newline. Since: 2.34
|
|
* @G_REGEX_MATCH_BSR_ANYCRLF: Overrides the newline definition for "\R" set when
|
|
* creating a new #GRegex; only '\r', '\n', or '\r\n' character sequences
|
|
* are recognized as a newline by "\R". Since: 2.34
|
|
* @G_REGEX_MATCH_BSR_ANY: Overrides the newline definition for "\R" set when
|
|
* creating a new #GRegex; any Unicode newline character or character sequence
|
|
* are recognized as a newline by "\R". These are '\r', '\n' and '\rn', and the
|
|
* single characters U+000B LINE TABULATION, U+000C FORM FEED (FF),
|
|
* U+0085 NEXT LINE (NEL), U+2028 LINE SEPARATOR and
|
|
* U+2029 PARAGRAPH SEPARATOR. Since: 2.34
|
|
* @G_REGEX_MATCH_PARTIAL_SOFT: An alias for #G_REGEX_MATCH_PARTIAL. Since: 2.34
|
|
* @G_REGEX_MATCH_PARTIAL_HARD: Turns on the partial matching feature. In contrast to
|
|
* to #G_REGEX_MATCH_PARTIAL_SOFT, this stops matching as soon as a partial match
|
|
* is found, without continuing to search for a possible complete match. See
|
|
* g_match_info_is_partial_match() for more information. Since: 2.34
|
|
* @G_REGEX_MATCH_NOTEMPTY_ATSTART: Like #G_REGEX_MATCH_NOTEMPTY, but only applied to
|
|
* the start of the matched string. For anchored
|
|
* patterns this can only happen for pattern containing "\K". Since: 2.34
|
|
*
|
|
* Flags specifying match-time options.
|
|
*
|
|
* Since: 2.14
|
|
*/
|
|
/* Remember to update G_REGEX_MATCH_MASK in gregex.c after
|
|
* adding a new flag. */
|
|
typedef enum
|
|
{
|
|
G_REGEX_MATCH_ANCHORED = 1 << 4,
|
|
G_REGEX_MATCH_NOTBOL = 1 << 7,
|
|
G_REGEX_MATCH_NOTEOL = 1 << 8,
|
|
G_REGEX_MATCH_NOTEMPTY = 1 << 10,
|
|
G_REGEX_MATCH_PARTIAL = 1 << 15,
|
|
G_REGEX_MATCH_NEWLINE_CR = 1 << 20,
|
|
G_REGEX_MATCH_NEWLINE_LF = 1 << 21,
|
|
G_REGEX_MATCH_NEWLINE_CRLF = G_REGEX_MATCH_NEWLINE_CR | G_REGEX_MATCH_NEWLINE_LF,
|
|
G_REGEX_MATCH_NEWLINE_ANY = 1 << 22,
|
|
G_REGEX_MATCH_NEWLINE_ANYCRLF = G_REGEX_MATCH_NEWLINE_CR | G_REGEX_MATCH_NEWLINE_ANY,
|
|
G_REGEX_MATCH_BSR_ANYCRLF = 1 << 23,
|
|
G_REGEX_MATCH_BSR_ANY = 1 << 24,
|
|
G_REGEX_MATCH_PARTIAL_SOFT = G_REGEX_MATCH_PARTIAL,
|
|
G_REGEX_MATCH_PARTIAL_HARD = 1 << 27,
|
|
G_REGEX_MATCH_NOTEMPTY_ATSTART = 1 << 28
|
|
} GRegexMatchFlags;
|
|
|
|
/**
|
|
* GRegex:
|
|
*
|
|
* A GRegex is the "compiled" form of a regular expression pattern.
|
|
* This structure is opaque and its fields cannot be accessed directly.
|
|
*
|
|
* Since: 2.14
|
|
*/
|
|
typedef struct _GRegex GRegex;
|
|
|
|
|
|
/**
|
|
* GMatchInfo:
|
|
*
|
|
* A GMatchInfo is an opaque struct used to return information about
|
|
* matches.
|
|
*/
|
|
typedef struct _GMatchInfo GMatchInfo;
|
|
|
|
/**
|
|
* GRegexEvalCallback:
|
|
* @match_info: the #GMatchInfo generated by the match.
|
|
* Use g_match_info_get_regex() and g_match_info_get_string() if you
|
|
* need the #GRegex or the matched string.
|
|
* @result: a #GString containing the new string
|
|
* @user_data: user data passed to g_regex_replace_eval()
|
|
*
|
|
* Specifies the type of the function passed to g_regex_replace_eval().
|
|
* It is called for each occurrence of the pattern in the string passed
|
|
* to g_regex_replace_eval(), and it should append the replacement to
|
|
* @result.
|
|
*
|
|
* Returns: %FALSE to continue the replacement process, %TRUE to stop it
|
|
*
|
|
* Since: 2.14
|
|
*/
|
|
typedef gboolean (*GRegexEvalCallback) (const GMatchInfo *match_info,
|
|
GString *result,
|
|
gpointer user_data);
|
|
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GRegex *g_regex_new (const gchar *pattern,
|
|
GRegexCompileFlags compile_options,
|
|
GRegexMatchFlags match_options,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GRegex *g_regex_ref (GRegex *regex);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_regex_unref (GRegex *regex);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar *g_regex_get_pattern (const GRegex *regex);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_regex_get_max_backref (const GRegex *regex);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_regex_get_capture_count (const GRegex *regex);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_regex_get_has_cr_or_lf (const GRegex *regex);
|
|
GLIB_AVAILABLE_IN_2_38
|
|
gint g_regex_get_max_lookbehind (const GRegex *regex);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_regex_get_string_number (const GRegex *regex,
|
|
const gchar *name);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_regex_escape_string (const gchar *string,
|
|
gint length);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_regex_escape_nul (const gchar *string,
|
|
gint length);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GRegexCompileFlags g_regex_get_compile_flags (const GRegex *regex);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GRegexMatchFlags g_regex_get_match_flags (const GRegex *regex);
|
|
|
|
/* Matching. */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_regex_match_simple (const gchar *pattern,
|
|
const gchar *string,
|
|
GRegexCompileFlags compile_options,
|
|
GRegexMatchFlags match_options);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_regex_match (const GRegex *regex,
|
|
const gchar *string,
|
|
GRegexMatchFlags match_options,
|
|
GMatchInfo **match_info);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_regex_match_full (const GRegex *regex,
|
|
const gchar *string,
|
|
gssize string_len,
|
|
gint start_position,
|
|
GRegexMatchFlags match_options,
|
|
GMatchInfo **match_info,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_regex_match_all (const GRegex *regex,
|
|
const gchar *string,
|
|
GRegexMatchFlags match_options,
|
|
GMatchInfo **match_info);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_regex_match_all_full (const GRegex *regex,
|
|
const gchar *string,
|
|
gssize string_len,
|
|
gint start_position,
|
|
GRegexMatchFlags match_options,
|
|
GMatchInfo **match_info,
|
|
GError **error);
|
|
|
|
/* String splitting. */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar **g_regex_split_simple (const gchar *pattern,
|
|
const gchar *string,
|
|
GRegexCompileFlags compile_options,
|
|
GRegexMatchFlags match_options);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar **g_regex_split (const GRegex *regex,
|
|
const gchar *string,
|
|
GRegexMatchFlags match_options);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar **g_regex_split_full (const GRegex *regex,
|
|
const gchar *string,
|
|
gssize string_len,
|
|
gint start_position,
|
|
GRegexMatchFlags match_options,
|
|
gint max_tokens,
|
|
GError **error);
|
|
|
|
/* String replacement. */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_regex_replace (const GRegex *regex,
|
|
const gchar *string,
|
|
gssize string_len,
|
|
gint start_position,
|
|
const gchar *replacement,
|
|
GRegexMatchFlags match_options,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_regex_replace_literal (const GRegex *regex,
|
|
const gchar *string,
|
|
gssize string_len,
|
|
gint start_position,
|
|
const gchar *replacement,
|
|
GRegexMatchFlags match_options,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_regex_replace_eval (const GRegex *regex,
|
|
const gchar *string,
|
|
gssize string_len,
|
|
gint start_position,
|
|
GRegexMatchFlags match_options,
|
|
GRegexEvalCallback eval,
|
|
gpointer user_data,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_regex_check_replacement (const gchar *replacement,
|
|
gboolean *has_references,
|
|
GError **error);
|
|
|
|
/* Match info */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GRegex *g_match_info_get_regex (const GMatchInfo *match_info);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar *g_match_info_get_string (const GMatchInfo *match_info);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GMatchInfo *g_match_info_ref (GMatchInfo *match_info);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_match_info_unref (GMatchInfo *match_info);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_match_info_free (GMatchInfo *match_info);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_match_info_next (GMatchInfo *match_info,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_match_info_matches (const GMatchInfo *match_info);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_match_info_get_match_count (const GMatchInfo *match_info);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_match_info_is_partial_match (const GMatchInfo *match_info);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_match_info_expand_references(const GMatchInfo *match_info,
|
|
const gchar *string_to_expand,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_match_info_fetch (const GMatchInfo *match_info,
|
|
gint match_num);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_match_info_fetch_pos (const GMatchInfo *match_info,
|
|
gint match_num,
|
|
gint *start_pos,
|
|
gint *end_pos);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_match_info_fetch_named (const GMatchInfo *match_info,
|
|
const gchar *name);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_match_info_fetch_named_pos (const GMatchInfo *match_info,
|
|
const gchar *name,
|
|
gint *start_pos,
|
|
gint *end_pos);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar **g_match_info_fetch_all (const GMatchInfo *match_info);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_REGEX_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_SCANNER_H__
|
|
#define __G_SCANNER_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GScanner GScanner;
|
|
typedef struct _GScannerConfig GScannerConfig;
|
|
typedef union _GTokenValue GTokenValue;
|
|
|
|
typedef void (*GScannerMsgFunc) (GScanner *scanner,
|
|
gchar *message,
|
|
gboolean error);
|
|
|
|
/* GScanner: Flexible lexical scanner for general purpose.
|
|
*/
|
|
|
|
/* Character sets */
|
|
#define G_CSET_A_2_Z "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
#define G_CSET_a_2_z "abcdefghijklmnopqrstuvwxyz"
|
|
#define G_CSET_DIGITS "0123456789"
|
|
#define G_CSET_LATINC "\300\301\302\303\304\305\306"\
|
|
"\307\310\311\312\313\314\315\316\317\320"\
|
|
"\321\322\323\324\325\326"\
|
|
"\330\331\332\333\334\335\336"
|
|
#define G_CSET_LATINS "\337\340\341\342\343\344\345\346"\
|
|
"\347\350\351\352\353\354\355\356\357\360"\
|
|
"\361\362\363\364\365\366"\
|
|
"\370\371\372\373\374\375\376\377"
|
|
|
|
/* Error types */
|
|
typedef enum
|
|
{
|
|
G_ERR_UNKNOWN,
|
|
G_ERR_UNEXP_EOF,
|
|
G_ERR_UNEXP_EOF_IN_STRING,
|
|
G_ERR_UNEXP_EOF_IN_COMMENT,
|
|
G_ERR_NON_DIGIT_IN_CONST,
|
|
G_ERR_DIGIT_RADIX,
|
|
G_ERR_FLOAT_RADIX,
|
|
G_ERR_FLOAT_MALFORMED
|
|
} GErrorType;
|
|
|
|
/* Token types */
|
|
typedef enum
|
|
{
|
|
G_TOKEN_EOF = 0,
|
|
|
|
G_TOKEN_LEFT_PAREN = '(',
|
|
G_TOKEN_RIGHT_PAREN = ')',
|
|
G_TOKEN_LEFT_CURLY = '{',
|
|
G_TOKEN_RIGHT_CURLY = '}',
|
|
G_TOKEN_LEFT_BRACE = '[',
|
|
G_TOKEN_RIGHT_BRACE = ']',
|
|
G_TOKEN_EQUAL_SIGN = '=',
|
|
G_TOKEN_COMMA = ',',
|
|
|
|
G_TOKEN_NONE = 256,
|
|
|
|
G_TOKEN_ERROR,
|
|
|
|
G_TOKEN_CHAR,
|
|
G_TOKEN_BINARY,
|
|
G_TOKEN_OCTAL,
|
|
G_TOKEN_INT,
|
|
G_TOKEN_HEX,
|
|
G_TOKEN_FLOAT,
|
|
G_TOKEN_STRING,
|
|
|
|
G_TOKEN_SYMBOL,
|
|
G_TOKEN_IDENTIFIER,
|
|
G_TOKEN_IDENTIFIER_NULL,
|
|
|
|
G_TOKEN_COMMENT_SINGLE,
|
|
G_TOKEN_COMMENT_MULTI,
|
|
|
|
/*< private >*/
|
|
G_TOKEN_LAST
|
|
} GTokenType;
|
|
|
|
union _GTokenValue
|
|
{
|
|
gpointer v_symbol;
|
|
gchar *v_identifier;
|
|
gulong v_binary;
|
|
gulong v_octal;
|
|
gulong v_int;
|
|
guint64 v_int64;
|
|
gdouble v_float;
|
|
gulong v_hex;
|
|
gchar *v_string;
|
|
gchar *v_comment;
|
|
guchar v_char;
|
|
guint v_error;
|
|
};
|
|
|
|
struct _GScannerConfig
|
|
{
|
|
/* Character sets
|
|
*/
|
|
gchar *cset_skip_characters; /* default: " \t\n" */
|
|
gchar *cset_identifier_first;
|
|
gchar *cset_identifier_nth;
|
|
gchar *cpair_comment_single; /* default: "#\n" */
|
|
|
|
/* Should symbol lookup work case sensitive?
|
|
*/
|
|
guint case_sensitive : 1;
|
|
|
|
/* Boolean values to be adjusted "on the fly"
|
|
* to configure scanning behaviour.
|
|
*/
|
|
guint skip_comment_multi : 1; /* C like comment */
|
|
guint skip_comment_single : 1; /* single line comment */
|
|
guint scan_comment_multi : 1; /* scan multi line comments? */
|
|
guint scan_identifier : 1;
|
|
guint scan_identifier_1char : 1;
|
|
guint scan_identifier_NULL : 1;
|
|
guint scan_symbols : 1;
|
|
guint scan_binary : 1;
|
|
guint scan_octal : 1;
|
|
guint scan_float : 1;
|
|
guint scan_hex : 1; /* '0x0ff0' */
|
|
guint scan_hex_dollar : 1; /* '$0ff0' */
|
|
guint scan_string_sq : 1; /* string: 'anything' */
|
|
guint scan_string_dq : 1; /* string: "\\-escapes!\n" */
|
|
guint numbers_2_int : 1; /* bin, octal, hex => int */
|
|
guint int_2_float : 1; /* int => G_TOKEN_FLOAT? */
|
|
guint identifier_2_string : 1;
|
|
guint char_2_token : 1; /* return G_TOKEN_CHAR? */
|
|
guint symbol_2_token : 1;
|
|
guint scope_0_fallback : 1; /* try scope 0 on lookups? */
|
|
guint store_int64 : 1; /* use value.v_int64 rather than v_int */
|
|
|
|
/*< private >*/
|
|
guint padding_dummy;
|
|
};
|
|
|
|
struct _GScanner
|
|
{
|
|
/* unused fields */
|
|
gpointer user_data;
|
|
guint max_parse_errors;
|
|
|
|
/* g_scanner_error() increments this field */
|
|
guint parse_errors;
|
|
|
|
/* name of input stream, featured by the default message handler */
|
|
const gchar *input_name;
|
|
|
|
/* quarked data */
|
|
GData *qdata;
|
|
|
|
/* link into the scanner configuration */
|
|
GScannerConfig *config;
|
|
|
|
/* fields filled in after g_scanner_get_next_token() */
|
|
GTokenType token;
|
|
GTokenValue value;
|
|
guint line;
|
|
guint position;
|
|
|
|
/* fields filled in after g_scanner_peek_next_token() */
|
|
GTokenType next_token;
|
|
GTokenValue next_value;
|
|
guint next_line;
|
|
guint next_position;
|
|
|
|
/*< private >*/
|
|
/* to be considered private */
|
|
GHashTable *symbol_table;
|
|
gint input_fd;
|
|
const gchar *text;
|
|
const gchar *text_end;
|
|
gchar *buffer;
|
|
guint scope_id;
|
|
|
|
/*< public >*/
|
|
/* handler function for _warn and _error */
|
|
GScannerMsgFunc msg_handler;
|
|
};
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GScanner* g_scanner_new (const GScannerConfig *config_templ);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_scanner_destroy (GScanner *scanner);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_scanner_input_file (GScanner *scanner,
|
|
gint input_fd);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_scanner_sync_file_offset (GScanner *scanner);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_scanner_input_text (GScanner *scanner,
|
|
const gchar *text,
|
|
guint text_len);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GTokenType g_scanner_get_next_token (GScanner *scanner);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GTokenType g_scanner_peek_next_token (GScanner *scanner);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GTokenType g_scanner_cur_token (GScanner *scanner);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GTokenValue g_scanner_cur_value (GScanner *scanner);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_scanner_cur_line (GScanner *scanner);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_scanner_cur_position (GScanner *scanner);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_scanner_eof (GScanner *scanner);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_scanner_set_scope (GScanner *scanner,
|
|
guint scope_id);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_scanner_scope_add_symbol (GScanner *scanner,
|
|
guint scope_id,
|
|
const gchar *symbol,
|
|
gpointer value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_scanner_scope_remove_symbol (GScanner *scanner,
|
|
guint scope_id,
|
|
const gchar *symbol);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_scanner_scope_lookup_symbol (GScanner *scanner,
|
|
guint scope_id,
|
|
const gchar *symbol);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_scanner_scope_foreach_symbol (GScanner *scanner,
|
|
guint scope_id,
|
|
GHFunc func,
|
|
gpointer user_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_scanner_lookup_symbol (GScanner *scanner,
|
|
const gchar *symbol);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_scanner_unexp_token (GScanner *scanner,
|
|
GTokenType expected_token,
|
|
const gchar *identifier_spec,
|
|
const gchar *symbol_spec,
|
|
const gchar *symbol_name,
|
|
const gchar *message,
|
|
gint is_error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_scanner_error (GScanner *scanner,
|
|
const gchar *format,
|
|
...) G_GNUC_PRINTF (2,3);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_scanner_warn (GScanner *scanner,
|
|
const gchar *format,
|
|
...) G_GNUC_PRINTF (2,3);
|
|
|
|
#ifndef G_DISABLE_DEPRECATED
|
|
|
|
/* keep downward source compatibility */
|
|
#define g_scanner_add_symbol( scanner, symbol, value ) G_STMT_START { \
|
|
g_scanner_scope_add_symbol ((scanner), 0, (symbol), (value)); \
|
|
} G_STMT_END
|
|
#define g_scanner_remove_symbol( scanner, symbol ) G_STMT_START { \
|
|
g_scanner_scope_remove_symbol ((scanner), 0, (symbol)); \
|
|
} G_STMT_END
|
|
#define g_scanner_foreach_symbol( scanner, func, data ) G_STMT_START { \
|
|
g_scanner_scope_foreach_symbol ((scanner), 0, (func), (data)); \
|
|
} G_STMT_END
|
|
|
|
/* The following two functions are deprecated and will be removed in
|
|
* the next major release. They do no good. */
|
|
#define g_scanner_freeze_symbol_table(scanner) ((void)0)
|
|
#define g_scanner_thaw_symbol_table(scanner) ((void)0)
|
|
|
|
#endif /* G_DISABLE_DEPRECATED */
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_SCANNER_H__ */
|
|
/* GLIB - Library of useful routines for C programming
|
|
* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007
|
|
* Soeren Sandmann (sandmann@daimi.au.dk)
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __G_SEQUENCE_H__
|
|
#define __G_SEQUENCE_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GSequence GSequence;
|
|
typedef struct _GSequenceNode GSequenceIter;
|
|
|
|
typedef gint (* GSequenceIterCompareFunc) (GSequenceIter *a,
|
|
GSequenceIter *b,
|
|
gpointer data);
|
|
|
|
|
|
/* GSequence */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSequence * g_sequence_new (GDestroyNotify data_destroy);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_sequence_free (GSequence *seq);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_sequence_get_length (GSequence *seq);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_sequence_foreach (GSequence *seq,
|
|
GFunc func,
|
|
gpointer user_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_sequence_foreach_range (GSequenceIter *begin,
|
|
GSequenceIter *end,
|
|
GFunc func,
|
|
gpointer user_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_sequence_sort (GSequence *seq,
|
|
GCompareDataFunc cmp_func,
|
|
gpointer cmp_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_sequence_sort_iter (GSequence *seq,
|
|
GSequenceIterCompareFunc cmp_func,
|
|
gpointer cmp_data);
|
|
GLIB_AVAILABLE_IN_2_48
|
|
gboolean g_sequence_is_empty (GSequence *seq);
|
|
|
|
|
|
/* Getting iters */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSequenceIter *g_sequence_get_begin_iter (GSequence *seq);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSequenceIter *g_sequence_get_end_iter (GSequence *seq);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSequenceIter *g_sequence_get_iter_at_pos (GSequence *seq,
|
|
gint pos);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSequenceIter *g_sequence_append (GSequence *seq,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSequenceIter *g_sequence_prepend (GSequence *seq,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSequenceIter *g_sequence_insert_before (GSequenceIter *iter,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_sequence_move (GSequenceIter *src,
|
|
GSequenceIter *dest);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_sequence_swap (GSequenceIter *a,
|
|
GSequenceIter *b);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSequenceIter *g_sequence_insert_sorted (GSequence *seq,
|
|
gpointer data,
|
|
GCompareDataFunc cmp_func,
|
|
gpointer cmp_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSequenceIter *g_sequence_insert_sorted_iter (GSequence *seq,
|
|
gpointer data,
|
|
GSequenceIterCompareFunc iter_cmp,
|
|
gpointer cmp_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_sequence_sort_changed (GSequenceIter *iter,
|
|
GCompareDataFunc cmp_func,
|
|
gpointer cmp_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_sequence_sort_changed_iter (GSequenceIter *iter,
|
|
GSequenceIterCompareFunc iter_cmp,
|
|
gpointer cmp_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_sequence_remove (GSequenceIter *iter);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_sequence_remove_range (GSequenceIter *begin,
|
|
GSequenceIter *end);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_sequence_move_range (GSequenceIter *dest,
|
|
GSequenceIter *begin,
|
|
GSequenceIter *end);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSequenceIter *g_sequence_search (GSequence *seq,
|
|
gpointer data,
|
|
GCompareDataFunc cmp_func,
|
|
gpointer cmp_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSequenceIter *g_sequence_search_iter (GSequence *seq,
|
|
gpointer data,
|
|
GSequenceIterCompareFunc iter_cmp,
|
|
gpointer cmp_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSequenceIter *g_sequence_lookup (GSequence *seq,
|
|
gpointer data,
|
|
GCompareDataFunc cmp_func,
|
|
gpointer cmp_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSequenceIter *g_sequence_lookup_iter (GSequence *seq,
|
|
gpointer data,
|
|
GSequenceIterCompareFunc iter_cmp,
|
|
gpointer cmp_data);
|
|
|
|
|
|
/* Dereferencing */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_sequence_get (GSequenceIter *iter);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_sequence_set (GSequenceIter *iter,
|
|
gpointer data);
|
|
|
|
/* Operations on GSequenceIter * */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_sequence_iter_is_begin (GSequenceIter *iter);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_sequence_iter_is_end (GSequenceIter *iter);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSequenceIter *g_sequence_iter_next (GSequenceIter *iter);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSequenceIter *g_sequence_iter_prev (GSequenceIter *iter);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_sequence_iter_get_position (GSequenceIter *iter);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSequenceIter *g_sequence_iter_move (GSequenceIter *iter,
|
|
gint delta);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSequence * g_sequence_iter_get_sequence (GSequenceIter *iter);
|
|
|
|
|
|
/* Search */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_sequence_iter_compare (GSequenceIter *a,
|
|
GSequenceIter *b);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSequenceIter *g_sequence_range_get_midpoint (GSequenceIter *begin,
|
|
GSequenceIter *end);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_SEQUENCE_H__ */
|
|
/* gshell.h - Shell-related utilities
|
|
*
|
|
* Copyright 2000 Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __G_SHELL_H__
|
|
#define __G_SHELL_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
#define G_SHELL_ERROR g_shell_error_quark ()
|
|
|
|
typedef enum
|
|
{
|
|
/* mismatched or otherwise mangled quoting */
|
|
G_SHELL_ERROR_BAD_QUOTING,
|
|
/* string to be parsed was empty */
|
|
G_SHELL_ERROR_EMPTY_STRING,
|
|
G_SHELL_ERROR_FAILED
|
|
} GShellError;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GQuark g_shell_error_quark (void);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_shell_quote (const gchar *unquoted_string);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_shell_unquote (const gchar *quoted_string,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_shell_parse_argv (const gchar *command_line,
|
|
gint *argcp,
|
|
gchar ***argvp,
|
|
GError **error);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_SHELL_H__ */
|
|
/* GLIB sliced memory - fast threaded memory chunk allocator
|
|
* Copyright (C) 2005 Tim Janik
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __G_SLICE_H__
|
|
#define __G_SLICE_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/* slices - fast allocation/release of small memory blocks
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_slice_alloc (gsize block_size) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_slice_alloc0 (gsize block_size) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_slice_copy (gsize block_size,
|
|
gconstpointer mem_block) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_slice_free1 (gsize block_size,
|
|
gpointer mem_block);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_slice_free_chain_with_offset (gsize block_size,
|
|
gpointer mem_chain,
|
|
gsize next_offset);
|
|
#define g_slice_new(type) ((type*) g_slice_alloc (sizeof (type)))
|
|
#define g_slice_new0(type) ((type*) g_slice_alloc0 (sizeof (type)))
|
|
/* MemoryBlockType *
|
|
* g_slice_dup (MemoryBlockType,
|
|
* MemoryBlockType *mem_block);
|
|
* g_slice_free (MemoryBlockType,
|
|
* MemoryBlockType *mem_block);
|
|
* g_slice_free_chain (MemoryBlockType,
|
|
* MemoryBlockType *first_chain_block,
|
|
* memory_block_next_field);
|
|
* pseudo prototypes for the macro
|
|
* definitions following below.
|
|
*/
|
|
|
|
/* we go through extra hoops to ensure type safety */
|
|
#define g_slice_dup(type, mem) \
|
|
(1 ? (type*) g_slice_copy (sizeof (type), (mem)) \
|
|
: ((void) ((type*) 0 == (mem)), (type*) 0))
|
|
#define g_slice_free(type, mem) \
|
|
G_STMT_START { \
|
|
if (1) g_slice_free1 (sizeof (type), (mem)); \
|
|
else (void) ((type*) 0 == (mem)); \
|
|
} G_STMT_END
|
|
#define g_slice_free_chain(type, mem_chain, next) \
|
|
G_STMT_START { \
|
|
if (1) g_slice_free_chain_with_offset (sizeof (type), \
|
|
(mem_chain), G_STRUCT_OFFSET (type, next)); \
|
|
else (void) ((type*) 0 == (mem_chain)); \
|
|
} G_STMT_END
|
|
|
|
/* --- internal debugging API --- */
|
|
typedef enum {
|
|
G_SLICE_CONFIG_ALWAYS_MALLOC = 1,
|
|
G_SLICE_CONFIG_BYPASS_MAGAZINES,
|
|
G_SLICE_CONFIG_WORKING_SET_MSECS,
|
|
G_SLICE_CONFIG_COLOR_INCREMENT,
|
|
G_SLICE_CONFIG_CHUNK_SIZES,
|
|
G_SLICE_CONFIG_CONTENTION_COUNTER
|
|
} GSliceConfig;
|
|
|
|
GLIB_DEPRECATED_IN_2_34
|
|
void g_slice_set_config (GSliceConfig ckey, gint64 value);
|
|
GLIB_DEPRECATED_IN_2_34
|
|
gint64 g_slice_get_config (GSliceConfig ckey);
|
|
GLIB_DEPRECATED_IN_2_34
|
|
gint64* g_slice_get_config_state (GSliceConfig ckey, gint64 address, guint *n_values);
|
|
|
|
#ifdef G_ENABLE_DEBUG
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_slice_debug_tree_statistics (void);
|
|
#endif
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_SLICE_H__ */
|
|
/* gspawn.h - Process launching
|
|
*
|
|
* Copyright 2000 Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __G_SPAWN_H__
|
|
#define __G_SPAWN_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
|
|
/* I'm not sure I remember our proposed naming convention here. */
|
|
/**
|
|
* G_SPAWN_ERROR:
|
|
*
|
|
* Error domain for spawning processes. Errors in this domain will
|
|
* be from the #GSpawnError enumeration. See #GError for information on
|
|
* error domains.
|
|
*/
|
|
#define G_SPAWN_ERROR g_spawn_error_quark ()
|
|
|
|
/**
|
|
* GSpawnError:
|
|
* @G_SPAWN_ERROR_FORK: Fork failed due to lack of memory.
|
|
* @G_SPAWN_ERROR_READ: Read or select on pipes failed.
|
|
* @G_SPAWN_ERROR_CHDIR: Changing to working directory failed.
|
|
* @G_SPAWN_ERROR_ACCES: execv() returned `EACCES`
|
|
* @G_SPAWN_ERROR_PERM: execv() returned `EPERM`
|
|
* @G_SPAWN_ERROR_TOO_BIG: execv() returned `E2BIG`
|
|
* @G_SPAWN_ERROR_2BIG: deprecated alias for %G_SPAWN_ERROR_TOO_BIG
|
|
* @G_SPAWN_ERROR_NOEXEC: execv() returned `ENOEXEC`
|
|
* @G_SPAWN_ERROR_NAMETOOLONG: execv() returned `ENAMETOOLONG`
|
|
* @G_SPAWN_ERROR_NOENT: execv() returned `ENOENT`
|
|
* @G_SPAWN_ERROR_NOMEM: execv() returned `ENOMEM`
|
|
* @G_SPAWN_ERROR_NOTDIR: execv() returned `ENOTDIR`
|
|
* @G_SPAWN_ERROR_LOOP: execv() returned `ELOOP`
|
|
* @G_SPAWN_ERROR_TXTBUSY: execv() returned `ETXTBUSY`
|
|
* @G_SPAWN_ERROR_IO: execv() returned `EIO`
|
|
* @G_SPAWN_ERROR_NFILE: execv() returned `ENFILE`
|
|
* @G_SPAWN_ERROR_MFILE: execv() returned `EMFILE`
|
|
* @G_SPAWN_ERROR_INVAL: execv() returned `EINVAL`
|
|
* @G_SPAWN_ERROR_ISDIR: execv() returned `EISDIR`
|
|
* @G_SPAWN_ERROR_LIBBAD: execv() returned `ELIBBAD`
|
|
* @G_SPAWN_ERROR_FAILED: Some other fatal failure,
|
|
* `error->message` should explain.
|
|
*
|
|
* Error codes returned by spawning processes.
|
|
*/
|
|
typedef enum
|
|
{
|
|
G_SPAWN_ERROR_FORK, /* fork failed due to lack of memory */
|
|
G_SPAWN_ERROR_READ, /* read or select on pipes failed */
|
|
G_SPAWN_ERROR_CHDIR, /* changing to working dir failed */
|
|
G_SPAWN_ERROR_ACCES, /* execv() returned EACCES */
|
|
G_SPAWN_ERROR_PERM, /* execv() returned EPERM */
|
|
G_SPAWN_ERROR_TOO_BIG,/* execv() returned E2BIG */
|
|
#ifndef G_DISABLE_DEPRECATED
|
|
G_SPAWN_ERROR_2BIG = G_SPAWN_ERROR_TOO_BIG,
|
|
#endif
|
|
G_SPAWN_ERROR_NOEXEC, /* execv() returned ENOEXEC */
|
|
G_SPAWN_ERROR_NAMETOOLONG, /* "" "" ENAMETOOLONG */
|
|
G_SPAWN_ERROR_NOENT, /* "" "" ENOENT */
|
|
G_SPAWN_ERROR_NOMEM, /* "" "" ENOMEM */
|
|
G_SPAWN_ERROR_NOTDIR, /* "" "" ENOTDIR */
|
|
G_SPAWN_ERROR_LOOP, /* "" "" ELOOP */
|
|
G_SPAWN_ERROR_TXTBUSY, /* "" "" ETXTBUSY */
|
|
G_SPAWN_ERROR_IO, /* "" "" EIO */
|
|
G_SPAWN_ERROR_NFILE, /* "" "" ENFILE */
|
|
G_SPAWN_ERROR_MFILE, /* "" "" EMFLE */
|
|
G_SPAWN_ERROR_INVAL, /* "" "" EINVAL */
|
|
G_SPAWN_ERROR_ISDIR, /* "" "" EISDIR */
|
|
G_SPAWN_ERROR_LIBBAD, /* "" "" ELIBBAD */
|
|
G_SPAWN_ERROR_FAILED /* other fatal failure, error->message
|
|
* should explain
|
|
*/
|
|
} GSpawnError;
|
|
|
|
/**
|
|
* G_SPAWN_EXIT_ERROR:
|
|
*
|
|
* Error domain used by g_spawn_check_exit_status(). The code
|
|
* will be the program exit code.
|
|
*/
|
|
#define G_SPAWN_EXIT_ERROR g_spawn_exit_error_quark ()
|
|
|
|
/**
|
|
* GSpawnChildSetupFunc:
|
|
* @user_data: user data to pass to the function.
|
|
*
|
|
* Specifies the type of the setup function passed to g_spawn_async(),
|
|
* g_spawn_sync() and g_spawn_async_with_pipes(), which can, in very
|
|
* limited ways, be used to affect the child's execution.
|
|
*
|
|
* On POSIX platforms, the function is called in the child after GLib
|
|
* has performed all the setup it plans to perform, but before calling
|
|
* exec(). Actions taken in this function will only affect the child,
|
|
* not the parent.
|
|
*
|
|
* On Windows, the function is called in the parent. Its usefulness on
|
|
* Windows is thus questionable. In many cases executing the child setup
|
|
* function in the parent can have ill effects, and you should be very
|
|
* careful when porting software to Windows that uses child setup
|
|
* functions.
|
|
*
|
|
* However, even on POSIX, you are extremely limited in what you can
|
|
* safely do from a #GSpawnChildSetupFunc, because any mutexes that were
|
|
* held by other threads in the parent process at the time of the fork()
|
|
* will still be locked in the child process, and they will never be
|
|
* unlocked (since the threads that held them don't exist in the child).
|
|
* POSIX allows only async-signal-safe functions (see signal(7)) to be
|
|
* called in the child between fork() and exec(), which drastically limits
|
|
* the usefulness of child setup functions.
|
|
*
|
|
* In particular, it is not safe to call any function which may
|
|
* call malloc(), which includes POSIX functions such as setenv().
|
|
* If you need to set up the child environment differently from
|
|
* the parent, you should use g_get_environ(), g_environ_setenv(),
|
|
* and g_environ_unsetenv(), and then pass the complete environment
|
|
* list to the `g_spawn...` function.
|
|
*/
|
|
typedef void (* GSpawnChildSetupFunc) (gpointer user_data);
|
|
|
|
/**
|
|
* GSpawnFlags:
|
|
* @G_SPAWN_DEFAULT: no flags, default behaviour
|
|
* @G_SPAWN_LEAVE_DESCRIPTORS_OPEN: the parent's open file descriptors will
|
|
* be inherited by the child; otherwise all descriptors except stdin,
|
|
* stdout and stderr will be closed before calling exec() in the child.
|
|
* @G_SPAWN_DO_NOT_REAP_CHILD: the child will not be automatically reaped;
|
|
* you must use g_child_watch_add() yourself (or call waitpid() or handle
|
|
* `SIGCHLD` yourself), or the child will become a zombie.
|
|
* @G_SPAWN_SEARCH_PATH: `argv[0]` need not be an absolute path, it will be
|
|
* looked for in the user's `PATH`.
|
|
* @G_SPAWN_STDOUT_TO_DEV_NULL: the child's standard output will be discarded,
|
|
* instead of going to the same location as the parent's standard output.
|
|
* @G_SPAWN_STDERR_TO_DEV_NULL: the child's standard error will be discarded.
|
|
* @G_SPAWN_CHILD_INHERITS_STDIN: the child will inherit the parent's standard
|
|
* input (by default, the child's standard input is attached to `/dev/null`).
|
|
* @G_SPAWN_FILE_AND_ARGV_ZERO: the first element of `argv` is the file to
|
|
* execute, while the remaining elements are the actual argument vector
|
|
* to pass to the file. Normally g_spawn_async_with_pipes() uses `argv[0]`
|
|
* as the file to execute, and passes all of `argv` to the child.
|
|
* @G_SPAWN_SEARCH_PATH_FROM_ENVP: if `argv[0]` is not an abolute path,
|
|
* it will be looked for in the `PATH` from the passed child environment.
|
|
* Since: 2.34
|
|
* @G_SPAWN_CLOEXEC_PIPES: create all pipes with the `O_CLOEXEC` flag set.
|
|
* Since: 2.40
|
|
*
|
|
* Flags passed to g_spawn_sync(), g_spawn_async() and g_spawn_async_with_pipes().
|
|
*/
|
|
typedef enum
|
|
{
|
|
G_SPAWN_DEFAULT = 0,
|
|
G_SPAWN_LEAVE_DESCRIPTORS_OPEN = 1 << 0,
|
|
G_SPAWN_DO_NOT_REAP_CHILD = 1 << 1,
|
|
/* look for argv[0] in the path i.e. use execvp() */
|
|
G_SPAWN_SEARCH_PATH = 1 << 2,
|
|
/* Dump output to /dev/null */
|
|
G_SPAWN_STDOUT_TO_DEV_NULL = 1 << 3,
|
|
G_SPAWN_STDERR_TO_DEV_NULL = 1 << 4,
|
|
G_SPAWN_CHILD_INHERITS_STDIN = 1 << 5,
|
|
G_SPAWN_FILE_AND_ARGV_ZERO = 1 << 6,
|
|
G_SPAWN_SEARCH_PATH_FROM_ENVP = 1 << 7,
|
|
G_SPAWN_CLOEXEC_PIPES = 1 << 8
|
|
} GSpawnFlags;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GQuark g_spawn_error_quark (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GQuark g_spawn_exit_error_quark (void);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_spawn_async (const gchar *working_directory,
|
|
gchar **argv,
|
|
gchar **envp,
|
|
GSpawnFlags flags,
|
|
GSpawnChildSetupFunc child_setup,
|
|
gpointer user_data,
|
|
GPid *child_pid,
|
|
GError **error);
|
|
|
|
|
|
/* Opens pipes for non-NULL standard_output, standard_input, standard_error,
|
|
* and returns the parent's end of the pipes.
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_spawn_async_with_pipes (const gchar *working_directory,
|
|
gchar **argv,
|
|
gchar **envp,
|
|
GSpawnFlags flags,
|
|
GSpawnChildSetupFunc child_setup,
|
|
gpointer user_data,
|
|
GPid *child_pid,
|
|
gint *standard_input,
|
|
gint *standard_output,
|
|
gint *standard_error,
|
|
GError **error);
|
|
|
|
|
|
/* If standard_output or standard_error are non-NULL, the full
|
|
* standard output or error of the command will be placed there.
|
|
*/
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_spawn_sync (const gchar *working_directory,
|
|
gchar **argv,
|
|
gchar **envp,
|
|
GSpawnFlags flags,
|
|
GSpawnChildSetupFunc child_setup,
|
|
gpointer user_data,
|
|
gchar **standard_output,
|
|
gchar **standard_error,
|
|
gint *exit_status,
|
|
GError **error);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_spawn_command_line_sync (const gchar *command_line,
|
|
gchar **standard_output,
|
|
gchar **standard_error,
|
|
gint *exit_status,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_spawn_command_line_async (const gchar *command_line,
|
|
GError **error);
|
|
|
|
GLIB_AVAILABLE_IN_2_34
|
|
gboolean g_spawn_check_exit_status (gint exit_status,
|
|
GError **error);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_spawn_close_pid (GPid pid);
|
|
|
|
#ifndef __GTK_DOC_IGNORE__
|
|
#ifdef G_OS_WIN32
|
|
#define g_spawn_async g_spawn_async_utf8
|
|
#define g_spawn_async_with_pipes g_spawn_async_with_pipes_utf8
|
|
#define g_spawn_sync g_spawn_sync_utf8
|
|
#define g_spawn_command_line_sync g_spawn_command_line_sync_utf8
|
|
#define g_spawn_command_line_async g_spawn_command_line_async_utf8
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_spawn_async_utf8 (const gchar *working_directory,
|
|
gchar **argv,
|
|
gchar **envp,
|
|
GSpawnFlags flags,
|
|
GSpawnChildSetupFunc child_setup,
|
|
gpointer user_data,
|
|
GPid *child_pid,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_spawn_async_with_pipes_utf8 (const gchar *working_directory,
|
|
gchar **argv,
|
|
gchar **envp,
|
|
GSpawnFlags flags,
|
|
GSpawnChildSetupFunc child_setup,
|
|
gpointer user_data,
|
|
GPid *child_pid,
|
|
gint *standard_input,
|
|
gint *standard_output,
|
|
gint *standard_error,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_spawn_sync_utf8 (const gchar *working_directory,
|
|
gchar **argv,
|
|
gchar **envp,
|
|
GSpawnFlags flags,
|
|
GSpawnChildSetupFunc child_setup,
|
|
gpointer user_data,
|
|
gchar **standard_output,
|
|
gchar **standard_error,
|
|
gint *exit_status,
|
|
GError **error);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_spawn_command_line_sync_utf8 (const gchar *command_line,
|
|
gchar **standard_output,
|
|
gchar **standard_error,
|
|
gint *exit_status,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_spawn_command_line_async_utf8 (const gchar *command_line,
|
|
GError **error);
|
|
#endif
|
|
#endif
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_SPAWN_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_STRFUNCS_H__
|
|
#define __G_STRFUNCS_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
#include <stdarg.h>
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/* Functions like the ones in <ctype.h> that are not affected by locale. */
|
|
typedef enum {
|
|
G_ASCII_ALNUM = 1 << 0,
|
|
G_ASCII_ALPHA = 1 << 1,
|
|
G_ASCII_CNTRL = 1 << 2,
|
|
G_ASCII_DIGIT = 1 << 3,
|
|
G_ASCII_GRAPH = 1 << 4,
|
|
G_ASCII_LOWER = 1 << 5,
|
|
G_ASCII_PRINT = 1 << 6,
|
|
G_ASCII_PUNCT = 1 << 7,
|
|
G_ASCII_SPACE = 1 << 8,
|
|
G_ASCII_UPPER = 1 << 9,
|
|
G_ASCII_XDIGIT = 1 << 10
|
|
} GAsciiType;
|
|
|
|
GLIB_VAR const guint16 * const g_ascii_table;
|
|
|
|
#define g_ascii_isalnum(c) \
|
|
((g_ascii_table[(guchar) (c)] & G_ASCII_ALNUM) != 0)
|
|
|
|
#define g_ascii_isalpha(c) \
|
|
((g_ascii_table[(guchar) (c)] & G_ASCII_ALPHA) != 0)
|
|
|
|
#define g_ascii_iscntrl(c) \
|
|
((g_ascii_table[(guchar) (c)] & G_ASCII_CNTRL) != 0)
|
|
|
|
#define g_ascii_isdigit(c) \
|
|
((g_ascii_table[(guchar) (c)] & G_ASCII_DIGIT) != 0)
|
|
|
|
#define g_ascii_isgraph(c) \
|
|
((g_ascii_table[(guchar) (c)] & G_ASCII_GRAPH) != 0)
|
|
|
|
#define g_ascii_islower(c) \
|
|
((g_ascii_table[(guchar) (c)] & G_ASCII_LOWER) != 0)
|
|
|
|
#define g_ascii_isprint(c) \
|
|
((g_ascii_table[(guchar) (c)] & G_ASCII_PRINT) != 0)
|
|
|
|
#define g_ascii_ispunct(c) \
|
|
((g_ascii_table[(guchar) (c)] & G_ASCII_PUNCT) != 0)
|
|
|
|
#define g_ascii_isspace(c) \
|
|
((g_ascii_table[(guchar) (c)] & G_ASCII_SPACE) != 0)
|
|
|
|
#define g_ascii_isupper(c) \
|
|
((g_ascii_table[(guchar) (c)] & G_ASCII_UPPER) != 0)
|
|
|
|
#define g_ascii_isxdigit(c) \
|
|
((g_ascii_table[(guchar) (c)] & G_ASCII_XDIGIT) != 0)
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar g_ascii_tolower (gchar c) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar g_ascii_toupper (gchar c) G_GNUC_CONST;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_ascii_digit_value (gchar c) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_ascii_xdigit_value (gchar c) G_GNUC_CONST;
|
|
|
|
/* String utility functions that modify a string argument or
|
|
* return a constant string that must not be freed.
|
|
*/
|
|
#define G_STR_DELIMITERS "_-|> <."
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_strdelimit (gchar *string,
|
|
const gchar *delimiters,
|
|
gchar new_delimiter);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_strcanon (gchar *string,
|
|
const gchar *valid_chars,
|
|
gchar substitutor);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_strerror (gint errnum) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_strsignal (gint signum) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar * g_strreverse (gchar *string);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gsize g_strlcpy (gchar *dest,
|
|
const gchar *src,
|
|
gsize dest_size);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gsize g_strlcat (gchar *dest,
|
|
const gchar *src,
|
|
gsize dest_size);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar * g_strstr_len (const gchar *haystack,
|
|
gssize haystack_len,
|
|
const gchar *needle);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar * g_strrstr (const gchar *haystack,
|
|
const gchar *needle);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar * g_strrstr_len (const gchar *haystack,
|
|
gssize haystack_len,
|
|
const gchar *needle);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_str_has_suffix (const gchar *str,
|
|
const gchar *suffix);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_str_has_prefix (const gchar *str,
|
|
const gchar *prefix);
|
|
|
|
/* String to/from double conversion functions */
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gdouble g_strtod (const gchar *nptr,
|
|
gchar **endptr);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gdouble g_ascii_strtod (const gchar *nptr,
|
|
gchar **endptr);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint64 g_ascii_strtoull (const gchar *nptr,
|
|
gchar **endptr,
|
|
guint base);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint64 g_ascii_strtoll (const gchar *nptr,
|
|
gchar **endptr,
|
|
guint base);
|
|
/* 29 bytes should enough for all possible values that
|
|
* g_ascii_dtostr can produce.
|
|
* Then add 10 for good measure */
|
|
#define G_ASCII_DTOSTR_BUF_SIZE (29 + 10)
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar * g_ascii_dtostr (gchar *buffer,
|
|
gint buf_len,
|
|
gdouble d);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar * g_ascii_formatd (gchar *buffer,
|
|
gint buf_len,
|
|
const gchar *format,
|
|
gdouble d);
|
|
|
|
/* removes leading spaces */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_strchug (gchar *string);
|
|
/* removes trailing spaces */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_strchomp (gchar *string);
|
|
/* removes leading & trailing spaces */
|
|
#define g_strstrip( string ) g_strchomp (g_strchug (string))
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_ascii_strcasecmp (const gchar *s1,
|
|
const gchar *s2);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_ascii_strncasecmp (const gchar *s1,
|
|
const gchar *s2,
|
|
gsize n);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_ascii_strdown (const gchar *str,
|
|
gssize len) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_ascii_strup (const gchar *str,
|
|
gssize len) G_GNUC_MALLOC;
|
|
|
|
GLIB_AVAILABLE_IN_2_40
|
|
gboolean g_str_is_ascii (const gchar *str);
|
|
|
|
GLIB_DEPRECATED
|
|
gint g_strcasecmp (const gchar *s1,
|
|
const gchar *s2);
|
|
GLIB_DEPRECATED
|
|
gint g_strncasecmp (const gchar *s1,
|
|
const gchar *s2,
|
|
guint n);
|
|
GLIB_DEPRECATED
|
|
gchar* g_strdown (gchar *string);
|
|
GLIB_DEPRECATED
|
|
gchar* g_strup (gchar *string);
|
|
|
|
|
|
/* String utility functions that return a newly allocated string which
|
|
* ought to be freed with g_free from the caller at some point.
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_strdup (const gchar *str) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_strdup_printf (const gchar *format,
|
|
...) G_GNUC_PRINTF (1, 2) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_strdup_vprintf (const gchar *format,
|
|
va_list args) G_GNUC_PRINTF(1, 0) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_strndup (const gchar *str,
|
|
gsize n) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_strnfill (gsize length,
|
|
gchar fill_char) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_strconcat (const gchar *string1,
|
|
...) G_GNUC_MALLOC G_GNUC_NULL_TERMINATED;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_strjoin (const gchar *separator,
|
|
...) G_GNUC_MALLOC G_GNUC_NULL_TERMINATED;
|
|
|
|
/* Make a copy of a string interpreting C string -style escape
|
|
* sequences. Inverse of g_strescape. The recognized sequences are \b
|
|
* \f \n \r \t \\ \" and the octal format.
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_strcompress (const gchar *source) G_GNUC_MALLOC;
|
|
|
|
/* Copy a string escaping nonprintable characters like in C strings.
|
|
* Inverse of g_strcompress. The exceptions parameter, if non-NULL, points
|
|
* to a string containing characters that are not to be escaped.
|
|
*
|
|
* Deprecated API: gchar* g_strescape (const gchar *source);
|
|
* Luckily this function wasn't used much, using NULL as second parameter
|
|
* provides mostly identical semantics.
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_strescape (const gchar *source,
|
|
const gchar *exceptions) G_GNUC_MALLOC;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_memdup (gconstpointer mem,
|
|
guint byte_size) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(2);
|
|
|
|
/* NULL terminated string arrays.
|
|
* g_strsplit(), g_strsplit_set() split up string into max_tokens tokens
|
|
* at delim and return a newly allocated string array.
|
|
* g_strjoinv() concatenates all of str_array's strings, sliding in an
|
|
* optional separator, the returned string is newly allocated.
|
|
* g_strfreev() frees the array itself and all of its strings.
|
|
* g_strdupv() copies a NULL-terminated array of strings
|
|
* g_strv_length() returns the length of a NULL-terminated array of strings
|
|
*/
|
|
typedef gchar** GStrv;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar** g_strsplit (const gchar *string,
|
|
const gchar *delimiter,
|
|
gint max_tokens) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar ** g_strsplit_set (const gchar *string,
|
|
const gchar *delimiters,
|
|
gint max_tokens) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_strjoinv (const gchar *separator,
|
|
gchar **str_array) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_strfreev (gchar **str_array);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar** g_strdupv (gchar **str_array) G_GNUC_MALLOC;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_strv_length (gchar **str_array);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_stpcpy (gchar *dest,
|
|
const char *src);
|
|
|
|
GLIB_AVAILABLE_IN_2_40
|
|
gchar * g_str_to_ascii (const gchar *str,
|
|
const gchar *from_locale);
|
|
|
|
GLIB_AVAILABLE_IN_2_40
|
|
gchar ** g_str_tokenize_and_fold (const gchar *string,
|
|
const gchar *translit_locale,
|
|
gchar ***ascii_alternates);
|
|
|
|
GLIB_AVAILABLE_IN_2_40
|
|
gboolean g_str_match_string (const gchar *search_term,
|
|
const gchar *potential_hit,
|
|
gboolean accept_alternates);
|
|
|
|
GLIB_AVAILABLE_IN_2_44
|
|
gboolean g_strv_contains (const gchar * const *strv,
|
|
const gchar *str);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_STRFUNCS_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_STRINGCHUNK_H__
|
|
#define __G_STRINGCHUNK_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GStringChunk GStringChunk;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GStringChunk* g_string_chunk_new (gsize size);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_string_chunk_free (GStringChunk *chunk);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_string_chunk_clear (GStringChunk *chunk);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_string_chunk_insert (GStringChunk *chunk,
|
|
const gchar *string);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_string_chunk_insert_len (GStringChunk *chunk,
|
|
const gchar *string,
|
|
gssize len);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_string_chunk_insert_const (GStringChunk *chunk,
|
|
const gchar *string);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_STRING_H__ */
|
|
/* GLib testing utilities
|
|
* Copyright (C) 2007 Imendio AB
|
|
* Authors: Tim Janik
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __G_TEST_UTILS_H__
|
|
#define __G_TEST_UTILS_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct GTestCase GTestCase;
|
|
typedef struct GTestSuite GTestSuite;
|
|
typedef void (*GTestFunc) (void);
|
|
typedef void (*GTestDataFunc) (gconstpointer user_data);
|
|
typedef void (*GTestFixtureFunc) (gpointer fixture,
|
|
gconstpointer user_data);
|
|
|
|
/* assertion API */
|
|
#define g_assert_cmpstr(s1, cmp, s2) G_STMT_START { \
|
|
const char *__s1 = (s1), *__s2 = (s2); \
|
|
if (g_strcmp0 (__s1, __s2) cmp 0) ; else \
|
|
g_assertion_message_cmpstr (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
|
|
#s1 " " #cmp " " #s2, __s1, #cmp, __s2); \
|
|
} G_STMT_END
|
|
#define g_assert_cmpint(n1, cmp, n2) G_STMT_START { \
|
|
gint64 __n1 = (n1), __n2 = (n2); \
|
|
if (__n1 cmp __n2) ; else \
|
|
g_assertion_message_cmpnum (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
|
|
#n1 " " #cmp " " #n2, __n1, #cmp, __n2, 'i'); \
|
|
} G_STMT_END
|
|
#define g_assert_cmpuint(n1, cmp, n2) G_STMT_START { \
|
|
guint64 __n1 = (n1), __n2 = (n2); \
|
|
if (__n1 cmp __n2) ; else \
|
|
g_assertion_message_cmpnum (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
|
|
#n1 " " #cmp " " #n2, __n1, #cmp, __n2, 'i'); \
|
|
} G_STMT_END
|
|
#define g_assert_cmphex(n1, cmp, n2) G_STMT_START {\
|
|
guint64 __n1 = (n1), __n2 = (n2); \
|
|
if (__n1 cmp __n2) ; else \
|
|
g_assertion_message_cmpnum (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
|
|
#n1 " " #cmp " " #n2, __n1, #cmp, __n2, 'x'); \
|
|
} G_STMT_END
|
|
#define g_assert_cmpfloat(n1,cmp,n2) G_STMT_START { \
|
|
long double __n1 = (n1), __n2 = (n2); \
|
|
if (__n1 cmp __n2) ; else \
|
|
g_assertion_message_cmpnum (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
|
|
#n1 " " #cmp " " #n2, __n1, #cmp, __n2, 'f'); \
|
|
} G_STMT_END
|
|
#define g_assert_cmpmem(m1, l1, m2, l2) G_STMT_START {\
|
|
gconstpointer __m1 = m1, __m2 = m2; \
|
|
int __l1 = l1, __l2 = l2; \
|
|
if (__l1 != __l2) \
|
|
g_assertion_message_cmpnum (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
|
|
#l1 " (len(" #m1 ")) == " #l2 " (len(" #m2 "))", __l1, "==", __l2, 'i'); \
|
|
else if (__l1 != 0 && memcmp (__m1, __m2, __l1) != 0) \
|
|
g_assertion_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
|
|
"assertion failed (" #m1 " == " #m2 ")"); \
|
|
} G_STMT_END
|
|
#define g_assert_no_error(err) G_STMT_START { \
|
|
if (err) \
|
|
g_assertion_message_error (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
|
|
#err, err, 0, 0); \
|
|
} G_STMT_END
|
|
#define g_assert_error(err, dom, c) G_STMT_START { \
|
|
if (!err || (err)->domain != dom || (err)->code != c) \
|
|
g_assertion_message_error (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
|
|
#err, err, dom, c); \
|
|
} G_STMT_END
|
|
#define g_assert_true(expr) G_STMT_START { \
|
|
if G_LIKELY (expr) ; else \
|
|
g_assertion_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
|
|
"'" #expr "' should be TRUE"); \
|
|
} G_STMT_END
|
|
#define g_assert_false(expr) G_STMT_START { \
|
|
if G_LIKELY (!(expr)) ; else \
|
|
g_assertion_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
|
|
"'" #expr "' should be FALSE"); \
|
|
} G_STMT_END
|
|
#define g_assert_null(expr) G_STMT_START { if G_LIKELY ((expr) == NULL) ; else \
|
|
g_assertion_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
|
|
"'" #expr "' should be NULL"); \
|
|
} G_STMT_END
|
|
#define g_assert_nonnull(expr) G_STMT_START { \
|
|
if G_LIKELY ((expr) != NULL) ; else \
|
|
g_assertion_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
|
|
"'" #expr "' should not be NULL"); \
|
|
} G_STMT_END
|
|
#ifdef G_DISABLE_ASSERT
|
|
#define g_assert_not_reached() G_STMT_START { (void) 0; } G_STMT_END
|
|
#define g_assert(expr) G_STMT_START { (void) 0; } G_STMT_END
|
|
#else /* !G_DISABLE_ASSERT */
|
|
#define g_assert_not_reached() G_STMT_START { g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, NULL); } G_STMT_END
|
|
#define g_assert(expr) G_STMT_START { \
|
|
if G_LIKELY (expr) ; else \
|
|
g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
|
|
#expr); \
|
|
} G_STMT_END
|
|
#endif /* !G_DISABLE_ASSERT */
|
|
|
|
typedef void (*GAssertionFunc) (const char *domain,
|
|
const char *file,
|
|
int line,
|
|
const char *func,
|
|
const char *message,
|
|
gpointer user_data);
|
|
|
|
GLIB_AVAILABLE_IN_2_50
|
|
void g_assertion_set_handler (GAssertionFunc handler,
|
|
gpointer user_data);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
int g_strcmp0 (const char *str1,
|
|
const char *str2);
|
|
|
|
/* report performance results */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_test_minimized_result (double minimized_quantity,
|
|
const char *format,
|
|
...) G_GNUC_PRINTF (2, 3);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_test_maximized_result (double maximized_quantity,
|
|
const char *format,
|
|
...) G_GNUC_PRINTF (2, 3);
|
|
|
|
/* initialize testing framework */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_test_init (int *argc,
|
|
char ***argv,
|
|
...) G_GNUC_NULL_TERMINATED;
|
|
/* query testing framework config */
|
|
#define g_test_initialized() (g_test_config_vars->test_initialized)
|
|
#define g_test_quick() (g_test_config_vars->test_quick)
|
|
#define g_test_slow() (!g_test_config_vars->test_quick)
|
|
#define g_test_thorough() (!g_test_config_vars->test_quick)
|
|
#define g_test_perf() (g_test_config_vars->test_perf)
|
|
#define g_test_verbose() (g_test_config_vars->test_verbose)
|
|
#define g_test_quiet() (g_test_config_vars->test_quiet)
|
|
#define g_test_undefined() (g_test_config_vars->test_undefined)
|
|
GLIB_AVAILABLE_IN_2_38
|
|
gboolean g_test_subprocess (void);
|
|
|
|
/* run all tests under toplevel suite (path: /) */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
int g_test_run (void);
|
|
/* hook up a test functions under test path */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_test_add_func (const char *testpath,
|
|
GTestFunc test_func);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_test_add_data_func (const char *testpath,
|
|
gconstpointer test_data,
|
|
GTestDataFunc test_func);
|
|
|
|
GLIB_AVAILABLE_IN_2_34
|
|
void g_test_add_data_func_full (const char *testpath,
|
|
gpointer test_data,
|
|
GTestDataFunc test_func,
|
|
GDestroyNotify data_free_func);
|
|
|
|
/* tell about failure */
|
|
GLIB_AVAILABLE_IN_2_30
|
|
void g_test_fail (void);
|
|
GLIB_AVAILABLE_IN_2_38
|
|
void g_test_incomplete (const gchar *msg);
|
|
GLIB_AVAILABLE_IN_2_38
|
|
void g_test_skip (const gchar *msg);
|
|
GLIB_AVAILABLE_IN_2_38
|
|
gboolean g_test_failed (void);
|
|
GLIB_AVAILABLE_IN_2_38
|
|
void g_test_set_nonfatal_assertions (void);
|
|
|
|
/* hook up a test with fixture under test path */
|
|
#define g_test_add(testpath, Fixture, tdata, fsetup, ftest, fteardown) \
|
|
G_STMT_START { \
|
|
void (*add_vtable) (const char*, \
|
|
gsize, \
|
|
gconstpointer, \
|
|
void (*) (Fixture*, gconstpointer), \
|
|
void (*) (Fixture*, gconstpointer), \
|
|
void (*) (Fixture*, gconstpointer)) = (void (*) (const gchar *, gsize, gconstpointer, void (*) (Fixture*, gconstpointer), void (*) (Fixture*, gconstpointer), void (*) (Fixture*, gconstpointer))) g_test_add_vtable; \
|
|
add_vtable \
|
|
(testpath, sizeof (Fixture), tdata, fsetup, ftest, fteardown); \
|
|
} G_STMT_END
|
|
|
|
/* add test messages to the test report */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_test_message (const char *format,
|
|
...) G_GNUC_PRINTF (1, 2);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_test_bug_base (const char *uri_pattern);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_test_bug (const char *bug_uri_snippet);
|
|
/* measure test timings */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_test_timer_start (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
double g_test_timer_elapsed (void); /* elapsed seconds */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
double g_test_timer_last (void); /* repeat last elapsed() result */
|
|
|
|
/* automatically g_free or g_object_unref upon teardown */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_test_queue_free (gpointer gfree_pointer);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_test_queue_destroy (GDestroyNotify destroy_func,
|
|
gpointer destroy_data);
|
|
#define g_test_queue_unref(gobject) g_test_queue_destroy (g_object_unref, gobject)
|
|
|
|
typedef enum {
|
|
G_TEST_TRAP_SILENCE_STDOUT = 1 << 7,
|
|
G_TEST_TRAP_SILENCE_STDERR = 1 << 8,
|
|
G_TEST_TRAP_INHERIT_STDIN = 1 << 9
|
|
} GTestTrapFlags;
|
|
|
|
GLIB_DEPRECATED_IN_2_38_FOR (g_test_trap_subprocess)
|
|
gboolean g_test_trap_fork (guint64 usec_timeout,
|
|
GTestTrapFlags test_trap_flags);
|
|
|
|
typedef enum {
|
|
G_TEST_SUBPROCESS_INHERIT_STDIN = 1 << 0,
|
|
G_TEST_SUBPROCESS_INHERIT_STDOUT = 1 << 1,
|
|
G_TEST_SUBPROCESS_INHERIT_STDERR = 1 << 2
|
|
} GTestSubprocessFlags;
|
|
|
|
GLIB_AVAILABLE_IN_2_38
|
|
void g_test_trap_subprocess (const char *test_path,
|
|
guint64 usec_timeout,
|
|
GTestSubprocessFlags test_flags);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_test_trap_has_passed (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_test_trap_reached_timeout (void);
|
|
#define g_test_trap_assert_passed() g_test_trap_assertions (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, 0, 0)
|
|
#define g_test_trap_assert_failed() g_test_trap_assertions (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, 1, 0)
|
|
#define g_test_trap_assert_stdout(soutpattern) g_test_trap_assertions (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, 2, soutpattern)
|
|
#define g_test_trap_assert_stdout_unmatched(soutpattern) g_test_trap_assertions (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, 3, soutpattern)
|
|
#define g_test_trap_assert_stderr(serrpattern) g_test_trap_assertions (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, 4, serrpattern)
|
|
#define g_test_trap_assert_stderr_unmatched(serrpattern) g_test_trap_assertions (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, 5, serrpattern)
|
|
|
|
/* provide seed-able random numbers for tests */
|
|
#define g_test_rand_bit() (0 != (g_test_rand_int() & (1 << 15)))
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint32 g_test_rand_int (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint32 g_test_rand_int_range (gint32 begin,
|
|
gint32 end);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
double g_test_rand_double (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
double g_test_rand_double_range (double range_start,
|
|
double range_end);
|
|
|
|
/*
|
|
* semi-internal API: non-documented symbols with stable ABI. You
|
|
* should use the non-internal helper macros instead. However, for
|
|
* compatibility reason, you may use this semi-internal API.
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GTestCase* g_test_create_case (const char *test_name,
|
|
gsize data_size,
|
|
gconstpointer test_data,
|
|
GTestFixtureFunc data_setup,
|
|
GTestFixtureFunc data_test,
|
|
GTestFixtureFunc data_teardown);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GTestSuite* g_test_create_suite (const char *suite_name);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GTestSuite* g_test_get_root (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_test_suite_add (GTestSuite *suite,
|
|
GTestCase *test_case);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_test_suite_add_suite (GTestSuite *suite,
|
|
GTestSuite *nestedsuite);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
int g_test_run_suite (GTestSuite *suite);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_test_trap_assertions (const char *domain,
|
|
const char *file,
|
|
int line,
|
|
const char *func,
|
|
guint64 assertion_flags, /* 0-pass, 1-fail, 2-outpattern, 4-errpattern */
|
|
const char *pattern);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_assertion_message (const char *domain,
|
|
const char *file,
|
|
int line,
|
|
const char *func,
|
|
const char *message);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_assertion_message_expr (const char *domain,
|
|
const char *file,
|
|
int line,
|
|
const char *func,
|
|
const char *expr) G_GNUC_NORETURN;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_assertion_message_cmpstr (const char *domain,
|
|
const char *file,
|
|
int line,
|
|
const char *func,
|
|
const char *expr,
|
|
const char *arg1,
|
|
const char *cmp,
|
|
const char *arg2);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_assertion_message_cmpnum (const char *domain,
|
|
const char *file,
|
|
int line,
|
|
const char *func,
|
|
const char *expr,
|
|
long double arg1,
|
|
const char *cmp,
|
|
long double arg2,
|
|
char numtype);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_assertion_message_error (const char *domain,
|
|
const char *file,
|
|
int line,
|
|
const char *func,
|
|
const char *expr,
|
|
const GError *error,
|
|
GQuark error_domain,
|
|
int error_code);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_test_add_vtable (const char *testpath,
|
|
gsize data_size,
|
|
gconstpointer test_data,
|
|
GTestFixtureFunc data_setup,
|
|
GTestFixtureFunc data_test,
|
|
GTestFixtureFunc data_teardown);
|
|
typedef struct {
|
|
gboolean test_initialized;
|
|
gboolean test_quick; /* disable thorough tests */
|
|
gboolean test_perf; /* run performance tests */
|
|
gboolean test_verbose; /* extra info */
|
|
gboolean test_quiet; /* reduce output */
|
|
gboolean test_undefined; /* run tests that are meant to assert */
|
|
} GTestConfig;
|
|
GLIB_VAR const GTestConfig * const g_test_config_vars;
|
|
|
|
/* internal logging API */
|
|
typedef enum {
|
|
G_TEST_LOG_NONE,
|
|
G_TEST_LOG_ERROR, /* s:msg */
|
|
G_TEST_LOG_START_BINARY, /* s:binaryname s:seed */
|
|
G_TEST_LOG_LIST_CASE, /* s:testpath */
|
|
G_TEST_LOG_SKIP_CASE, /* s:testpath */
|
|
G_TEST_LOG_START_CASE, /* s:testpath */
|
|
G_TEST_LOG_STOP_CASE, /* d:status d:nforks d:elapsed */
|
|
G_TEST_LOG_MIN_RESULT, /* s:blurb d:result */
|
|
G_TEST_LOG_MAX_RESULT, /* s:blurb d:result */
|
|
G_TEST_LOG_MESSAGE, /* s:blurb */
|
|
G_TEST_LOG_START_SUITE,
|
|
G_TEST_LOG_STOP_SUITE
|
|
} GTestLogType;
|
|
|
|
typedef struct {
|
|
GTestLogType log_type;
|
|
guint n_strings;
|
|
gchar **strings; /* NULL terminated */
|
|
guint n_nums;
|
|
long double *nums;
|
|
} GTestLogMsg;
|
|
typedef struct {
|
|
/*< private >*/
|
|
GString *data;
|
|
GSList *msgs;
|
|
} GTestLogBuffer;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const char* g_test_log_type_name (GTestLogType log_type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GTestLogBuffer* g_test_log_buffer_new (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_test_log_buffer_free (GTestLogBuffer *tbuffer);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_test_log_buffer_push (GTestLogBuffer *tbuffer,
|
|
guint n_bytes,
|
|
const guint8 *bytes);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GTestLogMsg* g_test_log_buffer_pop (GTestLogBuffer *tbuffer);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_test_log_msg_free (GTestLogMsg *tmsg);
|
|
|
|
/**
|
|
* GTestLogFatalFunc:
|
|
* @log_domain: the log domain of the message
|
|
* @log_level: the log level of the message (including the fatal and recursion flags)
|
|
* @message: the message to process
|
|
* @user_data: user data, set in g_test_log_set_fatal_handler()
|
|
*
|
|
* Specifies the prototype of fatal log handler functions.
|
|
*
|
|
* Returns: %TRUE if the program should abort, %FALSE otherwise
|
|
*
|
|
* Since: 2.22
|
|
*/
|
|
typedef gboolean (*GTestLogFatalFunc) (const gchar *log_domain,
|
|
GLogLevelFlags log_level,
|
|
const gchar *message,
|
|
gpointer user_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void
|
|
g_test_log_set_fatal_handler (GTestLogFatalFunc log_func,
|
|
gpointer user_data);
|
|
|
|
GLIB_AVAILABLE_IN_2_34
|
|
void g_test_expect_message (const gchar *log_domain,
|
|
GLogLevelFlags log_level,
|
|
const gchar *pattern);
|
|
GLIB_AVAILABLE_IN_2_34
|
|
void g_test_assert_expected_messages_internal (const char *domain,
|
|
const char *file,
|
|
int line,
|
|
const char *func);
|
|
|
|
typedef enum
|
|
{
|
|
G_TEST_DIST,
|
|
G_TEST_BUILT
|
|
} GTestFileType;
|
|
|
|
GLIB_AVAILABLE_IN_2_38
|
|
gchar * g_test_build_filename (GTestFileType file_type,
|
|
const gchar *first_path,
|
|
...) G_GNUC_NULL_TERMINATED;
|
|
GLIB_AVAILABLE_IN_2_38
|
|
const gchar *g_test_get_dir (GTestFileType file_type);
|
|
GLIB_AVAILABLE_IN_2_38
|
|
const gchar *g_test_get_filename (GTestFileType file_type,
|
|
const gchar *first_path,
|
|
...) G_GNUC_NULL_TERMINATED;
|
|
|
|
#define g_test_assert_expected_messages() g_test_assert_expected_messages_internal (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC)
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_TEST_UTILS_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_THREADPOOL_H__
|
|
#define __G_THREADPOOL_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GThreadPool GThreadPool;
|
|
|
|
/* Thread Pools
|
|
*/
|
|
|
|
struct _GThreadPool
|
|
{
|
|
GFunc func;
|
|
gpointer user_data;
|
|
gboolean exclusive;
|
|
};
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GThreadPool * g_thread_pool_new (GFunc func,
|
|
gpointer user_data,
|
|
gint max_threads,
|
|
gboolean exclusive,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_thread_pool_free (GThreadPool *pool,
|
|
gboolean immediate,
|
|
gboolean wait_);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_thread_pool_push (GThreadPool *pool,
|
|
gpointer data,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_thread_pool_unprocessed (GThreadPool *pool);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_thread_pool_set_sort_function (GThreadPool *pool,
|
|
GCompareDataFunc func,
|
|
gpointer user_data);
|
|
GLIB_AVAILABLE_IN_2_46
|
|
gboolean g_thread_pool_move_to_front (GThreadPool *pool,
|
|
gpointer data);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_thread_pool_set_max_threads (GThreadPool *pool,
|
|
gint max_threads,
|
|
GError **error);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_thread_pool_get_max_threads (GThreadPool *pool);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_thread_pool_get_num_threads (GThreadPool *pool);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_thread_pool_set_max_unused_threads (gint max_threads);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_thread_pool_get_max_unused_threads (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_thread_pool_get_num_unused_threads (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_thread_pool_stop_unused_threads (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_thread_pool_set_max_idle_time (guint interval);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_thread_pool_get_max_idle_time (void);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_THREADPOOL_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_TIMER_H__
|
|
#define __G_TIMER_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/* Timer
|
|
*/
|
|
|
|
/* microseconds per second */
|
|
typedef struct _GTimer GTimer;
|
|
|
|
#define G_USEC_PER_SEC 1000000
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GTimer* g_timer_new (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_timer_destroy (GTimer *timer);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_timer_start (GTimer *timer);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_timer_stop (GTimer *timer);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_timer_reset (GTimer *timer);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_timer_continue (GTimer *timer);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gdouble g_timer_elapsed (GTimer *timer,
|
|
gulong *microseconds);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_usleep (gulong microseconds);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_time_val_add (GTimeVal *time_,
|
|
glong microseconds);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_time_val_from_iso8601 (const gchar *iso_date,
|
|
GTimeVal *time_);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_time_val_to_iso8601 (GTimeVal *time_) G_GNUC_MALLOC;
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_TIMER_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_TRASH_STACK_H__
|
|
#define __G_TRASH_STACK_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GTrashStack GTrashStack;
|
|
struct _GTrashStack
|
|
{
|
|
GTrashStack *next;
|
|
};
|
|
|
|
GLIB_DEPRECATED_IN_2_48
|
|
void g_trash_stack_push (GTrashStack **stack_p,
|
|
gpointer data_p);
|
|
GLIB_DEPRECATED_IN_2_48
|
|
gpointer g_trash_stack_pop (GTrashStack **stack_p);
|
|
GLIB_DEPRECATED_IN_2_48
|
|
gpointer g_trash_stack_peek (GTrashStack **stack_p);
|
|
GLIB_DEPRECATED_IN_2_48
|
|
guint g_trash_stack_height (GTrashStack **stack_p);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_TRASH_STACK_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_TREE_H__
|
|
#define __G_TREE_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GTree GTree;
|
|
|
|
typedef gboolean (*GTraverseFunc) (gpointer key,
|
|
gpointer value,
|
|
gpointer data);
|
|
|
|
/* Balanced binary trees
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GTree* g_tree_new (GCompareFunc key_compare_func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GTree* g_tree_new_with_data (GCompareDataFunc key_compare_func,
|
|
gpointer key_compare_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GTree* g_tree_new_full (GCompareDataFunc key_compare_func,
|
|
gpointer key_compare_data,
|
|
GDestroyNotify key_destroy_func,
|
|
GDestroyNotify value_destroy_func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GTree* g_tree_ref (GTree *tree);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_tree_unref (GTree *tree);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_tree_destroy (GTree *tree);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_tree_insert (GTree *tree,
|
|
gpointer key,
|
|
gpointer value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_tree_replace (GTree *tree,
|
|
gpointer key,
|
|
gpointer value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_tree_remove (GTree *tree,
|
|
gconstpointer key);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_tree_steal (GTree *tree,
|
|
gconstpointer key);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_tree_lookup (GTree *tree,
|
|
gconstpointer key);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_tree_lookup_extended (GTree *tree,
|
|
gconstpointer lookup_key,
|
|
gpointer *orig_key,
|
|
gpointer *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_tree_foreach (GTree *tree,
|
|
GTraverseFunc func,
|
|
gpointer user_data);
|
|
|
|
GLIB_DEPRECATED
|
|
void g_tree_traverse (GTree *tree,
|
|
GTraverseFunc traverse_func,
|
|
GTraverseType traverse_type,
|
|
gpointer user_data);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_tree_search (GTree *tree,
|
|
GCompareFunc search_func,
|
|
gconstpointer user_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_tree_height (GTree *tree);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_tree_nnodes (GTree *tree);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_TREE_H__ */
|
|
/* GIO - GLib Input, Output and Streaming Library
|
|
*
|
|
* Copyright (C) 2006-2007 Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General
|
|
* Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* Author: Alexander Larsson <alexl@redhat.com>
|
|
*/
|
|
|
|
#ifndef __G_URI_FUNCS_H__
|
|
#define __G_URI_FUNCS_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/**
|
|
* G_URI_RESERVED_CHARS_GENERIC_DELIMITERS:
|
|
*
|
|
* Generic delimiters characters as defined in RFC 3986. Includes ":/?#[]@".
|
|
**/
|
|
#define G_URI_RESERVED_CHARS_GENERIC_DELIMITERS ":/?#[]@"
|
|
|
|
/**
|
|
* G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS:
|
|
*
|
|
* Subcomponent delimiter characters as defined in RFC 3986. Includes "!$&'()*+,;=".
|
|
**/
|
|
#define G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS "!$&'()*+,;="
|
|
|
|
/**
|
|
* G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT:
|
|
*
|
|
* Allowed characters in path elements. Includes "!$&'()*+,;=:@".
|
|
**/
|
|
#define G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS ":@"
|
|
|
|
/**
|
|
* G_URI_RESERVED_CHARS_ALLOWED_IN_PATH:
|
|
*
|
|
* Allowed characters in a path. Includes "!$&'()*+,;=:@/".
|
|
**/
|
|
#define G_URI_RESERVED_CHARS_ALLOWED_IN_PATH G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT "/"
|
|
|
|
/**
|
|
* G_URI_RESERVED_CHARS_ALLOWED_IN_USERINFO:
|
|
*
|
|
* Allowed characters in userinfo as defined in RFC 3986. Includes "!$&'()*+,;=:".
|
|
**/
|
|
#define G_URI_RESERVED_CHARS_ALLOWED_IN_USERINFO G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS ":"
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
char * g_uri_unescape_string (const char *escaped_string,
|
|
const char *illegal_characters);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
char * g_uri_unescape_segment (const char *escaped_string,
|
|
const char *escaped_string_end,
|
|
const char *illegal_characters);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
char * g_uri_parse_scheme (const char *uri);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
char * g_uri_escape_string (const char *unescaped,
|
|
const char *reserved_chars_allowed,
|
|
gboolean allow_utf8);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_URI_FUNCS_H__ */
|
|
/* guuid.h - UUID functions
|
|
*
|
|
* Copyright (C) 2013-2015, 2017 Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License as
|
|
* published by the Free Software Foundation; either version 2.1 of the
|
|
* licence, or (at your option) any later version.
|
|
*
|
|
* This 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 Lesser General Public
|
|
* License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
|
|
* USA.
|
|
*
|
|
* Authors: Marc-André Lureau <marcandre.lureau@redhat.com>
|
|
*/
|
|
|
|
#ifndef __G_UUID_H__
|
|
#define __G_UUID_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
GLIB_AVAILABLE_IN_2_52
|
|
gboolean g_uuid_string_is_valid (const gchar *str);
|
|
|
|
GLIB_AVAILABLE_IN_2_52
|
|
gchar * g_uuid_string_random (void);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_UUID_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_VERSION_H__
|
|
#define __G_VERSION_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
GLIB_VAR const guint glib_major_version;
|
|
GLIB_VAR const guint glib_minor_version;
|
|
GLIB_VAR const guint glib_micro_version;
|
|
GLIB_VAR const guint glib_interface_age;
|
|
GLIB_VAR const guint glib_binary_age;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * glib_check_version (guint required_major,
|
|
guint required_minor,
|
|
guint required_micro);
|
|
|
|
#define GLIB_CHECK_VERSION(major,minor,micro) \
|
|
(GLIB_MAJOR_VERSION > (major) || \
|
|
(GLIB_MAJOR_VERSION == (major) && GLIB_MINOR_VERSION > (minor)) || \
|
|
(GLIB_MAJOR_VERSION == (major) && GLIB_MINOR_VERSION == (minor) && \
|
|
GLIB_MICRO_VERSION >= (micro)))
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_VERSION_H__ */
|
|
#ifdef G_PLATFORM_WIN32
|
|
#include <glib/gwin32.h>
|
|
#endif
|
|
|
|
#ifndef G_DISABLE_DEPRECATED
|
|
/*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the licence, 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __G_ALLOCATOR_H__
|
|
#define __G_ALLOCATOR_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GAllocator GAllocator;
|
|
typedef struct _GMemChunk GMemChunk;
|
|
|
|
#define G_ALLOC_ONLY 1
|
|
#define G_ALLOC_AND_FREE 2
|
|
#define G_ALLOCATOR_LIST 1
|
|
#define G_ALLOCATOR_SLIST 2
|
|
#define G_ALLOCATOR_NODE 3
|
|
|
|
#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_mem_chunk_free (mem_chunk, mem))
|
|
#define g_mem_chunk_create(type, x, y) (g_mem_chunk_new (NULL, sizeof (type), 0, 0))
|
|
|
|
|
|
GLIB_DEPRECATED
|
|
GMemChunk * g_mem_chunk_new (const gchar *name,
|
|
gint atom_size,
|
|
gsize area_size,
|
|
gint type);
|
|
GLIB_DEPRECATED
|
|
void g_mem_chunk_destroy (GMemChunk *mem_chunk);
|
|
GLIB_DEPRECATED
|
|
gpointer g_mem_chunk_alloc (GMemChunk *mem_chunk);
|
|
GLIB_DEPRECATED
|
|
gpointer g_mem_chunk_alloc0 (GMemChunk *mem_chunk);
|
|
GLIB_DEPRECATED
|
|
void g_mem_chunk_free (GMemChunk *mem_chunk,
|
|
gpointer mem);
|
|
GLIB_DEPRECATED
|
|
void g_mem_chunk_clean (GMemChunk *mem_chunk);
|
|
GLIB_DEPRECATED
|
|
void g_mem_chunk_reset (GMemChunk *mem_chunk);
|
|
GLIB_DEPRECATED
|
|
void g_mem_chunk_print (GMemChunk *mem_chunk);
|
|
GLIB_DEPRECATED
|
|
void g_mem_chunk_info (void);
|
|
GLIB_DEPRECATED
|
|
void g_blow_chunks (void);
|
|
|
|
|
|
GLIB_DEPRECATED
|
|
GAllocator * g_allocator_new (const gchar *name,
|
|
guint n_preallocs);
|
|
GLIB_DEPRECATED
|
|
void g_allocator_free (GAllocator *allocator);
|
|
GLIB_DEPRECATED
|
|
void g_list_push_allocator (GAllocator *allocator);
|
|
GLIB_DEPRECATED
|
|
void g_list_pop_allocator (void);
|
|
GLIB_DEPRECATED
|
|
void g_slist_push_allocator (GAllocator *allocator);
|
|
GLIB_DEPRECATED
|
|
void g_slist_pop_allocator (void);
|
|
GLIB_DEPRECATED
|
|
void g_node_push_allocator (GAllocator *allocator);
|
|
GLIB_DEPRECATED
|
|
void g_node_pop_allocator (void);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_ALLOCATOR_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_CACHE_H__
|
|
#define __G_CACHE_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
#ifndef G_DISABLE_DEPRECATED
|
|
|
|
typedef struct _GCache GCache;
|
|
|
|
typedef gpointer (*GCacheNewFunc) (gpointer key);
|
|
typedef gpointer (*GCacheDupFunc) (gpointer value);
|
|
typedef void (*GCacheDestroyFunc) (gpointer value);
|
|
|
|
/* Caches
|
|
*/
|
|
GLIB_DEPRECATED
|
|
GCache* g_cache_new (GCacheNewFunc value_new_func,
|
|
GCacheDestroyFunc value_destroy_func,
|
|
GCacheDupFunc key_dup_func,
|
|
GCacheDestroyFunc key_destroy_func,
|
|
GHashFunc hash_key_func,
|
|
GHashFunc hash_value_func,
|
|
GEqualFunc key_equal_func);
|
|
GLIB_DEPRECATED
|
|
void g_cache_destroy (GCache *cache);
|
|
GLIB_DEPRECATED
|
|
gpointer g_cache_insert (GCache *cache,
|
|
gpointer key);
|
|
GLIB_DEPRECATED
|
|
void g_cache_remove (GCache *cache,
|
|
gconstpointer value);
|
|
GLIB_DEPRECATED
|
|
void g_cache_key_foreach (GCache *cache,
|
|
GHFunc func,
|
|
gpointer user_data);
|
|
GLIB_DEPRECATED
|
|
void g_cache_value_foreach (GCache *cache,
|
|
GHFunc func,
|
|
gpointer user_data);
|
|
|
|
#endif
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_CACHE_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_COMPLETION_H__
|
|
#define __G_COMPLETION_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GCompletion GCompletion;
|
|
|
|
typedef gchar* (*GCompletionFunc) (gpointer);
|
|
|
|
/* GCompletion
|
|
*/
|
|
|
|
typedef gint (*GCompletionStrncmpFunc) (const gchar *s1,
|
|
const gchar *s2,
|
|
gsize n);
|
|
|
|
struct _GCompletion
|
|
{
|
|
GList* items;
|
|
GCompletionFunc func;
|
|
|
|
gchar* prefix;
|
|
GList* cache;
|
|
GCompletionStrncmpFunc strncmp_func;
|
|
};
|
|
|
|
GLIB_DEPRECATED_IN_2_26
|
|
GCompletion* g_completion_new (GCompletionFunc func);
|
|
GLIB_DEPRECATED_IN_2_26
|
|
void g_completion_add_items (GCompletion* cmp,
|
|
GList* items);
|
|
GLIB_DEPRECATED_IN_2_26
|
|
void g_completion_remove_items (GCompletion* cmp,
|
|
GList* items);
|
|
GLIB_DEPRECATED_IN_2_26
|
|
void g_completion_clear_items (GCompletion* cmp);
|
|
GLIB_DEPRECATED_IN_2_26
|
|
GList* g_completion_complete (GCompletion* cmp,
|
|
const gchar* prefix,
|
|
gchar** new_prefix);
|
|
GLIB_DEPRECATED_IN_2_26
|
|
GList* g_completion_complete_utf8 (GCompletion *cmp,
|
|
const gchar* prefix,
|
|
gchar** new_prefix);
|
|
GLIB_DEPRECATED_IN_2_26
|
|
void g_completion_set_compare (GCompletion *cmp,
|
|
GCompletionStrncmpFunc strncmp_func);
|
|
GLIB_DEPRECATED_IN_2_26
|
|
void g_completion_free (GCompletion* cmp);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_COMPLETION_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_DEPRECATED_MAIN_H__
|
|
#define __G_DEPRECATED_MAIN_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
#ifndef G_DISABLE_DEPRECATED
|
|
|
|
/* ============== Compat main loop stuff ================== */
|
|
|
|
/**
|
|
* g_main_new:
|
|
* @is_running: set to %TRUE to indicate that the loop is running. This
|
|
* is not very important since calling g_main_run() will set this
|
|
* to %TRUE anyway.
|
|
*
|
|
* Creates a new #GMainLoop for th default main context.
|
|
*
|
|
* Returns: a new #GMainLoop
|
|
*
|
|
* Deprecated: 2.2: Use g_main_loop_new() instead
|
|
*/
|
|
#define g_main_new(is_running) g_main_loop_new (NULL, is_running)
|
|
|
|
/**
|
|
* g_main_run:
|
|
* @loop: a #GMainLoop
|
|
*
|
|
* Runs a main loop until it stops running.
|
|
*
|
|
* Deprecated: 2.2: Use g_main_loop_run() instead
|
|
*/
|
|
#define g_main_run(loop) g_main_loop_run(loop)
|
|
|
|
/**
|
|
* g_main_quit:
|
|
* @loop: a #GMainLoop
|
|
*
|
|
* Stops the #GMainLoop.
|
|
* If g_main_run() was called to run the #GMainLoop, it will now return.
|
|
*
|
|
* Deprecated: 2.2: Use g_main_loop_quit() instead
|
|
*/
|
|
#define g_main_quit(loop) g_main_loop_quit(loop)
|
|
|
|
/**
|
|
* g_main_destroy:
|
|
* @loop: a #GMainLoop
|
|
*
|
|
* Frees the memory allocated for the #GMainLoop.
|
|
*
|
|
* Deprecated: 2.2: Use g_main_loop_unref() instead
|
|
*/
|
|
#define g_main_destroy(loop) g_main_loop_unref(loop)
|
|
|
|
/**
|
|
* g_main_is_running:
|
|
* @loop: a #GMainLoop
|
|
*
|
|
* Checks if the main loop is running.
|
|
*
|
|
* Returns: %TRUE if the main loop is running
|
|
*
|
|
* Deprecated: 2.2: Use g_main_loop_is_running() instead
|
|
*/
|
|
#define g_main_is_running(loop) g_main_loop_is_running(loop)
|
|
|
|
/**
|
|
* g_main_iteration:
|
|
* @may_block: set to %TRUE if it should block (i.e. wait) until an event
|
|
* source becomes ready. It will return after an event source has been
|
|
* processed. If set to %FALSE it will return immediately if no event
|
|
* source is ready to be processed.
|
|
*
|
|
* Runs a single iteration for the default #GMainContext.
|
|
*
|
|
* Returns: %TRUE if more events are pending.
|
|
*
|
|
* Deprecated: 2.2: Use g_main_context_iteration() instead.
|
|
*/
|
|
#define g_main_iteration(may_block) g_main_context_iteration (NULL, may_block)
|
|
|
|
/**
|
|
* g_main_pending:
|
|
*
|
|
* Checks if any events are pending for the default #GMainContext
|
|
* (i.e. ready to be processed).
|
|
*
|
|
* Returns: %TRUE if any events are pending.
|
|
*
|
|
* Deprected: 2.2: Use g_main_context_pending() instead.
|
|
*/
|
|
#define g_main_pending() g_main_context_pending (NULL)
|
|
|
|
/**
|
|
* g_main_set_poll_func:
|
|
* @func: the function to call to poll all file descriptors
|
|
*
|
|
* Sets the function to use for the handle polling of file descriptors
|
|
* for the default main context.
|
|
*
|
|
* Deprecated: 2.2: Use g_main_context_set_poll_func() again
|
|
*/
|
|
#define g_main_set_poll_func(func) g_main_context_set_poll_func (NULL, func)
|
|
|
|
#endif
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_DEPRECATED_MAIN_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_REL_H__
|
|
#define __G_REL_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GRelation GRelation;
|
|
typedef struct _GTuples GTuples;
|
|
|
|
struct _GTuples
|
|
{
|
|
guint len;
|
|
};
|
|
|
|
/* GRelation
|
|
*
|
|
* Indexed Relations. Imagine a really simple table in a
|
|
* database. Relations are not ordered. This data type is meant for
|
|
* maintaining a N-way mapping.
|
|
*
|
|
* g_relation_new() creates a relation with FIELDS fields
|
|
*
|
|
* g_relation_destroy() frees all resources
|
|
* g_tuples_destroy() frees the result of g_relation_select()
|
|
*
|
|
* g_relation_index() indexes relation FIELD with the provided
|
|
* equality and hash functions. this must be done before any
|
|
* calls to insert are made.
|
|
*
|
|
* g_relation_insert() inserts a new tuple. you are expected to
|
|
* provide the right number of fields.
|
|
*
|
|
* g_relation_delete() deletes all relations with KEY in FIELD
|
|
* g_relation_select() returns ...
|
|
* g_relation_count() counts ...
|
|
*/
|
|
|
|
GLIB_DEPRECATED_IN_2_26
|
|
GRelation* g_relation_new (gint fields);
|
|
GLIB_DEPRECATED_IN_2_26
|
|
void g_relation_destroy (GRelation *relation);
|
|
GLIB_DEPRECATED_IN_2_26
|
|
void g_relation_index (GRelation *relation,
|
|
gint field,
|
|
GHashFunc hash_func,
|
|
GEqualFunc key_equal_func);
|
|
GLIB_DEPRECATED_IN_2_26
|
|
void g_relation_insert (GRelation *relation,
|
|
...);
|
|
GLIB_DEPRECATED_IN_2_26
|
|
gint g_relation_delete (GRelation *relation,
|
|
gconstpointer key,
|
|
gint field);
|
|
GLIB_DEPRECATED_IN_2_26
|
|
GTuples* g_relation_select (GRelation *relation,
|
|
gconstpointer key,
|
|
gint field);
|
|
GLIB_DEPRECATED_IN_2_26
|
|
gint g_relation_count (GRelation *relation,
|
|
gconstpointer key,
|
|
gint field);
|
|
GLIB_DEPRECATED_IN_2_26
|
|
gboolean g_relation_exists (GRelation *relation,
|
|
...);
|
|
GLIB_DEPRECATED_IN_2_26
|
|
void g_relation_print (GRelation *relation);
|
|
GLIB_DEPRECATED_IN_2_26
|
|
void g_tuples_destroy (GTuples *tuples);
|
|
GLIB_DEPRECATED_IN_2_26
|
|
gpointer g_tuples_index (GTuples *tuples,
|
|
gint index_,
|
|
gint field);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_REL_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 Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GLib Team and others 1997-2000. 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_DEPRECATED_THREAD_H__
|
|
#define __G_DEPRECATED_THREAD_H__
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
#ifndef G_DISABLE_DEPRECATED
|
|
|
|
typedef enum
|
|
{
|
|
G_THREAD_PRIORITY_LOW,
|
|
G_THREAD_PRIORITY_NORMAL,
|
|
G_THREAD_PRIORITY_HIGH,
|
|
G_THREAD_PRIORITY_URGENT
|
|
} GThreadPriority;
|
|
|
|
#endif
|
|
|
|
struct _GThread
|
|
{
|
|
/*< private >*/
|
|
GThreadFunc func;
|
|
gpointer data;
|
|
gboolean joinable;
|
|
GThreadPriority priority;
|
|
};
|
|
|
|
#ifndef G_DISABLE_DEPRECATED
|
|
|
|
typedef struct _GThreadFunctions GThreadFunctions;
|
|
struct _GThreadFunctions
|
|
{
|
|
GMutex* (*mutex_new) (void);
|
|
void (*mutex_lock) (GMutex *mutex);
|
|
gboolean (*mutex_trylock) (GMutex *mutex);
|
|
void (*mutex_unlock) (GMutex *mutex);
|
|
void (*mutex_free) (GMutex *mutex);
|
|
GCond* (*cond_new) (void);
|
|
void (*cond_signal) (GCond *cond);
|
|
void (*cond_broadcast) (GCond *cond);
|
|
void (*cond_wait) (GCond *cond,
|
|
GMutex *mutex);
|
|
gboolean (*cond_timed_wait) (GCond *cond,
|
|
GMutex *mutex,
|
|
GTimeVal *end_time);
|
|
void (*cond_free) (GCond *cond);
|
|
GPrivate* (*private_new) (GDestroyNotify destructor);
|
|
gpointer (*private_get) (GPrivate *private_key);
|
|
void (*private_set) (GPrivate *private_key,
|
|
gpointer data);
|
|
void (*thread_create) (GThreadFunc func,
|
|
gpointer data,
|
|
gulong stack_size,
|
|
gboolean joinable,
|
|
gboolean bound,
|
|
GThreadPriority priority,
|
|
gpointer thread,
|
|
GError **error);
|
|
void (*thread_yield) (void);
|
|
void (*thread_join) (gpointer thread);
|
|
void (*thread_exit) (void);
|
|
void (*thread_set_priority)(gpointer thread,
|
|
GThreadPriority priority);
|
|
void (*thread_self) (gpointer thread);
|
|
gboolean (*thread_equal) (gpointer thread1,
|
|
gpointer thread2);
|
|
};
|
|
|
|
GLIB_VAR GThreadFunctions g_thread_functions_for_glib_use;
|
|
GLIB_VAR gboolean g_thread_use_default_impl;
|
|
|
|
GLIB_VAR guint64 (*g_thread_gettime) (void);
|
|
|
|
GLIB_DEPRECATED_IN_2_32_FOR(g_thread_new)
|
|
GThread *g_thread_create (GThreadFunc func,
|
|
gpointer data,
|
|
gboolean joinable,
|
|
GError **error);
|
|
|
|
GLIB_DEPRECATED_IN_2_32_FOR(g_thread_new)
|
|
GThread *g_thread_create_full (GThreadFunc func,
|
|
gpointer data,
|
|
gulong stack_size,
|
|
gboolean joinable,
|
|
gboolean bound,
|
|
GThreadPriority priority,
|
|
GError **error);
|
|
|
|
GLIB_DEPRECATED_IN_2_32
|
|
void g_thread_set_priority (GThread *thread,
|
|
GThreadPriority priority);
|
|
|
|
GLIB_DEPRECATED_IN_2_32
|
|
void g_thread_foreach (GFunc thread_func,
|
|
gpointer user_data);
|
|
|
|
#ifndef G_OS_WIN32
|
|
#include <sys/types.h>
|
|
#include <pthread.h>
|
|
#endif
|
|
|
|
#define g_static_mutex_get_mutex g_static_mutex_get_mutex_impl
|
|
#define G_STATIC_MUTEX_INIT { NULL }
|
|
typedef struct
|
|
{
|
|
GMutex *mutex;
|
|
#ifndef G_OS_WIN32
|
|
/* only for ABI compatibility reasons */
|
|
pthread_mutex_t unused;
|
|
#endif
|
|
} GStaticMutex;
|
|
|
|
#define g_static_mutex_lock(mutex) \
|
|
g_mutex_lock (g_static_mutex_get_mutex (mutex))
|
|
#define g_static_mutex_trylock(mutex) \
|
|
g_mutex_trylock (g_static_mutex_get_mutex (mutex))
|
|
#define g_static_mutex_unlock(mutex) \
|
|
g_mutex_unlock (g_static_mutex_get_mutex (mutex))
|
|
|
|
GLIB_DEPRECATED_IN_2_32_FOR(g_mutex_init)
|
|
void g_static_mutex_init (GStaticMutex *mutex);
|
|
GLIB_DEPRECATED_IN_2_32_FOR(g_mutex_clear)
|
|
void g_static_mutex_free (GStaticMutex *mutex);
|
|
GLIB_DEPRECATED_IN_2_32_FOR(GMutex)
|
|
GMutex *g_static_mutex_get_mutex_impl (GStaticMutex *mutex);
|
|
|
|
typedef struct _GStaticRecMutex GStaticRecMutex;
|
|
struct _GStaticRecMutex
|
|
{
|
|
/*< private >*/
|
|
GStaticMutex mutex;
|
|
guint depth;
|
|
|
|
/* ABI compat only */
|
|
union {
|
|
#ifdef G_OS_WIN32
|
|
void *owner;
|
|
#else
|
|
pthread_t owner;
|
|
#endif
|
|
gdouble dummy;
|
|
} unused;
|
|
};
|
|
|
|
#define G_STATIC_REC_MUTEX_INIT { G_STATIC_MUTEX_INIT }
|
|
GLIB_DEPRECATED_IN_2_32_FOR(g_rec_mutex_init)
|
|
void g_static_rec_mutex_init (GStaticRecMutex *mutex);
|
|
|
|
GLIB_DEPRECATED_IN_2_32_FOR(g_rec_mutex_lock)
|
|
void g_static_rec_mutex_lock (GStaticRecMutex *mutex);
|
|
|
|
GLIB_DEPRECATED_IN_2_32_FOR(g_rec_mutex_try_lock)
|
|
gboolean g_static_rec_mutex_trylock (GStaticRecMutex *mutex);
|
|
|
|
GLIB_DEPRECATED_IN_2_32_FOR(g_rec_mutex_unlock)
|
|
void g_static_rec_mutex_unlock (GStaticRecMutex *mutex);
|
|
|
|
GLIB_DEPRECATED_IN_2_32
|
|
void g_static_rec_mutex_lock_full (GStaticRecMutex *mutex,
|
|
guint depth);
|
|
|
|
GLIB_DEPRECATED_IN_2_32
|
|
guint g_static_rec_mutex_unlock_full (GStaticRecMutex *mutex);
|
|
|
|
GLIB_DEPRECATED_IN_2_32_FOR(g_rec_mutex_free)
|
|
void g_static_rec_mutex_free (GStaticRecMutex *mutex);
|
|
|
|
typedef struct _GStaticRWLock GStaticRWLock;
|
|
struct _GStaticRWLock
|
|
{
|
|
/*< private >*/
|
|
GStaticMutex mutex;
|
|
GCond *read_cond;
|
|
GCond *write_cond;
|
|
guint read_counter;
|
|
gboolean have_writer;
|
|
guint want_to_read;
|
|
guint want_to_write;
|
|
};
|
|
|
|
#define G_STATIC_RW_LOCK_INIT { G_STATIC_MUTEX_INIT, NULL, NULL, 0, FALSE, 0, 0 }
|
|
|
|
GLIB_DEPRECATED_IN_2_32_FOR(g_rw_lock_init)
|
|
void g_static_rw_lock_init (GStaticRWLock *lock);
|
|
|
|
GLIB_DEPRECATED_IN_2_32_FOR(g_rw_lock_reader_lock)
|
|
void g_static_rw_lock_reader_lock (GStaticRWLock *lock);
|
|
|
|
GLIB_DEPRECATED_IN_2_32_FOR(g_rw_lock_reader_trylock)
|
|
gboolean g_static_rw_lock_reader_trylock (GStaticRWLock *lock);
|
|
|
|
GLIB_DEPRECATED_IN_2_32_FOR(g_rw_lock_reader_unlock)
|
|
void g_static_rw_lock_reader_unlock (GStaticRWLock *lock);
|
|
|
|
GLIB_DEPRECATED_IN_2_32_FOR(g_rw_lock_writer_lock)
|
|
void g_static_rw_lock_writer_lock (GStaticRWLock *lock);
|
|
|
|
GLIB_DEPRECATED_IN_2_32_FOR(g_rw_lock_writer_trylock)
|
|
gboolean g_static_rw_lock_writer_trylock (GStaticRWLock *lock);
|
|
|
|
GLIB_DEPRECATED_IN_2_32_FOR(g_rw_lock_writer_unlock)
|
|
void g_static_rw_lock_writer_unlock (GStaticRWLock *lock);
|
|
|
|
GLIB_DEPRECATED_IN_2_32_FOR(g_rw_lock_free)
|
|
void g_static_rw_lock_free (GStaticRWLock *lock);
|
|
|
|
GLIB_DEPRECATED_IN_2_32
|
|
GPrivate * g_private_new (GDestroyNotify notify);
|
|
|
|
typedef struct _GStaticPrivate GStaticPrivate;
|
|
struct _GStaticPrivate
|
|
{
|
|
/*< private >*/
|
|
guint index;
|
|
};
|
|
|
|
#define G_STATIC_PRIVATE_INIT { 0 }
|
|
GLIB_DEPRECATED_IN_2_32
|
|
void g_static_private_init (GStaticPrivate *private_key);
|
|
|
|
GLIB_DEPRECATED_IN_2_32_FOR(g_private_get)
|
|
gpointer g_static_private_get (GStaticPrivate *private_key);
|
|
|
|
GLIB_DEPRECATED_IN_2_32_FOR(g_private_set)
|
|
void g_static_private_set (GStaticPrivate *private_key,
|
|
gpointer data,
|
|
GDestroyNotify notify);
|
|
|
|
GLIB_DEPRECATED_IN_2_32
|
|
void g_static_private_free (GStaticPrivate *private_key);
|
|
|
|
GLIB_DEPRECATED_IN_2_32
|
|
gboolean g_once_init_enter_impl (volatile gsize *location);
|
|
|
|
GLIB_DEPRECATED_IN_2_32
|
|
void g_thread_init (gpointer vtable);
|
|
GLIB_DEPRECATED_IN_2_32
|
|
void g_thread_init_with_errorcheck_mutexes (gpointer vtable);
|
|
|
|
GLIB_DEPRECATED_IN_2_32
|
|
gboolean g_thread_get_initialized (void);
|
|
|
|
GLIB_VAR gboolean g_threads_got_initialized;
|
|
|
|
#define g_thread_supported() (1)
|
|
|
|
GLIB_DEPRECATED_IN_2_32
|
|
GMutex * g_mutex_new (void);
|
|
GLIB_DEPRECATED_IN_2_32
|
|
void g_mutex_free (GMutex *mutex);
|
|
GLIB_DEPRECATED_IN_2_32
|
|
GCond * g_cond_new (void);
|
|
GLIB_DEPRECATED_IN_2_32
|
|
void g_cond_free (GCond *cond);
|
|
GLIB_DEPRECATED_IN_2_32
|
|
gboolean g_cond_timed_wait (GCond *cond,
|
|
GMutex *mutex,
|
|
GTimeVal *timeval);
|
|
|
|
#endif
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_DEPRECATED_THREAD_H__ */
|
|
#endif /* G_DISABLE_DEPRECATED */
|
|
|
|
/*
|
|
* Copyright © 2015 Canonical Limited
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the licence, 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* Author: Ryan Lortie <desrt@desrt.ca>
|
|
*/
|
|
|
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
|
#error "Only <glib.h> can be included directly."
|
|
#endif
|
|
|
|
static inline void
|
|
g_autoptr_cleanup_generic_gfree (void *p)
|
|
{
|
|
void **pp = (void**)p;
|
|
g_free (*pp);
|
|
}
|
|
|
|
static inline void
|
|
g_autoptr_cleanup_gstring_free (GString *string)
|
|
{
|
|
if (string)
|
|
g_string_free (string, TRUE);
|
|
}
|
|
|
|
/* If adding a cleanup here, please also add a test case to
|
|
* glib/tests/autoptr.c
|
|
*/
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GAsyncQueue, g_async_queue_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GBookmarkFile, g_bookmark_file_free)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GBytes, g_bytes_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GChecksum, g_checksum_free)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GDateTime, g_date_time_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GDir, g_dir_close)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GError, g_error_free)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GHashTable, g_hash_table_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GHmac, g_hmac_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GIOChannel, g_io_channel_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GKeyFile, g_key_file_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GList, g_list_free)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GArray, g_array_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GPtrArray, g_ptr_array_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GByteArray, g_byte_array_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GMainContext, g_main_context_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GMainLoop, g_main_loop_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GSource, g_source_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GMappedFile, g_mapped_file_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GMarkupParseContext, g_markup_parse_context_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GNode, g_node_destroy)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GOptionContext, g_option_context_free)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GOptionGroup, g_option_group_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GPatternSpec, g_pattern_spec_free)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GQueue, g_queue_free)
|
|
G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(GQueue, g_queue_clear)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GRand, g_rand_free)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GRegex, g_regex_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GMatchInfo, g_match_info_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GScanner, g_scanner_destroy)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GSequence, g_sequence_free)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GSList, g_slist_free)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GString, g_autoptr_cleanup_gstring_free)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GStringChunk, g_string_chunk_free)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GThread, g_thread_unref)
|
|
G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(GMutex, g_mutex_clear)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GMutexLocker, g_mutex_locker_free)
|
|
G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(GCond, g_cond_clear)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GTimer, g_timer_destroy)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GTimeZone, g_time_zone_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GTree, g_tree_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GVariant, g_variant_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GVariantBuilder, g_variant_builder_unref)
|
|
G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(GVariantBuilder, g_variant_builder_clear)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GVariantIter, g_variant_iter_free)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GVariantDict, g_variant_dict_unref)
|
|
G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(GVariantDict, g_variant_dict_clear)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GVariantType, g_variant_type_free)
|
|
G_DEFINE_AUTO_CLEANUP_FREE_FUNC(GStrv, g_strfreev, NULL)
|
|
|
|
#undef __GLIB_H_INSIDE__
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
GLIB_AVAILABLE_IN_2_50
|
|
void glib_init (void);
|
|
|
|
GLIB_AVAILABLE_IN_2_50
|
|
void glib_shutdown (void);
|
|
|
|
GLIB_AVAILABLE_IN_2_50
|
|
void glib_deinit (void);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_LIB_H__ */
|
|
|
|
#if !defined (GUM_STATIC) && defined (G_OS_WIN32)
|
|
# ifdef GUM_EXPORTS
|
|
# define GUM_API __declspec(dllexport)
|
|
# else
|
|
# define GUM_API __declspec(dllimport)
|
|
# endif
|
|
#else
|
|
# define GUM_API
|
|
#endif
|
|
|
|
#if !defined (__arm__) && !defined (__aarch64__)
|
|
# if GLIB_SIZEOF_VOID_P == 4
|
|
# define GUM_NATIVE_CPU GUM_CPU_IA32
|
|
# else
|
|
# define GUM_NATIVE_CPU GUM_CPU_AMD64
|
|
# endif
|
|
#elif defined (__arm__) || defined (__aarch64__)
|
|
# if GLIB_SIZEOF_VOID_P == 4
|
|
# define GUM_NATIVE_CPU GUM_CPU_ARM
|
|
# else
|
|
# define GUM_NATIVE_CPU GUM_CPU_ARM64
|
|
# endif
|
|
#elif defined (__mips__)
|
|
# define GUM_NATIVE_CPU GUM_CPU_MIPS
|
|
#endif
|
|
#ifdef G_OS_WIN32
|
|
# define GUM_NATIVE_ABI GUM_ABI_WINDOWS
|
|
# define GUM_NATIVE_ABI_IS_WINDOWS 1
|
|
# define GUM_NATIVE_ABI_IS_UNIX 0
|
|
#else
|
|
# define GUM_NATIVE_ABI GUM_ABI_UNIX
|
|
# define GUM_NATIVE_ABI_IS_WINDOWS 0
|
|
# define GUM_NATIVE_ABI_IS_UNIX 1
|
|
#endif
|
|
|
|
typedef guint64 GumAddress;
|
|
#define GUM_ADDRESS(a) ((GumAddress) GPOINTER_TO_SIZE (a))
|
|
typedef guint GumOS;
|
|
typedef guint GumCallingConvention;
|
|
typedef guint GumAbiType;
|
|
typedef guint GumCpuType;
|
|
typedef guint GumArgType;
|
|
typedef guint GumBranchHint;
|
|
typedef struct _GumCpuContext GumCpuContext;
|
|
typedef guint GumRelocationScenario;
|
|
|
|
enum _GumOS
|
|
{
|
|
GUM_OS_WINDOWS,
|
|
GUM_OS_MAC,
|
|
GUM_OS_LINUX,
|
|
GUM_OS_IOS,
|
|
GUM_OS_ANDROID,
|
|
GUM_OS_QNX
|
|
};
|
|
|
|
enum _GumCallingConvention
|
|
{
|
|
GUM_CALL_CAPI,
|
|
GUM_CALL_SYSAPI
|
|
};
|
|
|
|
enum _GumAbiType
|
|
{
|
|
GUM_ABI_UNIX,
|
|
GUM_ABI_WINDOWS
|
|
};
|
|
|
|
enum _GumCpuType
|
|
{
|
|
GUM_CPU_INVALID,
|
|
GUM_CPU_IA32,
|
|
GUM_CPU_AMD64,
|
|
GUM_CPU_ARM,
|
|
GUM_CPU_ARM64,
|
|
GUM_CPU_MIPS
|
|
};
|
|
|
|
enum _GumArgType
|
|
{
|
|
GUM_ARG_ADDRESS,
|
|
GUM_ARG_REGISTER,
|
|
GUM_ARG_POINTER /* deprecated */
|
|
};
|
|
|
|
enum _GumBranchHint
|
|
{
|
|
GUM_NO_HINT,
|
|
GUM_LIKELY,
|
|
GUM_UNLIKELY
|
|
};
|
|
|
|
struct _GumCpuContext
|
|
{
|
|
#if !defined (__arm__) && !defined (__aarch64__) && !defined (__mips__)
|
|
# if GLIB_SIZEOF_VOID_P == 8
|
|
guint64 rip;
|
|
|
|
guint64 r15;
|
|
guint64 r14;
|
|
guint64 r13;
|
|
guint64 r12;
|
|
guint64 r11;
|
|
guint64 r10;
|
|
guint64 r9;
|
|
guint64 r8;
|
|
|
|
guint64 rdi;
|
|
guint64 rsi;
|
|
guint64 rbp;
|
|
guint64 rsp;
|
|
guint64 rbx;
|
|
guint64 rdx;
|
|
guint64 rcx;
|
|
guint64 rax;
|
|
# else
|
|
guint32 eip;
|
|
|
|
guint32 edi;
|
|
guint32 esi;
|
|
guint32 ebp;
|
|
guint32 esp;
|
|
guint32 ebx;
|
|
guint32 edx;
|
|
guint32 ecx;
|
|
guint32 eax;
|
|
# endif
|
|
#elif defined (__aarch64__)
|
|
guint64 pc;
|
|
guint64 sp;
|
|
|
|
guint64 x[29];
|
|
guint64 fp;
|
|
guint64 lr;
|
|
guint8 q[128];
|
|
#elif defined (__arm__) && !defined (__aarch64__)
|
|
guint32 cpsr;
|
|
guint32 pc;
|
|
guint32 sp;
|
|
|
|
guint32 r8;
|
|
guint32 r9;
|
|
guint32 r10;
|
|
guint32 r11;
|
|
guint32 r12;
|
|
|
|
guint32 r[8];
|
|
guint32 lr;
|
|
#elif defined (__mips__)
|
|
guint32 pc;
|
|
|
|
guint32 gp;
|
|
guint32 sp;
|
|
guint32 fp;
|
|
guint32 ra;
|
|
|
|
guint32 hi;
|
|
guint32 lo;
|
|
|
|
guint32 at;
|
|
|
|
guint32 v0;
|
|
guint32 v1;
|
|
|
|
guint32 a0;
|
|
guint32 a1;
|
|
guint32 a2;
|
|
guint32 a3;
|
|
|
|
guint32 t0;
|
|
guint32 t1;
|
|
guint32 t2;
|
|
guint32 t3;
|
|
guint32 t4;
|
|
guint32 t5;
|
|
guint32 t6;
|
|
guint32 t7;
|
|
guint32 t8;
|
|
guint32 t9;
|
|
|
|
guint32 s0;
|
|
guint32 s1;
|
|
guint32 s2;
|
|
guint32 s3;
|
|
guint32 s4;
|
|
guint32 s5;
|
|
guint32 s6;
|
|
guint32 s7;
|
|
|
|
guint32 k0;
|
|
guint32 k1;
|
|
#endif
|
|
};
|
|
|
|
enum _GumRelocationScenario
|
|
{
|
|
GUM_SCENARIO_OFFLINE,
|
|
GUM_SCENARIO_ONLINE
|
|
};
|
|
|
|
#ifndef __arm__
|
|
# if GLIB_SIZEOF_VOID_P == 8
|
|
# define GUM_CPU_CONTEXT_XAX(c) ((c)->rax)
|
|
# define GUM_CPU_CONTEXT_XCX(c) ((c)->rcx)
|
|
# define GUM_CPU_CONTEXT_XDX(c) ((c)->rdx)
|
|
# define GUM_CPU_CONTEXT_XBX(c) ((c)->rbx)
|
|
# define GUM_CPU_CONTEXT_XSP(c) ((c)->rsp)
|
|
# define GUM_CPU_CONTEXT_XBP(c) ((c)->rbp)
|
|
# define GUM_CPU_CONTEXT_XSI(c) ((c)->rsi)
|
|
# define GUM_CPU_CONTEXT_XDI(c) ((c)->rdi)
|
|
# define GUM_CPU_CONTEXT_XIP(c) ((c)->rip)
|
|
# define GUM_CPU_CONTEXT_OFFSET_XAX (G_STRUCT_OFFSET (GumCpuContext, rax))
|
|
# define GUM_CPU_CONTEXT_OFFSET_XCX (G_STRUCT_OFFSET (GumCpuContext, rcx))
|
|
# define GUM_CPU_CONTEXT_OFFSET_XDX (G_STRUCT_OFFSET (GumCpuContext, rdx))
|
|
# define GUM_CPU_CONTEXT_OFFSET_XBX (G_STRUCT_OFFSET (GumCpuContext, rbx))
|
|
# define GUM_CPU_CONTEXT_OFFSET_XSP (G_STRUCT_OFFSET (GumCpuContext, rsp))
|
|
# define GUM_CPU_CONTEXT_OFFSET_XBP (G_STRUCT_OFFSET (GumCpuContext, rbp))
|
|
# define GUM_CPU_CONTEXT_OFFSET_XSI (G_STRUCT_OFFSET (GumCpuContext, rsi))
|
|
# define GUM_CPU_CONTEXT_OFFSET_XDI (G_STRUCT_OFFSET (GumCpuContext, rdi))
|
|
# define GUM_CPU_CONTEXT_OFFSET_XIP (G_STRUCT_OFFSET (GumCpuContext, rip))
|
|
# else
|
|
# define GUM_CPU_CONTEXT_XAX(c) ((c)->eax)
|
|
# define GUM_CPU_CONTEXT_XCX(c) ((c)->ecx)
|
|
# define GUM_CPU_CONTEXT_XDX(c) ((c)->edx)
|
|
# define GUM_CPU_CONTEXT_XBX(c) ((c)->ebx)
|
|
# define GUM_CPU_CONTEXT_XSP(c) ((c)->esp)
|
|
# define GUM_CPU_CONTEXT_XBP(c) ((c)->ebp)
|
|
# define GUM_CPU_CONTEXT_XSI(c) ((c)->esi)
|
|
# define GUM_CPU_CONTEXT_XDI(c) ((c)->edi)
|
|
# define GUM_CPU_CONTEXT_XIP(c) ((c)->eip)
|
|
# define GUM_CPU_CONTEXT_OFFSET_XAX (G_STRUCT_OFFSET (GumCpuContext, eax))
|
|
# define GUM_CPU_CONTEXT_OFFSET_XCX (G_STRUCT_OFFSET (GumCpuContext, ecx))
|
|
# define GUM_CPU_CONTEXT_OFFSET_XDX (G_STRUCT_OFFSET (GumCpuContext, edx))
|
|
# define GUM_CPU_CONTEXT_OFFSET_XBX (G_STRUCT_OFFSET (GumCpuContext, ebx))
|
|
# define GUM_CPU_CONTEXT_OFFSET_XSP (G_STRUCT_OFFSET (GumCpuContext, esp))
|
|
# define GUM_CPU_CONTEXT_OFFSET_XBP (G_STRUCT_OFFSET (GumCpuContext, ebp))
|
|
# define GUM_CPU_CONTEXT_OFFSET_XSI (G_STRUCT_OFFSET (GumCpuContext, esi))
|
|
# define GUM_CPU_CONTEXT_OFFSET_XDI (G_STRUCT_OFFSET (GumCpuContext, edi))
|
|
# define GUM_CPU_CONTEXT_OFFSET_XIP (G_STRUCT_OFFSET (GumCpuContext, eip))
|
|
# endif
|
|
#endif
|
|
|
|
#define GUM_MAX_PATH 260
|
|
#define GUM_MAX_TYPE_NAME 16
|
|
#define GUM_MAX_SYMBOL_NAME 2000
|
|
|
|
#define GUM_MAX_THREADS 768
|
|
#define GUM_MAX_CALL_DEPTH 32
|
|
#define GUM_MAX_BACKTRACE_DEPTH 16
|
|
#define GUM_MAX_WORST_CASE_INFO_SIZE 128
|
|
|
|
#define GUM_MAX_LISTENERS_PER_FUNCTION 2
|
|
#define GUM_MAX_LISTENER_DATA 512
|
|
|
|
#if GLIB_SIZEOF_VOID_P == 8
|
|
#define GUM_CPU_MODE CS_MODE_64
|
|
#define GUM_THUNK
|
|
#else
|
|
#define GUM_CPU_MODE CS_MODE_32
|
|
#define GUM_THUNK GUM_FASTCALL
|
|
#endif
|
|
#if !defined (G_OS_WIN32) && GLIB_SIZEOF_VOID_P == 8
|
|
# define GUM_THUNK_REG_ARG0 GUM_REG_XDI
|
|
# define GUM_THUNK_REG_ARG1 GUM_REG_XSI
|
|
#else
|
|
# define GUM_THUNK_REG_ARG0 GUM_REG_XCX
|
|
# define GUM_THUNK_REG_ARG1 GUM_REG_XDX
|
|
#endif
|
|
#define GUM_RED_ZONE_SIZE 128
|
|
|
|
#ifdef _MSC_VER
|
|
# define GUM_CDECL __cdecl
|
|
# define GUM_STDCALL __stdcall
|
|
# define GUM_FASTCALL __fastcall
|
|
# define GUM_NOINLINE __declspec (noinline)
|
|
#else
|
|
# ifndef __arm__
|
|
# if GLIB_SIZEOF_VOID_P == 4
|
|
# define GUM_CDECL __attribute__((cdecl))
|
|
# define GUM_STDCALL __attribute__((stdcall))
|
|
# else
|
|
# define GUM_CDECL
|
|
# define GUM_STDCALL
|
|
# endif
|
|
# define GUM_FASTCALL __attribute__((fastcall))
|
|
# else
|
|
# define GUM_CDECL
|
|
# define GUM_STDCALL
|
|
# define GUM_FASTCALL
|
|
# endif
|
|
# define GUM_NOINLINE __attribute__((noinline))
|
|
#endif
|
|
|
|
#define GUM_ALIGN_POINTER(t, p, b) \
|
|
((t) GSIZE_TO_POINTER (((GPOINTER_TO_SIZE (p) + ((gsize) (b - 1))) & \
|
|
~((gsize) (b - 1)))))
|
|
#define GUM_ALIGN_SIZE(s, b) \
|
|
((((gsize) s) + ((gsize) (b - 1))) & ~((gsize) (b - 1)))
|
|
|
|
#define GUM_FUNCPTR_TO_POINTER(f) (GSIZE_TO_POINTER (f))
|
|
#define GUM_POINTER_TO_FUNCPTR(t, p) ((t) GPOINTER_TO_SIZE (p))
|
|
|
|
#define GUM_INT5_MASK 0x0000001f
|
|
#define GUM_INT8_MASK 0x000000ff
|
|
#define GUM_INT10_MASK 0x000003ff
|
|
#define GUM_INT11_MASK 0x000007ff
|
|
#define GUM_INT12_MASK 0x00000fff
|
|
#define GUM_INT14_MASK 0x00003fff
|
|
#define GUM_INT16_MASK 0x0000ffff
|
|
#define GUM_INT18_MASK 0x0003ffff
|
|
#define GUM_INT19_MASK 0x0007ffff
|
|
#define GUM_INT24_MASK 0x00ffffff
|
|
#define GUM_INT26_MASK 0x03ffffff
|
|
#define GUM_INT28_MASK 0x0fffffff
|
|
|
|
#define GUM_IS_WITHIN_UINT7_RANGE(i) \
|
|
(((gint64) (i)) >= G_GINT64_CONSTANT (0) && \
|
|
((gint64) (i)) <= G_GINT64_CONSTANT (127))
|
|
#define GUM_IS_WITHIN_INT8_RANGE(i) \
|
|
(((gint64) (i)) >= G_GINT64_CONSTANT (-128) && \
|
|
((gint64) (i)) <= G_GINT64_CONSTANT (127))
|
|
#define GUM_IS_WITHIN_INT11_RANGE(i) \
|
|
(((gint64) (i)) >= G_GINT64_CONSTANT (-1024) && \
|
|
((gint64) (i)) <= G_GINT64_CONSTANT (1023))
|
|
#define GUM_IS_WITHIN_INT14_RANGE(i) \
|
|
(((gint64) (i)) >= G_GINT64_CONSTANT (-8192) && \
|
|
((gint64) (i)) <= G_GINT64_CONSTANT (8191))
|
|
#define GUM_IS_WITHIN_INT16_RANGE(i) \
|
|
(((gint64) (i)) >= G_GINT64_CONSTANT (-32768) && \
|
|
((gint64) (i)) <= G_GINT64_CONSTANT (32767))
|
|
#define GUM_IS_WITHIN_INT18_RANGE(i) \
|
|
(((gint64) (i)) >= G_GINT64_CONSTANT (-131072) && \
|
|
((gint64) (i)) <= G_GINT64_CONSTANT (131071))
|
|
#define GUM_IS_WITHIN_INT19_RANGE(i) \
|
|
(((gint64) (i)) >= G_GINT64_CONSTANT (-262144) && \
|
|
((gint64) (i)) <= G_GINT64_CONSTANT (262143))
|
|
#define GUM_IS_WITHIN_INT21_RANGE(i) \
|
|
(((gint64) (i)) >= G_GINT64_CONSTANT (-1048576) && \
|
|
((gint64) (i)) <= G_GINT64_CONSTANT (1048575))
|
|
#define GUM_IS_WITHIN_INT26_RANGE(i) \
|
|
(((gint64) (i)) >= G_GINT64_CONSTANT (-33554432) && \
|
|
((gint64) (i)) <= G_GINT64_CONSTANT (33554431))
|
|
#define GUM_IS_WITHIN_INT28_RANGE(i) \
|
|
(((gint64) (i)) >= G_GINT64_CONSTANT (-134217728) && \
|
|
((gint64) (i)) <= G_GINT64_CONSTANT (134217727))
|
|
#define GUM_IS_WITHIN_INT32_RANGE(i) \
|
|
(((gint64) (i)) >= (gint64) G_MININT32 && \
|
|
((gint64) (i)) <= (gint64) G_MAXINT32)
|
|
|
|
#endif
|
|
|
|
/*
|
|
* Copyright (C) 2016 Ole André Vadla Ravnås <oleavr@nowsecure.com>
|
|
*
|
|
* Licence: wxWindows Library Licence, Version 3.1
|
|
*/
|
|
|
|
#ifndef __GUM_API_RESOLVER_H__
|
|
#define __GUM_API_RESOLVER_H__
|
|
|
|
/* GObject - GLib Type, Object, Parameter and Signal Library
|
|
* Copyright (C) 1998, 1999, 2000 Tim Janik and Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General
|
|
* Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#ifndef __GLIB_GOBJECT_H__
|
|
#define __GLIB_GOBJECT_H__
|
|
|
|
#define __GLIB_GOBJECT_H_INSIDE__
|
|
|
|
/* topmost include file for GObject header files */
|
|
/* gbinding.h: Binding for object properties
|
|
*
|
|
* Copyright (C) 2010 Intel Corp.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General
|
|
* Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* Author: Emmanuele Bassi <ebassi@linux.intel.com>
|
|
*/
|
|
|
|
#ifndef __G_BINDING_H__
|
|
#define __G_BINDING_H__
|
|
|
|
#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
|
|
#error "Only <glib-object.h> can be included directly."
|
|
#endif
|
|
|
|
/* GObject - GLib Type, Object, Parameter and Signal Library
|
|
* Copyright (C) 1998-1999, 2000-2001 Tim Janik and Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General
|
|
* Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#ifndef __G_OBJECT_H__
|
|
#define __G_OBJECT_H__
|
|
|
|
#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
|
|
#error "Only <glib-object.h> can be included directly."
|
|
#endif
|
|
|
|
/* GObject - GLib Type, Object, Parameter and Signal Library
|
|
* Copyright (C) 1998-1999, 2000-2001 Tim Janik and Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General
|
|
* Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#ifndef __G_TYPE_H__
|
|
#define __G_TYPE_H__
|
|
|
|
#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
|
|
#error "Only <glib-object.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/* Basic Type Macros
|
|
*/
|
|
/**
|
|
* G_TYPE_FUNDAMENTAL:
|
|
* @type: A #GType value.
|
|
*
|
|
* The fundamental type which is the ancestor of @type.
|
|
* Fundamental types are types that serve as ultimate bases for the derived types,
|
|
* thus they are the roots of distinct inheritance hierarchies.
|
|
*/
|
|
#define G_TYPE_FUNDAMENTAL(type) (g_type_fundamental (type))
|
|
/**
|
|
* G_TYPE_FUNDAMENTAL_MAX:
|
|
*
|
|
* An integer constant that represents the number of identifiers reserved
|
|
* for types that are assigned at compile-time.
|
|
*/
|
|
#define G_TYPE_FUNDAMENTAL_MAX (255 << G_TYPE_FUNDAMENTAL_SHIFT)
|
|
|
|
/* Constant fundamental types,
|
|
*/
|
|
/**
|
|
* G_TYPE_INVALID:
|
|
*
|
|
* An invalid #GType used as error return value in some functions which return
|
|
* a #GType.
|
|
*/
|
|
#define G_TYPE_INVALID G_TYPE_MAKE_FUNDAMENTAL (0)
|
|
/**
|
|
* G_TYPE_NONE:
|
|
*
|
|
* A fundamental type which is used as a replacement for the C
|
|
* void return type.
|
|
*/
|
|
#define G_TYPE_NONE G_TYPE_MAKE_FUNDAMENTAL (1)
|
|
/**
|
|
* G_TYPE_INTERFACE:
|
|
*
|
|
* The fundamental type from which all interfaces are derived.
|
|
*/
|
|
#define G_TYPE_INTERFACE G_TYPE_MAKE_FUNDAMENTAL (2)
|
|
/**
|
|
* G_TYPE_CHAR:
|
|
*
|
|
* The fundamental type corresponding to #gchar.
|
|
* The type designated by G_TYPE_CHAR is unconditionally an 8-bit signed integer.
|
|
* This may or may not be the same type a the C type "gchar".
|
|
*/
|
|
#define G_TYPE_CHAR G_TYPE_MAKE_FUNDAMENTAL (3)
|
|
/**
|
|
* G_TYPE_UCHAR:
|
|
*
|
|
* The fundamental type corresponding to #guchar.
|
|
*/
|
|
#define G_TYPE_UCHAR G_TYPE_MAKE_FUNDAMENTAL (4)
|
|
/**
|
|
* G_TYPE_BOOLEAN:
|
|
*
|
|
* The fundamental type corresponding to #gboolean.
|
|
*/
|
|
#define G_TYPE_BOOLEAN G_TYPE_MAKE_FUNDAMENTAL (5)
|
|
/**
|
|
* G_TYPE_INT:
|
|
*
|
|
* The fundamental type corresponding to #gint.
|
|
*/
|
|
#define G_TYPE_INT G_TYPE_MAKE_FUNDAMENTAL (6)
|
|
/**
|
|
* G_TYPE_UINT:
|
|
*
|
|
* The fundamental type corresponding to #guint.
|
|
*/
|
|
#define G_TYPE_UINT G_TYPE_MAKE_FUNDAMENTAL (7)
|
|
/**
|
|
* G_TYPE_LONG:
|
|
*
|
|
* The fundamental type corresponding to #glong.
|
|
*/
|
|
#define G_TYPE_LONG G_TYPE_MAKE_FUNDAMENTAL (8)
|
|
/**
|
|
* G_TYPE_ULONG:
|
|
*
|
|
* The fundamental type corresponding to #gulong.
|
|
*/
|
|
#define G_TYPE_ULONG G_TYPE_MAKE_FUNDAMENTAL (9)
|
|
/**
|
|
* G_TYPE_INT64:
|
|
*
|
|
* The fundamental type corresponding to #gint64.
|
|
*/
|
|
#define G_TYPE_INT64 G_TYPE_MAKE_FUNDAMENTAL (10)
|
|
/**
|
|
* G_TYPE_UINT64:
|
|
*
|
|
* The fundamental type corresponding to #guint64.
|
|
*/
|
|
#define G_TYPE_UINT64 G_TYPE_MAKE_FUNDAMENTAL (11)
|
|
/**
|
|
* G_TYPE_ENUM:
|
|
*
|
|
* The fundamental type from which all enumeration types are derived.
|
|
*/
|
|
#define G_TYPE_ENUM G_TYPE_MAKE_FUNDAMENTAL (12)
|
|
/**
|
|
* G_TYPE_FLAGS:
|
|
*
|
|
* The fundamental type from which all flags types are derived.
|
|
*/
|
|
#define G_TYPE_FLAGS G_TYPE_MAKE_FUNDAMENTAL (13)
|
|
/**
|
|
* G_TYPE_FLOAT:
|
|
*
|
|
* The fundamental type corresponding to #gfloat.
|
|
*/
|
|
#define G_TYPE_FLOAT G_TYPE_MAKE_FUNDAMENTAL (14)
|
|
/**
|
|
* G_TYPE_DOUBLE:
|
|
*
|
|
* The fundamental type corresponding to #gdouble.
|
|
*/
|
|
#define G_TYPE_DOUBLE G_TYPE_MAKE_FUNDAMENTAL (15)
|
|
/**
|
|
* G_TYPE_STRING:
|
|
*
|
|
* The fundamental type corresponding to nul-terminated C strings.
|
|
*/
|
|
#define G_TYPE_STRING G_TYPE_MAKE_FUNDAMENTAL (16)
|
|
/**
|
|
* G_TYPE_POINTER:
|
|
*
|
|
* The fundamental type corresponding to #gpointer.
|
|
*/
|
|
#define G_TYPE_POINTER G_TYPE_MAKE_FUNDAMENTAL (17)
|
|
/**
|
|
* G_TYPE_BOXED:
|
|
*
|
|
* The fundamental type from which all boxed types are derived.
|
|
*/
|
|
#define G_TYPE_BOXED G_TYPE_MAKE_FUNDAMENTAL (18)
|
|
/**
|
|
* G_TYPE_PARAM:
|
|
*
|
|
* The fundamental type from which all #GParamSpec types are derived.
|
|
*/
|
|
#define G_TYPE_PARAM G_TYPE_MAKE_FUNDAMENTAL (19)
|
|
/**
|
|
* G_TYPE_OBJECT:
|
|
*
|
|
* The fundamental type for #GObject.
|
|
*/
|
|
#define G_TYPE_OBJECT G_TYPE_MAKE_FUNDAMENTAL (20)
|
|
/**
|
|
* G_TYPE_VARIANT:
|
|
*
|
|
* The fundamental type corresponding to #GVariant.
|
|
*
|
|
* All floating #GVariant instances passed through the #GType system are
|
|
* consumed.
|
|
*
|
|
* Note that callbacks in closures, and signal handlers
|
|
* for signals of return type %G_TYPE_VARIANT, must never return floating
|
|
* variants.
|
|
*
|
|
* Note: GLib 2.24 did include a boxed type with this name. It was replaced
|
|
* with this fundamental type in 2.26.
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
#define G_TYPE_VARIANT G_TYPE_MAKE_FUNDAMENTAL (21)
|
|
|
|
|
|
/* Reserved fundamental type numbers to create new fundamental
|
|
* type IDs with G_TYPE_MAKE_FUNDAMENTAL().
|
|
* Send email to gtk-devel-list@gnome.org for reservations.
|
|
*/
|
|
/**
|
|
* G_TYPE_FUNDAMENTAL_SHIFT:
|
|
*
|
|
* Shift value used in converting numbers to type IDs.
|
|
*/
|
|
#define G_TYPE_FUNDAMENTAL_SHIFT (2)
|
|
/**
|
|
* G_TYPE_MAKE_FUNDAMENTAL:
|
|
* @x: the fundamental type number.
|
|
*
|
|
* Get the type ID for the fundamental type number @x.
|
|
* Use g_type_fundamental_next() instead of this macro to create new fundamental
|
|
* types.
|
|
*
|
|
* Returns: the GType
|
|
*/
|
|
#define G_TYPE_MAKE_FUNDAMENTAL(x) ((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
|
|
/**
|
|
* G_TYPE_RESERVED_GLIB_FIRST:
|
|
*
|
|
* First fundamental type number to create a new fundamental type id with
|
|
* G_TYPE_MAKE_FUNDAMENTAL() reserved for GLib.
|
|
*/
|
|
#define G_TYPE_RESERVED_GLIB_FIRST (22)
|
|
/**
|
|
* G_TYPE_RESERVED_GLIB_LAST:
|
|
*
|
|
* Last fundamental type number reserved for GLib.
|
|
*/
|
|
#define G_TYPE_RESERVED_GLIB_LAST (31)
|
|
/**
|
|
* G_TYPE_RESERVED_BSE_FIRST:
|
|
*
|
|
* First fundamental type number to create a new fundamental type id with
|
|
* G_TYPE_MAKE_FUNDAMENTAL() reserved for BSE.
|
|
*/
|
|
#define G_TYPE_RESERVED_BSE_FIRST (32)
|
|
/**
|
|
* G_TYPE_RESERVED_BSE_LAST:
|
|
*
|
|
* Last fundamental type number reserved for BSE.
|
|
*/
|
|
#define G_TYPE_RESERVED_BSE_LAST (48)
|
|
/**
|
|
* G_TYPE_RESERVED_USER_FIRST:
|
|
*
|
|
* First available fundamental type number to create new fundamental
|
|
* type id with G_TYPE_MAKE_FUNDAMENTAL().
|
|
*/
|
|
#define G_TYPE_RESERVED_USER_FIRST (49)
|
|
|
|
|
|
/* Type Checking Macros
|
|
*/
|
|
/**
|
|
* G_TYPE_IS_FUNDAMENTAL:
|
|
* @type: A #GType value
|
|
*
|
|
* Checks if @type is a fundamental type.
|
|
*
|
|
* Returns: %TRUE on success
|
|
*/
|
|
#define G_TYPE_IS_FUNDAMENTAL(type) ((type) <= G_TYPE_FUNDAMENTAL_MAX)
|
|
/**
|
|
* G_TYPE_IS_DERIVED:
|
|
* @type: A #GType value
|
|
*
|
|
* Checks if @type is derived (or in object-oriented terminology:
|
|
* inherited) from another type (this holds true for all non-fundamental
|
|
* types).
|
|
*
|
|
* Returns: %TRUE on success
|
|
*/
|
|
#define G_TYPE_IS_DERIVED(type) ((type) > G_TYPE_FUNDAMENTAL_MAX)
|
|
/**
|
|
* G_TYPE_IS_INTERFACE:
|
|
* @type: A #GType value
|
|
*
|
|
* Checks if @type is an interface type.
|
|
* An interface type provides a pure API, the implementation
|
|
* of which is provided by another type (which is then said to conform
|
|
* to the interface). GLib interfaces are somewhat analogous to Java
|
|
* interfaces and C++ classes containing only pure virtual functions,
|
|
* with the difference that GType interfaces are not derivable (but see
|
|
* g_type_interface_add_prerequisite() for an alternative).
|
|
*
|
|
* Returns: %TRUE on success
|
|
*/
|
|
#define G_TYPE_IS_INTERFACE(type) (G_TYPE_FUNDAMENTAL (type) == G_TYPE_INTERFACE)
|
|
/**
|
|
* G_TYPE_IS_CLASSED:
|
|
* @type: A #GType value
|
|
*
|
|
* Checks if @type is a classed type.
|
|
*
|
|
* Returns: %TRUE on success
|
|
*/
|
|
#define G_TYPE_IS_CLASSED(type) (g_type_test_flags ((type), G_TYPE_FLAG_CLASSED))
|
|
/**
|
|
* G_TYPE_IS_INSTANTIATABLE:
|
|
* @type: A #GType value
|
|
*
|
|
* Checks if @type can be instantiated. Instantiation is the
|
|
* process of creating an instance (object) of this type.
|
|
*
|
|
* Returns: %TRUE on success
|
|
*/
|
|
#define G_TYPE_IS_INSTANTIATABLE(type) (g_type_test_flags ((type), G_TYPE_FLAG_INSTANTIATABLE))
|
|
/**
|
|
* G_TYPE_IS_DERIVABLE:
|
|
* @type: A #GType value
|
|
*
|
|
* Checks if @type is a derivable type. A derivable type can
|
|
* be used as the base class of a flat (single-level) class hierarchy.
|
|
*
|
|
* Returns: %TRUE on success
|
|
*/
|
|
#define G_TYPE_IS_DERIVABLE(type) (g_type_test_flags ((type), G_TYPE_FLAG_DERIVABLE))
|
|
/**
|
|
* G_TYPE_IS_DEEP_DERIVABLE:
|
|
* @type: A #GType value
|
|
*
|
|
* Checks if @type is a deep derivable type. A deep derivable type
|
|
* can be used as the base class of a deep (multi-level) class hierarchy.
|
|
*
|
|
* Returns: %TRUE on success
|
|
*/
|
|
#define G_TYPE_IS_DEEP_DERIVABLE(type) (g_type_test_flags ((type), G_TYPE_FLAG_DEEP_DERIVABLE))
|
|
/**
|
|
* G_TYPE_IS_ABSTRACT:
|
|
* @type: A #GType value
|
|
*
|
|
* Checks if @type is an abstract type. An abstract type cannot be
|
|
* instantiated and is normally used as an abstract base class for
|
|
* derived classes.
|
|
*
|
|
* Returns: %TRUE on success
|
|
*/
|
|
#define G_TYPE_IS_ABSTRACT(type) (g_type_test_flags ((type), G_TYPE_FLAG_ABSTRACT))
|
|
/**
|
|
* G_TYPE_IS_VALUE_ABSTRACT:
|
|
* @type: A #GType value
|
|
*
|
|
* Checks if @type is an abstract value type. An abstract value type introduces
|
|
* a value table, but can't be used for g_value_init() and is normally used as
|
|
* an abstract base type for derived value types.
|
|
*
|
|
* Returns: %TRUE on success
|
|
*/
|
|
#define G_TYPE_IS_VALUE_ABSTRACT(type) (g_type_test_flags ((type), G_TYPE_FLAG_VALUE_ABSTRACT))
|
|
/**
|
|
* G_TYPE_IS_VALUE_TYPE:
|
|
* @type: A #GType value
|
|
*
|
|
* Checks if @type is a value type and can be used with g_value_init().
|
|
*
|
|
* Returns: %TRUE on success
|
|
*/
|
|
#define G_TYPE_IS_VALUE_TYPE(type) (g_type_check_is_value_type (type))
|
|
/**
|
|
* G_TYPE_HAS_VALUE_TABLE:
|
|
* @type: A #GType value
|
|
*
|
|
* Checks if @type has a #GTypeValueTable.
|
|
*
|
|
* Returns: %TRUE on success
|
|
*/
|
|
#define G_TYPE_HAS_VALUE_TABLE(type) (g_type_value_table_peek (type) != NULL)
|
|
|
|
|
|
/* Typedefs
|
|
*/
|
|
/**
|
|
* GType:
|
|
*
|
|
* A numerical value which represents the unique identifier of a registered
|
|
* type.
|
|
*/
|
|
#if GLIB_SIZEOF_SIZE_T != GLIB_SIZEOF_LONG || !defined __cplusplus
|
|
typedef gsize GType;
|
|
#else /* for historic reasons, C++ links against gulong GTypes */
|
|
typedef gulong GType;
|
|
#endif
|
|
typedef struct _GValue GValue;
|
|
typedef union _GTypeCValue GTypeCValue;
|
|
typedef struct _GTypePlugin GTypePlugin;
|
|
typedef struct _GTypeClass GTypeClass;
|
|
typedef struct _GTypeInterface GTypeInterface;
|
|
typedef struct _GTypeInstance GTypeInstance;
|
|
typedef struct _GTypeInfo GTypeInfo;
|
|
typedef struct _GTypeFundamentalInfo GTypeFundamentalInfo;
|
|
typedef struct _GInterfaceInfo GInterfaceInfo;
|
|
typedef struct _GTypeValueTable GTypeValueTable;
|
|
typedef struct _GTypeQuery GTypeQuery;
|
|
|
|
|
|
/* Basic Type Structures
|
|
*/
|
|
/**
|
|
* GTypeClass:
|
|
*
|
|
* An opaque structure used as the base of all classes.
|
|
*/
|
|
struct _GTypeClass
|
|
{
|
|
/*< private >*/
|
|
GType g_type;
|
|
};
|
|
/**
|
|
* GTypeInstance:
|
|
*
|
|
* An opaque structure used as the base of all type instances.
|
|
*/
|
|
struct _GTypeInstance
|
|
{
|
|
/*< private >*/
|
|
GTypeClass *g_class;
|
|
};
|
|
/**
|
|
* GTypeInterface:
|
|
*
|
|
* An opaque structure used as the base of all interface types.
|
|
*/
|
|
struct _GTypeInterface
|
|
{
|
|
/*< private >*/
|
|
GType g_type; /* iface type */
|
|
GType g_instance_type;
|
|
};
|
|
/**
|
|
* GTypeQuery:
|
|
* @type: the #GType value of the type
|
|
* @type_name: the name of the type
|
|
* @class_size: the size of the class structure
|
|
* @instance_size: the size of the instance structure
|
|
*
|
|
* A structure holding information for a specific type.
|
|
* It is filled in by the g_type_query() function.
|
|
*/
|
|
struct _GTypeQuery
|
|
{
|
|
GType type;
|
|
const gchar *type_name;
|
|
guint class_size;
|
|
guint instance_size;
|
|
};
|
|
|
|
|
|
/* Casts, checks and accessors for structured types
|
|
* usage of these macros is reserved to type implementations only
|
|
*/
|
|
/*< protected >*/
|
|
/**
|
|
* G_TYPE_CHECK_INSTANCE:
|
|
* @instance: Location of a #GTypeInstance structure
|
|
*
|
|
* Checks if @instance is a valid #GTypeInstance structure,
|
|
* otherwise issues a warning and returns %FALSE. %NULL is not a valid
|
|
* #GTypeInstance.
|
|
*
|
|
* This macro should only be used in type implementations.
|
|
*
|
|
* Returns: %TRUE on success
|
|
*/
|
|
#define G_TYPE_CHECK_INSTANCE(instance) (_G_TYPE_CHI ((GTypeInstance*) (instance)))
|
|
/**
|
|
* lG_TYPE_CHECK_INSTANCE_CAST:
|
|
* @instance: (nullable): Location of a #GTypeInstance structure
|
|
* @g_type: The type to be returned
|
|
* @c_type: The corresponding C type of @g_type
|
|
*
|
|
* Checks that @instance is an instance of the type identified by @g_type
|
|
* and issues a warning if this is not the case. Returns @instance casted
|
|
* to a pointer to @c_type.
|
|
*
|
|
* No warning will be issued if @instance is %NULL, and %NULL will be returned.
|
|
*
|
|
* This macro should only be used in type implementations.
|
|
*/
|
|
#define lG_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type) (l_G_TYPE_CIC ((instance), (g_type), c_type))
|
|
/**
|
|
* lG_TYPE_CHECK_INSTANCE_TYPE:
|
|
* @instance: (nullable): Location of a #GTypeInstance structure.
|
|
* @g_type: The type to be checked
|
|
*
|
|
* Checks if @instance is an instance of the type identified by @g_type. If
|
|
* @instance is %NULL, %FALSE will be returned.
|
|
*
|
|
* This macro should only be used in type implementations.
|
|
*
|
|
* Returns: %TRUE on success
|
|
*/
|
|
#define lG_TYPE_CHECK_INSTANCE_TYPE(instance, g_type) (l_G_TYPE_CIT ((instance), (g_type)))
|
|
/**
|
|
* G_TYPE_CHECK_INSTANCE_FUNDAMENTAL_TYPE:
|
|
* @instance: (nullable): Location of a #GTypeInstance structure.
|
|
* @g_type: The fundamental type to be checked
|
|
*
|
|
* Checks if @instance is an instance of the fundamental type identified by @g_type.
|
|
* If @instance is %NULL, %FALSE will be returned.
|
|
*
|
|
* This macro should only be used in type implementations.
|
|
*
|
|
* Returns: %TRUE on success
|
|
*/
|
|
#define G_TYPE_CHECK_INSTANCE_FUNDAMENTAL_TYPE(instance, g_type) (_G_TYPE_CIFT ((instance), (g_type)))
|
|
/**
|
|
* G_TYPE_INSTANCE_GET_CLASS:
|
|
* @instance: Location of the #GTypeInstance structure
|
|
* @g_type: The #GType of the class to be returned
|
|
* @c_type: The C type of the class structure
|
|
*
|
|
* Get the class structure of a given @instance, casted
|
|
* to a specified ancestor type @g_type of the instance.
|
|
*
|
|
* Note that while calling a GInstanceInitFunc(), the class pointer
|
|
* gets modified, so it might not always return the expected pointer.
|
|
*
|
|
* This macro should only be used in type implementations.
|
|
*
|
|
* Returns: a pointer to the class structure
|
|
*/
|
|
#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type) (_G_TYPE_IGC ((instance), (g_type), c_type))
|
|
/**
|
|
* G_TYPE_INSTANCE_GET_INTERFACE:
|
|
* @instance: Location of the #GTypeInstance structure
|
|
* @g_type: The #GType of the interface to be returned
|
|
* @c_type: The C type of the interface structure
|
|
*
|
|
* Get the interface structure for interface @g_type of a given @instance.
|
|
*
|
|
* This macro should only be used in type implementations.
|
|
*
|
|
* Returns: a pointer to the interface structure
|
|
*/
|
|
#define G_TYPE_INSTANCE_GET_INTERFACE(instance, g_type, c_type) (_G_TYPE_IGI ((instance), (g_type), c_type))
|
|
/**
|
|
* G_TYPE_CHECK_CLASS_CAST:
|
|
* @g_class: Location of a #GTypeClass structure
|
|
* @g_type: The type to be returned
|
|
* @c_type: The corresponding C type of class structure of @g_type
|
|
*
|
|
* Checks that @g_class is a class structure of the type identified by @g_type
|
|
* and issues a warning if this is not the case. Returns @g_class casted
|
|
* to a pointer to @c_type. %NULL is not a valid class structure.
|
|
*
|
|
* This macro should only be used in type implementations.
|
|
*/
|
|
#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type) (_G_TYPE_CCC ((g_class), (g_type), c_type))
|
|
/**
|
|
* G_TYPE_CHECK_CLASS_TYPE:
|
|
* @g_class: (nullable): Location of a #GTypeClass structure
|
|
* @g_type: The type to be checked
|
|
*
|
|
* Checks if @g_class is a class structure of the type identified by
|
|
* @g_type. If @g_class is %NULL, %FALSE will be returned.
|
|
*
|
|
* This macro should only be used in type implementations.
|
|
*
|
|
* Returns: %TRUE on success
|
|
*/
|
|
#define G_TYPE_CHECK_CLASS_TYPE(g_class, g_type) (_G_TYPE_CCT ((g_class), (g_type)))
|
|
/**
|
|
* G_TYPE_CHECK_VALUE:
|
|
* @value: a #GValue
|
|
*
|
|
* Checks if @value has been initialized to hold values
|
|
* of a value type.
|
|
*
|
|
* This macro should only be used in type implementations.
|
|
*
|
|
* Returns: %TRUE on success
|
|
*/
|
|
#define G_TYPE_CHECK_VALUE(value) (_G_TYPE_CHV ((value)))
|
|
/**
|
|
* G_TYPE_CHECK_VALUE_TYPE:
|
|
* @value: a #GValue
|
|
* @g_type: The type to be checked
|
|
*
|
|
* Checks if @value has been initialized to hold values
|
|
* of type @g_type.
|
|
*
|
|
* This macro should only be used in type implementations.
|
|
*
|
|
* Returns: %TRUE on success
|
|
*/
|
|
#define G_TYPE_CHECK_VALUE_TYPE(value, g_type) (_G_TYPE_CVH ((value), (g_type)))
|
|
/**
|
|
* G_TYPE_FROM_INSTANCE:
|
|
* @instance: Location of a valid #GTypeInstance structure
|
|
*
|
|
* Get the type identifier from a given @instance structure.
|
|
*
|
|
* This macro should only be used in type implementations.
|
|
*
|
|
* Returns: the #GType
|
|
*/
|
|
#define G_TYPE_FROM_INSTANCE(instance) (G_TYPE_FROM_CLASS (((GTypeInstance*) (instance))->g_class))
|
|
/**
|
|
* G_TYPE_FROM_CLASS:
|
|
* @g_class: Location of a valid #GTypeClass structure
|
|
*
|
|
* Get the type identifier from a given @class structure.
|
|
*
|
|
* This macro should only be used in type implementations.
|
|
*
|
|
* Returns: the #GType
|
|
*/
|
|
#define G_TYPE_FROM_CLASS(g_class) (((GTypeClass*) (g_class))->g_type)
|
|
/**
|
|
* G_TYPE_FROM_INTERFACE:
|
|
* @g_iface: Location of a valid #GTypeInterface structure
|
|
*
|
|
* Get the type identifier from a given @interface structure.
|
|
*
|
|
* This macro should only be used in type implementations.
|
|
*
|
|
* Returns: the #GType
|
|
*/
|
|
#define G_TYPE_FROM_INTERFACE(g_iface) (((GTypeInterface*) (g_iface))->g_type)
|
|
|
|
/**
|
|
* G_TYPE_INSTANCE_GET_PRIVATE:
|
|
* @instance: the instance of a type deriving from @private_type
|
|
* @g_type: the type identifying which private data to retrieve
|
|
* @c_type: The C type for the private structure
|
|
*
|
|
* Gets the private structure for a particular type.
|
|
* The private structure must have been registered in the
|
|
* class_init function with g_type_class_add_private().
|
|
*
|
|
* This macro should only be used in type implementations.
|
|
*
|
|
* Since: 2.4
|
|
* Returns: (not nullable): a pointer to the private data structure
|
|
*/
|
|
#define G_TYPE_INSTANCE_GET_PRIVATE(instance, g_type, c_type) ((c_type*) g_type_instance_get_private ((GTypeInstance*) (instance), (g_type)))
|
|
|
|
/**
|
|
* G_TYPE_CLASS_GET_PRIVATE:
|
|
* @klass: the class of a type deriving from @private_type
|
|
* @g_type: the type identifying which private data to retrieve
|
|
* @c_type: The C type for the private structure
|
|
*
|
|
* Gets the private class structure for a particular type.
|
|
* The private structure must have been registered in the
|
|
* get_type() function with g_type_add_class_private().
|
|
*
|
|
* This macro should only be used in type implementations.
|
|
*
|
|
* Since: 2.24
|
|
* Returns: (not nullable): a pointer to the private data structure
|
|
*/
|
|
#define G_TYPE_CLASS_GET_PRIVATE(klass, g_type, c_type) ((c_type*) g_type_class_get_private ((GTypeClass*) (klass), (g_type)))
|
|
|
|
/**
|
|
* GTypeDebugFlags:
|
|
* @G_TYPE_DEBUG_NONE: Print no messages
|
|
* @G_TYPE_DEBUG_OBJECTS: Print messages about object bookkeeping
|
|
* @G_TYPE_DEBUG_SIGNALS: Print messages about signal emissions
|
|
* @G_TYPE_DEBUG_MASK: Mask covering all debug flags
|
|
* @G_TYPE_DEBUG_INSTANCE_COUNT: Keep a count of instances of each type
|
|
*
|
|
* These flags used to be passed to g_type_init_with_debug_flags() which
|
|
* is now deprecated.
|
|
*
|
|
* If you need to enable debugging features, use the GOBJECT_DEBUG
|
|
* environment variable.
|
|
*
|
|
* Deprecated: 2.36: g_type_init() is now done automatically
|
|
*/
|
|
typedef enum /*< skip >*/
|
|
{
|
|
G_TYPE_DEBUG_NONE = 0,
|
|
G_TYPE_DEBUG_OBJECTS = 1 << 0,
|
|
G_TYPE_DEBUG_SIGNALS = 1 << 1,
|
|
G_TYPE_DEBUG_INSTANCE_COUNT = 1 << 2,
|
|
G_TYPE_DEBUG_MASK = 0x07
|
|
} GTypeDebugFlags;
|
|
|
|
|
|
/* --- prototypes --- */
|
|
GLIB_DEPRECATED_IN_2_36
|
|
void g_type_init (void);
|
|
GLIB_DEPRECATED_IN_2_36
|
|
void g_type_init_with_debug_flags (GTypeDebugFlags debug_flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_type_name (GType type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GQuark g_type_qname (GType type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_type_from_name (const gchar *name);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_type_parent (GType type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_type_depth (GType type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_type_next_base (GType leaf_type,
|
|
GType root_type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_type_is_a (GType type,
|
|
GType is_a_type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_type_class_ref (GType type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_type_class_peek (GType type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_type_class_peek_static (GType type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_type_class_unref (gpointer g_class);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_type_class_peek_parent (gpointer g_class);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_type_interface_peek (gpointer instance_class,
|
|
GType iface_type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_type_interface_peek_parent (gpointer g_iface);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_type_default_interface_ref (GType g_type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_type_default_interface_peek (GType g_type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_type_default_interface_unref (gpointer g_iface);
|
|
|
|
/* g_free() the returned arrays */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType* g_type_children (GType type,
|
|
guint *n_children);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType* g_type_interfaces (GType type,
|
|
guint *n_interfaces);
|
|
|
|
/* per-type _static_ data */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_type_set_qdata (GType type,
|
|
GQuark quark,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_type_get_qdata (GType type,
|
|
GQuark quark);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_type_query (GType type,
|
|
GTypeQuery *query);
|
|
|
|
GLIB_AVAILABLE_IN_2_44
|
|
int g_type_get_instance_count (GType type);
|
|
|
|
/* --- type registration --- */
|
|
/**
|
|
* GBaseInitFunc:
|
|
* @g_class: (type GObject.TypeClass): The #GTypeClass structure to initialize
|
|
*
|
|
* A callback function used by the type system to do base initialization
|
|
* of the class structures of derived types. It is called as part of the
|
|
* initialization process of all derived classes and should reallocate
|
|
* or reset all dynamic class members copied over from the parent class.
|
|
* For example, class members (such as strings) that are not sufficiently
|
|
* handled by a plain memory copy of the parent class into the derived class
|
|
* have to be altered. See GClassInitFunc() for a discussion of the class
|
|
* initialization process.
|
|
*/
|
|
typedef void (*GBaseInitFunc) (gpointer g_class);
|
|
/**
|
|
* GBaseFinalizeFunc:
|
|
* @g_class: (type GObject.TypeClass): The #GTypeClass structure to finalize
|
|
*
|
|
* A callback function used by the type system to finalize those portions
|
|
* of a derived types class structure that were setup from the corresponding
|
|
* GBaseInitFunc() function. Class finalization basically works the inverse
|
|
* way in which class initialization is performed.
|
|
* See GClassInitFunc() for a discussion of the class initialization process.
|
|
*/
|
|
typedef void (*GBaseFinalizeFunc) (gpointer g_class);
|
|
/**
|
|
* GClassInitFunc:
|
|
* @g_class: (type GObject.TypeClass): The #GTypeClass structure to initialize.
|
|
* @class_data: The @class_data member supplied via the #GTypeInfo structure.
|
|
*
|
|
* A callback function used by the type system to initialize the class
|
|
* of a specific type. This function should initialize all static class
|
|
* members.
|
|
*
|
|
* The initialization process of a class involves:
|
|
*
|
|
* - Copying common members from the parent class over to the
|
|
* derived class structure.
|
|
* - Zero initialization of the remaining members not copied
|
|
* over from the parent class.
|
|
* - Invocation of the GBaseInitFunc() initializers of all parent
|
|
* types and the class' type.
|
|
* - Invocation of the class' GClassInitFunc() initializer.
|
|
*
|
|
* Since derived classes are partially initialized through a memory copy
|
|
* of the parent class, the general rule is that GBaseInitFunc() and
|
|
* GBaseFinalizeFunc() should take care of necessary reinitialization
|
|
* and release of those class members that were introduced by the type
|
|
* that specified these GBaseInitFunc()/GBaseFinalizeFunc().
|
|
* GClassInitFunc() should only care about initializing static
|
|
* class members, while dynamic class members (such as allocated strings
|
|
* or reference counted resources) are better handled by a GBaseInitFunc()
|
|
* for this type, so proper initialization of the dynamic class members
|
|
* is performed for class initialization of derived types as well.
|
|
*
|
|
* An example may help to correspond the intend of the different class
|
|
* initializers:
|
|
*
|
|
* |[<!-- language="C" -->
|
|
* typedef struct {
|
|
* GObjectClass parent_class;
|
|
* gint static_integer;
|
|
* gchar *dynamic_string;
|
|
* } TypeAClass;
|
|
* static void
|
|
* type_a_base_class_init (TypeAClass *class)
|
|
* {
|
|
* class->dynamic_string = g_strdup ("some string");
|
|
* }
|
|
* static void
|
|
* type_a_base_class_finalize (TypeAClass *class)
|
|
* {
|
|
* g_free (class->dynamic_string);
|
|
* }
|
|
* static void
|
|
* type_a_class_init (TypeAClass *class)
|
|
* {
|
|
* class->static_integer = 42;
|
|
* }
|
|
*
|
|
* typedef struct {
|
|
* TypeAClass parent_class;
|
|
* gfloat static_float;
|
|
* GString *dynamic_gstring;
|
|
* } TypeBClass;
|
|
* static void
|
|
* type_b_base_class_init (TypeBClass *class)
|
|
* {
|
|
* class->dynamic_gstring = g_string_new ("some other string");
|
|
* }
|
|
* static void
|
|
* type_b_base_class_finalize (TypeBClass *class)
|
|
* {
|
|
* g_string_free (class->dynamic_gstring);
|
|
* }
|
|
* static void
|
|
* type_b_class_init (TypeBClass *class)
|
|
* {
|
|
* class->static_float = 3.14159265358979323846;
|
|
* }
|
|
* ]|
|
|
* Initialization of TypeBClass will first cause initialization of
|
|
* TypeAClass (derived classes reference their parent classes, see
|
|
* g_type_class_ref() on this).
|
|
*
|
|
* Initialization of TypeAClass roughly involves zero-initializing its fields,
|
|
* then calling its GBaseInitFunc() type_a_base_class_init() to allocate
|
|
* its dynamic members (dynamic_string), and finally calling its GClassInitFunc()
|
|
* type_a_class_init() to initialize its static members (static_integer).
|
|
* The first step in the initialization process of TypeBClass is then
|
|
* a plain memory copy of the contents of TypeAClass into TypeBClass and
|
|
* zero-initialization of the remaining fields in TypeBClass.
|
|
* The dynamic members of TypeAClass within TypeBClass now need
|
|
* reinitialization which is performed by calling type_a_base_class_init()
|
|
* with an argument of TypeBClass.
|
|
*
|
|
* After that, the GBaseInitFunc() of TypeBClass, type_b_base_class_init()
|
|
* is called to allocate the dynamic members of TypeBClass (dynamic_gstring),
|
|
* and finally the GClassInitFunc() of TypeBClass, type_b_class_init(),
|
|
* is called to complete the initialization process with the static members
|
|
* (static_float).
|
|
*
|
|
* Corresponding finalization counter parts to the GBaseInitFunc() functions
|
|
* have to be provided to release allocated resources at class finalization
|
|
* time.
|
|
*/
|
|
typedef void (*GClassInitFunc) (gpointer g_class,
|
|
gpointer class_data);
|
|
/**
|
|
* GClassFinalizeFunc:
|
|
* @g_class: (type GObject.TypeClass): The #GTypeClass structure to finalize
|
|
* @class_data: The @class_data member supplied via the #GTypeInfo structure
|
|
*
|
|
* A callback function used by the type system to finalize a class.
|
|
* This function is rarely needed, as dynamically allocated class resources
|
|
* should be handled by GBaseInitFunc() and GBaseFinalizeFunc().
|
|
* Also, specification of a GClassFinalizeFunc() in the #GTypeInfo
|
|
* structure of a static type is invalid, because classes of static types
|
|
* will never be finalized (they are artificially kept alive when their
|
|
* reference count drops to zero).
|
|
*/
|
|
typedef void (*GClassFinalizeFunc) (gpointer g_class,
|
|
gpointer class_data);
|
|
/**
|
|
* GInstanceInitFunc:
|
|
* @instance: The instance to initialize
|
|
* @g_class: (type GObject.TypeClass): The class of the type the instance is
|
|
* created for
|
|
*
|
|
* A callback function used by the type system to initialize a new
|
|
* instance of a type. This function initializes all instance members and
|
|
* allocates any resources required by it.
|
|
*
|
|
* Initialization of a derived instance involves calling all its parent
|
|
* types instance initializers, so the class member of the instance
|
|
* is altered during its initialization to always point to the class that
|
|
* belongs to the type the current initializer was introduced for.
|
|
*
|
|
* The extended members of @instance are guaranteed to have been filled with
|
|
* zeros before this function is called.
|
|
*/
|
|
typedef void (*GInstanceInitFunc) (GTypeInstance *instance,
|
|
gpointer g_class);
|
|
/**
|
|
* GInterfaceInitFunc:
|
|
* @g_iface: (type GObject.TypeInterface): The interface structure to initialize
|
|
* @iface_data: The @interface_data supplied via the #GInterfaceInfo structure
|
|
*
|
|
* A callback function used by the type system to initialize a new
|
|
* interface. This function should initialize all internal data and
|
|
* allocate any resources required by the interface.
|
|
*
|
|
* The members of @iface_data are guaranteed to have been filled with
|
|
* zeros before this function is called.
|
|
*/
|
|
typedef void (*GInterfaceInitFunc) (gpointer g_iface,
|
|
gpointer iface_data);
|
|
/**
|
|
* GInterfaceFinalizeFunc:
|
|
* @g_iface: (type GObject.TypeInterface): The interface structure to finalize
|
|
* @iface_data: The @interface_data supplied via the #GInterfaceInfo structure
|
|
*
|
|
* A callback function used by the type system to finalize an interface.
|
|
* This function should destroy any internal data and release any resources
|
|
* allocated by the corresponding GInterfaceInitFunc() function.
|
|
*/
|
|
typedef void (*GInterfaceFinalizeFunc) (gpointer g_iface,
|
|
gpointer iface_data);
|
|
/**
|
|
* GTypeClassCacheFunc:
|
|
* @cache_data: data that was given to the g_type_add_class_cache_func() call
|
|
* @g_class: (type GObject.TypeClass): The #GTypeClass structure which is
|
|
* unreferenced
|
|
*
|
|
* A callback function which is called when the reference count of a class
|
|
* drops to zero. It may use g_type_class_ref() to prevent the class from
|
|
* being freed. You should not call g_type_class_unref() from a
|
|
* #GTypeClassCacheFunc function to prevent infinite recursion, use
|
|
* g_type_class_unref_uncached() instead.
|
|
*
|
|
* The functions have to check the class id passed in to figure
|
|
* whether they actually want to cache the class of this type, since all
|
|
* classes are routed through the same #GTypeClassCacheFunc chain.
|
|
*
|
|
* Returns: %TRUE to stop further #GTypeClassCacheFuncs from being
|
|
* called, %FALSE to continue
|
|
*/
|
|
typedef gboolean (*GTypeClassCacheFunc) (gpointer cache_data,
|
|
GTypeClass *g_class);
|
|
/**
|
|
* GTypeInterfaceCheckFunc:
|
|
* @check_data: data passed to g_type_add_interface_check()
|
|
* @g_iface: (type GObject.TypeInterface): the interface that has been
|
|
* initialized
|
|
*
|
|
* A callback called after an interface vtable is initialized.
|
|
* See g_type_add_interface_check().
|
|
*
|
|
* Since: 2.4
|
|
*/
|
|
typedef void (*GTypeInterfaceCheckFunc) (gpointer check_data,
|
|
gpointer g_iface);
|
|
/**
|
|
* GTypeFundamentalFlags:
|
|
* @G_TYPE_FLAG_CLASSED: Indicates a classed type
|
|
* @G_TYPE_FLAG_INSTANTIATABLE: Indicates an instantiable type (implies classed)
|
|
* @G_TYPE_FLAG_DERIVABLE: Indicates a flat derivable type
|
|
* @G_TYPE_FLAG_DEEP_DERIVABLE: Indicates a deep derivable type (implies derivable)
|
|
*
|
|
* Bit masks used to check or determine specific characteristics of a
|
|
* fundamental type.
|
|
*/
|
|
typedef enum /*< skip >*/
|
|
{
|
|
G_TYPE_FLAG_CLASSED = (1 << 0),
|
|
G_TYPE_FLAG_INSTANTIATABLE = (1 << 1),
|
|
G_TYPE_FLAG_DERIVABLE = (1 << 2),
|
|
G_TYPE_FLAG_DEEP_DERIVABLE = (1 << 3)
|
|
} GTypeFundamentalFlags;
|
|
/**
|
|
* GTypeFlags:
|
|
* @G_TYPE_FLAG_ABSTRACT: Indicates an abstract type. No instances can be
|
|
* created for an abstract type
|
|
* @G_TYPE_FLAG_VALUE_ABSTRACT: Indicates an abstract value type, i.e. a type
|
|
* that introduces a value table, but can't be used for
|
|
* g_value_init()
|
|
*
|
|
* Bit masks used to check or determine characteristics of a type.
|
|
*/
|
|
typedef enum /*< skip >*/
|
|
{
|
|
G_TYPE_FLAG_ABSTRACT = (1 << 4),
|
|
G_TYPE_FLAG_VALUE_ABSTRACT = (1 << 5)
|
|
} GTypeFlags;
|
|
/**
|
|
* GTypeInfo:
|
|
* @class_size: Size of the class structure (required for interface, classed and instantiatable types)
|
|
* @base_init: Location of the base initialization function (optional)
|
|
* @base_finalize: Location of the base finalization function (optional)
|
|
* @class_init: Location of the class initialization function for
|
|
* classed and instantiatable types. Location of the default vtable
|
|
* inititalization function for interface types. (optional) This function
|
|
* is used both to fill in virtual functions in the class or default vtable,
|
|
* and to do type-specific setup such as registering signals and object
|
|
* properties.
|
|
* @class_finalize: Location of the class finalization function for
|
|
* classed and instantiatable types. Location of the default vtable
|
|
* finalization function for interface types. (optional)
|
|
* @class_data: User-supplied data passed to the class init/finalize functions
|
|
* @instance_size: Size of the instance (object) structure (required for instantiatable types only)
|
|
* @n_preallocs: Prior to GLib 2.10, it specified the number of pre-allocated (cached) instances to reserve memory for (0 indicates no caching). Since GLib 2.10, it is ignored, since instances are allocated with the [slice allocator][glib-Memory-Slices] now.
|
|
* @instance_init: Location of the instance initialization function (optional, for instantiatable types only)
|
|
* @value_table: A #GTypeValueTable function table for generic handling of GValues
|
|
* of this type (usually only useful for fundamental types)
|
|
*
|
|
* This structure is used to provide the type system with the information
|
|
* required to initialize and destruct (finalize) a type's class and
|
|
* its instances.
|
|
*
|
|
* The initialized structure is passed to the g_type_register_static() function
|
|
* (or is copied into the provided #GTypeInfo structure in the
|
|
* g_type_plugin_complete_type_info()). The type system will perform a deep
|
|
* copy of this structure, so its memory does not need to be persistent
|
|
* across invocation of g_type_register_static().
|
|
*/
|
|
struct _GTypeInfo
|
|
{
|
|
/* interface types, classed types, instantiated types */
|
|
guint16 class_size;
|
|
|
|
GBaseInitFunc base_init;
|
|
GBaseFinalizeFunc base_finalize;
|
|
|
|
/* interface types, classed types, instantiated types */
|
|
GClassInitFunc class_init;
|
|
GClassFinalizeFunc class_finalize;
|
|
gconstpointer class_data;
|
|
|
|
/* instantiated types */
|
|
guint16 instance_size;
|
|
guint16 n_preallocs;
|
|
GInstanceInitFunc instance_init;
|
|
|
|
/* value handling */
|
|
const GTypeValueTable *value_table;
|
|
};
|
|
/**
|
|
* GTypeFundamentalInfo:
|
|
* @type_flags: #GTypeFundamentalFlags describing the characteristics of the fundamental type
|
|
*
|
|
* A structure that provides information to the type system which is
|
|
* used specifically for managing fundamental types.
|
|
*/
|
|
struct _GTypeFundamentalInfo
|
|
{
|
|
GTypeFundamentalFlags type_flags;
|
|
};
|
|
/**
|
|
* GInterfaceInfo:
|
|
* @interface_init: location of the interface initialization function
|
|
* @interface_finalize: location of the interface finalization function
|
|
* @interface_data: user-supplied data passed to the interface init/finalize functions
|
|
*
|
|
* A structure that provides information to the type system which is
|
|
* used specifically for managing interface types.
|
|
*/
|
|
struct _GInterfaceInfo
|
|
{
|
|
GInterfaceInitFunc interface_init;
|
|
GInterfaceFinalizeFunc interface_finalize;
|
|
gpointer interface_data;
|
|
};
|
|
/**
|
|
* GTypeValueTable:
|
|
* @value_init: Default initialize @values contents by poking values
|
|
* directly into the value->data array. The data array of
|
|
* the #GValue passed into this function was zero-filled
|
|
* with `memset()`, so no care has to be taken to free any
|
|
* old contents. E.g. for the implementation of a string
|
|
* value that may never be %NULL, the implementation might
|
|
* look like:
|
|
* |[<!-- language="C" -->
|
|
* value->data[0].v_pointer = g_strdup ("");
|
|
* ]|
|
|
* @value_free: Free any old contents that might be left in the
|
|
* data array of the passed in @value. No resources may
|
|
* remain allocated through the #GValue contents after
|
|
* this function returns. E.g. for our above string type:
|
|
* |[<!-- language="C" -->
|
|
* // only free strings without a specific flag for static storage
|
|
* if (!(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS))
|
|
* g_free (value->data[0].v_pointer);
|
|
* ]|
|
|
* @value_copy: @dest_value is a #GValue with zero-filled data section
|
|
* and @src_value is a properly setup #GValue of same or
|
|
* derived type.
|
|
* The purpose of this function is to copy the contents of
|
|
* @src_value into @dest_value in a way, that even after
|
|
* @src_value has been freed, the contents of @dest_value
|
|
* remain valid. String type example:
|
|
* |[<!-- language="C" -->
|
|
* dest_value->data[0].v_pointer = g_strdup (src_value->data[0].v_pointer);
|
|
* ]|
|
|
* @value_peek_pointer: If the value contents fit into a pointer, such as objects
|
|
* or strings, return this pointer, so the caller can peek at
|
|
* the current contents. To extend on our above string example:
|
|
* |[<!-- language="C" -->
|
|
* return value->data[0].v_pointer;
|
|
* ]|
|
|
* @collect_format: A string format describing how to collect the contents of
|
|
* this value bit-by-bit. Each character in the format represents
|
|
* an argument to be collected, and the characters themselves indicate
|
|
* the type of the argument. Currently supported arguments are:
|
|
* - 'i' - Integers. passed as collect_values[].v_int.
|
|
* - 'l' - Longs. passed as collect_values[].v_long.
|
|
* - 'd' - Doubles. passed as collect_values[].v_double.
|
|
* - 'p' - Pointers. passed as collect_values[].v_pointer.
|
|
* It should be noted that for variable argument list construction,
|
|
* ANSI C promotes every type smaller than an integer to an int, and
|
|
* floats to doubles. So for collection of short int or char, 'i'
|
|
* needs to be used, and for collection of floats 'd'.
|
|
* @collect_value: The collect_value() function is responsible for converting the
|
|
* values collected from a variable argument list into contents
|
|
* suitable for storage in a GValue. This function should setup
|
|
* @value similar to value_init(); e.g. for a string value that
|
|
* does not allow %NULL pointers, it needs to either spew an error,
|
|
* or do an implicit conversion by storing an empty string.
|
|
* The @value passed in to this function has a zero-filled data
|
|
* array, so just like for value_init() it is guaranteed to not
|
|
* contain any old contents that might need freeing.
|
|
* @n_collect_values is exactly the string length of @collect_format,
|
|
* and @collect_values is an array of unions #GTypeCValue with
|
|
* length @n_collect_values, containing the collected values
|
|
* according to @collect_format.
|
|
* @collect_flags is an argument provided as a hint by the caller.
|
|
* It may contain the flag %G_VALUE_NOCOPY_CONTENTS indicating,
|
|
* that the collected value contents may be considered "static"
|
|
* for the duration of the @value lifetime.
|
|
* Thus an extra copy of the contents stored in @collect_values is
|
|
* not required for assignment to @value.
|
|
* For our above string example, we continue with:
|
|
* |[<!-- language="C" -->
|
|
* if (!collect_values[0].v_pointer)
|
|
* value->data[0].v_pointer = g_strdup ("");
|
|
* else if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
|
|
* {
|
|
* value->data[0].v_pointer = collect_values[0].v_pointer;
|
|
* // keep a flag for the value_free() implementation to not free this string
|
|
* value->data[1].v_uint = G_VALUE_NOCOPY_CONTENTS;
|
|
* }
|
|
* else
|
|
* value->data[0].v_pointer = g_strdup (collect_values[0].v_pointer);
|
|
* return NULL;
|
|
* ]|
|
|
* It should be noted, that it is generally a bad idea to follow the
|
|
* #G_VALUE_NOCOPY_CONTENTS hint for reference counted types. Due to
|
|
* reentrancy requirements and reference count assertions performed
|
|
* by the signal emission code, reference counts should always be
|
|
* incremented for reference counted contents stored in the value->data
|
|
* array. To deviate from our string example for a moment, and taking
|
|
* a look at an exemplary implementation for collect_value() of
|
|
* #GObject:
|
|
* |[<!-- language="C" -->
|
|
* if (collect_values[0].v_pointer)
|
|
* {
|
|
* GObject *object = G_OBJECT (collect_values[0].v_pointer);
|
|
* // never honour G_VALUE_NOCOPY_CONTENTS for ref-counted types
|
|
* value->data[0].v_pointer = g_object_ref (object);
|
|
* return NULL;
|
|
* }
|
|
* else
|
|
* return g_strdup_printf ("Object passed as invalid NULL pointer");
|
|
* }
|
|
* ]|
|
|
* The reference count for valid objects is always incremented,
|
|
* regardless of @collect_flags. For invalid objects, the example
|
|
* returns a newly allocated string without altering @value.
|
|
* Upon success, collect_value() needs to return %NULL. If, however,
|
|
* an error condition occurred, collect_value() may spew an
|
|
* error by returning a newly allocated non-%NULL string, giving
|
|
* a suitable description of the error condition.
|
|
* The calling code makes no assumptions about the @value
|
|
* contents being valid upon error returns, @value
|
|
* is simply thrown away without further freeing. As such, it is
|
|
* a good idea to not allocate #GValue contents, prior to returning
|
|
* an error, however, collect_values() is not obliged to return
|
|
* a correctly setup @value for error returns, simply because
|
|
* any non-%NULL return is considered a fatal condition so further
|
|
* program behaviour is undefined.
|
|
* @lcopy_format: Format description of the arguments to collect for @lcopy_value,
|
|
* analogous to @collect_format. Usually, @lcopy_format string consists
|
|
* only of 'p's to provide lcopy_value() with pointers to storage locations.
|
|
* @lcopy_value: This function is responsible for storing the @value contents into
|
|
* arguments passed through a variable argument list which got
|
|
* collected into @collect_values according to @lcopy_format.
|
|
* @n_collect_values equals the string length of @lcopy_format,
|
|
* and @collect_flags may contain %G_VALUE_NOCOPY_CONTENTS.
|
|
* In contrast to collect_value(), lcopy_value() is obliged to
|
|
* always properly support %G_VALUE_NOCOPY_CONTENTS.
|
|
* Similar to collect_value() the function may prematurely abort
|
|
* by returning a newly allocated string describing an error condition.
|
|
* To complete the string example:
|
|
* |[<!-- language="C" -->
|
|
* gchar **string_p = collect_values[0].v_pointer;
|
|
* if (!string_p)
|
|
* return g_strdup_printf ("string location passed as NULL");
|
|
* if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
|
|
* *string_p = value->data[0].v_pointer;
|
|
* else
|
|
* *string_p = g_strdup (value->data[0].v_pointer);
|
|
* ]|
|
|
* And an illustrative version of lcopy_value() for
|
|
* reference-counted types:
|
|
* |[<!-- language="C" -->
|
|
* GObject **object_p = collect_values[0].v_pointer;
|
|
* if (!object_p)
|
|
* return g_strdup_printf ("object location passed as NULL");
|
|
* if (!value->data[0].v_pointer)
|
|
* *object_p = NULL;
|
|
* else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) // always honour
|
|
* *object_p = value->data[0].v_pointer;
|
|
* else
|
|
* *object_p = g_object_ref (value->data[0].v_pointer);
|
|
* return NULL;
|
|
* ]|
|
|
*
|
|
* The #GTypeValueTable provides the functions required by the #GValue
|
|
* implementation, to serve as a container for values of a type.
|
|
*/
|
|
|
|
struct _GTypeValueTable
|
|
{
|
|
void (*value_init) (GValue *value);
|
|
void (*value_free) (GValue *value);
|
|
void (*value_copy) (const GValue *src_value,
|
|
GValue *dest_value);
|
|
/* varargs functionality (optional) */
|
|
gpointer (*value_peek_pointer) (const GValue *value);
|
|
const gchar *collect_format;
|
|
gchar* (*collect_value) (GValue *value,
|
|
guint n_collect_values,
|
|
GTypeCValue *collect_values,
|
|
guint collect_flags);
|
|
const gchar *lcopy_format;
|
|
gchar* (*lcopy_value) (const GValue *value,
|
|
guint n_collect_values,
|
|
GTypeCValue *collect_values,
|
|
guint collect_flags);
|
|
};
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_type_register_static (GType parent_type,
|
|
const gchar *type_name,
|
|
const GTypeInfo *info,
|
|
GTypeFlags flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType lg_type_register_static_simple (GType parent_type,
|
|
const gchar *type_name,
|
|
guint class_size,
|
|
GClassInitFunc class_init,
|
|
guint instance_size,
|
|
GInstanceInitFunc instance_init,
|
|
GTypeFlags flags);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_type_register_dynamic (GType parent_type,
|
|
const gchar *type_name,
|
|
GTypePlugin *plugin,
|
|
GTypeFlags flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_type_register_fundamental (GType type_id,
|
|
const gchar *type_name,
|
|
const GTypeInfo *info,
|
|
const GTypeFundamentalInfo *finfo,
|
|
GTypeFlags flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void lg_type_add_interface_static (GType instance_type,
|
|
GType interface_type,
|
|
const GInterfaceInfo *info);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_type_add_interface_dynamic (GType instance_type,
|
|
GType interface_type,
|
|
GTypePlugin *plugin);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_type_interface_add_prerequisite (GType interface_type,
|
|
GType prerequisite_type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType*g_type_interface_prerequisites (GType interface_type,
|
|
guint *n_prerequisites);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_type_class_add_private (gpointer g_class,
|
|
gsize private_size);
|
|
GLIB_AVAILABLE_IN_2_38
|
|
gint g_type_add_instance_private (GType class_type,
|
|
gsize private_size);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_type_instance_get_private (GTypeInstance *instance,
|
|
GType private_type);
|
|
GLIB_AVAILABLE_IN_2_38
|
|
void g_type_class_adjust_private_offset (gpointer g_class,
|
|
gint *private_size_or_offset);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_type_add_class_private (GType class_type,
|
|
gsize private_size);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_type_class_get_private (GTypeClass *klass,
|
|
GType private_type);
|
|
GLIB_AVAILABLE_IN_2_38
|
|
gint g_type_class_get_instance_private_offset (gpointer g_class);
|
|
|
|
GLIB_AVAILABLE_IN_2_34
|
|
void g_type_ensure (GType type);
|
|
GLIB_AVAILABLE_IN_2_36
|
|
guint g_type_get_type_registration_serial (void);
|
|
|
|
|
|
/* --- GType boilerplate --- */
|
|
/**
|
|
* lG_DECLARE_FINAL_TYPE:
|
|
* @ModuleObjName: The name of the new type, in camel case (like GtkWidget)
|
|
* @module_obj_name: The name of the new type in lowercase, with words
|
|
* separated by '_' (like 'gtk_widget')
|
|
* @MODULE: The name of the module, in all caps (like 'GTK')
|
|
* @OBJ_NAME: The bare name of the type, in all caps (like 'WIDGET')
|
|
* @ParentName: the name of the parent type, in camel case (like GtkWidget)
|
|
*
|
|
* A convenience macro for emitting the usual declarations in the header file for a type which is not (at the
|
|
* present time) intended to be subclassed.
|
|
*
|
|
* You might use it in a header as follows:
|
|
*
|
|
* |[
|
|
* #ifndef _myapp_window_h_
|
|
* #define _myapp_window_h_
|
|
*
|
|
* #include <gtk/gtk.h>
|
|
*
|
|
* #define MY_APP_TYPE_WINDOW my_app_window_get_type ()
|
|
* lG_DECLARE_FINAL_TYPE (MyAppWindow, my_app_window, MY_APP, WINDOW, GtkWindow)
|
|
*
|
|
* MyAppWindow * my_app_window_new (void);
|
|
*
|
|
* ...
|
|
*
|
|
* #endif
|
|
* ]|
|
|
*
|
|
* This results in the following things happening:
|
|
*
|
|
* - the usual my_app_window_get_type() function is declared with a return type of #GType
|
|
*
|
|
* - the MyAppWindow types is defined as a typedef of struct _MyAppWindow. The struct itself is not
|
|
* defined and should be defined from the .c file before G_DEFINE_TYPE() is used.
|
|
*
|
|
* - the MY_APP_WINDOW() cast is emitted as static inline function along with the MY_APP_IS_WINDOW() type
|
|
* checking function
|
|
*
|
|
* - the MyAppWindowClass type is defined as a struct containing GtkWindowClass. This is done for the
|
|
* convenience of the person defining the type and should not be considered to be part of the ABI. In
|
|
* particular, without a firm declaration of the instance structure, it is not possible to subclass the type
|
|
* and therefore the fact that the size of the class structure is exposed is not a concern and it can be
|
|
* freely changed at any point in the future.
|
|
*
|
|
* - g_autoptr() support being added for your type, based on the type of your parent class
|
|
*
|
|
* You can only use this function if your parent type also supports g_autoptr().
|
|
*
|
|
* Because the type macro (MY_APP_TYPE_WINDOW in the above example) is not a callable, you must continue to
|
|
* manually define this as a macro for yourself.
|
|
*
|
|
* The declaration of the _get_type() function is the first thing emitted by the macro. This allows this macro
|
|
* to be used in the usual way with export control and API versioning macros.
|
|
*
|
|
* If you want to declare your own class structure, use G_DECLARE_DERIVABLE_TYPE().
|
|
*
|
|
* If you are writing a library, it is important to note that it is possible to convert a type from using
|
|
* lG_DECLARE_FINAL_TYPE() to G_DECLARE_DERIVABLE_TYPE() without breaking API or ABI. As a precaution, you
|
|
* should therefore use lG_DECLARE_FINAL_TYPE() until you are sure that it makes sense for your class to be
|
|
* subclassed. Once a class structure has been exposed it is not possible to change its size or remove or
|
|
* reorder items without breaking the API and/or ABI.
|
|
*
|
|
* Since: 2.44
|
|
**/
|
|
#define lG_DECLARE_FINAL_TYPE(ModuleObjName, module_obj_name, MODULE, OBJ_NAME, ParentName) \
|
|
GType module_obj_name##_get_type (void); \
|
|
lG_GNUC_BEGIN_IGNORE_DEPRECATIONS \
|
|
typedef struct _##ModuleObjName ModuleObjName; \
|
|
typedef struct { ParentName##Class parent_class; } ModuleObjName##Class; \
|
|
\
|
|
l_GLIB_DEFINE_AUTOPTR_CHAINUP (ModuleObjName, ParentName) \
|
|
\
|
|
static inline ModuleObjName * MODULE##_##OBJ_NAME (gpointer ptr) { \
|
|
return lG_TYPE_CHECK_INSTANCE_CAST (ptr, module_obj_name##_get_type (), ModuleObjName); } \
|
|
static inline gboolean MODULE##_IS_##OBJ_NAME (gpointer ptr) { \
|
|
return lG_TYPE_CHECK_INSTANCE_TYPE (ptr, module_obj_name##_get_type ()); } \
|
|
lG_GNUC_END_IGNORE_DEPRECATIONS
|
|
|
|
/**
|
|
* G_DECLARE_DERIVABLE_TYPE:
|
|
* @ModuleObjName: The name of the new type, in camel case (like GtkWidget)
|
|
* @module_obj_name: The name of the new type in lowercase, with words
|
|
* separated by '_' (like 'gtk_widget')
|
|
* @MODULE: The name of the module, in all caps (like 'GTK')
|
|
* @OBJ_NAME: The bare name of the type, in all caps (like 'WIDGET')
|
|
* @ParentName: the name of the parent type, in camel case (like GtkWidget)
|
|
*
|
|
* A convenience macro for emitting the usual declarations in the header file for a type which will is intended
|
|
* to be subclassed.
|
|
*
|
|
* You might use it in a header as follows:
|
|
*
|
|
* |[
|
|
* #ifndef _gtk_frobber_h_
|
|
* #define _gtk_frobber_h_
|
|
*
|
|
* #define GTK_TYPE_FROBBER gtk_frobber_get_type ()
|
|
* GDK_AVAILABLE_IN_3_12
|
|
* G_DECLARE_DERIVABLE_TYPE (GtkFrobber, gtk_frobber, GTK, FROBBER, GtkWidget)
|
|
*
|
|
* struct _GtkFrobberClass
|
|
* {
|
|
* GtkWidgetClass parent_class;
|
|
*
|
|
* void (* handle_frob) (GtkFrobber *frobber,
|
|
* guint n_frobs);
|
|
*
|
|
* gpointer padding[12];
|
|
* };
|
|
*
|
|
* GtkWidget * gtk_frobber_new (void);
|
|
*
|
|
* ...
|
|
*
|
|
* #endif
|
|
* ]|
|
|
*
|
|
* This results in the following things happening:
|
|
*
|
|
* - the usual gtk_frobber_get_type() function is declared with a return type of #GType
|
|
*
|
|
* - the GtkFrobber struct is created with GtkWidget as the first and only item. You are expected to use
|
|
* a private structure from your .c file to store your instance variables.
|
|
*
|
|
* - the GtkFrobberClass type is defined as a typedef to struct _GtkFrobberClass, which is left undefined.
|
|
* You should do this from the header file directly after you use the macro.
|
|
*
|
|
* - the GTK_FROBBER() and GTK_FROBBER_CLASS() casts are emitted as static inline functions along with
|
|
* the GTK_IS_FROBBER() and GTK_IS_FROBBER_CLASS() type checking functions and GTK_FROBBER_GET_CLASS()
|
|
* function.
|
|
*
|
|
* - g_autoptr() support being added for your type, based on the type of your parent class
|
|
*
|
|
* You can only use this function if your parent type also supports g_autoptr().
|
|
*
|
|
* Because the type macro (GTK_TYPE_FROBBER in the above example) is not a callable, you must continue to
|
|
* manually define this as a macro for yourself.
|
|
*
|
|
* The declaration of the _get_type() function is the first thing emitted by the macro. This allows this macro
|
|
* to be used in the usual way with export control and API versioning macros.
|
|
*
|
|
* If you are writing a library, it is important to note that it is possible to convert a type from using
|
|
* lG_DECLARE_FINAL_TYPE() to G_DECLARE_DERIVABLE_TYPE() without breaking API or ABI. As a precaution, you
|
|
* should therefore use lG_DECLARE_FINAL_TYPE() until you are sure that it makes sense for your class to be
|
|
* subclassed. Once a class structure has been exposed it is not possible to change its size or remove or
|
|
* reorder items without breaking the API and/or ABI. If you want to declare your own class structure, use
|
|
* G_DECLARE_DERIVABLE_TYPE(). If you want to declare a class without exposing the class or instance
|
|
* structures, use lG_DECLARE_FINAL_TYPE().
|
|
*
|
|
* If you must use G_DECLARE_DERIVABLE_TYPE() you should be sure to include some padding at the bottom of your
|
|
* class structure to leave space for the addition of future virtual functions.
|
|
*
|
|
* Since: 2.44
|
|
**/
|
|
#define G_DECLARE_DERIVABLE_TYPE(ModuleObjName, module_obj_name, MODULE, OBJ_NAME, ParentName) \
|
|
GType module_obj_name##_get_type (void); \
|
|
lG_GNUC_BEGIN_IGNORE_DEPRECATIONS \
|
|
typedef struct _##ModuleObjName ModuleObjName; \
|
|
typedef struct _##ModuleObjName##Class ModuleObjName##Class; \
|
|
struct _##ModuleObjName { ParentName parent_instance; }; \
|
|
\
|
|
l_GLIB_DEFINE_AUTOPTR_CHAINUP (ModuleObjName, ParentName) \
|
|
\
|
|
static inline ModuleObjName * MODULE##_##OBJ_NAME (gpointer ptr) { \
|
|
return lG_TYPE_CHECK_INSTANCE_CAST (ptr, module_obj_name##_get_type (), ModuleObjName); } \
|
|
static inline ModuleObjName##Class * MODULE##_##OBJ_NAME##_CLASS (gpointer ptr) { \
|
|
return G_TYPE_CHECK_CLASS_CAST (ptr, module_obj_name##_get_type (), ModuleObjName##Class); } \
|
|
static inline gboolean MODULE##_IS_##OBJ_NAME (gpointer ptr) { \
|
|
return lG_TYPE_CHECK_INSTANCE_TYPE (ptr, module_obj_name##_get_type ()); } \
|
|
static inline gboolean MODULE##_IS_##OBJ_NAME##_CLASS (gpointer ptr) { \
|
|
return G_TYPE_CHECK_CLASS_TYPE (ptr, module_obj_name##_get_type ()); } \
|
|
static inline ModuleObjName##Class * MODULE##_##OBJ_NAME##_GET_CLASS (gpointer ptr) { \
|
|
return G_TYPE_INSTANCE_GET_CLASS (ptr, module_obj_name##_get_type (), ModuleObjName##Class); } \
|
|
lG_GNUC_END_IGNORE_DEPRECATIONS
|
|
|
|
/**
|
|
* G_DECLARE_INTERFACE:
|
|
* @ModuleObjName: The name of the new type, in camel case (like GtkWidget)
|
|
* @module_obj_name: The name of the new type in lowercase, with words
|
|
* separated by '_' (like 'gtk_widget')
|
|
* @MODULE: The name of the module, in all caps (like 'GTK')
|
|
* @OBJ_NAME: The bare name of the type, in all caps (like 'WIDGET')
|
|
* @PrerequisiteName: the name of the prerequisite type, in camel case (like GtkWidget)
|
|
*
|
|
* A convenience macro for emitting the usual declarations in the header file for a GInterface type.
|
|
*
|
|
* You might use it in a header as follows:
|
|
*
|
|
* |[
|
|
* #ifndef _my_model_h_
|
|
* #define _my_model_h_
|
|
*
|
|
* #define MY_TYPE_MODEL my_model_get_type ()
|
|
* GDK_AVAILABLE_IN_3_12
|
|
* G_DECLARE_INTERFACE (MyModel, my_model, MY, MODEL, GObject)
|
|
*
|
|
* struct _MyModelInterface
|
|
* {
|
|
* GTypeInterface g_iface;
|
|
*
|
|
* gpointer (* get_item) (MyModel *model);
|
|
* };
|
|
*
|
|
* gpointer my_model_get_item (MyModel *model);
|
|
*
|
|
* ...
|
|
*
|
|
* #endif
|
|
* ]|
|
|
*
|
|
* This results in the following things happening:
|
|
*
|
|
* - the usual my_model_get_type() function is declared with a return type of #GType
|
|
*
|
|
* - the MyModelInterface type is defined as a typedef to struct _MyModelInterface,
|
|
* which is left undefined. You should do this from the header file directly after
|
|
* you use the macro.
|
|
*
|
|
* - the MY_MODEL() cast is emitted as static inline functions along with
|
|
* the MY_IS_MODEL() type checking function and MY_MODEL_GET_IFACE() function.
|
|
*
|
|
* - g_autoptr() support being added for your type, based on your prerequisite type.
|
|
*
|
|
* You can only use this function if your prerequisite type also supports g_autoptr().
|
|
*
|
|
* Because the type macro (MY_TYPE_MODEL in the above example) is not a callable, you must continue to
|
|
* manually define this as a macro for yourself.
|
|
*
|
|
* The declaration of the _get_type() function is the first thing emitted by the macro. This allows this macro
|
|
* to be used in the usual way with export control and API versioning macros.
|
|
*
|
|
* Since: 2.44
|
|
**/
|
|
#define G_DECLARE_INTERFACE(ModuleObjName, module_obj_name, MODULE, OBJ_NAME, PrerequisiteName) \
|
|
GType module_obj_name##_get_type (void); \
|
|
lG_GNUC_BEGIN_IGNORE_DEPRECATIONS \
|
|
typedef struct _##ModuleObjName ModuleObjName; \
|
|
typedef struct _##ModuleObjName##Interface ModuleObjName##Interface; \
|
|
\
|
|
l_GLIB_DEFINE_AUTOPTR_CHAINUP (ModuleObjName, PrerequisiteName) \
|
|
\
|
|
static inline ModuleObjName * MODULE##_##OBJ_NAME (gpointer ptr) { \
|
|
return lG_TYPE_CHECK_INSTANCE_CAST (ptr, module_obj_name##_get_type (), ModuleObjName); } \
|
|
static inline gboolean MODULE##_IS_##OBJ_NAME (gpointer ptr) { \
|
|
return lG_TYPE_CHECK_INSTANCE_TYPE (ptr, module_obj_name##_get_type ()); } \
|
|
static inline ModuleObjName##Interface * MODULE##_##OBJ_NAME##_GET_IFACE (gpointer ptr) { \
|
|
return G_TYPE_INSTANCE_GET_INTERFACE (ptr, module_obj_name##_get_type (), ModuleObjName##Interface); } \
|
|
lG_GNUC_END_IGNORE_DEPRECATIONS
|
|
|
|
/**
|
|
* G_DEFINE_TYPE:
|
|
* @TN: The name of the new type, in Camel case.
|
|
* @t_n: The name of the new type, in lowercase, with words
|
|
* separated by '_'.
|
|
* @T_P: The #GType of the parent type.
|
|
*
|
|
* A convenience macro for type implementations, which declares a class
|
|
* initialization function, an instance initialization function (see #GTypeInfo
|
|
* for information about these) and a static variable named `t_n_parent_class`
|
|
* pointing to the parent class. Furthermore, it defines a *_get_type() function.
|
|
* See lG_DEFINE_TYPE_EXTENDED() for an example.
|
|
*
|
|
* Since: 2.4
|
|
*/
|
|
#define G_DEFINE_TYPE(TN, t_n, T_P) lG_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, 0, {})
|
|
/**
|
|
* G_DEFINE_TYPE_WITH_CODE:
|
|
* @TN: The name of the new type, in Camel case.
|
|
* @t_n: The name of the new type in lowercase, with words separated by '_'.
|
|
* @T_P: The #GType of the parent type.
|
|
* @_C_: Custom code that gets inserted in the *_get_type() function.
|
|
*
|
|
* A convenience macro for type implementations.
|
|
* Similar to G_DEFINE_TYPE(), but allows you to insert custom code into the
|
|
* *_get_type() function, e.g. interface implementations via lG_IMPLEMENT_INTERFACE().
|
|
* See lG_DEFINE_TYPE_EXTENDED() for an example.
|
|
*
|
|
* Since: 2.4
|
|
*/
|
|
#define G_DEFINE_TYPE_WITH_CODE(TN, t_n, T_P, _C_) _G_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, 0) {_C_;} _G_DEFINE_TYPE_EXTENDED_END()
|
|
/**
|
|
* G_DEFINE_TYPE_WITH_PRIVATE:
|
|
* @TN: The name of the new type, in Camel case.
|
|
* @t_n: The name of the new type, in lowercase, with words
|
|
* separated by '_'.
|
|
* @T_P: The #GType of the parent type.
|
|
*
|
|
* A convenience macro for type implementations, which declares a class
|
|
* initialization function, an instance initialization function (see #GTypeInfo
|
|
* for information about these), a static variable named `t_n_parent_class`
|
|
* pointing to the parent class, and adds private instance data to the type.
|
|
* Furthermore, it defines a *_get_type() function. See lG_DEFINE_TYPE_EXTENDED()
|
|
* for an example.
|
|
*
|
|
* Note that private structs added with this macros must have a struct
|
|
* name of the form @TN Private.
|
|
*
|
|
* Since: 2.38
|
|
*/
|
|
#define G_DEFINE_TYPE_WITH_PRIVATE(TN, t_n, T_P) lG_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, 0, G_ADD_PRIVATE (TN))
|
|
/**
|
|
* G_DEFINE_ABSTRACT_TYPE:
|
|
* @TN: The name of the new type, in Camel case.
|
|
* @t_n: The name of the new type, in lowercase, with words
|
|
* separated by '_'.
|
|
* @T_P: The #GType of the parent type.
|
|
*
|
|
* A convenience macro for type implementations.
|
|
* Similar to G_DEFINE_TYPE(), but defines an abstract type.
|
|
* See lG_DEFINE_TYPE_EXTENDED() for an example.
|
|
*
|
|
* Since: 2.4
|
|
*/
|
|
#define G_DEFINE_ABSTRACT_TYPE(TN, t_n, T_P) lG_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, G_TYPE_FLAG_ABSTRACT, {})
|
|
/**
|
|
* G_DEFINE_ABSTRACT_TYPE_WITH_CODE:
|
|
* @TN: The name of the new type, in Camel case.
|
|
* @t_n: The name of the new type, in lowercase, with words
|
|
* separated by '_'.
|
|
* @T_P: The #GType of the parent type.
|
|
* @_C_: Custom code that gets inserted in the @type_name_get_type() function.
|
|
*
|
|
* A convenience macro for type implementations.
|
|
* Similar to G_DEFINE_TYPE_WITH_CODE(), but defines an abstract type and
|
|
* allows you to insert custom code into the *_get_type() function, e.g.
|
|
* interface implementations via lG_IMPLEMENT_INTERFACE().
|
|
* See lG_DEFINE_TYPE_EXTENDED() for an example.
|
|
*
|
|
* Since: 2.4
|
|
*/
|
|
#define G_DEFINE_ABSTRACT_TYPE_WITH_CODE(TN, t_n, T_P, _C_) _G_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, G_TYPE_FLAG_ABSTRACT) {_C_;} _G_DEFINE_TYPE_EXTENDED_END()
|
|
/**
|
|
* G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE:
|
|
* @TN: The name of the new type, in Camel case.
|
|
* @t_n: The name of the new type, in lowercase, with words
|
|
* separated by '_'.
|
|
* @T_P: The #GType of the parent type.
|
|
*
|
|
* Similar to G_DEFINE_TYPE_WITH_PRIVATE(), but defines an abstract type.
|
|
* See lG_DEFINE_TYPE_EXTENDED() for an example.
|
|
*
|
|
* Since: 2.38
|
|
*/
|
|
#define G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE(TN, t_n, T_P) lG_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, G_TYPE_FLAG_ABSTRACT, G_ADD_PRIVATE (TN))
|
|
/**
|
|
* lG_DEFINE_TYPE_EXTENDED:
|
|
* @TN: The name of the new type, in Camel case.
|
|
* @t_n: The name of the new type, in lowercase, with words
|
|
* separated by '_'.
|
|
* @T_P: The #GType of the parent type.
|
|
* @_f_: #GTypeFlags to pass to g_type_register_static()
|
|
* @_C_: Custom code that gets inserted in the *_get_type() function.
|
|
*
|
|
* The most general convenience macro for type implementations, on which
|
|
* G_DEFINE_TYPE(), etc are based.
|
|
*
|
|
* |[<!-- language="C" -->
|
|
* lG_DEFINE_TYPE_EXTENDED (GtkGadget,
|
|
* gtk_gadget,
|
|
* GTK_TYPE_WIDGET,
|
|
* 0,
|
|
* lG_IMPLEMENT_INTERFACE (TYPE_GIZMO,
|
|
* gtk_gadget_gizmo_init));
|
|
* ]|
|
|
* expands to
|
|
* |[<!-- language="C" -->
|
|
* static void gtk_gadget_init (GtkGadget *self);
|
|
* static void gtk_gadget_class_init (GtkGadgetClass *klass);
|
|
* static gpointer gtk_gadget_parent_class = NULL;
|
|
* static void gtk_gadget_class_intern_init (gpointer klass)
|
|
* {
|
|
* gtk_gadget_parent_class = g_type_class_peek_parent (klass);
|
|
* gtk_gadget_class_init ((GtkGadgetClass*) klass);
|
|
* }
|
|
*
|
|
* GType
|
|
* gtk_gadget_get_type (void)
|
|
* {
|
|
* static volatile gsize g_define_type_id__volatile = 0;
|
|
* if (lg_once_init_enter (&g_define_type_id__volatile))
|
|
* {
|
|
* GType g_define_type_id =
|
|
* lg_type_register_static_simple (GTK_TYPE_WIDGET,
|
|
* lg_intern_static_string ("GtkGadget"),
|
|
* sizeof (GtkGadgetClass),
|
|
* (GClassInitFunc) gtk_gadget_class_intern_init,
|
|
* sizeof (GtkGadget),
|
|
* (GInstanceInitFunc) gtk_gadget_init,
|
|
* 0);
|
|
* {
|
|
* const GInterfaceInfo g_implement_interface_info = {
|
|
* (GInterfaceInitFunc) gtk_gadget_gizmo_init
|
|
* };
|
|
* lg_type_add_interface_static (g_define_type_id, TYPE_GIZMO, &g_implement_interface_info);
|
|
* }
|
|
* lg_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
|
|
* }
|
|
* return g_define_type_id__volatile;
|
|
* }
|
|
* ]|
|
|
* The only pieces which have to be manually provided are the definitions of
|
|
* the instance and class structure and the definitions of the instance and
|
|
* class init functions.
|
|
*
|
|
* Since: 2.4
|
|
*/
|
|
#define lG_DEFINE_TYPE_EXTENDED(TN, t_n, T_P, _f_, _C_) _G_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, _f_) {_C_;} _G_DEFINE_TYPE_EXTENDED_END()
|
|
|
|
/**
|
|
* G_DEFINE_INTERFACE:
|
|
* @TN: The name of the new type, in Camel case.
|
|
* @t_n: The name of the new type, in lowercase, with words separated by '_'.
|
|
* @T_P: The #GType of the prerequisite type for the interface, or 0
|
|
* (%G_TYPE_INVALID) for no prerequisite type.
|
|
*
|
|
* A convenience macro for #GTypeInterface definitions, which declares
|
|
* a default vtable initialization function and defines a *_get_type()
|
|
* function.
|
|
*
|
|
* The macro expects the interface initialization function to have the
|
|
* name `t_n ## _default_init`, and the interface structure to have the
|
|
* name `TN ## Interface`.
|
|
*
|
|
* Since: 2.24
|
|
*/
|
|
#define G_DEFINE_INTERFACE(TN, t_n, T_P) G_DEFINE_INTERFACE_WITH_CODE(TN, t_n, T_P, ;)
|
|
|
|
/**
|
|
* G_DEFINE_INTERFACE_WITH_CODE:
|
|
* @TN: The name of the new type, in Camel case.
|
|
* @t_n: The name of the new type, in lowercase, with words separated by '_'.
|
|
* @T_P: The #GType of the prerequisite type for the interface, or 0
|
|
* (%G_TYPE_INVALID) for no prerequisite type.
|
|
* @_C_: Custom code that gets inserted in the *_get_type() function.
|
|
*
|
|
* A convenience macro for #GTypeInterface definitions. Similar to
|
|
* G_DEFINE_INTERFACE(), but allows you to insert custom code into the
|
|
* *_get_type() function, e.g. additional interface implementations
|
|
* via lG_IMPLEMENT_INTERFACE(), or additional prerequisite types. See
|
|
* lG_DEFINE_TYPE_EXTENDED() for a similar example using
|
|
* G_DEFINE_TYPE_WITH_CODE().
|
|
*
|
|
* Since: 2.24
|
|
*/
|
|
#define G_DEFINE_INTERFACE_WITH_CODE(TN, t_n, T_P, _C_) _G_DEFINE_INTERFACE_EXTENDED_BEGIN(TN, t_n, T_P) {_C_;} _G_DEFINE_INTERFACE_EXTENDED_END()
|
|
|
|
/**
|
|
* lG_IMPLEMENT_INTERFACE:
|
|
* @TYPE_IFACE: The #GType of the interface to add
|
|
* @iface_init: The interface init function
|
|
*
|
|
* A convenience macro to ease interface addition in the `_C_` section
|
|
* of G_DEFINE_TYPE_WITH_CODE() or G_DEFINE_ABSTRACT_TYPE_WITH_CODE().
|
|
* See lG_DEFINE_TYPE_EXTENDED() for an example.
|
|
*
|
|
* Note that this macro can only be used together with the G_DEFINE_TYPE_*
|
|
* macros, since it depends on variable names from those macros.
|
|
*
|
|
* Since: 2.4
|
|
*/
|
|
#define lG_IMPLEMENT_INTERFACE(TYPE_IFACE, iface_init) { \
|
|
const GInterfaceInfo g_implement_interface_info = { \
|
|
(GInterfaceInitFunc) iface_init, NULL, NULL \
|
|
}; \
|
|
lg_type_add_interface_static (g_define_type_id, TYPE_IFACE, &g_implement_interface_info); \
|
|
}
|
|
|
|
/**
|
|
* G_ADD_PRIVATE:
|
|
* @TypeName: the name of the type in CamelCase
|
|
*
|
|
* A convenience macro to ease adding private data to instances of a new type
|
|
* in the @_C_ section of G_DEFINE_TYPE_WITH_CODE() or
|
|
* G_DEFINE_ABSTRACT_TYPE_WITH_CODE().
|
|
*
|
|
* For instance:
|
|
*
|
|
* |[<!-- language="C" -->
|
|
* typedef struct _MyObject MyObject;
|
|
* typedef struct _MyObjectClass MyObjectClass;
|
|
*
|
|
* typedef struct {
|
|
* gint foo;
|
|
* gint bar;
|
|
* } MyObjectPrivate;
|
|
*
|
|
* G_DEFINE_TYPE_WITH_CODE (MyObject, my_object, G_TYPE_OBJECT,
|
|
* G_ADD_PRIVATE (MyObject))
|
|
* ]|
|
|
*
|
|
* Will add MyObjectPrivate as the private data to any instance of the MyObject
|
|
* type.
|
|
*
|
|
* G_DEFINE_TYPE_* macros will automatically create a private function
|
|
* based on the arguments to this macro, which can be used to safely
|
|
* retrieve the private data from an instance of the type; for instance:
|
|
*
|
|
* |[<!-- language="C" -->
|
|
* gint
|
|
* my_object_get_foo (MyObject *obj)
|
|
* {
|
|
* MyObjectPrivate *priv = my_object_get_instance_private (obj);
|
|
*
|
|
* g_return_val_if_fail (MY_IS_OBJECT (obj), 0);
|
|
*
|
|
* return priv->foo;
|
|
* }
|
|
*
|
|
* void
|
|
* my_object_set_bar (MyObject *obj,
|
|
* gint bar)
|
|
* {
|
|
* MyObjectPrivate *priv = my_object_get_instance_private (obj);
|
|
*
|
|
* g_return_if_fail (MY_IS_OBJECT (obj));
|
|
*
|
|
* if (priv->bar != bar)
|
|
* priv->bar = bar;
|
|
* }
|
|
* ]|
|
|
*
|
|
* Note that this macro can only be used together with the G_DEFINE_TYPE_*
|
|
* macros, since it depends on variable names from those macros.
|
|
*
|
|
* Also note that private structs added with these macros must have a struct
|
|
* name of the form `TypeNamePrivate`.
|
|
*
|
|
* It is safe to call _get_instance_private on %NULL or invalid object since
|
|
* it's only adding an offset to the instance pointer. In that case the returned
|
|
* pointer must not be dereferenced.
|
|
*
|
|
* Since: 2.38
|
|
*/
|
|
#define G_ADD_PRIVATE(TypeName) { \
|
|
TypeName##_private_offset = \
|
|
g_type_add_instance_private (g_define_type_id, sizeof (TypeName##Private)); \
|
|
}
|
|
|
|
/**
|
|
* G_PRIVATE_OFFSET:
|
|
* @TypeName: the name of the type in CamelCase
|
|
* @field: the name of the field in the private data structure
|
|
*
|
|
* Evaluates to the offset of the @field inside the instance private data
|
|
* structure for @TypeName.
|
|
*
|
|
* Note that this macro can only be used together with the G_DEFINE_TYPE_*
|
|
* and G_ADD_PRIVATE() macros, since it depends on variable names from
|
|
* those macros.
|
|
*
|
|
* Since: 2.38
|
|
*/
|
|
#define G_PRIVATE_OFFSET(TypeName, field) \
|
|
(TypeName##_private_offset + (G_STRUCT_OFFSET (TypeName##Private, field)))
|
|
|
|
/**
|
|
* G_PRIVATE_FIELD_P:
|
|
* @TypeName: the name of the type in CamelCase
|
|
* @inst: the instance of @TypeName you wish to access
|
|
* @field_name: the name of the field in the private data structure
|
|
*
|
|
* Evaluates to a pointer to the @field_name inside the @inst private data
|
|
* structure for @TypeName.
|
|
*
|
|
* Note that this macro can only be used together with the G_DEFINE_TYPE_*
|
|
* and G_ADD_PRIVATE() macros, since it depends on variable names from
|
|
* those macros.
|
|
*
|
|
* Since: 2.38
|
|
*/
|
|
#define G_PRIVATE_FIELD_P(TypeName, inst, field_name) \
|
|
G_STRUCT_MEMBER_P (inst, G_PRIVATE_OFFSET (TypeName, field_name))
|
|
|
|
/**
|
|
* G_PRIVATE_FIELD:
|
|
* @TypeName: the name of the type in CamelCase
|
|
* @inst: the instance of @TypeName you wish to access
|
|
* @field_type: the type of the field in the private data structure
|
|
* @field_name: the name of the field in the private data structure
|
|
*
|
|
* Evaluates to the @field_name inside the @inst private data
|
|
* structure for @TypeName.
|
|
*
|
|
* Note that this macro can only be used together with the G_DEFINE_TYPE_*
|
|
* and G_ADD_PRIVATE() macros, since it depends on variable names from
|
|
* those macros.
|
|
*
|
|
* Since: 2.38
|
|
*/
|
|
#define G_PRIVATE_FIELD(TypeName, inst, field_type, field_name) \
|
|
G_STRUCT_MEMBER (field_type, inst, G_PRIVATE_OFFSET (TypeName, field_name))
|
|
|
|
/* we need to have this macro under conditional expansion, as it references
|
|
* a function that has been added in 2.38. see bug:
|
|
* https://bugzilla.gnome.org/show_bug.cgi?id=703191
|
|
*/
|
|
#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
|
|
#define _G_DEFINE_TYPE_EXTENDED_CLASS_INIT(TypeName, type_name) \
|
|
static void type_name##_class_intern_init (gpointer klass) \
|
|
{ \
|
|
type_name##_parent_class = g_type_class_peek_parent (klass); \
|
|
if (TypeName##_private_offset != 0) \
|
|
g_type_class_adjust_private_offset (klass, &TypeName##_private_offset); \
|
|
type_name##_class_init ((TypeName##Class*) klass); \
|
|
}
|
|
|
|
#else
|
|
#define _G_DEFINE_TYPE_EXTENDED_CLASS_INIT(TypeName, type_name) \
|
|
static void type_name##_class_intern_init (gpointer klass) \
|
|
{ \
|
|
type_name##_parent_class = g_type_class_peek_parent (klass); \
|
|
type_name##_class_init ((TypeName##Class*) klass); \
|
|
}
|
|
#endif /* GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 */
|
|
|
|
#define _G_DEFINE_TYPE_EXTENDED_BEGIN(TypeName, type_name, TYPE_PARENT, flags) \
|
|
\
|
|
static void type_name##_init (TypeName *self); \
|
|
static void type_name##_class_init (TypeName##Class *klass); \
|
|
static gpointer type_name##_parent_class = NULL; \
|
|
static gint TypeName##_private_offset; \
|
|
\
|
|
_G_DEFINE_TYPE_EXTENDED_CLASS_INIT(TypeName, type_name) \
|
|
\
|
|
G_GNUC_UNUSED \
|
|
static inline gpointer \
|
|
type_name##_get_instance_private (TypeName *self) \
|
|
{ \
|
|
return (G_STRUCT_MEMBER_P (self, TypeName##_private_offset)); \
|
|
} \
|
|
\
|
|
GType \
|
|
type_name##_get_type (void) \
|
|
{ \
|
|
static volatile gsize g_define_type_id__volatile = 0; \
|
|
if (lg_once_init_enter (&g_define_type_id__volatile)) \
|
|
{ \
|
|
GType g_define_type_id = \
|
|
lg_type_register_static_simple (TYPE_PARENT, \
|
|
lg_intern_static_string (#TypeName), \
|
|
sizeof (TypeName##Class), \
|
|
(GClassInitFunc) type_name##_class_intern_init, \
|
|
sizeof (TypeName), \
|
|
(GInstanceInitFunc) type_name##_init, \
|
|
(GTypeFlags) flags); \
|
|
{ /* custom code follows */
|
|
#define _G_DEFINE_TYPE_EXTENDED_END() \
|
|
/* following custom code */ \
|
|
} \
|
|
lg_once_init_leave (&g_define_type_id__volatile, g_define_type_id); \
|
|
} \
|
|
return g_define_type_id__volatile; \
|
|
} /* closes type_name##_get_type() */
|
|
|
|
#define _G_DEFINE_INTERFACE_EXTENDED_BEGIN(TypeName, type_name, TYPE_PREREQ) \
|
|
\
|
|
static void type_name##_default_init (TypeName##Interface *klass); \
|
|
\
|
|
GType \
|
|
type_name##_get_type (void) \
|
|
{ \
|
|
static volatile gsize g_define_type_id__volatile = 0; \
|
|
if (lg_once_init_enter (&g_define_type_id__volatile)) \
|
|
{ \
|
|
GType g_define_type_id = \
|
|
lg_type_register_static_simple (G_TYPE_INTERFACE, \
|
|
lg_intern_static_string (#TypeName), \
|
|
sizeof (TypeName##Interface), \
|
|
(GClassInitFunc)type_name##_default_init, \
|
|
0, \
|
|
(GInstanceInitFunc)NULL, \
|
|
(GTypeFlags) 0); \
|
|
if (TYPE_PREREQ) \
|
|
g_type_interface_add_prerequisite (g_define_type_id, TYPE_PREREQ); \
|
|
{ /* custom code follows */
|
|
#define _G_DEFINE_INTERFACE_EXTENDED_END() \
|
|
/* following custom code */ \
|
|
} \
|
|
lg_once_init_leave (&g_define_type_id__volatile, g_define_type_id); \
|
|
} \
|
|
return g_define_type_id__volatile; \
|
|
} /* closes type_name##_get_type() */
|
|
|
|
/**
|
|
* G_DEFINE_BOXED_TYPE:
|
|
* @TypeName: The name of the new type, in Camel case
|
|
* @type_name: The name of the new type, in lowercase, with words
|
|
* separated by '_'
|
|
* @copy_func: the #GBoxedCopyFunc for the new type
|
|
* @free_func: the #GBoxedFreeFunc for the new type
|
|
*
|
|
* A convenience macro for boxed type implementations, which defines a
|
|
* type_name_get_type() function registering the boxed type.
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
#define G_DEFINE_BOXED_TYPE(TypeName, type_name, copy_func, free_func) G_DEFINE_BOXED_TYPE_WITH_CODE (TypeName, type_name, copy_func, free_func, {})
|
|
/**
|
|
* G_DEFINE_BOXED_TYPE_WITH_CODE:
|
|
* @TypeName: The name of the new type, in Camel case
|
|
* @type_name: The name of the new type, in lowercase, with words
|
|
* separated by '_'
|
|
* @copy_func: the #GBoxedCopyFunc for the new type
|
|
* @free_func: the #GBoxedFreeFunc for the new type
|
|
* @_C_: Custom code that gets inserted in the *_get_type() function
|
|
*
|
|
* A convenience macro for boxed type implementations.
|
|
* Similar to G_DEFINE_BOXED_TYPE(), but allows to insert custom code into the
|
|
* type_name_get_type() function, e.g. to register value transformations with
|
|
* g_value_register_transform_func(), for instance:
|
|
*
|
|
* |[<!-- language="C" -->
|
|
* G_DEFINE_BOXED_TYPE_WITH_CODE (GdkRectangle, gdk_rectangle,
|
|
* gdk_rectangle_copy,
|
|
* gdk_rectangle_free,
|
|
* register_rectangle_transform_funcs (g_define_type_id))
|
|
* ]|
|
|
*
|
|
* Similarly to the %G_DEFINE_TYPE family of macros, the #GType of the newly
|
|
* defined boxed type is exposed in the `g_define_type_id` variable.
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
#define G_DEFINE_BOXED_TYPE_WITH_CODE(TypeName, type_name, copy_func, free_func, _C_) _G_DEFINE_BOXED_TYPE_BEGIN (TypeName, type_name, copy_func, free_func) {_C_;} _G_DEFINE_TYPE_EXTENDED_END()
|
|
|
|
/* Only use this in non-C++ on GCC >= 2.7, except for Darwin/ppc64.
|
|
* See https://bugzilla.gnome.org/show_bug.cgi?id=647145
|
|
*/
|
|
#if !defined (__cplusplus) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)) && !(defined (__APPLE__) && defined (__ppc64__))
|
|
#define _G_DEFINE_BOXED_TYPE_BEGIN(TypeName, type_name, copy_func, free_func) \
|
|
GType \
|
|
type_name##_get_type (void) \
|
|
{ \
|
|
static volatile gsize g_define_type_id__volatile = 0; \
|
|
if (lg_once_init_enter (&g_define_type_id__volatile)) \
|
|
{ \
|
|
GType (* _g_register_boxed) \
|
|
(const gchar *, \
|
|
union \
|
|
{ \
|
|
TypeName * (*do_copy_type) (TypeName *); \
|
|
TypeName * (*do_const_copy_type) (const TypeName *); \
|
|
GBoxedCopyFunc do_copy_boxed; \
|
|
} __attribute__((__transparent_union__)), \
|
|
union \
|
|
{ \
|
|
void (* do_free_type) (TypeName *); \
|
|
GBoxedFreeFunc do_free_boxed; \
|
|
} __attribute__((__transparent_union__)) \
|
|
) = g_boxed_type_register_static; \
|
|
GType g_define_type_id = \
|
|
_g_register_boxed (lg_intern_static_string (#TypeName), copy_func, free_func); \
|
|
{ /* custom code follows */
|
|
#else
|
|
#define _G_DEFINE_BOXED_TYPE_BEGIN(TypeName, type_name, copy_func, free_func) \
|
|
GType \
|
|
type_name##_get_type (void) \
|
|
{ \
|
|
static volatile gsize g_define_type_id__volatile = 0; \
|
|
if (lg_once_init_enter (&g_define_type_id__volatile)) \
|
|
{ \
|
|
GType g_define_type_id = \
|
|
g_boxed_type_register_static (lg_intern_static_string (#TypeName), \
|
|
(GBoxedCopyFunc) copy_func, \
|
|
(GBoxedFreeFunc) free_func); \
|
|
{ /* custom code follows */
|
|
#endif /* __GNUC__ */
|
|
|
|
/**
|
|
* G_DEFINE_POINTER_TYPE:
|
|
* @TypeName: The name of the new type, in Camel case
|
|
* @type_name: The name of the new type, in lowercase, with words
|
|
* separated by '_'
|
|
*
|
|
* A convenience macro for pointer type implementations, which defines a
|
|
* type_name_get_type() function registering the pointer type.
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
#define G_DEFINE_POINTER_TYPE(TypeName, type_name) G_DEFINE_POINTER_TYPE_WITH_CODE (TypeName, type_name, {})
|
|
/**
|
|
* G_DEFINE_POINTER_TYPE_WITH_CODE:
|
|
* @TypeName: The name of the new type, in Camel case
|
|
* @type_name: The name of the new type, in lowercase, with words
|
|
* separated by '_'
|
|
* @_C_: Custom code that gets inserted in the *_get_type() function
|
|
*
|
|
* A convenience macro for pointer type implementations.
|
|
* Similar to G_DEFINE_POINTER_TYPE(), but allows to insert
|
|
* custom code into the type_name_get_type() function.
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
#define G_DEFINE_POINTER_TYPE_WITH_CODE(TypeName, type_name, _C_) _G_DEFINE_POINTER_TYPE_BEGIN (TypeName, type_name) {_C_;} _G_DEFINE_TYPE_EXTENDED_END()
|
|
|
|
#define _G_DEFINE_POINTER_TYPE_BEGIN(TypeName, type_name) \
|
|
GType \
|
|
type_name##_get_type (void) \
|
|
{ \
|
|
static volatile gsize g_define_type_id__volatile = 0; \
|
|
if (lg_once_init_enter (&g_define_type_id__volatile)) \
|
|
{ \
|
|
GType g_define_type_id = \
|
|
g_pointer_type_register_static (lg_intern_static_string (#TypeName)); \
|
|
{ /* custom code follows */
|
|
|
|
/* --- protected (for fundamental type implementations) --- */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GTypePlugin* g_type_get_plugin (GType type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GTypePlugin* g_type_interface_get_plugin (GType instance_type,
|
|
GType interface_type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_type_fundamental_next (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_type_fundamental (GType type_id);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GTypeInstance* g_type_create_instance (GType type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_type_free_instance (GTypeInstance *instance);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_type_add_class_cache_func (gpointer cache_data,
|
|
GTypeClassCacheFunc cache_func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_type_remove_class_cache_func (gpointer cache_data,
|
|
GTypeClassCacheFunc cache_func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_type_class_unref_uncached (gpointer g_class);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_type_add_interface_check (gpointer check_data,
|
|
GTypeInterfaceCheckFunc check_func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_type_remove_interface_check (gpointer check_data,
|
|
GTypeInterfaceCheckFunc check_func);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GTypeValueTable* g_type_value_table_peek (GType type);
|
|
|
|
|
|
/*< private >*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_type_check_instance (GTypeInstance *instance) G_GNUC_PURE;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GTypeInstance* lg_type_check_instance_cast (GTypeInstance *instance,
|
|
GType iface_type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_type_check_instance_is_a (GTypeInstance *instance,
|
|
GType iface_type) G_GNUC_PURE;
|
|
GLIB_AVAILABLE_IN_2_42
|
|
gboolean g_type_check_instance_is_fundamentally_a (GTypeInstance *instance,
|
|
GType fundamental_type) G_GNUC_PURE;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GTypeClass* g_type_check_class_cast (GTypeClass *g_class,
|
|
GType is_a_type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_type_check_class_is_a (GTypeClass *g_class,
|
|
GType is_a_type) G_GNUC_PURE;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_type_check_is_value_type (GType type) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_type_check_value (GValue *value) G_GNUC_PURE;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_type_check_value_holds (GValue *value,
|
|
GType type) G_GNUC_PURE;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_type_test_flags (GType type,
|
|
guint flags) G_GNUC_CONST;
|
|
|
|
|
|
/* --- debugging functions --- */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_type_name_from_instance (GTypeInstance *instance);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_type_name_from_class (GTypeClass *g_class);
|
|
|
|
|
|
/* --- implementation bits --- */
|
|
#ifndef G_DISABLE_CAST_CHECKS
|
|
# define l_G_TYPE_CIC(ip, gt, ct) \
|
|
((ct*) lg_type_check_instance_cast ((GTypeInstance*) ip, gt))
|
|
# define _G_TYPE_CCC(cp, gt, ct) \
|
|
((ct*) g_type_check_class_cast ((GTypeClass*) cp, gt))
|
|
#else /* G_DISABLE_CAST_CHECKS */
|
|
# define l_G_TYPE_CIC(ip, gt, ct) ((ct*) ip)
|
|
# define _G_TYPE_CCC(cp, gt, ct) ((ct*) cp)
|
|
#endif /* G_DISABLE_CAST_CHECKS */
|
|
#define _G_TYPE_CHI(ip) (g_type_check_instance ((GTypeInstance*) ip))
|
|
#define _G_TYPE_CHV(vl) (g_type_check_value ((GValue*) vl))
|
|
#define _G_TYPE_IGC(ip, gt, ct) ((ct*) (((GTypeInstance*) ip)->g_class))
|
|
#define _G_TYPE_IGI(ip, gt, ct) ((ct*) g_type_interface_peek (((GTypeInstance*) ip)->g_class, gt))
|
|
#define _G_TYPE_CIFT(ip, ft) (g_type_check_instance_is_fundamentally_a ((GTypeInstance*) ip, ft))
|
|
#ifdef __GNUC__
|
|
# define l_G_TYPE_CIT(ip, gt) (lG_GNUC_EXTENSION ({ \
|
|
GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
|
|
if (!__inst) \
|
|
__r = FALSE; \
|
|
else if (__inst->g_class && __inst->g_class->g_type == __t) \
|
|
__r = TRUE; \
|
|
else \
|
|
__r = g_type_check_instance_is_a (__inst, __t); \
|
|
__r; \
|
|
}))
|
|
# define _G_TYPE_CCT(cp, gt) (lG_GNUC_EXTENSION ({ \
|
|
GTypeClass *__class = (GTypeClass*) cp; GType __t = gt; gboolean __r; \
|
|
if (!__class) \
|
|
__r = FALSE; \
|
|
else if (__class->g_type == __t) \
|
|
__r = TRUE; \
|
|
else \
|
|
__r = g_type_check_class_is_a (__class, __t); \
|
|
__r; \
|
|
}))
|
|
# define _G_TYPE_CVH(vl, gt) (lG_GNUC_EXTENSION ({ \
|
|
GValue *__val = (GValue*) vl; GType __t = gt; gboolean __r; \
|
|
if (!__val) \
|
|
__r = FALSE; \
|
|
else if (__val->g_type == __t) \
|
|
__r = TRUE; \
|
|
else \
|
|
__r = g_type_check_value_holds (__val, __t); \
|
|
__r; \
|
|
}))
|
|
#else /* !__GNUC__ */
|
|
# define l_G_TYPE_CIT(ip, gt) (g_type_check_instance_is_a ((GTypeInstance*) ip, gt))
|
|
# define _G_TYPE_CCT(cp, gt) (g_type_check_class_is_a ((GTypeClass*) cp, gt))
|
|
# define _G_TYPE_CVH(vl, gt) (g_type_check_value_holds ((GValue*) vl, gt))
|
|
#endif /* !__GNUC__ */
|
|
/**
|
|
* G_TYPE_FLAG_RESERVED_ID_BIT:
|
|
*
|
|
* A bit in the type number that's supposed to be left untouched.
|
|
*/
|
|
#define G_TYPE_FLAG_RESERVED_ID_BIT ((GType) (1 << 0))
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_TYPE_H__ */
|
|
/* GObject - GLib Type, Object, Parameter and Signal Library
|
|
* Copyright (C) 1997-1999, 2000-2001 Tim Janik and Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General
|
|
* Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* gvalue.h: generic GValue functions
|
|
*/
|
|
#ifndef __G_VALUE_H__
|
|
#define __G_VALUE_H__
|
|
|
|
#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
|
|
#error "Only <glib-object.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/* --- type macros --- */
|
|
/**
|
|
* G_TYPE_IS_VALUE:
|
|
* @type: A #GType value.
|
|
*
|
|
* Checks whether the passed in type ID can be used for g_value_init().
|
|
* That is, this macro checks whether this type provides an implementation
|
|
* of the #GTypeValueTable functions required for a type to create a #GValue of.
|
|
*
|
|
* Returns: Whether @type is suitable as a #GValue type.
|
|
*/
|
|
#define G_TYPE_IS_VALUE(type) (g_type_check_is_value_type (type))
|
|
/**
|
|
* G_IS_VALUE:
|
|
* @value: A #GValue structure.
|
|
*
|
|
* Checks if @value is a valid and initialized #GValue structure.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_IS_VALUE(value) (G_TYPE_CHECK_VALUE (value))
|
|
/**
|
|
* G_VALUE_TYPE:
|
|
* @value: A #GValue structure.
|
|
*
|
|
* Get the type identifier of @value.
|
|
*
|
|
* Returns: the #GType.
|
|
*/
|
|
#define G_VALUE_TYPE(value) (((GValue*) (value))->g_type)
|
|
/**
|
|
* G_VALUE_TYPE_NAME:
|
|
* @value: A #GValue structure.
|
|
*
|
|
* Gets the type name of @value.
|
|
*
|
|
* Returns: the type name.
|
|
*/
|
|
#define G_VALUE_TYPE_NAME(value) (g_type_name (G_VALUE_TYPE (value)))
|
|
/**
|
|
* G_VALUE_HOLDS:
|
|
* @value: A #GValue structure.
|
|
* @type: A #GType value.
|
|
*
|
|
* Checks if @value holds (or contains) a value of @type.
|
|
* This macro will also check for @value != %NULL and issue a
|
|
* warning if the check fails.
|
|
*
|
|
* Returns: %TRUE if @value holds the @type.
|
|
*/
|
|
#define G_VALUE_HOLDS(value,type) (G_TYPE_CHECK_VALUE_TYPE ((value), (type)))
|
|
|
|
|
|
/* --- typedefs & structures --- */
|
|
/**
|
|
* GValueTransform:
|
|
* @src_value: Source value.
|
|
* @dest_value: Target value.
|
|
*
|
|
* The type of value transformation functions which can be registered with
|
|
* g_value_register_transform_func().
|
|
*/
|
|
typedef void (*GValueTransform) (const GValue *src_value,
|
|
GValue *dest_value);
|
|
/**
|
|
* GValue:
|
|
*
|
|
* An opaque structure used to hold different types of values.
|
|
* The data within the structure has protected scope: it is accessible only
|
|
* to functions within a #GTypeValueTable structure, or implementations of
|
|
* the g_value_*() API. That is, code portions which implement new fundamental
|
|
* types.
|
|
* #GValue users cannot make any assumptions about how data is stored
|
|
* within the 2 element @data union, and the @g_type member should
|
|
* only be accessed through the G_VALUE_TYPE() macro.
|
|
*/
|
|
struct _GValue
|
|
{
|
|
/*< private >*/
|
|
GType g_type;
|
|
|
|
/* public for GTypeValueTable methods */
|
|
union {
|
|
gint v_int;
|
|
guint v_uint;
|
|
glong v_long;
|
|
gulong v_ulong;
|
|
gint64 v_int64;
|
|
guint64 v_uint64;
|
|
gfloat v_float;
|
|
gdouble v_double;
|
|
gpointer v_pointer;
|
|
} data[2];
|
|
};
|
|
|
|
|
|
/* --- prototypes --- */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GValue* g_value_init (GValue *value,
|
|
GType g_type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_copy (const GValue *src_value,
|
|
GValue *dest_value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GValue* g_value_reset (GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_unset (GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_set_instance (GValue *value,
|
|
gpointer instance);
|
|
GLIB_AVAILABLE_IN_2_42
|
|
void g_value_init_from_instance (GValue *value,
|
|
gpointer instance);
|
|
|
|
|
|
/* --- private --- */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_value_fits_pointer (const GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_value_peek_pointer (const GValue *value);
|
|
|
|
|
|
/* --- implementation details --- */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_value_type_compatible (GType src_type,
|
|
GType dest_type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_value_type_transformable (GType src_type,
|
|
GType dest_type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_value_transform (const GValue *src_value,
|
|
GValue *dest_value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_register_transform_func (GType src_type,
|
|
GType dest_type,
|
|
GValueTransform transform_func);
|
|
|
|
/**
|
|
* G_VALUE_NOCOPY_CONTENTS:
|
|
*
|
|
* If passed to G_VALUE_COLLECT(), allocated data won't be copied
|
|
* but used verbatim. This does not affect ref-counted types like
|
|
* objects.
|
|
*/
|
|
#define G_VALUE_NOCOPY_CONTENTS (1 << 27)
|
|
|
|
/**
|
|
* G_VALUE_INIT:
|
|
*
|
|
* A #GValue must be initialized before it can be used. This macro can
|
|
* be used as initializer instead of an explicit `{ 0 }` when declaring
|
|
* a variable, but it cannot be assigned to a variable.
|
|
*
|
|
* |[
|
|
* GValue value = G_VALUE_INIT;
|
|
* ]|
|
|
*
|
|
* Since: 2.30
|
|
*/
|
|
#define G_VALUE_INIT { 0, { { 0 } } }
|
|
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_VALUE_H__ */
|
|
/* GObject - GLib Type, Object, Parameter and Signal Library
|
|
* Copyright (C) 1997-1999, 2000-2001 Tim Janik and Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General
|
|
* Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* gparam.h: GParamSpec base class implementation
|
|
*/
|
|
#ifndef __G_PARAM_H__
|
|
#define __G_PARAM_H__
|
|
|
|
#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
|
|
#error "Only <glib-object.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/* --- standard type macros --- */
|
|
/**
|
|
* G_TYPE_IS_PARAM:
|
|
* @type: a #GType ID
|
|
*
|
|
* Checks whether @type "is a" %G_TYPE_PARAM.
|
|
*/
|
|
#define G_TYPE_IS_PARAM(type) (G_TYPE_FUNDAMENTAL (type) == G_TYPE_PARAM)
|
|
/**
|
|
* G_PARAM_SPEC:
|
|
* @pspec: a valid #GParamSpec
|
|
*
|
|
* Casts a derived #GParamSpec object (e.g. of type #GParamSpecInt) into
|
|
* a #GParamSpec object.
|
|
*/
|
|
#define G_PARAM_SPEC(pspec) (lG_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM, GParamSpec))
|
|
/**
|
|
* G_IS_PARAM_SPEC:
|
|
* @pspec: a #GParamSpec
|
|
*
|
|
* Checks whether @pspec "is a" valid #GParamSpec structure of type %G_TYPE_PARAM
|
|
* or derived.
|
|
*/
|
|
#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_42
|
|
#define G_IS_PARAM_SPEC(pspec) (G_TYPE_CHECK_INSTANCE_FUNDAMENTAL_TYPE ((pspec), G_TYPE_PARAM))
|
|
#else
|
|
#define G_IS_PARAM_SPEC(pspec) (lG_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM))
|
|
#endif
|
|
/**
|
|
* G_PARAM_SPEC_CLASS:
|
|
* @pclass: a valid #GParamSpecClass
|
|
*
|
|
* Casts a derived #GParamSpecClass structure into a #GParamSpecClass structure.
|
|
*/
|
|
#define G_PARAM_SPEC_CLASS(pclass) (G_TYPE_CHECK_CLASS_CAST ((pclass), G_TYPE_PARAM, GParamSpecClass))
|
|
/**
|
|
* G_IS_PARAM_SPEC_CLASS:
|
|
* @pclass: a #GParamSpecClass
|
|
*
|
|
* Checks whether @pclass "is a" valid #GParamSpecClass structure of type
|
|
* %G_TYPE_PARAM or derived.
|
|
*/
|
|
#define G_IS_PARAM_SPEC_CLASS(pclass) (G_TYPE_CHECK_CLASS_TYPE ((pclass), G_TYPE_PARAM))
|
|
/**
|
|
* G_PARAM_SPEC_GET_CLASS:
|
|
* @pspec: a valid #GParamSpec
|
|
*
|
|
* Retrieves the #GParamSpecClass of a #GParamSpec.
|
|
*/
|
|
#define G_PARAM_SPEC_GET_CLASS(pspec) (G_TYPE_INSTANCE_GET_CLASS ((pspec), G_TYPE_PARAM, GParamSpecClass))
|
|
|
|
|
|
/* --- convenience macros --- */
|
|
/**
|
|
* G_PARAM_SPEC_TYPE:
|
|
* @pspec: a valid #GParamSpec
|
|
*
|
|
* Retrieves the #GType of this @pspec.
|
|
*/
|
|
#define G_PARAM_SPEC_TYPE(pspec) (G_TYPE_FROM_INSTANCE (pspec))
|
|
/**
|
|
* G_PARAM_SPEC_TYPE_NAME:
|
|
* @pspec: a valid #GParamSpec
|
|
*
|
|
* Retrieves the #GType name of this @pspec.
|
|
*/
|
|
#define G_PARAM_SPEC_TYPE_NAME(pspec) (g_type_name (G_PARAM_SPEC_TYPE (pspec)))
|
|
/**
|
|
* G_PARAM_SPEC_VALUE_TYPE:
|
|
* @pspec: a valid #GParamSpec
|
|
*
|
|
* Retrieves the #GType to initialize a #GValue for this parameter.
|
|
*/
|
|
#define G_PARAM_SPEC_VALUE_TYPE(pspec) (G_PARAM_SPEC (pspec)->value_type)
|
|
/**
|
|
* G_VALUE_HOLDS_PARAM:
|
|
* @value: a valid #GValue structure
|
|
*
|
|
* Checks whether the given #GValue can hold values derived from type %G_TYPE_PARAM.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_VALUE_HOLDS_PARAM(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_PARAM))
|
|
|
|
|
|
/* --- flags --- */
|
|
/**
|
|
* GParamFlags:
|
|
* @G_PARAM_READABLE: the parameter is readable
|
|
* @G_PARAM_WRITABLE: the parameter is writable
|
|
* @G_PARAM_READWRITE: alias for %G_PARAM_READABLE | %G_PARAM_WRITABLE
|
|
* @G_PARAM_CONSTRUCT: the parameter will be set upon object construction
|
|
* @G_PARAM_CONSTRUCT_ONLY: the parameter can only be set upon object construction
|
|
* @G_PARAM_LAX_VALIDATION: upon parameter conversion (see g_param_value_convert())
|
|
* strict validation is not required
|
|
* @G_PARAM_STATIC_NAME: the string used as name when constructing the
|
|
* parameter is guaranteed to remain valid and
|
|
* unmodified for the lifetime of the parameter.
|
|
* Since 2.8
|
|
* @G_PARAM_STATIC_NICK: the string used as nick when constructing the
|
|
* parameter is guaranteed to remain valid and
|
|
* unmmodified for the lifetime of the parameter.
|
|
* Since 2.8
|
|
* @G_PARAM_STATIC_BLURB: the string used as blurb when constructing the
|
|
* parameter is guaranteed to remain valid and
|
|
* unmodified for the lifetime of the parameter.
|
|
* Since 2.8
|
|
* @G_PARAM_EXPLICIT_NOTIFY: calls to g_object_set_property() for this
|
|
* property will not automatically result in a "notify" signal being
|
|
* emitted: the implementation must call g_object_notify() themselves
|
|
* in case the property actually changes. Since: 2.42.
|
|
* @G_PARAM_PRIVATE: internal
|
|
* @G_PARAM_DEPRECATED: the parameter is deprecated and will be removed
|
|
* in a future version. A warning will be generated if it is used
|
|
* while running with G_ENABLE_DIAGNOSTIC=1.
|
|
* Since 2.26
|
|
*
|
|
* Through the #GParamFlags flag values, certain aspects of parameters
|
|
* can be configured. See also #G_PARAM_STATIC_STRINGS.
|
|
*/
|
|
typedef enum
|
|
{
|
|
G_PARAM_READABLE = 1 << 0,
|
|
G_PARAM_WRITABLE = 1 << 1,
|
|
G_PARAM_READWRITE = (G_PARAM_READABLE | G_PARAM_WRITABLE),
|
|
G_PARAM_CONSTRUCT = 1 << 2,
|
|
G_PARAM_CONSTRUCT_ONLY = 1 << 3,
|
|
G_PARAM_LAX_VALIDATION = 1 << 4,
|
|
G_PARAM_STATIC_NAME = 1 << 5,
|
|
#ifndef G_DISABLE_DEPRECATED
|
|
G_PARAM_PRIVATE = G_PARAM_STATIC_NAME,
|
|
#endif
|
|
G_PARAM_STATIC_NICK = 1 << 6,
|
|
G_PARAM_STATIC_BLURB = 1 << 7,
|
|
/* User defined flags go here */
|
|
G_PARAM_EXPLICIT_NOTIFY = 1 << 30,
|
|
/* Avoid warning with -Wpedantic for gcc6 */
|
|
G_PARAM_DEPRECATED = (gint)(1u << 31)
|
|
} GParamFlags;
|
|
|
|
/**
|
|
* G_PARAM_STATIC_STRINGS:
|
|
*
|
|
* #GParamFlags value alias for %G_PARAM_STATIC_NAME | %G_PARAM_STATIC_NICK | %G_PARAM_STATIC_BLURB.
|
|
*
|
|
* Since 2.13.0
|
|
*/
|
|
#define G_PARAM_STATIC_STRINGS (G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)
|
|
/* bits in the range 0xffffff00 are reserved for 3rd party usage */
|
|
/**
|
|
* G_PARAM_MASK:
|
|
*
|
|
* Mask containing the bits of #GParamSpec.flags which are reserved for GLib.
|
|
*/
|
|
#define G_PARAM_MASK (0x000000ff)
|
|
/**
|
|
* G_PARAM_USER_SHIFT:
|
|
*
|
|
* Minimum shift count to be used for user defined flags, to be stored in
|
|
* #GParamSpec.flags. The maximum allowed is 10.
|
|
*/
|
|
#define G_PARAM_USER_SHIFT (8)
|
|
|
|
/* --- typedefs & structures --- */
|
|
typedef struct _GParamSpec GParamSpec;
|
|
typedef struct _GParamSpecClass GParamSpecClass;
|
|
typedef struct _GParameter GParameter;
|
|
typedef struct _GParamSpecPool GParamSpecPool;
|
|
/**
|
|
* GParamSpec: (ref-func g_param_spec_ref_sink) (unref-func g_param_spec_uref) (set-value-func g_value_set_param) (get-value-func g_value_get_param)
|
|
* @g_type_instance: private #GTypeInstance portion
|
|
* @name: name of this parameter: always an interned string
|
|
* @flags: #GParamFlags flags for this parameter
|
|
* @value_type: the #GValue type for this parameter
|
|
* @owner_type: #GType type that uses (introduces) this parameter
|
|
*
|
|
* All other fields of the GParamSpec struct are private and
|
|
* should not be used directly.
|
|
*/
|
|
struct _GParamSpec
|
|
{
|
|
GTypeInstance g_type_instance;
|
|
|
|
const gchar *name; /* interned string */
|
|
GParamFlags flags;
|
|
GType value_type;
|
|
GType owner_type; /* class or interface using this property */
|
|
|
|
/*< private >*/
|
|
gchar *_nick;
|
|
gchar *_blurb;
|
|
GData *qdata;
|
|
guint ref_count;
|
|
guint param_id; /* sort-criteria */
|
|
};
|
|
/**
|
|
* GParamSpecClass:
|
|
* @g_type_class: the parent class
|
|
* @value_type: the #GValue type for this parameter
|
|
* @finalize: The instance finalization function (optional), should chain
|
|
* up to the finalize method of the parent class.
|
|
* @value_set_default: Resets a @value to the default value for this type
|
|
* (recommended, the default is g_value_reset()), see
|
|
* g_param_value_set_default().
|
|
* @value_validate: Ensures that the contents of @value comply with the
|
|
* specifications set out by this type (optional), see
|
|
* g_param_value_validate().
|
|
* @values_cmp: Compares @value1 with @value2 according to this type
|
|
* (recommended, the default is memcmp()), see g_param_values_cmp().
|
|
*
|
|
* The class structure for the GParamSpec type.
|
|
* Normally, GParamSpec classes are filled by
|
|
* g_param_type_register_static().
|
|
*/
|
|
struct _GParamSpecClass
|
|
{
|
|
GTypeClass g_type_class;
|
|
|
|
GType value_type;
|
|
|
|
void (*finalize) (GParamSpec *pspec);
|
|
|
|
/* GParam methods */
|
|
void (*value_set_default) (GParamSpec *pspec,
|
|
GValue *value);
|
|
gboolean (*value_validate) (GParamSpec *pspec,
|
|
GValue *value);
|
|
gint (*values_cmp) (GParamSpec *pspec,
|
|
const GValue *value1,
|
|
const GValue *value2);
|
|
/*< private >*/
|
|
gpointer dummy[4];
|
|
};
|
|
/**
|
|
* GParameter:
|
|
* @name: the parameter name
|
|
* @value: the parameter value
|
|
*
|
|
* The GParameter struct is an auxiliary structure used
|
|
* to hand parameter name/value pairs to g_object_newv().
|
|
*/
|
|
struct _GParameter /* auxiliary structure for _setv() variants */
|
|
{
|
|
const gchar *name;
|
|
GValue value;
|
|
};
|
|
|
|
|
|
/* --- prototypes --- */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_param_spec_ref (GParamSpec *pspec);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_param_spec_unref (GParamSpec *pspec);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_param_spec_sink (GParamSpec *pspec);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_param_spec_ref_sink (GParamSpec *pspec);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_param_spec_get_qdata (GParamSpec *pspec,
|
|
GQuark quark);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_param_spec_set_qdata (GParamSpec *pspec,
|
|
GQuark quark,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_param_spec_set_qdata_full (GParamSpec *pspec,
|
|
GQuark quark,
|
|
gpointer data,
|
|
GDestroyNotify destroy);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_param_spec_steal_qdata (GParamSpec *pspec,
|
|
GQuark quark);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_param_spec_get_redirect_target (GParamSpec *pspec);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_param_value_set_default (GParamSpec *pspec,
|
|
GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_param_value_defaults (GParamSpec *pspec,
|
|
GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_param_value_validate (GParamSpec *pspec,
|
|
GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_param_value_convert (GParamSpec *pspec,
|
|
const GValue *src_value,
|
|
GValue *dest_value,
|
|
gboolean strict_validation);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_param_values_cmp (GParamSpec *pspec,
|
|
const GValue *value1,
|
|
const GValue *value2);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_param_spec_get_name (GParamSpec *pspec);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_param_spec_get_nick (GParamSpec *pspec);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_param_spec_get_blurb (GParamSpec *pspec);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_set_param (GValue *value,
|
|
GParamSpec *param);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_value_get_param (const GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_value_dup_param (const GValue *value);
|
|
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_take_param (GValue *value,
|
|
GParamSpec *param);
|
|
GLIB_DEPRECATED_FOR(g_value_take_param)
|
|
void g_value_set_param_take_ownership (GValue *value,
|
|
GParamSpec *param);
|
|
GLIB_AVAILABLE_IN_2_36
|
|
const GValue * g_param_spec_get_default_value (GParamSpec *pspec);
|
|
|
|
GLIB_AVAILABLE_IN_2_46
|
|
GQuark g_param_spec_get_name_quark (GParamSpec *pspec);
|
|
|
|
/* --- convenience functions --- */
|
|
typedef struct _GParamSpecTypeInfo GParamSpecTypeInfo;
|
|
/**
|
|
* GParamSpecTypeInfo:
|
|
* @instance_size: Size of the instance (object) structure.
|
|
* @n_preallocs: Prior to GLib 2.10, it specified the number of pre-allocated (cached) instances to reserve memory for (0 indicates no caching). Since GLib 2.10, it is ignored, since instances are allocated with the [slice allocator][glib-Memory-Slices] now.
|
|
* @instance_init: Location of the instance initialization function (optional).
|
|
* @value_type: The #GType of values conforming to this #GParamSpec
|
|
* @finalize: The instance finalization function (optional).
|
|
* @value_set_default: Resets a @value to the default value for @pspec
|
|
* (recommended, the default is g_value_reset()), see
|
|
* g_param_value_set_default().
|
|
* @value_validate: Ensures that the contents of @value comply with the
|
|
* specifications set out by @pspec (optional), see
|
|
* g_param_value_validate().
|
|
* @values_cmp: Compares @value1 with @value2 according to @pspec
|
|
* (recommended, the default is memcmp()), see g_param_values_cmp().
|
|
*
|
|
* This structure is used to provide the type system with the information
|
|
* required to initialize and destruct (finalize) a parameter's class and
|
|
* instances thereof.
|
|
* The initialized structure is passed to the g_param_type_register_static()
|
|
* The type system will perform a deep copy of this structure, so its memory
|
|
* does not need to be persistent across invocation of
|
|
* g_param_type_register_static().
|
|
*/
|
|
struct _GParamSpecTypeInfo
|
|
{
|
|
/* type system portion */
|
|
guint16 instance_size; /* obligatory */
|
|
guint16 n_preallocs; /* optional */
|
|
void (*instance_init) (GParamSpec *pspec); /* optional */
|
|
|
|
/* class portion */
|
|
GType value_type; /* obligatory */
|
|
void (*finalize) (GParamSpec *pspec); /* optional */
|
|
void (*value_set_default) (GParamSpec *pspec, /* recommended */
|
|
GValue *value);
|
|
gboolean (*value_validate) (GParamSpec *pspec, /* optional */
|
|
GValue *value);
|
|
gint (*values_cmp) (GParamSpec *pspec, /* recommended */
|
|
const GValue *value1,
|
|
const GValue *value2);
|
|
};
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_param_type_register_static (const gchar *name,
|
|
const GParamSpecTypeInfo *pspec_info);
|
|
|
|
/* For registering builting types */
|
|
GType _g_param_type_register_static_constant (const gchar *name,
|
|
const GParamSpecTypeInfo *pspec_info,
|
|
GType opt_type);
|
|
|
|
|
|
/* --- protected --- */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_param_spec_internal (GType param_type,
|
|
const gchar *name,
|
|
const gchar *nick,
|
|
const gchar *blurb,
|
|
GParamFlags flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpecPool* g_param_spec_pool_new (gboolean type_prefixing);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_param_spec_pool_insert (GParamSpecPool *pool,
|
|
GParamSpec *pspec,
|
|
GType owner_type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_param_spec_pool_remove (GParamSpecPool *pool,
|
|
GParamSpec *pspec);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_param_spec_pool_lookup (GParamSpecPool *pool,
|
|
const gchar *param_name,
|
|
GType owner_type,
|
|
gboolean walk_ancestors);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GList* g_param_spec_pool_list_owned (GParamSpecPool *pool,
|
|
GType owner_type);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec** g_param_spec_pool_list (GParamSpecPool *pool,
|
|
GType owner_type,
|
|
guint *n_pspecs_p);
|
|
|
|
|
|
/* contracts:
|
|
*
|
|
* gboolean value_validate (GParamSpec *pspec,
|
|
* GValue *value):
|
|
* modify value contents in the least destructive way, so
|
|
* that it complies with pspec's requirements (i.e.
|
|
* according to minimum/maximum ranges etc...). return
|
|
* whether modification was necessary.
|
|
*
|
|
* gint values_cmp (GParamSpec *pspec,
|
|
* const GValue *value1,
|
|
* const GValue *value2):
|
|
* return value1 - value2, i.e. (-1) if value1 < value2,
|
|
* (+1) if value1 > value2, and (0) otherwise (equality)
|
|
*/
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_PARAM_H__ */
|
|
/* GObject - GLib Type, Object, Parameter and Signal Library
|
|
* Copyright (C) 2000-2001 Red Hat, Inc.
|
|
* Copyright (C) 2005 Imendio AB
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General
|
|
* Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#ifndef __G_CLOSURE_H__
|
|
#define __G_CLOSURE_H__
|
|
|
|
#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
|
|
#error "Only <glib-object.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/* --- defines --- */
|
|
/**
|
|
* G_CLOSURE_NEEDS_MARSHAL:
|
|
* @closure: a #GClosure
|
|
*
|
|
* Check if the closure still needs a marshaller. See g_closure_set_marshal().
|
|
*
|
|
* Returns: %TRUE if a #GClosureMarshal marshaller has not yet been set on
|
|
* @closure.
|
|
*/
|
|
#define G_CLOSURE_NEEDS_MARSHAL(closure) (((GClosure*) (closure))->marshal == NULL)
|
|
/**
|
|
* G_CLOSURE_N_NOTIFIERS:
|
|
* @cl: a #GClosure
|
|
*
|
|
* Get the total number of notifiers connected with the closure @cl.
|
|
* The count includes the meta marshaller, the finalize and invalidate notifiers
|
|
* and the marshal guards. Note that each guard counts as two notifiers.
|
|
* See g_closure_set_meta_marshal(), g_closure_add_finalize_notifier(),
|
|
* g_closure_add_invalidate_notifier() and g_closure_add_marshal_guards().
|
|
*
|
|
* Returns: number of notifiers
|
|
*/
|
|
#define G_CLOSURE_N_NOTIFIERS(cl) (((cl)->n_guards << 1L) + \
|
|
(cl)->n_fnotifiers + (cl)->n_inotifiers)
|
|
/**
|
|
* G_CCLOSURE_SWAP_DATA:
|
|
* @cclosure: a #GCClosure
|
|
*
|
|
* Checks whether the user data of the #GCClosure should be passed as the
|
|
* first parameter to the callback. See g_cclosure_new_swap().
|
|
*
|
|
* Returns: %TRUE if data has to be swapped.
|
|
*/
|
|
#define G_CCLOSURE_SWAP_DATA(cclosure) (((GClosure*) (cclosure))->derivative_flag)
|
|
/**
|
|
* G_CALLBACK:
|
|
* @f: a function pointer.
|
|
*
|
|
* Cast a function pointer to a #GCallback.
|
|
*/
|
|
#define G_CALLBACK(f) ((GCallback) (f))
|
|
|
|
|
|
/* -- typedefs --- */
|
|
typedef struct _GClosure GClosure;
|
|
typedef struct _GClosureNotifyData GClosureNotifyData;
|
|
|
|
/**
|
|
* GCallback:
|
|
*
|
|
* The type used for callback functions in structure definitions and function
|
|
* signatures. This doesn't mean that all callback functions must take no
|
|
* parameters and return void. The required signature of a callback function
|
|
* is determined by the context in which is used (e.g. the signal to which it
|
|
* is connected). Use G_CALLBACK() to cast the callback function to a #GCallback.
|
|
*/
|
|
typedef void (*GCallback) (void);
|
|
/**
|
|
* GClosureNotify:
|
|
* @data: data specified when registering the notification callback
|
|
* @closure: the #GClosure on which the notification is emitted
|
|
*
|
|
* The type used for the various notification callbacks which can be registered
|
|
* on closures.
|
|
*/
|
|
typedef void (*GClosureNotify) (gpointer data,
|
|
GClosure *closure);
|
|
/**
|
|
* GClosureMarshal:
|
|
* @closure: the #GClosure to which the marshaller belongs
|
|
* @return_value: (nullable): a #GValue to store the return
|
|
* value. May be %NULL if the callback of @closure doesn't return a
|
|
* value.
|
|
* @n_param_values: the length of the @param_values array
|
|
* @param_values: (array length=n_param_values): an array of
|
|
* #GValues holding the arguments on which to invoke the
|
|
* callback of @closure
|
|
* @invocation_hint: (nullable): the invocation hint given as the
|
|
* last argument to g_closure_invoke()
|
|
* @marshal_data: (nullable): additional data specified when
|
|
* registering the marshaller, see g_closure_set_marshal() and
|
|
* g_closure_set_meta_marshal()
|
|
*
|
|
* The type used for marshaller functions.
|
|
*/
|
|
typedef void (*GClosureMarshal) (GClosure *closure,
|
|
GValue *return_value,
|
|
guint n_param_values,
|
|
const GValue *param_values,
|
|
gpointer invocation_hint,
|
|
gpointer marshal_data);
|
|
|
|
/**
|
|
* GVaClosureMarshal:
|
|
* @closure: the #GClosure to which the marshaller belongs
|
|
* @return_value: (nullable): a #GValue to store the return
|
|
* value. May be %NULL if the callback of @closure doesn't return a
|
|
* value.
|
|
* @instance: (type GObject.TypeInstance): the instance on which the closure is
|
|
* invoked.
|
|
* @args: va_list of arguments to be passed to the closure.
|
|
* @marshal_data: (nullable): additional data specified when
|
|
* registering the marshaller, see g_closure_set_marshal() and
|
|
* g_closure_set_meta_marshal()
|
|
* @n_params: the length of the @param_types array
|
|
* @param_types: (array length=n_params): the #GType of each argument from
|
|
* @args.
|
|
*
|
|
* This is the signature of va_list marshaller functions, an optional
|
|
* marshaller that can be used in some situations to avoid
|
|
* marshalling the signal argument into GValues.
|
|
*/
|
|
typedef void (* GVaClosureMarshal) (GClosure *closure,
|
|
GValue *return_value,
|
|
gpointer instance,
|
|
va_list args,
|
|
gpointer marshal_data,
|
|
int n_params,
|
|
GType *param_types);
|
|
|
|
/**
|
|
* GCClosure:
|
|
* @closure: the #GClosure
|
|
* @callback: the callback function
|
|
*
|
|
* A #GCClosure is a specialization of #GClosure for C function callbacks.
|
|
*/
|
|
typedef struct _GCClosure GCClosure;
|
|
|
|
|
|
/* --- structures --- */
|
|
struct _GClosureNotifyData
|
|
{
|
|
gpointer data;
|
|
GClosureNotify notify;
|
|
};
|
|
/**
|
|
* GClosure:
|
|
* @in_marshal: Indicates whether the closure is currently being invoked with
|
|
* g_closure_invoke()
|
|
* @is_invalid: Indicates whether the closure has been invalidated by
|
|
* g_closure_invalidate()
|
|
*
|
|
* A #GClosure represents a callback supplied by the programmer.
|
|
*/
|
|
struct _GClosure
|
|
{
|
|
/*< private >*/
|
|
volatile guint ref_count : 15;
|
|
/* meta_marshal is not used anymore but must be zero for historical reasons
|
|
as it was exposed in the G_CLOSURE_N_NOTIFIERS macro */
|
|
volatile guint meta_marshal_nouse : 1;
|
|
volatile guint n_guards : 1;
|
|
volatile guint n_fnotifiers : 2; /* finalization notifiers */
|
|
volatile guint n_inotifiers : 8; /* invalidation notifiers */
|
|
volatile guint in_inotify : 1;
|
|
volatile guint floating : 1;
|
|
/*< protected >*/
|
|
volatile guint derivative_flag : 1;
|
|
/*< public >*/
|
|
volatile guint in_marshal : 1;
|
|
volatile guint is_invalid : 1;
|
|
|
|
/*< private >*/ void (*marshal) (GClosure *closure,
|
|
GValue /*out*/ *return_value,
|
|
guint n_param_values,
|
|
const GValue *param_values,
|
|
gpointer invocation_hint,
|
|
gpointer marshal_data);
|
|
/*< protected >*/ gpointer data;
|
|
|
|
/*< private >*/ GClosureNotifyData *notifiers;
|
|
|
|
/* invariants/constrains:
|
|
* - ->marshal and ->data are _invalid_ as soon as ->is_invalid==TRUE
|
|
* - invocation of all inotifiers occours prior to fnotifiers
|
|
* - order of inotifiers is random
|
|
* inotifiers may _not_ free/invalidate parameter values (e.g. ->data)
|
|
* - order of fnotifiers is random
|
|
* - each notifier may only be removed before or during its invocation
|
|
* - reference counting may only happen prior to fnotify invocation
|
|
* (in that sense, fnotifiers are really finalization handlers)
|
|
*/
|
|
};
|
|
/* closure for C function calls, callback() is the user function
|
|
*/
|
|
struct _GCClosure
|
|
{
|
|
GClosure closure;
|
|
gpointer callback;
|
|
};
|
|
|
|
|
|
/* --- prototypes --- */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GClosure* g_cclosure_new (GCallback callback_func,
|
|
gpointer user_data,
|
|
GClosureNotify destroy_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GClosure* g_cclosure_new_swap (GCallback callback_func,
|
|
gpointer user_data,
|
|
GClosureNotify destroy_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GClosure* g_signal_type_cclosure_new (GType itype,
|
|
guint struct_offset);
|
|
|
|
|
|
/* --- prototypes --- */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GClosure* g_closure_ref (GClosure *closure);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_closure_sink (GClosure *closure);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_closure_unref (GClosure *closure);
|
|
/* intimidating */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GClosure* g_closure_new_simple (guint sizeof_closure,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_closure_add_finalize_notifier (GClosure *closure,
|
|
gpointer notify_data,
|
|
GClosureNotify notify_func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_closure_remove_finalize_notifier (GClosure *closure,
|
|
gpointer notify_data,
|
|
GClosureNotify notify_func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_closure_add_invalidate_notifier (GClosure *closure,
|
|
gpointer notify_data,
|
|
GClosureNotify notify_func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_closure_remove_invalidate_notifier (GClosure *closure,
|
|
gpointer notify_data,
|
|
GClosureNotify notify_func);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_closure_add_marshal_guards (GClosure *closure,
|
|
gpointer pre_marshal_data,
|
|
GClosureNotify pre_marshal_notify,
|
|
gpointer post_marshal_data,
|
|
GClosureNotify post_marshal_notify);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_closure_set_marshal (GClosure *closure,
|
|
GClosureMarshal marshal);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_closure_set_meta_marshal (GClosure *closure,
|
|
gpointer marshal_data,
|
|
GClosureMarshal meta_marshal);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_closure_invalidate (GClosure *closure);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_closure_invoke (GClosure *closure,
|
|
GValue /*out*/ *return_value,
|
|
guint n_param_values,
|
|
const GValue *param_values,
|
|
gpointer invocation_hint);
|
|
|
|
/* FIXME:
|
|
OK: data_object::destroy -> closure_invalidate();
|
|
MIS: closure_invalidate() -> disconnect(closure);
|
|
MIS: disconnect(closure) -> (unlink) closure_unref();
|
|
OK: closure_finalize() -> g_free (data_string);
|
|
|
|
random remarks:
|
|
- need marshaller repo with decent aliasing to base types
|
|
- provide marshaller collection, virtually covering anything out there
|
|
*/
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_generic (GClosure *closure,
|
|
GValue *return_gvalue,
|
|
guint n_param_values,
|
|
const GValue *param_values,
|
|
gpointer invocation_hint,
|
|
gpointer marshal_data);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_generic_va (GClosure *closure,
|
|
GValue *return_value,
|
|
gpointer instance,
|
|
va_list args_list,
|
|
gpointer marshal_data,
|
|
int n_params,
|
|
GType *param_types);
|
|
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_CLOSURE_H__ */
|
|
/* GObject - GLib Type, Object, Parameter and Signal Library
|
|
* Copyright (C) 2000-2001 Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General
|
|
* Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#ifndef __G_SIGNAL_H__
|
|
#define __G_SIGNAL_H__
|
|
|
|
#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
|
|
#error "Only <glib-object.h> can be included directly."
|
|
#endif
|
|
|
|
/* Note: This file is no longer generated. See the comment in gmarshal.list */
|
|
#ifndef __G_MARSHAL_H__
|
|
#define __G_MARSHAL_H__
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/* VOID:VOID (./gmarshal.list:6) */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__VOID (GClosure *closure,
|
|
GValue *return_value,
|
|
guint n_param_values,
|
|
const GValue *param_values,
|
|
gpointer invocation_hint,
|
|
gpointer marshal_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__VOIDv (GClosure *closure,
|
|
GValue *return_value,
|
|
gpointer instance,
|
|
va_list args,
|
|
gpointer marshal_data,
|
|
int n_params,
|
|
GType *param_types);
|
|
|
|
/* VOID:BOOLEAN (./gmarshal.list:7) */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__BOOLEAN (GClosure *closure,
|
|
GValue *return_value,
|
|
guint n_param_values,
|
|
const GValue *param_values,
|
|
gpointer invocation_hint,
|
|
gpointer marshal_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__BOOLEANv (GClosure *closure,
|
|
GValue *return_value,
|
|
gpointer instance,
|
|
va_list args,
|
|
gpointer marshal_data,
|
|
int n_params,
|
|
GType *param_types);
|
|
|
|
/* VOID:CHAR (./gmarshal.list:8) */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__CHAR (GClosure *closure,
|
|
GValue *return_value,
|
|
guint n_param_values,
|
|
const GValue *param_values,
|
|
gpointer invocation_hint,
|
|
gpointer marshal_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__CHARv (GClosure *closure,
|
|
GValue *return_value,
|
|
gpointer instance,
|
|
va_list args,
|
|
gpointer marshal_data,
|
|
int n_params,
|
|
GType *param_types);
|
|
|
|
/* VOID:UCHAR (./gmarshal.list:9) */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__UCHAR (GClosure *closure,
|
|
GValue *return_value,
|
|
guint n_param_values,
|
|
const GValue *param_values,
|
|
gpointer invocation_hint,
|
|
gpointer marshal_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__UCHARv (GClosure *closure,
|
|
GValue *return_value,
|
|
gpointer instance,
|
|
va_list args,
|
|
gpointer marshal_data,
|
|
int n_params,
|
|
GType *param_types);
|
|
|
|
/* VOID:INT (./gmarshal.list:10) */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__INT (GClosure *closure,
|
|
GValue *return_value,
|
|
guint n_param_values,
|
|
const GValue *param_values,
|
|
gpointer invocation_hint,
|
|
gpointer marshal_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__INTv (GClosure *closure,
|
|
GValue *return_value,
|
|
gpointer instance,
|
|
va_list args,
|
|
gpointer marshal_data,
|
|
int n_params,
|
|
GType *param_types);
|
|
|
|
/* VOID:UINT (./gmarshal.list:11) */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__UINT (GClosure *closure,
|
|
GValue *return_value,
|
|
guint n_param_values,
|
|
const GValue *param_values,
|
|
gpointer invocation_hint,
|
|
gpointer marshal_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__UINTv (GClosure *closure,
|
|
GValue *return_value,
|
|
gpointer instance,
|
|
va_list args,
|
|
gpointer marshal_data,
|
|
int n_params,
|
|
GType *param_types);
|
|
|
|
/* VOID:LONG (./gmarshal.list:12) */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__LONG (GClosure *closure,
|
|
GValue *return_value,
|
|
guint n_param_values,
|
|
const GValue *param_values,
|
|
gpointer invocation_hint,
|
|
gpointer marshal_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__LONGv (GClosure *closure,
|
|
GValue *return_value,
|
|
gpointer instance,
|
|
va_list args,
|
|
gpointer marshal_data,
|
|
int n_params,
|
|
GType *param_types);
|
|
|
|
/* VOID:ULONG (./gmarshal.list:13) */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__ULONG (GClosure *closure,
|
|
GValue *return_value,
|
|
guint n_param_values,
|
|
const GValue *param_values,
|
|
gpointer invocation_hint,
|
|
gpointer marshal_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__ULONGv (GClosure *closure,
|
|
GValue *return_value,
|
|
gpointer instance,
|
|
va_list args,
|
|
gpointer marshal_data,
|
|
int n_params,
|
|
GType *param_types);
|
|
|
|
/* VOID:ENUM (./gmarshal.list:14) */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__ENUM (GClosure *closure,
|
|
GValue *return_value,
|
|
guint n_param_values,
|
|
const GValue *param_values,
|
|
gpointer invocation_hint,
|
|
gpointer marshal_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__ENUMv (GClosure *closure,
|
|
GValue *return_value,
|
|
gpointer instance,
|
|
va_list args,
|
|
gpointer marshal_data,
|
|
int n_params,
|
|
GType *param_types);
|
|
|
|
/* VOID:FLAGS (./gmarshal.list:15) */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__FLAGS (GClosure *closure,
|
|
GValue *return_value,
|
|
guint n_param_values,
|
|
const GValue *param_values,
|
|
gpointer invocation_hint,
|
|
gpointer marshal_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__FLAGSv (GClosure *closure,
|
|
GValue *return_value,
|
|
gpointer instance,
|
|
va_list args,
|
|
gpointer marshal_data,
|
|
int n_params,
|
|
GType *param_types);
|
|
|
|
/* VOID:FLOAT (./gmarshal.list:16) */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__FLOAT (GClosure *closure,
|
|
GValue *return_value,
|
|
guint n_param_values,
|
|
const GValue *param_values,
|
|
gpointer invocation_hint,
|
|
gpointer marshal_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__FLOATv (GClosure *closure,
|
|
GValue *return_value,
|
|
gpointer instance,
|
|
va_list args,
|
|
gpointer marshal_data,
|
|
int n_params,
|
|
GType *param_types);
|
|
|
|
/* VOID:DOUBLE (./gmarshal.list:17) */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__DOUBLE (GClosure *closure,
|
|
GValue *return_value,
|
|
guint n_param_values,
|
|
const GValue *param_values,
|
|
gpointer invocation_hint,
|
|
gpointer marshal_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__DOUBLEv (GClosure *closure,
|
|
GValue *return_value,
|
|
gpointer instance,
|
|
va_list args,
|
|
gpointer marshal_data,
|
|
int n_params,
|
|
GType *param_types);
|
|
|
|
/* VOID:STRING (./gmarshal.list:18) */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__STRING (GClosure *closure,
|
|
GValue *return_value,
|
|
guint n_param_values,
|
|
const GValue *param_values,
|
|
gpointer invocation_hint,
|
|
gpointer marshal_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__STRINGv (GClosure *closure,
|
|
GValue *return_value,
|
|
gpointer instance,
|
|
va_list args,
|
|
gpointer marshal_data,
|
|
int n_params,
|
|
GType *param_types);
|
|
|
|
/* VOID:PARAM (./gmarshal.list:19) */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__PARAM (GClosure *closure,
|
|
GValue *return_value,
|
|
guint n_param_values,
|
|
const GValue *param_values,
|
|
gpointer invocation_hint,
|
|
gpointer marshal_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__PARAMv (GClosure *closure,
|
|
GValue *return_value,
|
|
gpointer instance,
|
|
va_list args,
|
|
gpointer marshal_data,
|
|
int n_params,
|
|
GType *param_types);
|
|
|
|
/* VOID:BOXED (./gmarshal.list:20) */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__BOXED (GClosure *closure,
|
|
GValue *return_value,
|
|
guint n_param_values,
|
|
const GValue *param_values,
|
|
gpointer invocation_hint,
|
|
gpointer marshal_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__BOXEDv (GClosure *closure,
|
|
GValue *return_value,
|
|
gpointer instance,
|
|
va_list args,
|
|
gpointer marshal_data,
|
|
int n_params,
|
|
GType *param_types);
|
|
|
|
/* VOID:POINTER (./gmarshal.list:21) */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__POINTER (GClosure *closure,
|
|
GValue *return_value,
|
|
guint n_param_values,
|
|
const GValue *param_values,
|
|
gpointer invocation_hint,
|
|
gpointer marshal_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__POINTERv (GClosure *closure,
|
|
GValue *return_value,
|
|
gpointer instance,
|
|
va_list args,
|
|
gpointer marshal_data,
|
|
int n_params,
|
|
GType *param_types);
|
|
|
|
/* VOID:OBJECT (./gmarshal.list:22) */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__OBJECT (GClosure *closure,
|
|
GValue *return_value,
|
|
guint n_param_values,
|
|
const GValue *param_values,
|
|
gpointer invocation_hint,
|
|
gpointer marshal_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__OBJECTv (GClosure *closure,
|
|
GValue *return_value,
|
|
gpointer instance,
|
|
va_list args,
|
|
gpointer marshal_data,
|
|
int n_params,
|
|
GType *param_types);
|
|
|
|
/* VOID:VARIANT (./gmarshal.list:23) */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__VARIANT (GClosure *closure,
|
|
GValue *return_value,
|
|
guint n_param_values,
|
|
const GValue *param_values,
|
|
gpointer invocation_hint,
|
|
gpointer marshal_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__VARIANTv (GClosure *closure,
|
|
GValue *return_value,
|
|
gpointer instance,
|
|
va_list args,
|
|
gpointer marshal_data,
|
|
int n_params,
|
|
GType *param_types);
|
|
|
|
/* VOID:UINT,POINTER (./gmarshal.list:26) */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__UINT_POINTER (GClosure *closure,
|
|
GValue *return_value,
|
|
guint n_param_values,
|
|
const GValue *param_values,
|
|
gpointer invocation_hint,
|
|
gpointer marshal_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_VOID__UINT_POINTERv (GClosure *closure,
|
|
GValue *return_value,
|
|
gpointer instance,
|
|
va_list args,
|
|
gpointer marshal_data,
|
|
int n_params,
|
|
GType *param_types);
|
|
|
|
/* BOOL:FLAGS (./gmarshal.list:27) */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_BOOLEAN__FLAGS (GClosure *closure,
|
|
GValue *return_value,
|
|
guint n_param_values,
|
|
const GValue *param_values,
|
|
gpointer invocation_hint,
|
|
gpointer marshal_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_BOOLEAN__FLAGSv (GClosure *closure,
|
|
GValue *return_value,
|
|
gpointer instance,
|
|
va_list args,
|
|
gpointer marshal_data,
|
|
int n_params,
|
|
GType *param_types);
|
|
#define g_cclosure_marshal_BOOL__FLAGS g_cclosure_marshal_BOOLEAN__FLAGS
|
|
|
|
/* STRING:OBJECT,POINTER (./gmarshal.list:28) */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_STRING__OBJECT_POINTER (GClosure *closure,
|
|
GValue *return_value,
|
|
guint n_param_values,
|
|
const GValue *param_values,
|
|
gpointer invocation_hint,
|
|
gpointer marshal_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_STRING__OBJECT_POINTERv (GClosure *closure,
|
|
GValue *return_value,
|
|
gpointer instance,
|
|
va_list args,
|
|
gpointer marshal_data,
|
|
int n_params,
|
|
GType *param_types);
|
|
|
|
/* BOOL:BOXED,BOXED (./gmarshal.list:29) */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_BOOLEAN__BOXED_BOXED (GClosure *closure,
|
|
GValue *return_value,
|
|
guint n_param_values,
|
|
const GValue *param_values,
|
|
gpointer invocation_hint,
|
|
gpointer marshal_data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_cclosure_marshal_BOOLEAN__BOXED_BOXEDv (GClosure *closure,
|
|
GValue *return_value,
|
|
gpointer instance,
|
|
va_list args,
|
|
gpointer marshal_data,
|
|
int n_params,
|
|
GType *param_types);
|
|
#define g_cclosure_marshal_BOOL__BOXED_BOXED g_cclosure_marshal_BOOLEAN__BOXED_BOXED
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_MARSHAL_H__ */
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/* --- typedefs --- */
|
|
typedef struct _GSignalQuery GSignalQuery;
|
|
typedef struct _GSignalInvocationHint GSignalInvocationHint;
|
|
/**
|
|
* GSignalCMarshaller:
|
|
*
|
|
* This is the signature of marshaller functions, required to marshall
|
|
* arrays of parameter values to signal emissions into C language callback
|
|
* invocations. It is merely an alias to #GClosureMarshal since the #GClosure
|
|
* mechanism takes over responsibility of actual function invocation for the
|
|
* signal system.
|
|
*/
|
|
typedef GClosureMarshal GSignalCMarshaller;
|
|
/**
|
|
* GSignalCVaMarshaller:
|
|
*
|
|
* This is the signature of va_list marshaller functions, an optional
|
|
* marshaller that can be used in some situations to avoid
|
|
* marshalling the signal argument into GValues.
|
|
*/
|
|
typedef GVaClosureMarshal GSignalCVaMarshaller;
|
|
/**
|
|
* GSignalEmissionHook:
|
|
* @ihint: Signal invocation hint, see #GSignalInvocationHint.
|
|
* @n_param_values: the number of parameters to the function, including
|
|
* the instance on which the signal was emitted.
|
|
* @param_values: (array length=n_param_values): the instance on which
|
|
* the signal was emitted, followed by the parameters of the emission.
|
|
* @data: user data associated with the hook.
|
|
*
|
|
* A simple function pointer to get invoked when the signal is emitted. This
|
|
* allows you to tie a hook to the signal type, so that it will trap all
|
|
* emissions of that signal, from any object.
|
|
*
|
|
* You may not attach these to signals created with the #G_SIGNAL_NO_HOOKS flag.
|
|
*
|
|
* Returns: whether it wants to stay connected. If it returns %FALSE, the signal
|
|
* hook is disconnected (and destroyed).
|
|
*/
|
|
typedef gboolean (*GSignalEmissionHook) (GSignalInvocationHint *ihint,
|
|
guint n_param_values,
|
|
const GValue *param_values,
|
|
gpointer data);
|
|
/**
|
|
* GSignalAccumulator:
|
|
* @ihint: Signal invocation hint, see #GSignalInvocationHint.
|
|
* @return_accu: Accumulator to collect callback return values in, this
|
|
* is the return value of the current signal emission.
|
|
* @handler_return: A #GValue holding the return value of the signal handler.
|
|
* @data: Callback data that was specified when creating the signal.
|
|
*
|
|
* The signal accumulator is a special callback function that can be used
|
|
* to collect return values of the various callbacks that are called
|
|
* during a signal emission. The signal accumulator is specified at signal
|
|
* creation time, if it is left %NULL, no accumulation of callback return
|
|
* values is performed. The return value of signal emissions is then the
|
|
* value returned by the last callback.
|
|
*
|
|
* Returns: The accumulator function returns whether the signal emission
|
|
* should be aborted. Returning %FALSE means to abort the
|
|
* current emission and %TRUE is returned for continuation.
|
|
*/
|
|
typedef gboolean (*GSignalAccumulator) (GSignalInvocationHint *ihint,
|
|
GValue *return_accu,
|
|
const GValue *handler_return,
|
|
gpointer data);
|
|
|
|
|
|
/* --- run, match and connect types --- */
|
|
/**
|
|
* GSignalFlags:
|
|
* @G_SIGNAL_RUN_FIRST: Invoke the object method handler in the first emission stage.
|
|
* @G_SIGNAL_RUN_LAST: Invoke the object method handler in the third emission stage.
|
|
* @G_SIGNAL_RUN_CLEANUP: Invoke the object method handler in the last emission stage.
|
|
* @G_SIGNAL_NO_RECURSE: Signals being emitted for an object while currently being in
|
|
* emission for this very object will not be emitted recursively,
|
|
* but instead cause the first emission to be restarted.
|
|
* @G_SIGNAL_DETAILED: This signal supports "::detail" appendices to the signal name
|
|
* upon handler connections and emissions.
|
|
* @G_SIGNAL_ACTION: Action signals are signals that may freely be emitted on alive
|
|
* objects from user code via g_signal_emit() and friends, without
|
|
* the need of being embedded into extra code that performs pre or
|
|
* post emission adjustments on the object. They can also be thought
|
|
* of as object methods which can be called generically by
|
|
* third-party code.
|
|
* @G_SIGNAL_NO_HOOKS: No emissions hooks are supported for this signal.
|
|
* @G_SIGNAL_MUST_COLLECT: Varargs signal emission will always collect the
|
|
* arguments, even if there are no signal handlers connected. Since 2.30.
|
|
* @G_SIGNAL_DEPRECATED: The signal is deprecated and will be removed
|
|
* in a future version. A warning will be generated if it is connected while
|
|
* running with G_ENABLE_DIAGNOSTIC=1. Since 2.32.
|
|
*
|
|
* The signal flags are used to specify a signal's behaviour, the overall
|
|
* signal description outlines how especially the RUN flags control the
|
|
* stages of a signal emission.
|
|
*/
|
|
typedef enum
|
|
{
|
|
G_SIGNAL_RUN_FIRST = 1 << 0,
|
|
G_SIGNAL_RUN_LAST = 1 << 1,
|
|
G_SIGNAL_RUN_CLEANUP = 1 << 2,
|
|
G_SIGNAL_NO_RECURSE = 1 << 3,
|
|
G_SIGNAL_DETAILED = 1 << 4,
|
|
G_SIGNAL_ACTION = 1 << 5,
|
|
G_SIGNAL_NO_HOOKS = 1 << 6,
|
|
G_SIGNAL_MUST_COLLECT = 1 << 7,
|
|
G_SIGNAL_DEPRECATED = 1 << 8
|
|
} GSignalFlags;
|
|
/**
|
|
* G_SIGNAL_FLAGS_MASK:
|
|
*
|
|
* A mask for all #GSignalFlags bits.
|
|
*/
|
|
#define G_SIGNAL_FLAGS_MASK 0x1ff
|
|
/**
|
|
* GConnectFlags:
|
|
* @G_CONNECT_AFTER: whether the handler should be called before or after the
|
|
* default handler of the signal.
|
|
* @G_CONNECT_SWAPPED: whether the instance and data should be swapped when
|
|
* calling the handler; see g_signal_connect_swapped() for an example.
|
|
*
|
|
* The connection flags are used to specify the behaviour of a signal's
|
|
* connection.
|
|
*/
|
|
typedef enum
|
|
{
|
|
G_CONNECT_AFTER = 1 << 0,
|
|
G_CONNECT_SWAPPED = 1 << 1
|
|
} GConnectFlags;
|
|
/**
|
|
* GSignalMatchType:
|
|
* @G_SIGNAL_MATCH_ID: The signal id must be equal.
|
|
* @G_SIGNAL_MATCH_DETAIL: The signal detail be equal.
|
|
* @G_SIGNAL_MATCH_CLOSURE: The closure must be the same.
|
|
* @G_SIGNAL_MATCH_FUNC: The C closure callback must be the same.
|
|
* @G_SIGNAL_MATCH_DATA: The closure data must be the same.
|
|
* @G_SIGNAL_MATCH_UNBLOCKED: Only unblocked signals may matched.
|
|
*
|
|
* The match types specify what g_signal_handlers_block_matched(),
|
|
* g_signal_handlers_unblock_matched() and g_signal_handlers_disconnect_matched()
|
|
* match signals by.
|
|
*/
|
|
typedef enum
|
|
{
|
|
G_SIGNAL_MATCH_ID = 1 << 0,
|
|
G_SIGNAL_MATCH_DETAIL = 1 << 1,
|
|
G_SIGNAL_MATCH_CLOSURE = 1 << 2,
|
|
G_SIGNAL_MATCH_FUNC = 1 << 3,
|
|
G_SIGNAL_MATCH_DATA = 1 << 4,
|
|
G_SIGNAL_MATCH_UNBLOCKED = 1 << 5
|
|
} GSignalMatchType;
|
|
/**
|
|
* G_SIGNAL_MATCH_MASK:
|
|
*
|
|
* A mask for all #GSignalMatchType bits.
|
|
*/
|
|
#define G_SIGNAL_MATCH_MASK 0x3f
|
|
/**
|
|
* G_SIGNAL_TYPE_STATIC_SCOPE:
|
|
*
|
|
* This macro flags signal argument types for which the signal system may
|
|
* assume that instances thereof remain persistent across all signal emissions
|
|
* they are used in. This is only useful for non ref-counted, value-copy types.
|
|
*
|
|
* To flag a signal argument in this way, add `| G_SIGNAL_TYPE_STATIC_SCOPE`
|
|
* to the corresponding argument of g_signal_new().
|
|
* |[
|
|
* g_signal_new ("size_request",
|
|
* G_TYPE_FROM_CLASS (gobject_class),
|
|
* G_SIGNAL_RUN_FIRST,
|
|
* G_STRUCT_OFFSET (GtkWidgetClass, size_request),
|
|
* NULL, NULL,
|
|
* _gtk_marshal_VOID__BOXED,
|
|
* G_TYPE_NONE, 1,
|
|
* GTK_TYPE_REQUISITION | G_SIGNAL_TYPE_STATIC_SCOPE);
|
|
* ]|
|
|
*/
|
|
#define G_SIGNAL_TYPE_STATIC_SCOPE (G_TYPE_FLAG_RESERVED_ID_BIT)
|
|
|
|
|
|
/* --- signal information --- */
|
|
/**
|
|
* GSignalInvocationHint:
|
|
* @signal_id: The signal id of the signal invoking the callback
|
|
* @detail: The detail passed on for this emission
|
|
* @run_type: The stage the signal emission is currently in, this
|
|
* field will contain one of %G_SIGNAL_RUN_FIRST,
|
|
* %G_SIGNAL_RUN_LAST or %G_SIGNAL_RUN_CLEANUP.
|
|
*
|
|
* The #GSignalInvocationHint structure is used to pass on additional information
|
|
* to callbacks during a signal emission.
|
|
*/
|
|
struct _GSignalInvocationHint
|
|
{
|
|
guint signal_id;
|
|
GQuark detail;
|
|
GSignalFlags run_type;
|
|
};
|
|
/**
|
|
* GSignalQuery:
|
|
* @signal_id: The signal id of the signal being queried, or 0 if the
|
|
* signal to be queried was unknown.
|
|
* @signal_name: The signal name.
|
|
* @itype: The interface/instance type that this signal can be emitted for.
|
|
* @signal_flags: The signal flags as passed in to g_signal_new().
|
|
* @return_type: The return type for user callbacks.
|
|
* @n_params: The number of parameters that user callbacks take.
|
|
* @param_types: (array length=n_params): The individual parameter types for
|
|
* user callbacks, note that the effective callback signature is:
|
|
* |[<!-- language="C" -->
|
|
* @return_type callback (#gpointer data1,
|
|
* [param_types param_names,]
|
|
* gpointer data2);
|
|
* ]|
|
|
*
|
|
* A structure holding in-depth information for a specific signal. It is
|
|
* filled in by the g_signal_query() function.
|
|
*/
|
|
struct _GSignalQuery
|
|
{
|
|
guint signal_id;
|
|
const gchar *signal_name;
|
|
GType itype;
|
|
GSignalFlags signal_flags;
|
|
GType return_type; /* mangled with G_SIGNAL_TYPE_STATIC_SCOPE flag */
|
|
guint n_params;
|
|
const GType *param_types; /* mangled with G_SIGNAL_TYPE_STATIC_SCOPE flag */
|
|
};
|
|
|
|
|
|
/* --- signals --- */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_signal_newv (const gchar *signal_name,
|
|
GType itype,
|
|
GSignalFlags signal_flags,
|
|
GClosure *class_closure,
|
|
GSignalAccumulator accumulator,
|
|
gpointer accu_data,
|
|
GSignalCMarshaller c_marshaller,
|
|
GType return_type,
|
|
guint n_params,
|
|
GType *param_types);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_signal_new_valist (const gchar *signal_name,
|
|
GType itype,
|
|
GSignalFlags signal_flags,
|
|
GClosure *class_closure,
|
|
GSignalAccumulator accumulator,
|
|
gpointer accu_data,
|
|
GSignalCMarshaller c_marshaller,
|
|
GType return_type,
|
|
guint n_params,
|
|
va_list args);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_signal_new (const gchar *signal_name,
|
|
GType itype,
|
|
GSignalFlags signal_flags,
|
|
guint class_offset,
|
|
GSignalAccumulator accumulator,
|
|
gpointer accu_data,
|
|
GSignalCMarshaller c_marshaller,
|
|
GType return_type,
|
|
guint n_params,
|
|
...);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_signal_new_class_handler (const gchar *signal_name,
|
|
GType itype,
|
|
GSignalFlags signal_flags,
|
|
GCallback class_handler,
|
|
GSignalAccumulator accumulator,
|
|
gpointer accu_data,
|
|
GSignalCMarshaller c_marshaller,
|
|
GType return_type,
|
|
guint n_params,
|
|
...);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_signal_set_va_marshaller (guint signal_id,
|
|
GType instance_type,
|
|
GSignalCVaMarshaller va_marshaller);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_signal_emitv (const GValue *instance_and_params,
|
|
guint signal_id,
|
|
GQuark detail,
|
|
GValue *return_value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_signal_emit_valist (gpointer instance,
|
|
guint signal_id,
|
|
GQuark detail,
|
|
va_list var_args);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_signal_emit (gpointer instance,
|
|
guint signal_id,
|
|
GQuark detail,
|
|
...);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_signal_emit_by_name (gpointer instance,
|
|
const gchar *detailed_signal,
|
|
...);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_signal_lookup (const gchar *name,
|
|
GType itype);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_signal_name (guint signal_id);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_signal_query (guint signal_id,
|
|
GSignalQuery *query);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint* g_signal_list_ids (GType itype,
|
|
guint *n_ids);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_signal_parse_name (const gchar *detailed_signal,
|
|
GType itype,
|
|
guint *signal_id_p,
|
|
GQuark *detail_p,
|
|
gboolean force_detail_quark);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GSignalInvocationHint* g_signal_get_invocation_hint (gpointer instance);
|
|
|
|
|
|
/* --- signal emissions --- */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_signal_stop_emission (gpointer instance,
|
|
guint signal_id,
|
|
GQuark detail);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_signal_stop_emission_by_name (gpointer instance,
|
|
const gchar *detailed_signal);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gulong g_signal_add_emission_hook (guint signal_id,
|
|
GQuark detail,
|
|
GSignalEmissionHook hook_func,
|
|
gpointer hook_data,
|
|
GDestroyNotify data_destroy);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_signal_remove_emission_hook (guint signal_id,
|
|
gulong hook_id);
|
|
|
|
|
|
/* --- signal handlers --- */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_signal_has_handler_pending (gpointer instance,
|
|
guint signal_id,
|
|
GQuark detail,
|
|
gboolean may_be_blocked);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gulong g_signal_connect_closure_by_id (gpointer instance,
|
|
guint signal_id,
|
|
GQuark detail,
|
|
GClosure *closure,
|
|
gboolean after);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gulong g_signal_connect_closure (gpointer instance,
|
|
const gchar *detailed_signal,
|
|
GClosure *closure,
|
|
gboolean after);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gulong g_signal_connect_data (gpointer instance,
|
|
const gchar *detailed_signal,
|
|
GCallback c_handler,
|
|
gpointer data,
|
|
GClosureNotify destroy_data,
|
|
GConnectFlags connect_flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_signal_handler_block (gpointer instance,
|
|
gulong handler_id);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_signal_handler_unblock (gpointer instance,
|
|
gulong handler_id);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_signal_handler_disconnect (gpointer instance,
|
|
gulong handler_id);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_signal_handler_is_connected (gpointer instance,
|
|
gulong handler_id);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gulong g_signal_handler_find (gpointer instance,
|
|
GSignalMatchType mask,
|
|
guint signal_id,
|
|
GQuark detail,
|
|
GClosure *closure,
|
|
gpointer func,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_signal_handlers_block_matched (gpointer instance,
|
|
GSignalMatchType mask,
|
|
guint signal_id,
|
|
GQuark detail,
|
|
GClosure *closure,
|
|
gpointer func,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_signal_handlers_unblock_matched (gpointer instance,
|
|
GSignalMatchType mask,
|
|
guint signal_id,
|
|
GQuark detail,
|
|
GClosure *closure,
|
|
gpointer func,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_signal_handlers_disconnect_matched (gpointer instance,
|
|
GSignalMatchType mask,
|
|
guint signal_id,
|
|
GQuark detail,
|
|
GClosure *closure,
|
|
gpointer func,
|
|
gpointer data);
|
|
|
|
|
|
/* --- overriding and chaining --- */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_signal_override_class_closure (guint signal_id,
|
|
GType instance_type,
|
|
GClosure *class_closure);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_signal_override_class_handler (const gchar *signal_name,
|
|
GType instance_type,
|
|
GCallback class_handler);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_signal_chain_from_overridden (const GValue *instance_and_params,
|
|
GValue *return_value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_signal_chain_from_overridden_handler (gpointer instance,
|
|
...);
|
|
|
|
|
|
/* --- convenience --- */
|
|
/**
|
|
* g_signal_connect:
|
|
* @instance: the instance to connect to.
|
|
* @detailed_signal: a string of the form "signal-name::detail".
|
|
* @c_handler: the #GCallback to connect.
|
|
* @data: data to pass to @c_handler calls.
|
|
*
|
|
* Connects a #GCallback function to a signal for a particular object.
|
|
*
|
|
* The handler will be called before the default handler of the signal.
|
|
*
|
|
* See [memory management of signal handlers][signal-memory-management] for
|
|
* details on how to handle the return value and memory management of @data.
|
|
*
|
|
* Returns: the handler ID, of type #gulong (always greater than 0 for successful connections)
|
|
*/
|
|
#define g_signal_connect(instance, detailed_signal, c_handler, data) \
|
|
g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
|
|
/**
|
|
* g_signal_connect_after:
|
|
* @instance: the instance to connect to.
|
|
* @detailed_signal: a string of the form "signal-name::detail".
|
|
* @c_handler: the #GCallback to connect.
|
|
* @data: data to pass to @c_handler calls.
|
|
*
|
|
* Connects a #GCallback function to a signal for a particular object.
|
|
*
|
|
* The handler will be called after the default handler of the signal.
|
|
*
|
|
* Returns: the handler ID, of type #gulong (always greater than 0 for successful connections)
|
|
*/
|
|
#define g_signal_connect_after(instance, detailed_signal, c_handler, data) \
|
|
g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, G_CONNECT_AFTER)
|
|
/**
|
|
* g_signal_connect_swapped:
|
|
* @instance: the instance to connect to.
|
|
* @detailed_signal: a string of the form "signal-name::detail".
|
|
* @c_handler: the #GCallback to connect.
|
|
* @data: data to pass to @c_handler calls.
|
|
*
|
|
* Connects a #GCallback function to a signal for a particular object.
|
|
*
|
|
* The instance on which the signal is emitted and @data will be swapped when
|
|
* calling the handler. This is useful when calling pre-existing functions to
|
|
* operate purely on the @data, rather than the @instance: swapping the
|
|
* parameters avoids the need to write a wrapper function.
|
|
*
|
|
* For example, this allows the shorter code:
|
|
* |[<!-- language="C" -->
|
|
* g_signal_connect_swapped (button, "clicked",
|
|
* (GCallback) gtk_widget_hide, other_widget);
|
|
* ]|
|
|
*
|
|
* Rather than the cumbersome:
|
|
* |[<!-- language="C" -->
|
|
* static void
|
|
* button_clicked_cb (GtkButton *button, GtkWidget *other_widget)
|
|
* {
|
|
* gtk_widget_hide (other_widget);
|
|
* }
|
|
*
|
|
* ...
|
|
*
|
|
* g_signal_connect (button, "clicked",
|
|
* (GCallback) button_clicked_cb, other_widget);
|
|
* ]|
|
|
*
|
|
* Returns: the handler ID, of type #gulong (always greater than 0 for successful connections)
|
|
*/
|
|
#define g_signal_connect_swapped(instance, detailed_signal, c_handler, data) \
|
|
g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, G_CONNECT_SWAPPED)
|
|
/**
|
|
* g_signal_handlers_disconnect_by_func:
|
|
* @instance: The instance to remove handlers from.
|
|
* @func: The C closure callback of the handlers (useless for non-C closures).
|
|
* @data: The closure data of the handlers' closures.
|
|
*
|
|
* Disconnects all handlers on an instance that match @func and @data.
|
|
*
|
|
* Returns: The number of handlers that matched.
|
|
*/
|
|
#define g_signal_handlers_disconnect_by_func(instance, func, data) \
|
|
g_signal_handlers_disconnect_matched ((instance), \
|
|
(GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), \
|
|
0, 0, NULL, (func), (data))
|
|
|
|
/**
|
|
* g_signal_handlers_disconnect_by_data:
|
|
* @instance: The instance to remove handlers from
|
|
* @data: the closure data of the handlers' closures
|
|
*
|
|
* Disconnects all handlers on an instance that match @data.
|
|
*
|
|
* Returns: The number of handlers that matched.
|
|
*
|
|
* Since: 2.32
|
|
*/
|
|
#define g_signal_handlers_disconnect_by_data(instance, data) \
|
|
g_signal_handlers_disconnect_matched ((instance), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, (data))
|
|
|
|
/**
|
|
* g_signal_handlers_block_by_func:
|
|
* @instance: The instance to block handlers from.
|
|
* @func: The C closure callback of the handlers (useless for non-C closures).
|
|
* @data: The closure data of the handlers' closures.
|
|
*
|
|
* Blocks all handlers on an instance that match @func and @data.
|
|
*
|
|
* Returns: The number of handlers that matched.
|
|
*/
|
|
#define g_signal_handlers_block_by_func(instance, func, data) \
|
|
g_signal_handlers_block_matched ((instance), \
|
|
(GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), \
|
|
0, 0, NULL, (func), (data))
|
|
/**
|
|
* g_signal_handlers_unblock_by_func:
|
|
* @instance: The instance to unblock handlers from.
|
|
* @func: The C closure callback of the handlers (useless for non-C closures).
|
|
* @data: The closure data of the handlers' closures.
|
|
*
|
|
* Unblocks all handlers on an instance that match @func and @data.
|
|
*
|
|
* Returns: The number of handlers that matched.
|
|
*/
|
|
#define g_signal_handlers_unblock_by_func(instance, func, data) \
|
|
g_signal_handlers_unblock_matched ((instance), \
|
|
(GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), \
|
|
0, 0, NULL, (func), (data))
|
|
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_signal_accumulator_true_handled (GSignalInvocationHint *ihint,
|
|
GValue *return_accu,
|
|
const GValue *handler_return,
|
|
gpointer dummy);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_signal_accumulator_first_wins (GSignalInvocationHint *ihint,
|
|
GValue *return_accu,
|
|
const GValue *handler_return,
|
|
gpointer dummy);
|
|
|
|
/*< private >*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_signal_handlers_destroy (gpointer instance);
|
|
void _g_signals_destroy (GType itype);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_SIGNAL_H__ */
|
|
/* GObject - GLib Type, Object, Parameter and Signal Library
|
|
* Copyright (C) 2000-2001 Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General
|
|
* Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#ifndef __G_BOXED_H__
|
|
#define __G_BOXED_H__
|
|
|
|
#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
|
|
#error "Only <glib-object.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
#ifndef __GI_SCANNER__
|
|
/* GObject - GLib Type, Object, Parameter and Signal Library
|
|
* Copyright (C) 2000-2001 Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General
|
|
* Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#ifndef __GLIB_TYPES_H__
|
|
#define __GLIB_TYPES_H__
|
|
|
|
#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) && !defined(GLIB_COMPILATION)
|
|
#error "Only <glib-object.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/* A hack necesssary to preprocess this file with g-ir-scanner */
|
|
#ifdef __GI_SCANNER__
|
|
typedef gsize GType;
|
|
#endif
|
|
|
|
/* --- GLib boxed types --- */
|
|
/**
|
|
* G_TYPE_DATE:
|
|
*
|
|
* The #GType for #GDate.
|
|
*/
|
|
#define G_TYPE_DATE (g_date_get_type ())
|
|
|
|
/**
|
|
* G_TYPE_STRV:
|
|
*
|
|
* The #GType for a boxed type holding a %NULL-terminated array of strings.
|
|
*
|
|
* The code fragments in the following example show the use of a property of
|
|
* type #G_TYPE_STRV with g_object_class_install_property(), g_object_set()
|
|
* and g_object_get().
|
|
*
|
|
* |[
|
|
* g_object_class_install_property (object_class,
|
|
* PROP_AUTHORS,
|
|
* g_param_spec_boxed ("authors",
|
|
* _("Authors"),
|
|
* _("List of authors"),
|
|
* G_TYPE_STRV,
|
|
* G_PARAM_READWRITE));
|
|
*
|
|
* gchar *authors[] = { "Owen", "Tim", NULL };
|
|
* g_object_set (obj, "authors", authors, NULL);
|
|
*
|
|
* gchar *writers[];
|
|
* g_object_get (obj, "authors", &writers, NULL);
|
|
* /* do something with writers */
|
|
* g_strfreev (writers);
|
|
* ]|
|
|
*
|
|
* Since: 2.4
|
|
*/
|
|
#define G_TYPE_STRV (g_strv_get_type ())
|
|
|
|
/**
|
|
* G_TYPE_GSTRING:
|
|
*
|
|
* The #GType for #GString.
|
|
*/
|
|
#define G_TYPE_GSTRING (g_gstring_get_type ())
|
|
|
|
/**
|
|
* G_TYPE_HASH_TABLE:
|
|
*
|
|
* The #GType for a boxed type holding a #GHashTable reference.
|
|
*
|
|
* Since: 2.10
|
|
*/
|
|
#define G_TYPE_HASH_TABLE (g_hash_table_get_type ())
|
|
|
|
/**
|
|
* G_TYPE_REGEX:
|
|
*
|
|
* The #GType for a boxed type holding a #GRegex reference.
|
|
*
|
|
* Since: 2.14
|
|
*/
|
|
#define G_TYPE_REGEX (g_regex_get_type ())
|
|
|
|
/**
|
|
* G_TYPE_MATCH_INFO:
|
|
*
|
|
* The #GType for a boxed type holding a #GMatchInfo reference.
|
|
*
|
|
* Since: 2.30
|
|
*/
|
|
#define G_TYPE_MATCH_INFO (g_match_info_get_type ())
|
|
|
|
/**
|
|
* G_TYPE_ARRAY:
|
|
*
|
|
* The #GType for a boxed type holding a #GArray reference.
|
|
*
|
|
* Since: 2.22
|
|
*/
|
|
#define G_TYPE_ARRAY (g_array_get_type ())
|
|
|
|
/**
|
|
* G_TYPE_BYTE_ARRAY:
|
|
*
|
|
* The #GType for a boxed type holding a #GByteArray reference.
|
|
*
|
|
* Since: 2.22
|
|
*/
|
|
#define G_TYPE_BYTE_ARRAY (g_byte_array_get_type ())
|
|
|
|
/**
|
|
* G_TYPE_PTR_ARRAY:
|
|
*
|
|
* The #GType for a boxed type holding a #GPtrArray reference.
|
|
*
|
|
* Since: 2.22
|
|
*/
|
|
#define G_TYPE_PTR_ARRAY (g_ptr_array_get_type ())
|
|
|
|
/**
|
|
* G_TYPE_BYTES:
|
|
*
|
|
* The #GType for #GBytes.
|
|
*
|
|
* Since: 2.32
|
|
*/
|
|
#define G_TYPE_BYTES (g_bytes_get_type ())
|
|
|
|
/**
|
|
* G_TYPE_VARIANT_TYPE:
|
|
*
|
|
* The #GType for a boxed type holding a #GVariantType.
|
|
*
|
|
* Since: 2.24
|
|
*/
|
|
#define G_TYPE_VARIANT_TYPE (g_variant_type_get_gtype ())
|
|
|
|
/**
|
|
* G_TYPE_ERROR:
|
|
*
|
|
* The #GType for a boxed type holding a #GError.
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
#define G_TYPE_ERROR (g_error_get_type ())
|
|
|
|
/**
|
|
* G_TYPE_DATE_TIME:
|
|
*
|
|
* The #GType for a boxed type holding a #GDateTime.
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
#define G_TYPE_DATE_TIME (g_date_time_get_type ())
|
|
|
|
/**
|
|
* G_TYPE_TIME_ZONE:
|
|
*
|
|
* The #GType for a boxed type holding a #GTimeZone.
|
|
*
|
|
* Since: 2.34
|
|
*/
|
|
#define G_TYPE_TIME_ZONE (g_time_zone_get_type ())
|
|
|
|
/**
|
|
* G_TYPE_IO_CHANNEL:
|
|
*
|
|
* The #GType for #GIOChannel.
|
|
*/
|
|
#define G_TYPE_IO_CHANNEL (g_io_channel_get_type ())
|
|
|
|
/**
|
|
* G_TYPE_IO_CONDITION:
|
|
*
|
|
* The #GType for #GIOCondition.
|
|
*/
|
|
#define G_TYPE_IO_CONDITION (g_io_condition_get_type ())
|
|
|
|
/**
|
|
* G_TYPE_VARIANT_BUILDER:
|
|
*
|
|
* The #GType for a boxed type holding a #GVariantBuilder.
|
|
*
|
|
* Since: 2.30
|
|
*/
|
|
#define G_TYPE_VARIANT_BUILDER (g_variant_builder_get_type ())
|
|
|
|
/**
|
|
* G_TYPE_VARIANT_DICT:
|
|
*
|
|
* The #GType for a boxed type holding a #GVariantDict.
|
|
*
|
|
* Since: 2.40
|
|
*/
|
|
#define G_TYPE_VARIANT_DICT (g_variant_dict_get_type ())
|
|
|
|
/**
|
|
* G_TYPE_MAIN_LOOP:
|
|
*
|
|
* The #GType for a boxed type holding a #GMainLoop.
|
|
*
|
|
* Since: 2.30
|
|
*/
|
|
#define G_TYPE_MAIN_LOOP (g_main_loop_get_type ())
|
|
|
|
/**
|
|
* G_TYPE_MAIN_CONTEXT:
|
|
*
|
|
* The #GType for a boxed type holding a #GMainContext.
|
|
*
|
|
* Since: 2.30
|
|
*/
|
|
#define G_TYPE_MAIN_CONTEXT (g_main_context_get_type ())
|
|
|
|
/**
|
|
* G_TYPE_SOURCE:
|
|
*
|
|
* The #GType for a boxed type holding a #GSource.
|
|
*
|
|
* Since: 2.30
|
|
*/
|
|
#define G_TYPE_SOURCE (g_source_get_type ())
|
|
|
|
/**
|
|
* G_TYPE_POLLFD:
|
|
*
|
|
* The #GType for a boxed type holding a #GPollFD.
|
|
*
|
|
* Since: 2.36
|
|
*/
|
|
#define G_TYPE_POLLFD (g_pollfd_get_type ())
|
|
|
|
/**
|
|
* G_TYPE_MARKUP_PARSE_CONTEXT:
|
|
*
|
|
* The #GType for a boxed type holding a #GMarkupParseContext.
|
|
*
|
|
* Since: 2.36
|
|
*/
|
|
#define G_TYPE_MARKUP_PARSE_CONTEXT (g_markup_parse_context_get_type ())
|
|
|
|
/**
|
|
* G_TYPE_KEY_FILE:
|
|
*
|
|
* The #GType for a boxed type holding a #GKeyFile.
|
|
*
|
|
* Since: 2.32
|
|
*/
|
|
#define G_TYPE_KEY_FILE (g_key_file_get_type ())
|
|
|
|
/**
|
|
* G_TYPE_MAPPED_FILE:
|
|
*
|
|
* The #GType for a boxed type holding a #GMappedFile.
|
|
*
|
|
* Since: 2.40
|
|
*/
|
|
#define G_TYPE_MAPPED_FILE (g_mapped_file_get_type ())
|
|
|
|
/**
|
|
* G_TYPE_THREAD:
|
|
*
|
|
* The #GType for a boxed type holding a #GThread.
|
|
*
|
|
* Since: 2.36
|
|
*/
|
|
#define G_TYPE_THREAD (g_thread_get_type ())
|
|
|
|
/**
|
|
* G_TYPE_CHECKSUM:
|
|
*
|
|
* The #GType for a boxed type holding a #GChecksum.
|
|
*
|
|
* Since: 2.36
|
|
*/
|
|
#define G_TYPE_CHECKSUM (g_checksum_get_type ())
|
|
|
|
/**
|
|
* G_TYPE_OPTION_GROUP:
|
|
*
|
|
* The #GType for a boxed type holding a #GOptionGroup.
|
|
*
|
|
* Since: 2.44
|
|
*/
|
|
#define G_TYPE_OPTION_GROUP (g_option_group_get_type ())
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_date_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_strv_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_gstring_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_hash_table_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_array_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_byte_array_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_ptr_array_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_bytes_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_variant_type_get_gtype (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_regex_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_2_30
|
|
GType g_match_info_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_error_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_date_time_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_time_zone_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_io_channel_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_io_condition_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_variant_builder_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_2_40
|
|
GType g_variant_dict_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_key_file_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_2_30
|
|
GType g_main_loop_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_2_30
|
|
GType g_main_context_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_2_30
|
|
GType g_source_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_2_36
|
|
GType g_pollfd_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_2_36
|
|
GType g_thread_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_2_36
|
|
GType g_checksum_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_2_36
|
|
GType g_markup_parse_context_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_2_40
|
|
GType g_mapped_file_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_2_44
|
|
GType g_option_group_get_type (void) G_GNUC_CONST;
|
|
|
|
GLIB_DEPRECATED_FOR('G_TYPE_VARIANT')
|
|
GType g_variant_get_gtype (void) G_GNUC_CONST;
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __GLIB_TYPES_H__ */
|
|
#endif
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/* --- type macros --- */
|
|
#define G_TYPE_IS_BOXED(type) (G_TYPE_FUNDAMENTAL (type) == G_TYPE_BOXED)
|
|
/**
|
|
* G_VALUE_HOLDS_BOXED:
|
|
* @value: a valid #GValue structure
|
|
*
|
|
* Checks whether the given #GValue can hold values derived
|
|
* from type %G_TYPE_BOXED.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_VALUE_HOLDS_BOXED(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_BOXED))
|
|
|
|
|
|
/* --- typedefs --- */
|
|
/**
|
|
* GBoxedCopyFunc:
|
|
* @boxed: (not nullable): The boxed structure to be copied.
|
|
*
|
|
* This function is provided by the user and should produce a copy
|
|
* of the passed in boxed structure.
|
|
*
|
|
* Returns: (not nullable): The newly created copy of the boxed structure.
|
|
*/
|
|
typedef gpointer (*GBoxedCopyFunc) (gpointer boxed);
|
|
|
|
/**
|
|
* GBoxedFreeFunc:
|
|
* @boxed: (not nullable): The boxed structure to be freed.
|
|
*
|
|
* This function is provided by the user and should free the boxed
|
|
* structure passed.
|
|
*/
|
|
typedef void (*GBoxedFreeFunc) (gpointer boxed);
|
|
|
|
|
|
/* --- prototypes --- */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_boxed_copy (GType boxed_type,
|
|
gconstpointer src_boxed);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_boxed_free (GType boxed_type,
|
|
gpointer boxed);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_set_boxed (GValue *value,
|
|
gconstpointer v_boxed);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_set_static_boxed (GValue *value,
|
|
gconstpointer v_boxed);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_take_boxed (GValue *value,
|
|
gconstpointer v_boxed);
|
|
GLIB_DEPRECATED_FOR(g_value_take_boxed)
|
|
void g_value_set_boxed_take_ownership (GValue *value,
|
|
gconstpointer v_boxed);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_value_get_boxed (const GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_value_dup_boxed (const GValue *value);
|
|
|
|
|
|
/* --- convenience --- */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_boxed_type_register_static (const gchar *name,
|
|
GBoxedCopyFunc boxed_copy,
|
|
GBoxedFreeFunc boxed_free);
|
|
|
|
/* --- GObject boxed types --- */
|
|
/**
|
|
* G_TYPE_CLOSURE:
|
|
*
|
|
* The #GType for #GClosure.
|
|
*/
|
|
#define G_TYPE_CLOSURE (g_closure_get_type ())
|
|
|
|
/**
|
|
* G_TYPE_VALUE:
|
|
*
|
|
* The type ID of the "GValue" type which is a boxed type,
|
|
* used to pass around pointers to GValues.
|
|
*/
|
|
#define G_TYPE_VALUE (g_value_get_type ())
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_closure_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_value_get_type (void) G_GNUC_CONST;
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_BOXED_H__ */
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/* --- type macros --- */
|
|
/**
|
|
* G_TYPE_IS_OBJECT:
|
|
* @type: Type id to check
|
|
*
|
|
* Check if the passed in type id is a %G_TYPE_OBJECT or derived from it.
|
|
*
|
|
* Returns: %FALSE or %TRUE, indicating whether @type is a %G_TYPE_OBJECT.
|
|
*/
|
|
#define G_TYPE_IS_OBJECT(type) (G_TYPE_FUNDAMENTAL (type) == G_TYPE_OBJECT)
|
|
/**
|
|
* G_OBJECT:
|
|
* @object: Object which is subject to casting.
|
|
*
|
|
* Casts a #GObject or derived pointer into a (GObject*) pointer.
|
|
* Depending on the current debugging level, this function may invoke
|
|
* certain runtime checks to identify invalid casts.
|
|
*/
|
|
#define G_OBJECT(object) (lG_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
|
|
/**
|
|
* G_OBJECT_CLASS:
|
|
* @class: a valid #GObjectClass
|
|
*
|
|
* Casts a derived #GObjectClass structure into a #GObjectClass structure.
|
|
*/
|
|
#define G_OBJECT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
|
|
/**
|
|
* G_IS_OBJECT:
|
|
* @object: Instance to check for being a %G_TYPE_OBJECT.
|
|
*
|
|
* Checks whether a valid #GTypeInstance pointer is of type %G_TYPE_OBJECT.
|
|
*/
|
|
#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_42
|
|
#define G_IS_OBJECT(object) (G_TYPE_CHECK_INSTANCE_FUNDAMENTAL_TYPE ((object), G_TYPE_OBJECT))
|
|
#else
|
|
#define G_IS_OBJECT(object) (lG_TYPE_CHECK_INSTANCE_TYPE ((object), G_TYPE_OBJECT))
|
|
#endif
|
|
/**
|
|
* G_IS_OBJECT_CLASS:
|
|
* @class: a #GObjectClass
|
|
*
|
|
* Checks whether @class "is a" valid #GObjectClass structure of type
|
|
* %G_TYPE_OBJECT or derived.
|
|
*/
|
|
#define G_IS_OBJECT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_OBJECT))
|
|
/**
|
|
* G_OBJECT_GET_CLASS:
|
|
* @object: a #GObject instance.
|
|
*
|
|
* Get the class structure associated to a #GObject instance.
|
|
*
|
|
* Returns: pointer to object class structure.
|
|
*/
|
|
#define G_OBJECT_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), G_TYPE_OBJECT, GObjectClass))
|
|
/**
|
|
* G_OBJECT_TYPE:
|
|
* @object: Object to return the type id for.
|
|
*
|
|
* Get the type id of an object.
|
|
*
|
|
* Returns: Type id of @object.
|
|
*/
|
|
#define G_OBJECT_TYPE(object) (G_TYPE_FROM_INSTANCE (object))
|
|
/**
|
|
* G_OBJECT_TYPE_NAME:
|
|
* @object: Object to return the type name for.
|
|
*
|
|
* Get the name of an object's type.
|
|
*
|
|
* Returns: Type name of @object. The string is owned by the type system and
|
|
* should not be freed.
|
|
*/
|
|
#define G_OBJECT_TYPE_NAME(object) (g_type_name (G_OBJECT_TYPE (object)))
|
|
/**
|
|
* G_OBJECT_CLASS_TYPE:
|
|
* @class: a valid #GObjectClass
|
|
*
|
|
* Get the type id of a class structure.
|
|
*
|
|
* Returns: Type id of @class.
|
|
*/
|
|
#define G_OBJECT_CLASS_TYPE(class) (G_TYPE_FROM_CLASS (class))
|
|
/**
|
|
* G_OBJECT_CLASS_NAME:
|
|
* @class: a valid #GObjectClass
|
|
*
|
|
* Return the name of a class structure's type.
|
|
*
|
|
* Returns: Type name of @class. The string is owned by the type system and
|
|
* should not be freed.
|
|
*/
|
|
#define G_OBJECT_CLASS_NAME(class) (g_type_name (G_OBJECT_CLASS_TYPE (class)))
|
|
/**
|
|
* G_VALUE_HOLDS_OBJECT:
|
|
* @value: a valid #GValue structure
|
|
*
|
|
* Checks whether the given #GValue can hold values derived from type %G_TYPE_OBJECT.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_VALUE_HOLDS_OBJECT(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_OBJECT))
|
|
|
|
/* --- type macros --- */
|
|
/**
|
|
* G_TYPE_INITIALLY_UNOWNED:
|
|
*
|
|
* The type for #GInitiallyUnowned.
|
|
*/
|
|
#define G_TYPE_INITIALLY_UNOWNED (g_initially_unowned_get_type())
|
|
/**
|
|
* G_INITIALLY_UNOWNED:
|
|
* @object: Object which is subject to casting.
|
|
*
|
|
* Casts a #GInitiallyUnowned or derived pointer into a (GInitiallyUnowned*)
|
|
* pointer. Depending on the current debugging level, this function may invoke
|
|
* certain runtime checks to identify invalid casts.
|
|
*/
|
|
#define G_INITIALLY_UNOWNED(object) (lG_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_INITIALLY_UNOWNED, GInitiallyUnowned))
|
|
/**
|
|
* G_INITIALLY_UNOWNED_CLASS:
|
|
* @class: a valid #GInitiallyUnownedClass
|
|
*
|
|
* Casts a derived #GInitiallyUnownedClass structure into a
|
|
* #GInitiallyUnownedClass structure.
|
|
*/
|
|
#define G_INITIALLY_UNOWNED_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_INITIALLY_UNOWNED, GInitiallyUnownedClass))
|
|
/**
|
|
* G_IS_INITIALLY_UNOWNED:
|
|
* @object: Instance to check for being a %G_TYPE_INITIALLY_UNOWNED.
|
|
*
|
|
* Checks whether a valid #GTypeInstance pointer is of type %G_TYPE_INITIALLY_UNOWNED.
|
|
*/
|
|
#define G_IS_INITIALLY_UNOWNED(object) (lG_TYPE_CHECK_INSTANCE_TYPE ((object), G_TYPE_INITIALLY_UNOWNED))
|
|
/**
|
|
* G_IS_INITIALLY_UNOWNED_CLASS:
|
|
* @class: a #GInitiallyUnownedClass
|
|
*
|
|
* Checks whether @class "is a" valid #GInitiallyUnownedClass structure of type
|
|
* %G_TYPE_INITIALLY_UNOWNED or derived.
|
|
*/
|
|
#define G_IS_INITIALLY_UNOWNED_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_INITIALLY_UNOWNED))
|
|
/**
|
|
* G_INITIALLY_UNOWNED_GET_CLASS:
|
|
* @object: a #GInitiallyUnowned instance.
|
|
*
|
|
* Get the class structure associated to a #GInitiallyUnowned instance.
|
|
*
|
|
* Returns: pointer to object class structure.
|
|
*/
|
|
#define G_INITIALLY_UNOWNED_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), G_TYPE_INITIALLY_UNOWNED, GInitiallyUnownedClass))
|
|
/* GInitiallyUnowned ia a GObject with initially floating reference count */
|
|
|
|
|
|
/* --- typedefs & structures --- */
|
|
typedef struct _GObject GObject;
|
|
typedef struct _GObjectClass GObjectClass;
|
|
typedef struct _GObject GInitiallyUnowned;
|
|
typedef struct _GObjectClass GInitiallyUnownedClass;
|
|
typedef struct _GObjectConstructParam GObjectConstructParam;
|
|
/**
|
|
* GObjectGetPropertyFunc:
|
|
* @object: a #GObject
|
|
* @property_id: the numeric id under which the property was registered with
|
|
* g_object_class_install_property().
|
|
* @value: a #GValue to return the property value in
|
|
* @pspec: the #GParamSpec describing the property
|
|
*
|
|
* The type of the @get_property function of #GObjectClass.
|
|
*/
|
|
typedef void (*GObjectGetPropertyFunc) (GObject *object,
|
|
guint property_id,
|
|
GValue *value,
|
|
GParamSpec *pspec);
|
|
/**
|
|
* GObjectSetPropertyFunc:
|
|
* @object: a #GObject
|
|
* @property_id: the numeric id under which the property was registered with
|
|
* g_object_class_install_property().
|
|
* @value: the new value for the property
|
|
* @pspec: the #GParamSpec describing the property
|
|
*
|
|
* The type of the @set_property function of #GObjectClass.
|
|
*/
|
|
typedef void (*GObjectSetPropertyFunc) (GObject *object,
|
|
guint property_id,
|
|
const GValue *value,
|
|
GParamSpec *pspec);
|
|
/**
|
|
* GObjectFinalizeFunc:
|
|
* @object: the #GObject being finalized
|
|
*
|
|
* The type of the @finalize function of #GObjectClass.
|
|
*/
|
|
typedef void (*GObjectFinalizeFunc) (GObject *object);
|
|
/**
|
|
* GWeakNotify:
|
|
* @data: data that was provided when the weak reference was established
|
|
* @where_the_object_was: the object being finalized
|
|
*
|
|
* A #GWeakNotify function can be added to an object as a callback that gets
|
|
* triggered when the object is finalized. Since the object is already being
|
|
* finalized when the #GWeakNotify is called, there's not much you could do
|
|
* with the object, apart from e.g. using its address as hash-index or the like.
|
|
*/
|
|
typedef void (*GWeakNotify) (gpointer data,
|
|
GObject *where_the_object_was);
|
|
/**
|
|
* GObject:
|
|
*
|
|
* All the fields in the GObject structure are private
|
|
* to the #GObject implementation and should never be accessed directly.
|
|
*/
|
|
struct _GObject
|
|
{
|
|
GTypeInstance g_type_instance;
|
|
|
|
/*< private >*/
|
|
volatile guint ref_count;
|
|
GData *qdata;
|
|
};
|
|
/**
|
|
* GObjectClass:
|
|
* @g_type_class: the parent class
|
|
* @constructor: the @constructor function is called by lg_object_new () to
|
|
* complete the object initialization after all the construction properties are
|
|
* set. The first thing a @constructor implementation must do is chain up to the
|
|
* @constructor of the parent class. Overriding @constructor should be rarely
|
|
* needed, e.g. to handle construct properties, or to implement singletons.
|
|
* @set_property: the generic setter for all properties of this type. Should be
|
|
* overridden for every type with properties. If implementations of
|
|
* @set_property don't emit property change notification explicitly, this will
|
|
* be done implicitly by the type system. However, if the notify signal is
|
|
* emitted explicitly, the type system will not emit it a second time.
|
|
* @get_property: the generic getter for all properties of this type. Should be
|
|
* overridden for every type with properties.
|
|
* @dispose: the @dispose function is supposed to drop all references to other
|
|
* objects, but keep the instance otherwise intact, so that client method
|
|
* invocations still work. It may be run multiple times (due to reference
|
|
* loops). Before returning, @dispose should chain up to the @dispose method
|
|
* of the parent class.
|
|
* @finalize: instance finalization function, should finish the finalization of
|
|
* the instance begun in @dispose and chain up to the @finalize method of the
|
|
* parent class.
|
|
* @dispatch_properties_changed: emits property change notification for a bunch
|
|
* of properties. Overriding @dispatch_properties_changed should be rarely
|
|
* needed.
|
|
* @notify: the class closure for the notify signal
|
|
* @constructed: the @constructed function is called by lg_object_new() as the
|
|
* final step of the object creation process. At the point of the call, all
|
|
* construction properties have been set on the object. The purpose of this
|
|
* call is to allow for object initialisation steps that can only be performed
|
|
* after construction properties have been set. @constructed implementors
|
|
* should chain up to the @constructed call of their parent class to allow it
|
|
* to complete its initialisation.
|
|
*
|
|
* The class structure for the GObject type.
|
|
*
|
|
* <example>
|
|
* <title>Implementing singletons using a constructor</title>
|
|
* <programlisting>
|
|
* static MySingleton *the_singleton = NULL;
|
|
*
|
|
* static GObject*
|
|
* my_singleton_constructor (GType type,
|
|
* guint n_construct_params,
|
|
* GObjectConstructParam *construct_params)
|
|
* {
|
|
* GObject *object;
|
|
*
|
|
* if (!the_singleton)
|
|
* {
|
|
* object = G_OBJECT_CLASS (parent_class)->constructor (type,
|
|
* n_construct_params,
|
|
* construct_params);
|
|
* the_singleton = MY_SINGLETON (object);
|
|
* }
|
|
* else
|
|
* object = g_object_ref (G_OBJECT (the_singleton));
|
|
*
|
|
* return object;
|
|
* }
|
|
* </programlisting></example>
|
|
*/
|
|
struct _GObjectClass
|
|
{
|
|
GTypeClass g_type_class;
|
|
|
|
/*< private >*/
|
|
GSList *construct_properties;
|
|
|
|
/*< public >*/
|
|
/* seldom overidden */
|
|
GObject* (*constructor) (GType type,
|
|
guint n_construct_properties,
|
|
GObjectConstructParam *construct_properties);
|
|
/* overridable methods */
|
|
void (*set_property) (GObject *object,
|
|
guint property_id,
|
|
const GValue *value,
|
|
GParamSpec *pspec);
|
|
void (*get_property) (GObject *object,
|
|
guint property_id,
|
|
GValue *value,
|
|
GParamSpec *pspec);
|
|
void (*dispose) (GObject *object);
|
|
void (*finalize) (GObject *object);
|
|
/* seldom overidden */
|
|
void (*dispatch_properties_changed) (GObject *object,
|
|
guint n_pspecs,
|
|
GParamSpec **pspecs);
|
|
/* signals */
|
|
void (*notify) (GObject *object,
|
|
GParamSpec *pspec);
|
|
|
|
/* called when done constructing */
|
|
void (*constructed) (GObject *object);
|
|
|
|
/*< private >*/
|
|
gsize flags;
|
|
|
|
/* padding */
|
|
gpointer pdummy[6];
|
|
};
|
|
/**
|
|
* GObjectConstructParam:
|
|
* @pspec: the #GParamSpec of the construct parameter
|
|
* @value: the value to set the parameter to
|
|
*
|
|
* The GObjectConstructParam struct is an auxiliary
|
|
* structure used to hand #GParamSpec/#GValue pairs to the @constructor of
|
|
* a #GObjectClass.
|
|
*/
|
|
struct _GObjectConstructParam
|
|
{
|
|
GParamSpec *pspec;
|
|
GValue *value;
|
|
};
|
|
|
|
/**
|
|
* GInitiallyUnowned:
|
|
*
|
|
* All the fields in the GInitiallyUnowned structure
|
|
* are private to the #GInitiallyUnowned implementation and should never be
|
|
* accessed directly.
|
|
*/
|
|
/**
|
|
* GInitiallyUnownedClass:
|
|
*
|
|
* The class structure for the GInitiallyUnowned type.
|
|
*/
|
|
|
|
|
|
/* --- prototypes --- */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_initially_unowned_get_type (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_class_install_property (GObjectClass *oclass,
|
|
guint property_id,
|
|
GParamSpec *pspec);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_object_class_find_property (GObjectClass *oclass,
|
|
const gchar *property_name);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec**g_object_class_list_properties (GObjectClass *oclass,
|
|
guint *n_properties);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_class_override_property (GObjectClass *oclass,
|
|
guint property_id,
|
|
const gchar *name);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_class_install_properties (GObjectClass *oclass,
|
|
guint n_pspecs,
|
|
GParamSpec **pspecs);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_interface_install_property (gpointer g_iface,
|
|
GParamSpec *pspec);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_object_interface_find_property (gpointer g_iface,
|
|
const gchar *property_name);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec**g_object_interface_list_properties (gpointer g_iface,
|
|
guint *n_properties_p);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_object_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer lg_object_new (GType object_type,
|
|
const gchar *first_property_name,
|
|
...);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_object_newv (GType object_type,
|
|
guint n_parameters,
|
|
GParameter *parameters);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GObject* g_object_new_valist (GType object_type,
|
|
const gchar *first_property_name,
|
|
va_list var_args);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_set (gpointer object,
|
|
const gchar *first_property_name,
|
|
...) G_GNUC_NULL_TERMINATED;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_get (gpointer object,
|
|
const gchar *first_property_name,
|
|
...) G_GNUC_NULL_TERMINATED;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_object_connect (gpointer object,
|
|
const gchar *signal_spec,
|
|
...) G_GNUC_NULL_TERMINATED;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_disconnect (gpointer object,
|
|
const gchar *signal_spec,
|
|
...) G_GNUC_NULL_TERMINATED;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_set_valist (GObject *object,
|
|
const gchar *first_property_name,
|
|
va_list var_args);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_get_valist (GObject *object,
|
|
const gchar *first_property_name,
|
|
va_list var_args);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_set_property (GObject *object,
|
|
const gchar *property_name,
|
|
const GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_get_property (GObject *object,
|
|
const gchar *property_name,
|
|
GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_freeze_notify (GObject *object);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_notify (GObject *object,
|
|
const gchar *property_name);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_notify_by_pspec (GObject *object,
|
|
GParamSpec *pspec);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_thaw_notify (GObject *object);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_object_is_floating (gpointer object);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_object_ref_sink (gpointer object);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_object_ref (gpointer object);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_unref (gpointer object);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_weak_ref (GObject *object,
|
|
GWeakNotify notify,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_weak_unref (GObject *object,
|
|
GWeakNotify notify,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_add_weak_pointer (GObject *object,
|
|
gpointer *weak_pointer_location);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_remove_weak_pointer (GObject *object,
|
|
gpointer *weak_pointer_location);
|
|
|
|
/**
|
|
* GToggleNotify:
|
|
* @data: Callback data passed to g_object_add_toggle_ref()
|
|
* @object: The object on which g_object_add_toggle_ref() was called.
|
|
* @is_last_ref: %TRUE if the toggle reference is now the
|
|
* last reference to the object. %FALSE if the toggle
|
|
* reference was the last reference and there are now other
|
|
* references.
|
|
*
|
|
* A callback function used for notification when the state
|
|
* of a toggle reference changes. See g_object_add_toggle_ref().
|
|
*/
|
|
typedef void (*GToggleNotify) (gpointer data,
|
|
GObject *object,
|
|
gboolean is_last_ref);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_add_toggle_ref (GObject *object,
|
|
GToggleNotify notify,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_remove_toggle_ref (GObject *object,
|
|
GToggleNotify notify,
|
|
gpointer data);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_object_get_qdata (GObject *object,
|
|
GQuark quark);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_set_qdata (GObject *object,
|
|
GQuark quark,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_set_qdata_full (GObject *object,
|
|
GQuark quark,
|
|
gpointer data,
|
|
GDestroyNotify destroy);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_object_steal_qdata (GObject *object,
|
|
GQuark quark);
|
|
|
|
GLIB_AVAILABLE_IN_2_34
|
|
gpointer g_object_dup_qdata (GObject *object,
|
|
GQuark quark,
|
|
GDuplicateFunc dup_func,
|
|
gpointer user_data);
|
|
GLIB_AVAILABLE_IN_2_34
|
|
gboolean g_object_replace_qdata (GObject *object,
|
|
GQuark quark,
|
|
gpointer oldval,
|
|
gpointer newval,
|
|
GDestroyNotify destroy,
|
|
GDestroyNotify *old_destroy);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_object_get_data (GObject *object,
|
|
const gchar *key);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_set_data (GObject *object,
|
|
const gchar *key,
|
|
gpointer data);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_set_data_full (GObject *object,
|
|
const gchar *key,
|
|
gpointer data,
|
|
GDestroyNotify destroy);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_object_steal_data (GObject *object,
|
|
const gchar *key);
|
|
|
|
GLIB_AVAILABLE_IN_2_34
|
|
gpointer g_object_dup_data (GObject *object,
|
|
const gchar *key,
|
|
GDuplicateFunc dup_func,
|
|
gpointer user_data);
|
|
GLIB_AVAILABLE_IN_2_34
|
|
gboolean g_object_replace_data (GObject *object,
|
|
const gchar *key,
|
|
gpointer oldval,
|
|
gpointer newval,
|
|
GDestroyNotify destroy,
|
|
GDestroyNotify *old_destroy);
|
|
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_watch_closure (GObject *object,
|
|
GClosure *closure);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GClosure* g_cclosure_new_object (GCallback callback_func,
|
|
GObject *object);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GClosure* g_cclosure_new_object_swap (GCallback callback_func,
|
|
GObject *object);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GClosure* g_closure_new_object (guint sizeof_closure,
|
|
GObject *object);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_set_object (GValue *value,
|
|
gpointer v_object);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_value_get_object (const GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_value_dup_object (const GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gulong g_signal_connect_object (gpointer instance,
|
|
const gchar *detailed_signal,
|
|
GCallback c_handler,
|
|
gpointer gobject,
|
|
GConnectFlags connect_flags);
|
|
|
|
/*< protected >*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_force_floating (GObject *object);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_object_run_dispose (GObject *object);
|
|
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_take_object (GValue *value,
|
|
gpointer v_object);
|
|
GLIB_DEPRECATED_FOR(g_value_take_object)
|
|
void g_value_set_object_take_ownership (GValue *value,
|
|
gpointer v_object);
|
|
|
|
GLIB_DEPRECATED
|
|
gsize g_object_compat_control (gsize what,
|
|
gpointer data);
|
|
|
|
/* --- implementation macros --- */
|
|
#define G_OBJECT_WARN_INVALID_PSPEC(object, pname, property_id, pspec) \
|
|
G_STMT_START { \
|
|
GObject *_glib__object = (GObject*) (object); \
|
|
GParamSpec *_glib__pspec = (GParamSpec*) (pspec); \
|
|
guint _glib__property_id = (property_id); \
|
|
g_warning ("%s:%d: invalid %s id %u for \"%s\" of type '%s' in '%s'", \
|
|
__FILE__, __LINE__, \
|
|
(pname), \
|
|
_glib__property_id, \
|
|
_glib__pspec->name, \
|
|
g_type_name (G_PARAM_SPEC_TYPE (_glib__pspec)), \
|
|
G_OBJECT_TYPE_NAME (_glib__object)); \
|
|
} G_STMT_END
|
|
/**
|
|
* G_OBJECT_WARN_INVALID_PROPERTY_ID:
|
|
* @object: the #GObject on which set_property() or get_property() was called
|
|
* @property_id: the numeric id of the property
|
|
* @pspec: the #GParamSpec of the property
|
|
*
|
|
* This macro should be used to emit a standard warning about unexpected
|
|
* properties in set_property() and get_property() implementations.
|
|
*/
|
|
#define G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec) \
|
|
G_OBJECT_WARN_INVALID_PSPEC ((object), "property", (property_id), (pspec))
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_clear_object (volatile GObject **object_ptr);
|
|
#define g_clear_object(object_ptr) g_clear_pointer ((object_ptr), g_object_unref)
|
|
|
|
/**
|
|
* g_set_object: (skip)
|
|
* @object_ptr: a pointer to a #GObject reference
|
|
* @new_object: (nullable) (transfer none): a pointer to the new #GObject to
|
|
* assign to it, or %NULL to clear the pointer
|
|
*
|
|
* Updates a #GObject pointer to refer to @new_object. It increments the
|
|
* reference count of @new_object (if non-%NULL), decrements the reference
|
|
* count of the current value of @object_ptr (if non-%NULL), and assigns
|
|
* @new_object to @object_ptr. The assignment is not atomic.
|
|
*
|
|
* @object_ptr must not be %NULL.
|
|
*
|
|
* A macro is also included that allows this function to be used without
|
|
* pointer casts. The function itself is static inline, so its address may vary
|
|
* between compilation units.
|
|
*
|
|
* One convenient usage of this function is in implementing property setters:
|
|
* |[
|
|
* void
|
|
* foo_set_bar (Foo *foo,
|
|
* Bar *new_bar)
|
|
* {
|
|
* g_return_if_fail (IS_FOO (foo));
|
|
* g_return_if_fail (new_bar == NULL || IS_BAR (new_bar));
|
|
*
|
|
* if (g_set_object (&foo->bar, new_bar))
|
|
* g_object_notify (foo, "bar");
|
|
* }
|
|
* ]|
|
|
*
|
|
* Returns: %TRUE if the value of @object_ptr changed, %FALSE otherwise
|
|
*
|
|
* Since: 2.44
|
|
*/
|
|
static inline gboolean
|
|
(g_set_object) (GObject **object_ptr,
|
|
GObject *new_object)
|
|
{
|
|
GObject *old_object = *object_ptr;
|
|
|
|
/* rely on g_object_[un]ref() to check the pointers are actually GObjects;
|
|
* elide a (object_ptr != NULL) check because most of the time we will be
|
|
* operating on struct members with a constant offset, so a NULL check would
|
|
* not catch bugs
|
|
*/
|
|
|
|
if (old_object == new_object)
|
|
return FALSE;
|
|
|
|
if (new_object != NULL)
|
|
g_object_ref (new_object);
|
|
|
|
*object_ptr = new_object;
|
|
|
|
if (old_object != NULL)
|
|
g_object_unref (old_object);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
#define g_set_object(object_ptr, new_object) \
|
|
(/* Check types match. */ \
|
|
0 ? *(object_ptr) = (new_object), FALSE : \
|
|
(g_set_object) ((GObject **) (object_ptr), (GObject *) (new_object)) \
|
|
)
|
|
|
|
typedef struct {
|
|
/*<private>*/
|
|
union { gpointer p; } priv;
|
|
} GWeakRef;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_weak_ref_init (GWeakRef *weak_ref,
|
|
gpointer object);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_weak_ref_clear (GWeakRef *weak_ref);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_weak_ref_get (GWeakRef *weak_ref);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_weak_ref_set (GWeakRef *weak_ref,
|
|
gpointer object);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_OBJECT_H__ */
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
#define G_TYPE_BINDING_FLAGS (g_binding_flags_get_type ())
|
|
|
|
#define G_TYPE_BINDING (g_binding_get_type ())
|
|
#define G_BINDING(obj) (lG_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_BINDING, GBinding))
|
|
#define G_IS_BINDING(obj) (lG_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_BINDING))
|
|
|
|
/**
|
|
* GBinding:
|
|
*
|
|
* GBinding is an opaque structure whose members
|
|
* cannot be accessed directly.
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
typedef struct _GBinding GBinding;
|
|
|
|
/**
|
|
* GBindingTransformFunc:
|
|
* @binding: a #GBinding
|
|
* @from_value: the #GValue containing the value to transform
|
|
* @to_value: the #GValue in which to store the transformed value
|
|
* @user_data: data passed to the transform function
|
|
*
|
|
* A function to be called to transform @from_value to @to_value. If
|
|
* this is the @transform_to function of a binding, then @from_value
|
|
* is the @source_property on the @source object, and @to_value is the
|
|
* @target_property on the @target object. If this is the
|
|
* @transform_from function of a %G_BINDING_BIDIRECTIONAL binding,
|
|
* then those roles are reversed.
|
|
*
|
|
* Returns: %TRUE if the transformation was successful, and %FALSE
|
|
* otherwise
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
typedef gboolean (* GBindingTransformFunc) (GBinding *binding,
|
|
const GValue *from_value,
|
|
GValue *to_value,
|
|
gpointer user_data);
|
|
|
|
/**
|
|
* GBindingFlags:
|
|
* @G_BINDING_DEFAULT: The default binding; if the source property
|
|
* changes, the target property is updated with its value.
|
|
* @G_BINDING_BIDIRECTIONAL: Bidirectional binding; if either the
|
|
* property of the source or the property of the target changes,
|
|
* the other is updated.
|
|
* @G_BINDING_SYNC_CREATE: Synchronize the values of the source and
|
|
* target properties when creating the binding; the direction of
|
|
* the synchronization is always from the source to the target.
|
|
* @G_BINDING_INVERT_BOOLEAN: If the two properties being bound are
|
|
* booleans, setting one to %TRUE will result in the other being
|
|
* set to %FALSE and vice versa. This flag will only work for
|
|
* boolean properties, and cannot be used when passing custom
|
|
* transformation functions to g_object_bind_property_full().
|
|
*
|
|
* Flags to be passed to g_object_bind_property() or
|
|
* g_object_bind_property_full().
|
|
*
|
|
* This enumeration can be extended at later date.
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
typedef enum { /*< prefix=G_BINDING >*/
|
|
G_BINDING_DEFAULT = 0,
|
|
|
|
G_BINDING_BIDIRECTIONAL = 1 << 0,
|
|
G_BINDING_SYNC_CREATE = 1 << 1,
|
|
G_BINDING_INVERT_BOOLEAN = 1 << 2
|
|
} GBindingFlags;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_binding_flags_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_binding_get_type (void) G_GNUC_CONST;
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GBindingFlags g_binding_get_flags (GBinding *binding);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GObject * g_binding_get_source (GBinding *binding);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GObject * g_binding_get_target (GBinding *binding);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_binding_get_source_property (GBinding *binding);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_binding_get_target_property (GBinding *binding);
|
|
GLIB_AVAILABLE_IN_2_38
|
|
void g_binding_unbind (GBinding *binding);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GBinding *g_object_bind_property (gpointer source,
|
|
const gchar *source_property,
|
|
gpointer target,
|
|
const gchar *target_property,
|
|
GBindingFlags flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GBinding *g_object_bind_property_full (gpointer source,
|
|
const gchar *source_property,
|
|
gpointer target,
|
|
const gchar *target_property,
|
|
GBindingFlags flags,
|
|
GBindingTransformFunc transform_to,
|
|
GBindingTransformFunc transform_from,
|
|
gpointer user_data,
|
|
GDestroyNotify notify);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GBinding *g_object_bind_property_with_closures (gpointer source,
|
|
const gchar *source_property,
|
|
gpointer target,
|
|
const gchar *target_property,
|
|
GBindingFlags flags,
|
|
GClosure *transform_to,
|
|
GClosure *transform_from);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_BINDING_H__ */
|
|
/* GObject - GLib Type, Object, Parameter and Signal Library
|
|
* Copyright (C) 1998-1999, 2000-2001 Tim Janik and Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General
|
|
* Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#ifndef __G_ENUMS_H__
|
|
#define __G_ENUMS_H__
|
|
|
|
#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
|
|
#error "Only <glib-object.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/* --- type macros --- */
|
|
/**
|
|
* G_TYPE_IS_ENUM:
|
|
* @type: a #GType ID.
|
|
*
|
|
* Checks whether @type "is a" %G_TYPE_ENUM.
|
|
*
|
|
* Returns: %TRUE if @type "is a" %G_TYPE_ENUM.
|
|
*/
|
|
#define G_TYPE_IS_ENUM(type) (G_TYPE_FUNDAMENTAL (type) == G_TYPE_ENUM)
|
|
/**
|
|
* G_ENUM_CLASS:
|
|
* @class: a valid #GEnumClass
|
|
*
|
|
* Casts a derived #GEnumClass structure into a #GEnumClass structure.
|
|
*/
|
|
#define G_ENUM_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_ENUM, GEnumClass))
|
|
/**
|
|
* G_IS_ENUM_CLASS:
|
|
* @class: a #GEnumClass
|
|
*
|
|
* Checks whether @class "is a" valid #GEnumClass structure of type %G_TYPE_ENUM
|
|
* or derived.
|
|
*/
|
|
#define G_IS_ENUM_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_ENUM))
|
|
/**
|
|
* G_ENUM_CLASS_TYPE:
|
|
* @class: a #GEnumClass
|
|
*
|
|
* Get the type identifier from a given #GEnumClass structure.
|
|
*
|
|
* Returns: the #GType
|
|
*/
|
|
#define G_ENUM_CLASS_TYPE(class) (G_TYPE_FROM_CLASS (class))
|
|
/**
|
|
* G_ENUM_CLASS_TYPE_NAME:
|
|
* @class: a #GEnumClass
|
|
*
|
|
* Get the static type name from a given #GEnumClass structure.
|
|
*
|
|
* Returns: the type name.
|
|
*/
|
|
#define G_ENUM_CLASS_TYPE_NAME(class) (g_type_name (G_ENUM_CLASS_TYPE (class)))
|
|
|
|
|
|
/**
|
|
* G_TYPE_IS_FLAGS:
|
|
* @type: a #GType ID.
|
|
*
|
|
* Checks whether @type "is a" %G_TYPE_FLAGS.
|
|
*
|
|
* Returns: %TRUE if @type "is a" %G_TYPE_FLAGS.
|
|
*/
|
|
#define G_TYPE_IS_FLAGS(type) (G_TYPE_FUNDAMENTAL (type) == G_TYPE_FLAGS)
|
|
/**
|
|
* G_FLAGS_CLASS:
|
|
* @class: a valid #GFlagsClass
|
|
*
|
|
* Casts a derived #GFlagsClass structure into a #GFlagsClass structure.
|
|
*/
|
|
#define G_FLAGS_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_FLAGS, GFlagsClass))
|
|
/**
|
|
* G_IS_FLAGS_CLASS:
|
|
* @class: a #GFlagsClass
|
|
*
|
|
* Checks whether @class "is a" valid #GFlagsClass structure of type %G_TYPE_FLAGS
|
|
* or derived.
|
|
*/
|
|
#define G_IS_FLAGS_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_FLAGS))
|
|
/**
|
|
* G_FLAGS_CLASS_TYPE:
|
|
* @class: a #GFlagsClass
|
|
*
|
|
* Get the type identifier from a given #GFlagsClass structure.
|
|
*
|
|
* Returns: the #GType
|
|
*/
|
|
#define G_FLAGS_CLASS_TYPE(class) (G_TYPE_FROM_CLASS (class))
|
|
/**
|
|
* G_FLAGS_CLASS_TYPE_NAME:
|
|
* @class: a #GFlagsClass
|
|
*
|
|
* Get the static type name from a given #GFlagsClass structure.
|
|
*
|
|
* Returns: the type name.
|
|
*/
|
|
#define G_FLAGS_CLASS_TYPE_NAME(class) (g_type_name (G_FLAGS_CLASS_TYPE (class)))
|
|
|
|
|
|
/**
|
|
* G_VALUE_HOLDS_ENUM:
|
|
* @value: a valid #GValue structure
|
|
*
|
|
* Checks whether the given #GValue can hold values derived from type %G_TYPE_ENUM.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_VALUE_HOLDS_ENUM(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_ENUM))
|
|
/**
|
|
* G_VALUE_HOLDS_FLAGS:
|
|
* @value: a valid #GValue structure
|
|
*
|
|
* Checks whether the given #GValue can hold values derived from type %G_TYPE_FLAGS.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_VALUE_HOLDS_FLAGS(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_FLAGS))
|
|
|
|
|
|
/* --- enum/flag values & classes --- */
|
|
typedef struct _GEnumClass GEnumClass;
|
|
typedef struct _GFlagsClass GFlagsClass;
|
|
typedef struct _GEnumValue GEnumValue;
|
|
typedef struct _GFlagsValue GFlagsValue;
|
|
|
|
/**
|
|
* GEnumClass:
|
|
* @g_type_class: the parent class
|
|
* @minimum: the smallest possible value.
|
|
* @maximum: the largest possible value.
|
|
* @n_values: the number of possible values.
|
|
* @values: an array of #GEnumValue structs describing the
|
|
* individual values.
|
|
*
|
|
* The class of an enumeration type holds information about its
|
|
* possible values.
|
|
*/
|
|
struct _GEnumClass
|
|
{
|
|
GTypeClass g_type_class;
|
|
|
|
/*< public >*/
|
|
gint minimum;
|
|
gint maximum;
|
|
guint n_values;
|
|
GEnumValue *values;
|
|
};
|
|
/**
|
|
* GFlagsClass:
|
|
* @g_type_class: the parent class
|
|
* @mask: a mask covering all possible values.
|
|
* @n_values: the number of possible values.
|
|
* @values: an array of #GFlagsValue structs describing the
|
|
* individual values.
|
|
*
|
|
* The class of a flags type holds information about its
|
|
* possible values.
|
|
*/
|
|
struct _GFlagsClass
|
|
{
|
|
GTypeClass g_type_class;
|
|
|
|
/*< public >*/
|
|
guint mask;
|
|
guint n_values;
|
|
GFlagsValue *values;
|
|
};
|
|
/**
|
|
* GEnumValue:
|
|
* @value: the enum value
|
|
* @value_name: the name of the value
|
|
* @value_nick: the nickname of the value
|
|
*
|
|
* A structure which contains a single enum value, its name, and its
|
|
* nickname.
|
|
*/
|
|
struct _GEnumValue
|
|
{
|
|
gint value;
|
|
const gchar *value_name;
|
|
const gchar *value_nick;
|
|
};
|
|
/**
|
|
* GFlagsValue:
|
|
* @value: the flags value
|
|
* @value_name: the name of the value
|
|
* @value_nick: the nickname of the value
|
|
*
|
|
* A structure which contains a single flags value, its name, and its
|
|
* nickname.
|
|
*/
|
|
struct _GFlagsValue
|
|
{
|
|
guint value;
|
|
const gchar *value_name;
|
|
const gchar *value_nick;
|
|
};
|
|
|
|
|
|
/* --- prototypes --- */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GEnumValue* g_enum_get_value (GEnumClass *enum_class,
|
|
gint value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GEnumValue* g_enum_get_value_by_name (GEnumClass *enum_class,
|
|
const gchar *name);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GEnumValue* g_enum_get_value_by_nick (GEnumClass *enum_class,
|
|
const gchar *nick);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GFlagsValue* g_flags_get_first_value (GFlagsClass *flags_class,
|
|
guint value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GFlagsValue* g_flags_get_value_by_name (GFlagsClass *flags_class,
|
|
const gchar *name);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GFlagsValue* g_flags_get_value_by_nick (GFlagsClass *flags_class,
|
|
const gchar *nick);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_set_enum (GValue *value,
|
|
gint v_enum);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_value_get_enum (const GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_set_flags (GValue *value,
|
|
guint v_flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_value_get_flags (const GValue *value);
|
|
|
|
|
|
|
|
/* --- registration functions --- */
|
|
/* const_static_values is a NULL terminated array of enum/flags
|
|
* values that is taken over!
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_enum_register_static (const gchar *name,
|
|
const GEnumValue *const_static_values);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_flags_register_static (const gchar *name,
|
|
const GFlagsValue *const_static_values);
|
|
/* functions to complete the type information
|
|
* for enums/flags implemented by plugins
|
|
*/
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_enum_complete_type_info (GType g_enum_type,
|
|
GTypeInfo *info,
|
|
const GEnumValue *const_values);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_flags_complete_type_info (GType g_flags_type,
|
|
GTypeInfo *info,
|
|
const GFlagsValue *const_values);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_ENUMS_H__ */
|
|
/* GObject - GLib Type, Object, Parameter and Signal Library
|
|
* Copyright (C) 1997-1999, 2000-2001 Tim Janik and Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General
|
|
* Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* gparamspecs.h: GLib default param specs
|
|
*/
|
|
#ifndef __G_PARAMSPECS_H__
|
|
#define __G_PARAMSPECS_H__
|
|
|
|
#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
|
|
#error "Only <glib-object.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/* --- type macros --- */
|
|
/**
|
|
* G_TYPE_PARAM_CHAR:
|
|
*
|
|
* The #GType of #GParamSpecChar.
|
|
*/
|
|
#define G_TYPE_PARAM_CHAR (g_param_spec_types[0])
|
|
/**
|
|
* G_IS_PARAM_SPEC_CHAR:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_CHAR.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_IS_PARAM_SPEC_CHAR(pspec) (lG_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_CHAR))
|
|
/**
|
|
* G_PARAM_SPEC_CHAR:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Cast a #GParamSpec instance into a #GParamSpecChar.
|
|
*/
|
|
#define G_PARAM_SPEC_CHAR(pspec) (lG_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_CHAR, GParamSpecChar))
|
|
|
|
/**
|
|
* G_TYPE_PARAM_UCHAR:
|
|
*
|
|
* The #GType of #GParamSpecUChar.
|
|
*/
|
|
#define G_TYPE_PARAM_UCHAR (g_param_spec_types[1])
|
|
/**
|
|
* G_IS_PARAM_SPEC_UCHAR:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_UCHAR.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_IS_PARAM_SPEC_UCHAR(pspec) (lG_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UCHAR))
|
|
/**
|
|
* G_PARAM_SPEC_UCHAR:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Cast a #GParamSpec instance into a #GParamSpecUChar.
|
|
*/
|
|
#define G_PARAM_SPEC_UCHAR(pspec) (lG_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_UCHAR, GParamSpecUChar))
|
|
|
|
/**
|
|
* G_TYPE_PARAM_BOOLEAN:
|
|
*
|
|
* The #GType of #GParamSpecBoolean.
|
|
*/
|
|
#define G_TYPE_PARAM_BOOLEAN (g_param_spec_types[2])
|
|
/**
|
|
* G_IS_PARAM_SPEC_BOOLEAN:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_BOOLEAN.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_IS_PARAM_SPEC_BOOLEAN(pspec) (lG_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOOLEAN))
|
|
/**
|
|
* G_PARAM_SPEC_BOOLEAN:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Cast a #GParamSpec instance into a #GParamSpecBoolean.
|
|
*/
|
|
#define G_PARAM_SPEC_BOOLEAN(pspec) (lG_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_BOOLEAN, GParamSpecBoolean))
|
|
|
|
/**
|
|
* G_TYPE_PARAM_INT:
|
|
*
|
|
* The #GType of #GParamSpecInt.
|
|
*/
|
|
#define G_TYPE_PARAM_INT (g_param_spec_types[3])
|
|
/**
|
|
* G_IS_PARAM_SPEC_INT:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_INT.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_IS_PARAM_SPEC_INT(pspec) (lG_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_INT))
|
|
/**
|
|
* G_PARAM_SPEC_INT:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Cast a #GParamSpec instance into a #GParamSpecInt.
|
|
*/
|
|
#define G_PARAM_SPEC_INT(pspec) (lG_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_INT, GParamSpecInt))
|
|
|
|
/**
|
|
* G_TYPE_PARAM_UINT:
|
|
*
|
|
* The #GType of #GParamSpecUInt.
|
|
*/
|
|
#define G_TYPE_PARAM_UINT (g_param_spec_types[4])
|
|
/**
|
|
* G_IS_PARAM_SPEC_UINT:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_UINT.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_IS_PARAM_SPEC_UINT(pspec) (lG_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UINT))
|
|
/**
|
|
* G_PARAM_SPEC_UINT:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Cast a #GParamSpec instance into a #GParamSpecUInt.
|
|
*/
|
|
#define G_PARAM_SPEC_UINT(pspec) (lG_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_UINT, GParamSpecUInt))
|
|
|
|
/**
|
|
* G_TYPE_PARAM_LONG:
|
|
*
|
|
* The #GType of #GParamSpecLong.
|
|
*/
|
|
#define G_TYPE_PARAM_LONG (g_param_spec_types[5])
|
|
/**
|
|
* G_IS_PARAM_SPEC_LONG:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_LONG.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_IS_PARAM_SPEC_LONG(pspec) (lG_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_LONG))
|
|
/**
|
|
* G_PARAM_SPEC_LONG:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Cast a #GParamSpec instance into a #GParamSpecLong.
|
|
*/
|
|
#define G_PARAM_SPEC_LONG(pspec) (lG_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_LONG, GParamSpecLong))
|
|
|
|
/**
|
|
* G_TYPE_PARAM_ULONG:
|
|
*
|
|
* The #GType of #GParamSpecULong.
|
|
*/
|
|
#define G_TYPE_PARAM_ULONG (g_param_spec_types[6])
|
|
/**
|
|
* G_IS_PARAM_SPEC_ULONG:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_ULONG.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_IS_PARAM_SPEC_ULONG(pspec) (lG_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_ULONG))
|
|
/**
|
|
* G_PARAM_SPEC_ULONG:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Cast a #GParamSpec instance into a #GParamSpecULong.
|
|
*/
|
|
#define G_PARAM_SPEC_ULONG(pspec) (lG_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_ULONG, GParamSpecULong))
|
|
|
|
/**
|
|
* G_TYPE_PARAM_INT64:
|
|
*
|
|
* The #GType of #GParamSpecInt64.
|
|
*/
|
|
#define G_TYPE_PARAM_INT64 (g_param_spec_types[7])
|
|
/**
|
|
* G_IS_PARAM_SPEC_INT64:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_INT64.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_IS_PARAM_SPEC_INT64(pspec) (lG_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_INT64))
|
|
/**
|
|
* G_PARAM_SPEC_INT64:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Cast a #GParamSpec instance into a #GParamSpecInt64.
|
|
*/
|
|
#define G_PARAM_SPEC_INT64(pspec) (lG_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_INT64, GParamSpecInt64))
|
|
|
|
/**
|
|
* G_TYPE_PARAM_UINT64:
|
|
*
|
|
* The #GType of #GParamSpecUInt64.
|
|
*/
|
|
#define G_TYPE_PARAM_UINT64 (g_param_spec_types[8])
|
|
/**
|
|
* G_IS_PARAM_SPEC_UINT64:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_UINT64.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_IS_PARAM_SPEC_UINT64(pspec) (lG_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UINT64))
|
|
/**
|
|
* G_PARAM_SPEC_UINT64:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Cast a #GParamSpec instance into a #GParamSpecUInt64.
|
|
*/
|
|
#define G_PARAM_SPEC_UINT64(pspec) (lG_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_UINT64, GParamSpecUInt64))
|
|
|
|
/**
|
|
* G_TYPE_PARAM_UNICHAR:
|
|
*
|
|
* The #GType of #GParamSpecUnichar.
|
|
*/
|
|
#define G_TYPE_PARAM_UNICHAR (g_param_spec_types[9])
|
|
/**
|
|
* G_PARAM_SPEC_UNICHAR:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Cast a #GParamSpec instance into a #GParamSpecUnichar.
|
|
*/
|
|
#define G_PARAM_SPEC_UNICHAR(pspec) (lG_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_UNICHAR, GParamSpecUnichar))
|
|
/**
|
|
* G_IS_PARAM_SPEC_UNICHAR:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_UNICHAR.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_IS_PARAM_SPEC_UNICHAR(pspec) (lG_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UNICHAR))
|
|
|
|
/**
|
|
* G_TYPE_PARAM_ENUM:
|
|
*
|
|
* The #GType of #GParamSpecEnum.
|
|
*/
|
|
#define G_TYPE_PARAM_ENUM (g_param_spec_types[10])
|
|
/**
|
|
* G_IS_PARAM_SPEC_ENUM:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_ENUM.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_IS_PARAM_SPEC_ENUM(pspec) (lG_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_ENUM))
|
|
/**
|
|
* G_PARAM_SPEC_ENUM:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Cast a #GParamSpec instance into a #GParamSpecEnum.
|
|
*/
|
|
#define G_PARAM_SPEC_ENUM(pspec) (lG_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_ENUM, GParamSpecEnum))
|
|
|
|
/**
|
|
* G_TYPE_PARAM_FLAGS:
|
|
*
|
|
* The #GType of #GParamSpecFlags.
|
|
*/
|
|
#define G_TYPE_PARAM_FLAGS (g_param_spec_types[11])
|
|
/**
|
|
* G_IS_PARAM_SPEC_FLAGS:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_FLAGS.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_IS_PARAM_SPEC_FLAGS(pspec) (lG_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_FLAGS))
|
|
/**
|
|
* G_PARAM_SPEC_FLAGS:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Cast a #GParamSpec instance into a #GParamSpecFlags.
|
|
*/
|
|
#define G_PARAM_SPEC_FLAGS(pspec) (lG_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_FLAGS, GParamSpecFlags))
|
|
|
|
/**
|
|
* G_TYPE_PARAM_FLOAT:
|
|
*
|
|
* The #GType of #GParamSpecFloat.
|
|
*/
|
|
#define G_TYPE_PARAM_FLOAT (g_param_spec_types[12])
|
|
/**
|
|
* G_IS_PARAM_SPEC_FLOAT:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_FLOAT.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_IS_PARAM_SPEC_FLOAT(pspec) (lG_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_FLOAT))
|
|
/**
|
|
* G_PARAM_SPEC_FLOAT:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Cast a #GParamSpec instance into a #GParamSpecFloat.
|
|
*/
|
|
#define G_PARAM_SPEC_FLOAT(pspec) (lG_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_FLOAT, GParamSpecFloat))
|
|
|
|
/**
|
|
* G_TYPE_PARAM_DOUBLE:
|
|
*
|
|
* The #GType of #GParamSpecDouble.
|
|
*/
|
|
#define G_TYPE_PARAM_DOUBLE (g_param_spec_types[13])
|
|
/**
|
|
* G_IS_PARAM_SPEC_DOUBLE:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_DOUBLE.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_IS_PARAM_SPEC_DOUBLE(pspec) (lG_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_DOUBLE))
|
|
/**
|
|
* G_PARAM_SPEC_DOUBLE:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Cast a #GParamSpec instance into a #GParamSpecDouble.
|
|
*/
|
|
#define G_PARAM_SPEC_DOUBLE(pspec) (lG_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_DOUBLE, GParamSpecDouble))
|
|
|
|
/**
|
|
* G_TYPE_PARAM_STRING:
|
|
*
|
|
* The #GType of #GParamSpecString.
|
|
*/
|
|
#define G_TYPE_PARAM_STRING (g_param_spec_types[14])
|
|
/**
|
|
* G_IS_PARAM_SPEC_STRING:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_STRING.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_IS_PARAM_SPEC_STRING(pspec) (lG_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_STRING))
|
|
/**
|
|
* G_PARAM_SPEC_STRING:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Casts a #GParamSpec instance into a #GParamSpecString.
|
|
*/
|
|
#define G_PARAM_SPEC_STRING(pspec) (lG_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_STRING, GParamSpecString))
|
|
|
|
/**
|
|
* G_TYPE_PARAM_PARAM:
|
|
*
|
|
* The #GType of #GParamSpecParam.
|
|
*/
|
|
#define G_TYPE_PARAM_PARAM (g_param_spec_types[15])
|
|
/**
|
|
* G_IS_PARAM_SPEC_PARAM:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_PARAM.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_IS_PARAM_SPEC_PARAM(pspec) (lG_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_PARAM))
|
|
/**
|
|
* G_PARAM_SPEC_PARAM:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Casts a #GParamSpec instance into a #GParamSpecParam.
|
|
*/
|
|
#define G_PARAM_SPEC_PARAM(pspec) (lG_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_PARAM, GParamSpecParam))
|
|
|
|
/**
|
|
* G_TYPE_PARAM_BOXED:
|
|
*
|
|
* The #GType of #GParamSpecBoxed.
|
|
*/
|
|
#define G_TYPE_PARAM_BOXED (g_param_spec_types[16])
|
|
/**
|
|
* G_IS_PARAM_SPEC_BOXED:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_BOXED.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_IS_PARAM_SPEC_BOXED(pspec) (lG_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOXED))
|
|
/**
|
|
* G_PARAM_SPEC_BOXED:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Cast a #GParamSpec instance into a #GParamSpecBoxed.
|
|
*/
|
|
#define G_PARAM_SPEC_BOXED(pspec) (lG_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_BOXED, GParamSpecBoxed))
|
|
|
|
/**
|
|
* G_TYPE_PARAM_POINTER:
|
|
*
|
|
* The #GType of #GParamSpecPointer.
|
|
*/
|
|
#define G_TYPE_PARAM_POINTER (g_param_spec_types[17])
|
|
/**
|
|
* G_IS_PARAM_SPEC_POINTER:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_POINTER.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_IS_PARAM_SPEC_POINTER(pspec) (lG_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_POINTER))
|
|
/**
|
|
* G_PARAM_SPEC_POINTER:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Casts a #GParamSpec instance into a #GParamSpecPointer.
|
|
*/
|
|
#define G_PARAM_SPEC_POINTER(pspec) (lG_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_POINTER, GParamSpecPointer))
|
|
|
|
/**
|
|
* G_TYPE_PARAM_VALUE_ARRAY:
|
|
*
|
|
* The #GType of #GParamSpecValueArray.
|
|
*
|
|
* Deprecated: 2.32: Use #GArray instead of #GValueArray
|
|
*/
|
|
#define G_TYPE_PARAM_VALUE_ARRAY (g_param_spec_types[18])
|
|
/**
|
|
* G_IS_PARAM_SPEC_VALUE_ARRAY:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_VALUE_ARRAY.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*
|
|
* Deprecated: 2.32: Use #GArray instead of #GValueArray
|
|
*/
|
|
#define G_IS_PARAM_SPEC_VALUE_ARRAY(pspec) (lG_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_VALUE_ARRAY))
|
|
/**
|
|
* G_PARAM_SPEC_VALUE_ARRAY:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Cast a #GParamSpec instance into a #GParamSpecValueArray.
|
|
*
|
|
* Deprecated: 2.32: Use #GArray instead of #GValueArray
|
|
*/
|
|
#define G_PARAM_SPEC_VALUE_ARRAY(pspec) (lG_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_VALUE_ARRAY, GParamSpecValueArray))
|
|
|
|
/**
|
|
* G_TYPE_PARAM_OBJECT:
|
|
*
|
|
* The #GType of #GParamSpecObject.
|
|
*/
|
|
#define G_TYPE_PARAM_OBJECT (g_param_spec_types[19])
|
|
/**
|
|
* G_IS_PARAM_SPEC_OBJECT:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_OBJECT.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_IS_PARAM_SPEC_OBJECT(pspec) (lG_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT))
|
|
/**
|
|
* G_PARAM_SPEC_OBJECT:
|
|
* @pspec: a valid #GParamSpec instance
|
|
*
|
|
* Casts a #GParamSpec instance into a #GParamSpecObject.
|
|
*/
|
|
#define G_PARAM_SPEC_OBJECT(pspec) (lG_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_OBJECT, GParamSpecObject))
|
|
|
|
/**
|
|
* G_TYPE_PARAM_OVERRIDE:
|
|
*
|
|
* The #GType of #GParamSpecOverride.
|
|
*
|
|
* Since: 2.4
|
|
*/
|
|
#define G_TYPE_PARAM_OVERRIDE (g_param_spec_types[20])
|
|
/**
|
|
* G_IS_PARAM_SPEC_OVERRIDE:
|
|
* @pspec: a #GParamSpec
|
|
*
|
|
* Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_OVERRIDE.
|
|
*
|
|
* Since: 2.4
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_IS_PARAM_SPEC_OVERRIDE(pspec) (lG_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OVERRIDE))
|
|
/**
|
|
* G_PARAM_SPEC_OVERRIDE:
|
|
* @pspec: a #GParamSpec
|
|
*
|
|
* Casts a #GParamSpec into a #GParamSpecOverride.
|
|
*
|
|
* Since: 2.4
|
|
*/
|
|
#define G_PARAM_SPEC_OVERRIDE(pspec) (lG_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_OVERRIDE, GParamSpecOverride))
|
|
|
|
/**
|
|
* G_TYPE_PARAM_GTYPE:
|
|
*
|
|
* The #GType of #GParamSpecGType.
|
|
*
|
|
* Since: 2.10
|
|
*/
|
|
#define G_TYPE_PARAM_GTYPE (g_param_spec_types[21])
|
|
/**
|
|
* G_IS_PARAM_SPEC_GTYPE:
|
|
* @pspec: a #GParamSpec
|
|
*
|
|
* Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_GTYPE.
|
|
*
|
|
* Since: 2.10
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_IS_PARAM_SPEC_GTYPE(pspec) (lG_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_GTYPE))
|
|
/**
|
|
* G_PARAM_SPEC_GTYPE:
|
|
* @pspec: a #GParamSpec
|
|
*
|
|
* Casts a #GParamSpec into a #GParamSpecGType.
|
|
*
|
|
* Since: 2.10
|
|
*/
|
|
#define G_PARAM_SPEC_GTYPE(pspec) (lG_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_GTYPE, GParamSpecGType))
|
|
|
|
/**
|
|
* G_TYPE_PARAM_VARIANT:
|
|
*
|
|
* The #GType of #GParamSpecVariant.
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
#define G_TYPE_PARAM_VARIANT (g_param_spec_types[22])
|
|
/**
|
|
* G_IS_PARAM_SPEC_VARIANT:
|
|
* @pspec: a #GParamSpec
|
|
*
|
|
* Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_VARIANT.
|
|
*
|
|
* Returns: %TRUE on success
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
#define G_IS_PARAM_SPEC_VARIANT(pspec) (lG_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_VARIANT))
|
|
/**
|
|
* G_PARAM_SPEC_VARIANT:
|
|
* @pspec: a #GParamSpec
|
|
*
|
|
* Casts a #GParamSpec into a #GParamSpecVariant.
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
#define G_PARAM_SPEC_VARIANT(pspec) (lG_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_VARIANT, GParamSpecVariant))
|
|
|
|
/* --- typedefs & structures --- */
|
|
typedef struct _GParamSpecChar GParamSpecChar;
|
|
typedef struct _GParamSpecUChar GParamSpecUChar;
|
|
typedef struct _GParamSpecBoolean GParamSpecBoolean;
|
|
typedef struct _GParamSpecInt GParamSpecInt;
|
|
typedef struct _GParamSpecUInt GParamSpecUInt;
|
|
typedef struct _GParamSpecLong GParamSpecLong;
|
|
typedef struct _GParamSpecULong GParamSpecULong;
|
|
typedef struct _GParamSpecInt64 GParamSpecInt64;
|
|
typedef struct _GParamSpecUInt64 GParamSpecUInt64;
|
|
typedef struct _GParamSpecUnichar GParamSpecUnichar;
|
|
typedef struct _GParamSpecEnum GParamSpecEnum;
|
|
typedef struct _GParamSpecFlags GParamSpecFlags;
|
|
typedef struct _GParamSpecFloat GParamSpecFloat;
|
|
typedef struct _GParamSpecDouble GParamSpecDouble;
|
|
typedef struct _GParamSpecString GParamSpecString;
|
|
typedef struct _GParamSpecParam GParamSpecParam;
|
|
typedef struct _GParamSpecBoxed GParamSpecBoxed;
|
|
typedef struct _GParamSpecPointer GParamSpecPointer;
|
|
typedef struct _GParamSpecValueArray GParamSpecValueArray;
|
|
typedef struct _GParamSpecObject GParamSpecObject;
|
|
typedef struct _GParamSpecOverride GParamSpecOverride;
|
|
typedef struct _GParamSpecGType GParamSpecGType;
|
|
typedef struct _GParamSpecVariant GParamSpecVariant;
|
|
|
|
/**
|
|
* GParamSpecChar:
|
|
* @parent_instance: private #GParamSpec portion
|
|
* @minimum: minimum value for the property specified
|
|
* @maximum: maximum value for the property specified
|
|
* @default_value: default value for the property specified
|
|
*
|
|
* A #GParamSpec derived structure that contains the meta data for character properties.
|
|
*/
|
|
struct _GParamSpecChar
|
|
{
|
|
GParamSpec parent_instance;
|
|
|
|
gint8 minimum;
|
|
gint8 maximum;
|
|
gint8 default_value;
|
|
};
|
|
/**
|
|
* GParamSpecUChar:
|
|
* @parent_instance: private #GParamSpec portion
|
|
* @minimum: minimum value for the property specified
|
|
* @maximum: maximum value for the property specified
|
|
* @default_value: default value for the property specified
|
|
*
|
|
* A #GParamSpec derived structure that contains the meta data for unsigned character properties.
|
|
*/
|
|
struct _GParamSpecUChar
|
|
{
|
|
GParamSpec parent_instance;
|
|
|
|
guint8 minimum;
|
|
guint8 maximum;
|
|
guint8 default_value;
|
|
};
|
|
/**
|
|
* GParamSpecBoolean:
|
|
* @parent_instance: private #GParamSpec portion
|
|
* @default_value: default value for the property specified
|
|
*
|
|
* A #GParamSpec derived structure that contains the meta data for boolean properties.
|
|
*/
|
|
struct _GParamSpecBoolean
|
|
{
|
|
GParamSpec parent_instance;
|
|
|
|
gboolean default_value;
|
|
};
|
|
/**
|
|
* GParamSpecInt:
|
|
* @parent_instance: private #GParamSpec portion
|
|
* @minimum: minimum value for the property specified
|
|
* @maximum: maximum value for the property specified
|
|
* @default_value: default value for the property specified
|
|
*
|
|
* A #GParamSpec derived structure that contains the meta data for integer properties.
|
|
*/
|
|
struct _GParamSpecInt
|
|
{
|
|
GParamSpec parent_instance;
|
|
|
|
gint minimum;
|
|
gint maximum;
|
|
gint default_value;
|
|
};
|
|
/**
|
|
* GParamSpecUInt:
|
|
* @parent_instance: private #GParamSpec portion
|
|
* @minimum: minimum value for the property specified
|
|
* @maximum: maximum value for the property specified
|
|
* @default_value: default value for the property specified
|
|
*
|
|
* A #GParamSpec derived structure that contains the meta data for unsigned integer properties.
|
|
*/
|
|
struct _GParamSpecUInt
|
|
{
|
|
GParamSpec parent_instance;
|
|
|
|
guint minimum;
|
|
guint maximum;
|
|
guint default_value;
|
|
};
|
|
/**
|
|
* GParamSpecLong:
|
|
* @parent_instance: private #GParamSpec portion
|
|
* @minimum: minimum value for the property specified
|
|
* @maximum: maximum value for the property specified
|
|
* @default_value: default value for the property specified
|
|
*
|
|
* A #GParamSpec derived structure that contains the meta data for long integer properties.
|
|
*/
|
|
struct _GParamSpecLong
|
|
{
|
|
GParamSpec parent_instance;
|
|
|
|
glong minimum;
|
|
glong maximum;
|
|
glong default_value;
|
|
};
|
|
/**
|
|
* GParamSpecULong:
|
|
* @parent_instance: private #GParamSpec portion
|
|
* @minimum: minimum value for the property specified
|
|
* @maximum: maximum value for the property specified
|
|
* @default_value: default value for the property specified
|
|
*
|
|
* A #GParamSpec derived structure that contains the meta data for unsigned long integer properties.
|
|
*/
|
|
struct _GParamSpecULong
|
|
{
|
|
GParamSpec parent_instance;
|
|
|
|
gulong minimum;
|
|
gulong maximum;
|
|
gulong default_value;
|
|
};
|
|
/**
|
|
* GParamSpecInt64:
|
|
* @parent_instance: private #GParamSpec portion
|
|
* @minimum: minimum value for the property specified
|
|
* @maximum: maximum value for the property specified
|
|
* @default_value: default value for the property specified
|
|
*
|
|
* A #GParamSpec derived structure that contains the meta data for 64bit integer properties.
|
|
*/
|
|
struct _GParamSpecInt64
|
|
{
|
|
GParamSpec parent_instance;
|
|
|
|
gint64 minimum;
|
|
gint64 maximum;
|
|
gint64 default_value;
|
|
};
|
|
/**
|
|
* GParamSpecUInt64:
|
|
* @parent_instance: private #GParamSpec portion
|
|
* @minimum: minimum value for the property specified
|
|
* @maximum: maximum value for the property specified
|
|
* @default_value: default value for the property specified
|
|
*
|
|
* A #GParamSpec derived structure that contains the meta data for unsigned 64bit integer properties.
|
|
*/
|
|
struct _GParamSpecUInt64
|
|
{
|
|
GParamSpec parent_instance;
|
|
|
|
guint64 minimum;
|
|
guint64 maximum;
|
|
guint64 default_value;
|
|
};
|
|
/**
|
|
* GParamSpecUnichar:
|
|
* @parent_instance: private #GParamSpec portion
|
|
* @default_value: default value for the property specified
|
|
*
|
|
* A #GParamSpec derived structure that contains the meta data for unichar (unsigned integer) properties.
|
|
*/
|
|
struct _GParamSpecUnichar
|
|
{
|
|
GParamSpec parent_instance;
|
|
|
|
gunichar default_value;
|
|
};
|
|
/**
|
|
* GParamSpecEnum:
|
|
* @parent_instance: private #GParamSpec portion
|
|
* @enum_class: the #GEnumClass for the enum
|
|
* @default_value: default value for the property specified
|
|
*
|
|
* A #GParamSpec derived structure that contains the meta data for enum
|
|
* properties.
|
|
*/
|
|
struct _GParamSpecEnum
|
|
{
|
|
GParamSpec parent_instance;
|
|
|
|
GEnumClass *enum_class;
|
|
gint default_value;
|
|
};
|
|
/**
|
|
* GParamSpecFlags:
|
|
* @parent_instance: private #GParamSpec portion
|
|
* @flags_class: the #GFlagsClass for the flags
|
|
* @default_value: default value for the property specified
|
|
*
|
|
* A #GParamSpec derived structure that contains the meta data for flags
|
|
* properties.
|
|
*/
|
|
struct _GParamSpecFlags
|
|
{
|
|
GParamSpec parent_instance;
|
|
|
|
GFlagsClass *flags_class;
|
|
guint default_value;
|
|
};
|
|
/**
|
|
* GParamSpecFloat:
|
|
* @parent_instance: private #GParamSpec portion
|
|
* @minimum: minimum value for the property specified
|
|
* @maximum: maximum value for the property specified
|
|
* @default_value: default value for the property specified
|
|
* @epsilon: values closer than @epsilon will be considered identical
|
|
* by g_param_values_cmp(); the default value is 1e-30.
|
|
*
|
|
* A #GParamSpec derived structure that contains the meta data for float properties.
|
|
*/
|
|
struct _GParamSpecFloat
|
|
{
|
|
GParamSpec parent_instance;
|
|
|
|
gfloat minimum;
|
|
gfloat maximum;
|
|
gfloat default_value;
|
|
gfloat epsilon;
|
|
};
|
|
/**
|
|
* GParamSpecDouble:
|
|
* @parent_instance: private #GParamSpec portion
|
|
* @minimum: minimum value for the property specified
|
|
* @maximum: maximum value for the property specified
|
|
* @default_value: default value for the property specified
|
|
* @epsilon: values closer than @epsilon will be considered identical
|
|
* by g_param_values_cmp(); the default value is 1e-90.
|
|
*
|
|
* A #GParamSpec derived structure that contains the meta data for double properties.
|
|
*/
|
|
struct _GParamSpecDouble
|
|
{
|
|
GParamSpec parent_instance;
|
|
|
|
gdouble minimum;
|
|
gdouble maximum;
|
|
gdouble default_value;
|
|
gdouble epsilon;
|
|
};
|
|
/**
|
|
* GParamSpecString:
|
|
* @parent_instance: private #GParamSpec portion
|
|
* @default_value: default value for the property specified
|
|
* @cset_first: a string containing the allowed values for the first byte
|
|
* @cset_nth: a string containing the allowed values for the subsequent bytes
|
|
* @substitutor: the replacement byte for bytes which don't match @cset_first or @cset_nth.
|
|
* @null_fold_if_empty: replace empty string by %NULL
|
|
* @ensure_non_null: replace %NULL strings by an empty string
|
|
*
|
|
* A #GParamSpec derived structure that contains the meta data for string
|
|
* properties.
|
|
*/
|
|
struct _GParamSpecString
|
|
{
|
|
GParamSpec parent_instance;
|
|
|
|
gchar *default_value;
|
|
gchar *cset_first;
|
|
gchar *cset_nth;
|
|
gchar substitutor;
|
|
guint null_fold_if_empty : 1;
|
|
guint ensure_non_null : 1;
|
|
};
|
|
/**
|
|
* GParamSpecParam:
|
|
* @parent_instance: private #GParamSpec portion
|
|
*
|
|
* A #GParamSpec derived structure that contains the meta data for %G_TYPE_PARAM
|
|
* properties.
|
|
*/
|
|
struct _GParamSpecParam
|
|
{
|
|
GParamSpec parent_instance;
|
|
};
|
|
/**
|
|
* GParamSpecBoxed:
|
|
* @parent_instance: private #GParamSpec portion
|
|
*
|
|
* A #GParamSpec derived structure that contains the meta data for boxed properties.
|
|
*/
|
|
struct _GParamSpecBoxed
|
|
{
|
|
GParamSpec parent_instance;
|
|
};
|
|
/**
|
|
* GParamSpecPointer:
|
|
* @parent_instance: private #GParamSpec portion
|
|
*
|
|
* A #GParamSpec derived structure that contains the meta data for pointer properties.
|
|
*/
|
|
struct _GParamSpecPointer
|
|
{
|
|
GParamSpec parent_instance;
|
|
};
|
|
/**
|
|
* GParamSpecValueArray:
|
|
* @parent_instance: private #GParamSpec portion
|
|
* @element_spec: a #GParamSpec describing the elements contained in arrays of this property, may be %NULL
|
|
* @fixed_n_elements: if greater than 0, arrays of this property will always have this many elements
|
|
*
|
|
* A #GParamSpec derived structure that contains the meta data for #GValueArray properties.
|
|
*/
|
|
struct _GParamSpecValueArray
|
|
{
|
|
GParamSpec parent_instance;
|
|
GParamSpec *element_spec;
|
|
guint fixed_n_elements;
|
|
};
|
|
/**
|
|
* GParamSpecObject:
|
|
* @parent_instance: private #GParamSpec portion
|
|
*
|
|
* A #GParamSpec derived structure that contains the meta data for object properties.
|
|
*/
|
|
struct _GParamSpecObject
|
|
{
|
|
GParamSpec parent_instance;
|
|
};
|
|
/**
|
|
* GParamSpecOverride:
|
|
*
|
|
* This is a type of #GParamSpec type that simply redirects operations to
|
|
* another paramspec. All operations other than getting or
|
|
* setting the value are redirected, including accessing the nick and
|
|
* blurb, validating a value, and so forth. See
|
|
* g_param_spec_get_redirect_target() for retrieving the overidden
|
|
* property. #GParamSpecOverride is used in implementing
|
|
* g_object_class_override_property(), and will not be directly useful
|
|
* unless you are implementing a new base type similar to GObject.
|
|
*
|
|
* Since: 2.4
|
|
*/
|
|
struct _GParamSpecOverride
|
|
{
|
|
/*< private >*/
|
|
GParamSpec parent_instance;
|
|
GParamSpec *overridden;
|
|
};
|
|
/**
|
|
* GParamSpecGType:
|
|
* @parent_instance: private #GParamSpec portion
|
|
* @is_a_type: a #GType whose subtypes can occur as values
|
|
*
|
|
* A #GParamSpec derived structure that contains the meta data for #GType properties.
|
|
*
|
|
* Since: 2.10
|
|
*/
|
|
struct _GParamSpecGType
|
|
{
|
|
GParamSpec parent_instance;
|
|
GType is_a_type;
|
|
};
|
|
/**
|
|
* GParamSpecVariant:
|
|
* @parent_instance: private #GParamSpec portion
|
|
* @type: a #GVariantType, or %NULL
|
|
* @default_value: a #GVariant, or %NULL
|
|
*
|
|
* A #GParamSpec derived structure that contains the meta data for #GVariant properties.
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
struct _GParamSpecVariant
|
|
{
|
|
GParamSpec parent_instance;
|
|
GVariantType *type;
|
|
GVariant *default_value;
|
|
|
|
/*< private >*/
|
|
gpointer padding[4];
|
|
};
|
|
|
|
/* --- GParamSpec prototypes --- */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_param_spec_char (const gchar *name,
|
|
const gchar *nick,
|
|
const gchar *blurb,
|
|
gint8 minimum,
|
|
gint8 maximum,
|
|
gint8 default_value,
|
|
GParamFlags flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_param_spec_uchar (const gchar *name,
|
|
const gchar *nick,
|
|
const gchar *blurb,
|
|
guint8 minimum,
|
|
guint8 maximum,
|
|
guint8 default_value,
|
|
GParamFlags flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_param_spec_boolean (const gchar *name,
|
|
const gchar *nick,
|
|
const gchar *blurb,
|
|
gboolean default_value,
|
|
GParamFlags flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_param_spec_int (const gchar *name,
|
|
const gchar *nick,
|
|
const gchar *blurb,
|
|
gint minimum,
|
|
gint maximum,
|
|
gint default_value,
|
|
GParamFlags flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_param_spec_uint (const gchar *name,
|
|
const gchar *nick,
|
|
const gchar *blurb,
|
|
guint minimum,
|
|
guint maximum,
|
|
guint default_value,
|
|
GParamFlags flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_param_spec_long (const gchar *name,
|
|
const gchar *nick,
|
|
const gchar *blurb,
|
|
glong minimum,
|
|
glong maximum,
|
|
glong default_value,
|
|
GParamFlags flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_param_spec_ulong (const gchar *name,
|
|
const gchar *nick,
|
|
const gchar *blurb,
|
|
gulong minimum,
|
|
gulong maximum,
|
|
gulong default_value,
|
|
GParamFlags flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_param_spec_int64 (const gchar *name,
|
|
const gchar *nick,
|
|
const gchar *blurb,
|
|
gint64 minimum,
|
|
gint64 maximum,
|
|
gint64 default_value,
|
|
GParamFlags flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_param_spec_uint64 (const gchar *name,
|
|
const gchar *nick,
|
|
const gchar *blurb,
|
|
guint64 minimum,
|
|
guint64 maximum,
|
|
guint64 default_value,
|
|
GParamFlags flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_param_spec_unichar (const gchar *name,
|
|
const gchar *nick,
|
|
const gchar *blurb,
|
|
gunichar default_value,
|
|
GParamFlags flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_param_spec_enum (const gchar *name,
|
|
const gchar *nick,
|
|
const gchar *blurb,
|
|
GType enum_type,
|
|
gint default_value,
|
|
GParamFlags flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_param_spec_flags (const gchar *name,
|
|
const gchar *nick,
|
|
const gchar *blurb,
|
|
GType flags_type,
|
|
guint default_value,
|
|
GParamFlags flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_param_spec_float (const gchar *name,
|
|
const gchar *nick,
|
|
const gchar *blurb,
|
|
gfloat minimum,
|
|
gfloat maximum,
|
|
gfloat default_value,
|
|
GParamFlags flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_param_spec_double (const gchar *name,
|
|
const gchar *nick,
|
|
const gchar *blurb,
|
|
gdouble minimum,
|
|
gdouble maximum,
|
|
gdouble default_value,
|
|
GParamFlags flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_param_spec_string (const gchar *name,
|
|
const gchar *nick,
|
|
const gchar *blurb,
|
|
const gchar *default_value,
|
|
GParamFlags flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_param_spec_param (const gchar *name,
|
|
const gchar *nick,
|
|
const gchar *blurb,
|
|
GType param_type,
|
|
GParamFlags flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_param_spec_boxed (const gchar *name,
|
|
const gchar *nick,
|
|
const gchar *blurb,
|
|
GType boxed_type,
|
|
GParamFlags flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_param_spec_pointer (const gchar *name,
|
|
const gchar *nick,
|
|
const gchar *blurb,
|
|
GParamFlags flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_param_spec_value_array (const gchar *name,
|
|
const gchar *nick,
|
|
const gchar *blurb,
|
|
GParamSpec *element_spec,
|
|
GParamFlags flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_param_spec_object (const gchar *name,
|
|
const gchar *nick,
|
|
const gchar *blurb,
|
|
GType object_type,
|
|
GParamFlags flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_param_spec_override (const gchar *name,
|
|
GParamSpec *overridden);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_param_spec_gtype (const gchar *name,
|
|
const gchar *nick,
|
|
const gchar *blurb,
|
|
GType is_a_type,
|
|
GParamFlags flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GParamSpec* g_param_spec_variant (const gchar *name,
|
|
const gchar *nick,
|
|
const gchar *blurb,
|
|
const GVariantType *type,
|
|
GVariant *default_value,
|
|
GParamFlags flags);
|
|
|
|
/* --- internal --- */
|
|
/* We prefix variable declarations so they can
|
|
* properly get exported in windows dlls.
|
|
*/
|
|
#ifndef GOBJECT_VAR
|
|
# ifdef G_PLATFORM_WIN32
|
|
# ifdef GOBJECT_STATIC_COMPILATION
|
|
# define GOBJECT_VAR extern
|
|
# else /* !GOBJECT_STATIC_COMPILATION */
|
|
# ifdef GOBJECT_COMPILATION
|
|
# ifdef DLL_EXPORT
|
|
# define GOBJECT_VAR __declspec(dllexport)
|
|
# else /* !DLL_EXPORT */
|
|
# define GOBJECT_VAR extern
|
|
# endif /* !DLL_EXPORT */
|
|
# else /* !GOBJECT_COMPILATION */
|
|
# define GOBJECT_VAR extern __declspec(dllimport)
|
|
# endif /* !GOBJECT_COMPILATION */
|
|
# endif /* !GOBJECT_STATIC_COMPILATION */
|
|
# else /* !G_PLATFORM_WIN32 */
|
|
# define GOBJECT_VAR _GLIB_EXTERN
|
|
# endif /* !G_PLATFORM_WIN32 */
|
|
#endif /* GOBJECT_VAR */
|
|
|
|
GOBJECT_VAR GType *g_param_spec_types;
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_PARAMSPECS_H__ */
|
|
/* GObject - GLib Type, Object, Parameter and Signal Library
|
|
* Copyright (C) 2001 Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General
|
|
* Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#ifndef __G_SOURCECLOSURE_H__
|
|
#define __G_SOURCECLOSURE_H__
|
|
|
|
#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
|
|
#error "Only <glib-object.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_source_set_closure (GSource *source,
|
|
GClosure *closure);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_source_set_dummy_callback (GSource *source);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_SOURCECLOSURE_H__ */
|
|
/* GObject - GLib Type, Object, Parameter and Signal Library
|
|
* Copyright (C) 2000 Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#ifndef __G_TYPE_MODULE_H__
|
|
#define __G_TYPE_MODULE_H__
|
|
|
|
#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
|
|
#error "Only <glib-object.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GTypeModule GTypeModule;
|
|
typedef struct _GTypeModuleClass GTypeModuleClass;
|
|
|
|
#define G_TYPE_TYPE_MODULE (g_type_module_get_type ())
|
|
#define G_TYPE_MODULE(module) (lG_TYPE_CHECK_INSTANCE_CAST ((module), G_TYPE_TYPE_MODULE, GTypeModule))
|
|
#define G_TYPE_MODULE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_TYPE_MODULE, GTypeModuleClass))
|
|
#define G_IS_TYPE_MODULE(module) (lG_TYPE_CHECK_INSTANCE_TYPE ((module), G_TYPE_TYPE_MODULE))
|
|
#define G_IS_TYPE_MODULE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_TYPE_MODULE))
|
|
#define G_TYPE_MODULE_GET_CLASS(module) (G_TYPE_INSTANCE_GET_CLASS ((module), G_TYPE_TYPE_MODULE, GTypeModuleClass))
|
|
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GTypeModule, g_object_unref)
|
|
|
|
/**
|
|
* GTypeModule:
|
|
* @name: the name of the module
|
|
*
|
|
* The members of the GTypeModule structure should not
|
|
* be accessed directly, except for the @name field.
|
|
*/
|
|
struct _GTypeModule
|
|
{
|
|
GObject parent_instance;
|
|
|
|
guint use_count;
|
|
GSList *type_infos;
|
|
GSList *interface_infos;
|
|
|
|
/*< public >*/
|
|
gchar *name;
|
|
};
|
|
|
|
/**
|
|
* GTypeModuleClass:
|
|
* @parent_class: the parent class
|
|
* @load: loads the module and registers one or more types using
|
|
* g_type_module_register_type().
|
|
* @unload: unloads the module
|
|
*
|
|
* In order to implement dynamic loading of types based on #GTypeModule,
|
|
* the @load and @unload functions in #GTypeModuleClass must be implemented.
|
|
*/
|
|
struct _GTypeModuleClass
|
|
{
|
|
GObjectClass parent_class;
|
|
|
|
/*< public >*/
|
|
gboolean (* load) (GTypeModule *module);
|
|
void (* unload) (GTypeModule *module);
|
|
|
|
/*< private >*/
|
|
/* Padding for future expansion */
|
|
void (*reserved1) (void);
|
|
void (*reserved2) (void);
|
|
void (*reserved3) (void);
|
|
void (*reserved4) (void);
|
|
};
|
|
|
|
/**
|
|
* G_DEFINE_DYNAMIC_TYPE:
|
|
* @TN: The name of the new type, in Camel case.
|
|
* @t_n: The name of the new type, in lowercase, with words
|
|
* separated by '_'.
|
|
* @T_P: The #GType of the parent type.
|
|
*
|
|
* A convenience macro for dynamic type implementations, which declares a
|
|
* class initialization function, an instance initialization function (see
|
|
* #GTypeInfo for information about these) and a static variable named
|
|
* @t_n<!-- -->_parent_class pointing to the parent class. Furthermore,
|
|
* it defines a `*_get_type()` and a static `*_register_type()` functions
|
|
* for use in your `module_init()`.
|
|
*
|
|
* See G_DEFINE_DYNAMIC_TYPE_EXTENDED() for an example.
|
|
*
|
|
* Since: 2.14
|
|
*/
|
|
#define G_DEFINE_DYNAMIC_TYPE(TN, t_n, T_P) G_DEFINE_DYNAMIC_TYPE_EXTENDED (TN, t_n, T_P, 0, {})
|
|
/**
|
|
* G_DEFINE_DYNAMIC_TYPE_EXTENDED:
|
|
* @TypeName: The name of the new type, in Camel case.
|
|
* @type_name: The name of the new type, in lowercase, with words
|
|
* separated by '_'.
|
|
* @TYPE_PARENT: The #GType of the parent type.
|
|
* @flags: #GTypeFlags to pass to g_type_module_register_type()
|
|
* @CODE: Custom code that gets inserted in the *_get_type() function.
|
|
*
|
|
* A more general version of G_DEFINE_DYNAMIC_TYPE() which
|
|
* allows to specify #GTypeFlags and custom code.
|
|
*
|
|
* |[
|
|
* G_DEFINE_DYNAMIC_TYPE_EXTENDED (GtkGadget,
|
|
* gtk_gadget,
|
|
* GTK_TYPE_THING,
|
|
* 0,
|
|
* G_IMPLEMENT_INTERFACE_DYNAMIC (TYPE_GIZMO,
|
|
* gtk_gadget_gizmo_init));
|
|
* ]|
|
|
* expands to
|
|
* |[
|
|
* static void gtk_gadget_init (GtkGadget *self);
|
|
* static void gtk_gadget_class_init (GtkGadgetClass *klass);
|
|
* static void gtk_gadget_class_finalize (GtkGadgetClass *klass);
|
|
*
|
|
* static gpointer gtk_gadget_parent_class = NULL;
|
|
* static GType gtk_gadget_type_id = 0;
|
|
*
|
|
* static void gtk_gadget_class_intern_init (gpointer klass)
|
|
* {
|
|
* gtk_gadget_parent_class = g_type_class_peek_parent (klass);
|
|
* gtk_gadget_class_init ((GtkGadgetClass*) klass);
|
|
* }
|
|
*
|
|
* GType
|
|
* gtk_gadget_get_type (void)
|
|
* {
|
|
* return gtk_gadget_type_id;
|
|
* }
|
|
*
|
|
* static void
|
|
* gtk_gadget_register_type (GTypeModule *type_module)
|
|
* {
|
|
* const GTypeInfo g_define_type_info = {
|
|
* sizeof (GtkGadgetClass),
|
|
* (GBaseInitFunc) NULL,
|
|
* (GBaseFinalizeFunc) NULL,
|
|
* (GClassInitFunc) gtk_gadget_class_intern_init,
|
|
* (GClassFinalizeFunc) gtk_gadget_class_finalize,
|
|
* NULL, // class_data
|
|
* sizeof (GtkGadget),
|
|
* 0, // n_preallocs
|
|
* (GInstanceInitFunc) gtk_gadget_init,
|
|
* NULL // value_table
|
|
* };
|
|
* gtk_gadget_type_id = g_type_module_register_type (type_module,
|
|
* GTK_TYPE_THING,
|
|
* "GtkGadget",
|
|
* &g_define_type_info,
|
|
* (GTypeFlags) flags);
|
|
* {
|
|
* const GInterfaceInfo g_implement_interface_info = {
|
|
* (GInterfaceInitFunc) gtk_gadget_gizmo_init
|
|
* };
|
|
* g_type_module_add_interface (type_module, g_define_type_id, TYPE_GIZMO, &g_implement_interface_info);
|
|
* }
|
|
* }
|
|
* ]|
|
|
*
|
|
* Since: 2.14
|
|
*/
|
|
#define G_DEFINE_DYNAMIC_TYPE_EXTENDED(TypeName, type_name, TYPE_PARENT, flags, CODE) \
|
|
static void type_name##_init (TypeName *self); \
|
|
static void type_name##_class_init (TypeName##Class *klass); \
|
|
static void type_name##_class_finalize (TypeName##Class *klass); \
|
|
static gpointer type_name##_parent_class = NULL; \
|
|
static GType type_name##_type_id = 0; \
|
|
static gint TypeName##_private_offset; \
|
|
\
|
|
_G_DEFINE_TYPE_EXTENDED_CLASS_INIT(TypeName, type_name) \
|
|
\
|
|
G_GNUC_UNUSED \
|
|
static inline gpointer \
|
|
type_name##_get_instance_private (TypeName *self) \
|
|
{ \
|
|
return (G_STRUCT_MEMBER_P (self, TypeName##_private_offset)); \
|
|
} \
|
|
\
|
|
GType \
|
|
type_name##_get_type (void) \
|
|
{ \
|
|
return type_name##_type_id; \
|
|
} \
|
|
static void \
|
|
type_name##_register_type (GTypeModule *type_module) \
|
|
{ \
|
|
GType g_define_type_id G_GNUC_UNUSED; \
|
|
const GTypeInfo g_define_type_info = { \
|
|
sizeof (TypeName##Class), \
|
|
(GBaseInitFunc) NULL, \
|
|
(GBaseFinalizeFunc) NULL, \
|
|
(GClassInitFunc) type_name##_class_intern_init, \
|
|
(GClassFinalizeFunc) type_name##_class_finalize, \
|
|
NULL, /* class_data */ \
|
|
sizeof (TypeName), \
|
|
0, /* n_preallocs */ \
|
|
(GInstanceInitFunc) type_name##_init, \
|
|
NULL /* value_table */ \
|
|
}; \
|
|
type_name##_type_id = g_type_module_register_type (type_module, \
|
|
TYPE_PARENT, \
|
|
#TypeName, \
|
|
&g_define_type_info, \
|
|
(GTypeFlags) flags); \
|
|
g_define_type_id = type_name##_type_id; \
|
|
{ CODE ; } \
|
|
}
|
|
|
|
/**
|
|
* G_IMPLEMENT_INTERFACE_DYNAMIC:
|
|
* @TYPE_IFACE: The #GType of the interface to add
|
|
* @iface_init: The interface init function
|
|
*
|
|
* A convenience macro to ease interface addition in the @_C_ section
|
|
* of G_DEFINE_DYNAMIC_TYPE_EXTENDED(). See G_DEFINE_DYNAMIC_TYPE_EXTENDED()
|
|
* for an example.
|
|
*
|
|
* Note that this macro can only be used together with the
|
|
* G_DEFINE_DYNAMIC_TYPE_EXTENDED macros, since it depends on variable
|
|
* names from that macro.
|
|
*
|
|
* Since: 2.24
|
|
*/
|
|
#define G_IMPLEMENT_INTERFACE_DYNAMIC(TYPE_IFACE, iface_init) { \
|
|
const GInterfaceInfo g_implement_interface_info = { \
|
|
(GInterfaceInitFunc) iface_init, NULL, NULL \
|
|
}; \
|
|
g_type_module_add_interface (type_module, g_define_type_id, TYPE_IFACE, &g_implement_interface_info); \
|
|
}
|
|
|
|
/**
|
|
* G_ADD_PRIVATE_DYNAMIC:
|
|
* @TypeName: the name of the type in CamelCase
|
|
*
|
|
* A convenience macro to ease adding private data to instances of a new dynamic
|
|
* type in the @_C_ section of G_DEFINE_DYNAMIC_TYPE_EXTENDED(). See
|
|
* G_ADD_PRIVATE() for details, it is similar but for static types.
|
|
*
|
|
* Note that this macro can only be used together with the
|
|
* G_DEFINE_DYNAMIC_TYPE_EXTENDED macros, since it depends on variable
|
|
* names from that macro.
|
|
*
|
|
* Since: 2.38
|
|
*/
|
|
#define G_ADD_PRIVATE_DYNAMIC(TypeName) { \
|
|
TypeName##_private_offset = sizeof (TypeName##Private); \
|
|
}
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_type_module_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_type_module_use (GTypeModule *module);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_type_module_unuse (GTypeModule *module);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_type_module_set_name (GTypeModule *module,
|
|
const gchar *name);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_type_module_register_type (GTypeModule *module,
|
|
GType parent_type,
|
|
const gchar *type_name,
|
|
const GTypeInfo *type_info,
|
|
GTypeFlags flags);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_type_module_add_interface (GTypeModule *module,
|
|
GType instance_type,
|
|
GType interface_type,
|
|
const GInterfaceInfo *interface_info);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_type_module_register_enum (GTypeModule *module,
|
|
const gchar *name,
|
|
const GEnumValue *const_static_values);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_type_module_register_flags (GTypeModule *module,
|
|
const gchar *name,
|
|
const GFlagsValue *const_static_values);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_TYPE_MODULE_H__ */
|
|
/* GObject - GLib Type, Object, Parameter and Signal Library
|
|
* Copyright (C) 2000 Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General
|
|
* Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#ifndef __G_TYPE_PLUGIN_H__
|
|
#define __G_TYPE_PLUGIN_H__
|
|
|
|
#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
|
|
#error "Only <glib-object.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/* --- type macros --- */
|
|
#define G_TYPE_TYPE_PLUGIN (g_type_plugin_get_type ())
|
|
#define G_TYPE_PLUGIN(inst) (lG_TYPE_CHECK_INSTANCE_CAST ((inst), G_TYPE_TYPE_PLUGIN, GTypePlugin))
|
|
#define G_TYPE_PLUGIN_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), G_TYPE_TYPE_PLUGIN, GTypePluginClass))
|
|
#define G_IS_TYPE_PLUGIN(inst) (lG_TYPE_CHECK_INSTANCE_TYPE ((inst), G_TYPE_TYPE_PLUGIN))
|
|
#define G_IS_TYPE_PLUGIN_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), G_TYPE_TYPE_PLUGIN))
|
|
#define G_TYPE_PLUGIN_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), G_TYPE_TYPE_PLUGIN, GTypePluginClass))
|
|
|
|
|
|
/* --- typedefs & structures --- */
|
|
typedef struct _GTypePluginClass GTypePluginClass;
|
|
/**
|
|
* GTypePluginUse:
|
|
* @plugin: the #GTypePlugin whose use count should be increased
|
|
*
|
|
* The type of the @use_plugin function of #GTypePluginClass, which gets called
|
|
* to increase the use count of @plugin.
|
|
*/
|
|
typedef void (*GTypePluginUse) (GTypePlugin *plugin);
|
|
/**
|
|
* GTypePluginUnuse:
|
|
* @plugin: the #GTypePlugin whose use count should be decreased
|
|
*
|
|
* The type of the @unuse_plugin function of #GTypePluginClass.
|
|
*/
|
|
typedef void (*GTypePluginUnuse) (GTypePlugin *plugin);
|
|
/**
|
|
* GTypePluginCompleteTypeInfo:
|
|
* @plugin: the #GTypePlugin
|
|
* @g_type: the #GType whose info is completed
|
|
* @info: the #GTypeInfo struct to fill in
|
|
* @value_table: the #GTypeValueTable to fill in
|
|
*
|
|
* The type of the @complete_type_info function of #GTypePluginClass.
|
|
*/
|
|
typedef void (*GTypePluginCompleteTypeInfo) (GTypePlugin *plugin,
|
|
GType g_type,
|
|
GTypeInfo *info,
|
|
GTypeValueTable *value_table);
|
|
/**
|
|
* GTypePluginCompleteInterfaceInfo:
|
|
* @plugin: the #GTypePlugin
|
|
* @instance_type: the #GType of an instantiable type to which the interface
|
|
* is added
|
|
* @interface_type: the #GType of the interface whose info is completed
|
|
* @info: the #GInterfaceInfo to fill in
|
|
*
|
|
* The type of the @complete_interface_info function of #GTypePluginClass.
|
|
*/
|
|
typedef void (*GTypePluginCompleteInterfaceInfo) (GTypePlugin *plugin,
|
|
GType instance_type,
|
|
GType interface_type,
|
|
GInterfaceInfo *info);
|
|
/**
|
|
* GTypePlugin:
|
|
*
|
|
* The GTypePlugin typedef is used as a placeholder
|
|
* for objects that implement the GTypePlugin interface.
|
|
*/
|
|
/**
|
|
* GTypePluginClass:
|
|
* @use_plugin: Increases the use count of the plugin.
|
|
* @unuse_plugin: Decreases the use count of the plugin.
|
|
* @complete_type_info: Fills in the #GTypeInfo and
|
|
* #GTypeValueTable structs for the type. The structs are initialized
|
|
* with `memset(s, 0, sizeof (s))` before calling this function.
|
|
* @complete_interface_info: Fills in missing parts of the #GInterfaceInfo
|
|
* for the interface. The structs is initialized with
|
|
* `memset(s, 0, sizeof (s))` before calling this function.
|
|
*
|
|
* The #GTypePlugin interface is used by the type system in order to handle
|
|
* the lifecycle of dynamically loaded types.
|
|
*/
|
|
struct _GTypePluginClass
|
|
{
|
|
/*< private >*/
|
|
GTypeInterface base_iface;
|
|
|
|
/*< public >*/
|
|
GTypePluginUse use_plugin;
|
|
GTypePluginUnuse unuse_plugin;
|
|
GTypePluginCompleteTypeInfo complete_type_info;
|
|
GTypePluginCompleteInterfaceInfo complete_interface_info;
|
|
};
|
|
|
|
|
|
/* --- prototypes --- */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_type_plugin_get_type (void) G_GNUC_CONST;
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_type_plugin_use (GTypePlugin *plugin);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_type_plugin_unuse (GTypePlugin *plugin);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_type_plugin_complete_type_info (GTypePlugin *plugin,
|
|
GType g_type,
|
|
GTypeInfo *info,
|
|
GTypeValueTable *value_table);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_type_plugin_complete_interface_info (GTypePlugin *plugin,
|
|
GType instance_type,
|
|
GType interface_type,
|
|
GInterfaceInfo *info);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_TYPE_PLUGIN_H__ */
|
|
/* GObject - GLib Type, Object, Parameter and Signal Library
|
|
* Copyright (C) 2001 Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General
|
|
* Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* gvaluearray.h: GLib array type holding GValues
|
|
*/
|
|
#ifndef __G_VALUE_ARRAY_H__
|
|
#define __G_VALUE_ARRAY_H__
|
|
|
|
#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
|
|
#error "Only <glib-object.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/**
|
|
* G_TYPE_VALUE_ARRAY:
|
|
*
|
|
* The type ID of the "GValueArray" type which is a boxed type,
|
|
* used to pass around pointers to GValueArrays.
|
|
*
|
|
* Deprecated: 2.32: Use #GArray instead of #GValueArray
|
|
*/
|
|
#define G_TYPE_VALUE_ARRAY (g_value_array_get_type ())
|
|
|
|
/* --- typedefs & structs --- */
|
|
typedef struct _GValueArray GValueArray;
|
|
/**
|
|
* GValueArray:
|
|
* @n_values: number of values contained in the array
|
|
* @values: array of values
|
|
*
|
|
* A #GValueArray contains an array of #GValue elements.
|
|
*/
|
|
struct _GValueArray
|
|
{
|
|
guint n_values;
|
|
GValue *values;
|
|
|
|
/*< private >*/
|
|
guint n_prealloced;
|
|
};
|
|
|
|
/* --- prototypes --- */
|
|
GLIB_DEPRECATED_IN_2_32_FOR(GArray)
|
|
GType g_value_array_get_type (void) G_GNUC_CONST;
|
|
|
|
GLIB_DEPRECATED_IN_2_32_FOR(GArray)
|
|
GValue* g_value_array_get_nth (GValueArray *value_array,
|
|
guint index_);
|
|
|
|
GLIB_DEPRECATED_IN_2_32_FOR(GArray)
|
|
GValueArray* g_value_array_new (guint n_prealloced);
|
|
|
|
GLIB_DEPRECATED_IN_2_32_FOR(GArray)
|
|
void g_value_array_free (GValueArray *value_array);
|
|
|
|
GLIB_DEPRECATED_IN_2_32_FOR(GArray)
|
|
GValueArray* g_value_array_copy (const GValueArray *value_array);
|
|
|
|
GLIB_DEPRECATED_IN_2_32_FOR(GArray)
|
|
GValueArray* g_value_array_prepend (GValueArray *value_array,
|
|
const GValue *value);
|
|
|
|
GLIB_DEPRECATED_IN_2_32_FOR(GArray)
|
|
GValueArray* g_value_array_append (GValueArray *value_array,
|
|
const GValue *value);
|
|
|
|
GLIB_DEPRECATED_IN_2_32_FOR(GArray)
|
|
GValueArray* g_value_array_insert (GValueArray *value_array,
|
|
guint index_,
|
|
const GValue *value);
|
|
|
|
GLIB_DEPRECATED_IN_2_32_FOR(GArray)
|
|
GValueArray* g_value_array_remove (GValueArray *value_array,
|
|
guint index_);
|
|
|
|
GLIB_DEPRECATED_IN_2_32_FOR(GArray)
|
|
GValueArray* g_value_array_sort (GValueArray *value_array,
|
|
GCompareFunc compare_func);
|
|
|
|
GLIB_DEPRECATED_IN_2_32_FOR(GArray)
|
|
GValueArray* g_value_array_sort_with_data (GValueArray *value_array,
|
|
GCompareDataFunc compare_func,
|
|
gpointer user_data);
|
|
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_VALUE_ARRAY_H__ */
|
|
/* GObject - GLib Type, Object, Parameter and Signal Library
|
|
* Copyright (C) 1997-1999, 2000-2001 Tim Janik and Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General
|
|
* Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* gvaluetypes.h: GLib default values
|
|
*/
|
|
#ifndef __G_VALUETYPES_H__
|
|
#define __G_VALUETYPES_H__
|
|
|
|
#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
|
|
#error "Only <glib-object.h> can be included directly."
|
|
#endif
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/* --- type macros --- */
|
|
/**
|
|
* G_VALUE_HOLDS_CHAR:
|
|
* @value: a valid #GValue structure
|
|
*
|
|
* Checks whether the given #GValue can hold values of type %G_TYPE_CHAR.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_VALUE_HOLDS_CHAR(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_CHAR))
|
|
/**
|
|
* G_VALUE_HOLDS_UCHAR:
|
|
* @value: a valid #GValue structure
|
|
*
|
|
* Checks whether the given #GValue can hold values of type %G_TYPE_UCHAR.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_VALUE_HOLDS_UCHAR(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_UCHAR))
|
|
/**
|
|
* G_VALUE_HOLDS_BOOLEAN:
|
|
* @value: a valid #GValue structure
|
|
*
|
|
* Checks whether the given #GValue can hold values of type %G_TYPE_BOOLEAN.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_VALUE_HOLDS_BOOLEAN(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_BOOLEAN))
|
|
/**
|
|
* G_VALUE_HOLDS_INT:
|
|
* @value: a valid #GValue structure
|
|
*
|
|
* Checks whether the given #GValue can hold values of type %G_TYPE_INT.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_VALUE_HOLDS_INT(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_INT))
|
|
/**
|
|
* G_VALUE_HOLDS_UINT:
|
|
* @value: a valid #GValue structure
|
|
*
|
|
* Checks whether the given #GValue can hold values of type %G_TYPE_UINT.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_VALUE_HOLDS_UINT(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_UINT))
|
|
/**
|
|
* G_VALUE_HOLDS_LONG:
|
|
* @value: a valid #GValue structure
|
|
*
|
|
* Checks whether the given #GValue can hold values of type %G_TYPE_LONG.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_VALUE_HOLDS_LONG(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_LONG))
|
|
/**
|
|
* G_VALUE_HOLDS_ULONG:
|
|
* @value: a valid #GValue structure
|
|
*
|
|
* Checks whether the given #GValue can hold values of type %G_TYPE_ULONG.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_VALUE_HOLDS_ULONG(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_ULONG))
|
|
/**
|
|
* G_VALUE_HOLDS_INT64:
|
|
* @value: a valid #GValue structure
|
|
*
|
|
* Checks whether the given #GValue can hold values of type %G_TYPE_INT64.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_VALUE_HOLDS_INT64(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_INT64))
|
|
/**
|
|
* G_VALUE_HOLDS_UINT64:
|
|
* @value: a valid #GValue structure
|
|
*
|
|
* Checks whether the given #GValue can hold values of type %G_TYPE_UINT64.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_VALUE_HOLDS_UINT64(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_UINT64))
|
|
/**
|
|
* G_VALUE_HOLDS_FLOAT:
|
|
* @value: a valid #GValue structure
|
|
*
|
|
* Checks whether the given #GValue can hold values of type %G_TYPE_FLOAT.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_VALUE_HOLDS_FLOAT(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_FLOAT))
|
|
/**
|
|
* G_VALUE_HOLDS_DOUBLE:
|
|
* @value: a valid #GValue structure
|
|
*
|
|
* Checks whether the given #GValue can hold values of type %G_TYPE_DOUBLE.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_VALUE_HOLDS_DOUBLE(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_DOUBLE))
|
|
/**
|
|
* G_VALUE_HOLDS_STRING:
|
|
* @value: a valid #GValue structure
|
|
*
|
|
* Checks whether the given #GValue can hold values of type %G_TYPE_STRING.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_VALUE_HOLDS_STRING(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_STRING))
|
|
/**
|
|
* G_VALUE_HOLDS_POINTER:
|
|
* @value: a valid #GValue structure
|
|
*
|
|
* Checks whether the given #GValue can hold values of type %G_TYPE_POINTER.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_VALUE_HOLDS_POINTER(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_POINTER))
|
|
/**
|
|
* G_TYPE_GTYPE:
|
|
*
|
|
* The type for #GType.
|
|
*/
|
|
#define G_TYPE_GTYPE (g_gtype_get_type())
|
|
/**
|
|
* G_VALUE_HOLDS_GTYPE:
|
|
* @value: a valid #GValue structure
|
|
*
|
|
* Checks whether the given #GValue can hold values of type %G_TYPE_GTYPE.
|
|
*
|
|
* Since: 2.12
|
|
* Returns: %TRUE on success.
|
|
*/
|
|
#define G_VALUE_HOLDS_GTYPE(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_GTYPE))
|
|
/**
|
|
* G_VALUE_HOLDS_VARIANT:
|
|
* @value: a valid #GValue structure
|
|
*
|
|
* Checks whether the given #GValue can hold values of type %G_TYPE_VARIANT.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
#define G_VALUE_HOLDS_VARIANT(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_VARIANT))
|
|
|
|
|
|
/* --- prototypes --- */
|
|
GLIB_DEPRECATED_IN_2_32_FOR(g_value_set_schar)
|
|
void g_value_set_char (GValue *value,
|
|
gchar v_char);
|
|
GLIB_DEPRECATED_IN_2_32_FOR(g_value_get_schar)
|
|
gchar g_value_get_char (const GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_set_schar (GValue *value,
|
|
gint8 v_char);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint8 g_value_get_schar (const GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_set_uchar (GValue *value,
|
|
guchar v_uchar);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guchar g_value_get_uchar (const GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_set_boolean (GValue *value,
|
|
gboolean v_boolean);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_value_get_boolean (const GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_set_int (GValue *value,
|
|
gint v_int);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint g_value_get_int (const GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_set_uint (GValue *value,
|
|
guint v_uint);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint g_value_get_uint (const GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_set_long (GValue *value,
|
|
glong v_long);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
glong g_value_get_long (const GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_set_ulong (GValue *value,
|
|
gulong v_ulong);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gulong g_value_get_ulong (const GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_set_int64 (GValue *value,
|
|
gint64 v_int64);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gint64 g_value_get_int64 (const GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_set_uint64 (GValue *value,
|
|
guint64 v_uint64);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
guint64 g_value_get_uint64 (const GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_set_float (GValue *value,
|
|
gfloat v_float);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gfloat g_value_get_float (const GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_set_double (GValue *value,
|
|
gdouble v_double);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gdouble g_value_get_double (const GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_set_string (GValue *value,
|
|
const gchar *v_string);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_set_static_string (GValue *value,
|
|
const gchar *v_string);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
const gchar * g_value_get_string (const GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_value_dup_string (const GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_set_pointer (GValue *value,
|
|
gpointer v_pointer);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gpointer g_value_get_pointer (const GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_gtype_get_type (void);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_set_gtype (GValue *value,
|
|
GType v_gtype);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_value_get_gtype (const GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_set_variant (GValue *value,
|
|
GVariant *variant);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_take_variant (GValue *value,
|
|
GVariant *variant);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant* g_value_get_variant (const GValue *value);
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GVariant* g_value_dup_variant (const GValue *value);
|
|
|
|
|
|
/* Convenience for registering new pointer types */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
GType g_pointer_type_register_static (const gchar *name);
|
|
|
|
/* debugging aid, describe value contents as string */
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar* g_strdup_value_contents (const GValue *value);
|
|
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
void g_value_take_string (GValue *value,
|
|
gchar *v_string);
|
|
GLIB_DEPRECATED_FOR(g_value_take_string)
|
|
void g_value_set_string_take_ownership (GValue *value,
|
|
gchar *v_string);
|
|
|
|
|
|
/* humpf, need a C representable type name for G_TYPE_STRING */
|
|
/**
|
|
* gchararray:
|
|
*
|
|
* A C representable type name for #G_TYPE_STRING.
|
|
*/
|
|
typedef gchar* gchararray;
|
|
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __G_VALUETYPES_H__ */
|
|
|
|
/*
|
|
* Copyright © 2015 Canonical Limited
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the licence, 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* Author: Ryan Lortie <desrt@desrt.ca>
|
|
*/
|
|
|
|
#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
|
|
#error "Only <glib-object.h> can be included directly."
|
|
#endif
|
|
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GObject, g_object_unref)
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GInitiallyUnowned, g_object_unref)
|
|
G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(GValue, g_value_unset)
|
|
|
|
#undef __GLIB_GOBJECT_H_INSIDE__
|
|
|
|
GLIB_AVAILABLE_IN_2_50
|
|
void gobject_init (void);
|
|
|
|
#endif /* __GLIB_GOBJECT_H__ */
|
|
|
|
#define GUM_TYPE_API_RESOLVER (gum_api_resolver_get_type ())
|
|
#define GUM_API_RESOLVER(obj) (lG_TYPE_CHECK_INSTANCE_CAST ((obj),\
|
|
GUM_TYPE_API_RESOLVER, GumApiResolver))
|
|
#define GUM_API_RESOLVER_CAST(obj) ((GumApiResolver *) (obj))
|
|
#define GUM_IS_API_RESOLVER(obj) (lG_TYPE_CHECK_INSTANCE_TYPE ((obj),\
|
|
GUM_TYPE_API_RESOLVER))
|
|
#define GUM_API_RESOLVER_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE (\
|
|
(inst), GUM_TYPE_API_RESOLVER, GumApiResolverIface))
|
|
|
|
typedef struct _GumApiResolver GumApiResolver;
|
|
typedef struct _GumApiResolverIface GumApiResolverIface;
|
|
|
|
typedef struct _GumApiDetails GumApiDetails;
|
|
|
|
typedef gboolean (* GumFoundApiFunc) (const GumApiDetails * details,
|
|
gpointer user_data);
|
|
|
|
struct _GumApiResolverIface
|
|
{
|
|
GTypeInterface parent;
|
|
|
|
void (* enumerate_matches) (GumApiResolver * self, const gchar * query,
|
|
GumFoundApiFunc func, gpointer user_data, GError ** error);
|
|
};
|
|
|
|
struct _GumApiDetails
|
|
{
|
|
const gchar * name;
|
|
GumAddress address;
|
|
};
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
GUM_API GType gum_api_resolver_get_type (void);
|
|
|
|
GUM_API GumApiResolver * gum_api_resolver_make (const gchar * type);
|
|
|
|
GUM_API void gum_api_resolver_enumerate_matches (GumApiResolver * self,
|
|
const gchar * query, GumFoundApiFunc func, gpointer user_data,
|
|
GError ** error);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif
|
|
/*
|
|
* Copyright (C) 2008-2010 Ole André Vadla Ravnås <ole.andre.ravnas@tillitech.com>
|
|
*
|
|
* Licence: wxWindows Library Licence, Version 3.1
|
|
*/
|
|
|
|
#ifndef __GUM_BACKTRACER_H__
|
|
#define __GUM_BACKTRACER_H__
|
|
|
|
/*
|
|
* Copyright (C) 2008-2010 Ole André Vadla Ravnås <ole.andre.ravnas@tillitech.com>
|
|
*
|
|
* Licence: wxWindows Library Licence, Version 3.1
|
|
*/
|
|
|
|
#ifndef __GUM_RETURN_ADDRESS_H__
|
|
#define __GUM_RETURN_ADDRESS_H__
|
|
|
|
|
|
typedef struct _GumReturnAddressDetails GumReturnAddressDetails;
|
|
typedef gpointer GumReturnAddress;
|
|
typedef struct _GumReturnAddressArray GumReturnAddressArray;
|
|
|
|
struct _GumReturnAddressDetails
|
|
{
|
|
GumReturnAddress address;
|
|
gchar module_name[GUM_MAX_PATH + 1];
|
|
gchar function_name[GUM_MAX_SYMBOL_NAME + 1];
|
|
gchar file_name[GUM_MAX_PATH + 1];
|
|
guint line_number;
|
|
};
|
|
|
|
struct _GumReturnAddressArray
|
|
{
|
|
guint len;
|
|
GumReturnAddress items[GUM_MAX_BACKTRACE_DEPTH];
|
|
};
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
GUM_API gboolean gum_return_address_details_from_address (
|
|
GumReturnAddress address, GumReturnAddressDetails * details);
|
|
|
|
GUM_API gboolean gum_return_address_array_is_equal (
|
|
const GumReturnAddressArray * array1,
|
|
const GumReturnAddressArray * array2);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif
|
|
|
|
#define GUM_TYPE_BACKTRACER (gum_backtracer_get_type ())
|
|
#define GUM_BACKTRACER(obj) (lG_TYPE_CHECK_INSTANCE_CAST ((obj),\
|
|
GUM_TYPE_BACKTRACER, GumBacktracer))
|
|
#define GUM_BACKTRACER_CAST(obj) ((GumBacktracer *) (obj))
|
|
#define GUM_IS_BACKTRACER(obj) (lG_TYPE_CHECK_INSTANCE_TYPE ((obj),\
|
|
GUM_TYPE_BACKTRACER))
|
|
#define GUM_BACKTRACER_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE (\
|
|
(inst), GUM_TYPE_BACKTRACER, GumBacktracerIface))
|
|
|
|
typedef struct _GumBacktracer GumBacktracer;
|
|
typedef struct _GumBacktracerIface GumBacktracerIface;
|
|
|
|
struct _GumBacktracerIface
|
|
{
|
|
GTypeInterface parent;
|
|
|
|
void (* generate) (GumBacktracer * self, const GumCpuContext * cpu_context,
|
|
GumReturnAddressArray * return_addresses);
|
|
};
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
GType gum_backtracer_get_type (void);
|
|
|
|
GUM_API GumBacktracer * gum_backtracer_make_accurate (void);
|
|
GUM_API GumBacktracer * gum_backtracer_make_fuzzy (void);
|
|
|
|
GUM_API void gum_backtracer_generate (GumBacktracer * self,
|
|
const GumCpuContext * cpu_context,
|
|
GumReturnAddressArray * return_addresses);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif
|
|
/*
|
|
* Copyright (C) 2017 Ole André Vadla Ravnås <oleavr@nowsecure.com>
|
|
*
|
|
* Licence: wxWindows Library Licence, Version 3.1
|
|
*/
|
|
|
|
#ifndef __GUM_CLOAK_H__
|
|
#define __GUM_CLOAK_H__
|
|
|
|
/*
|
|
* Copyright (C) 2008-2010 Ole André Vadla Ravnås <ole.andre.ravnas@tillitech.com>
|
|
* Copyright (C) 2008 Christian Berentsen <jc.berentsen@gmail.com>
|
|
*
|
|
* Licence: wxWindows Library Licence, Version 3.1
|
|
*/
|
|
|
|
#ifndef __GUM_MEMORY_H__
|
|
#define __GUM_MEMORY_H__
|
|
|
|
|
|
typedef guint GumMemoryOperation;
|
|
typedef guint GumPageProtection;
|
|
typedef struct _GumAddressSpec GumAddressSpec;
|
|
typedef struct _GumMemoryRange GumMemoryRange;
|
|
typedef struct _GumMatchPattern GumMatchPattern;
|
|
|
|
typedef gboolean (* GumMemoryIsNearFunc) (gpointer memory, gpointer address);
|
|
|
|
enum _GumMemoryOperation
|
|
{
|
|
GUM_MEMOP_INVALID,
|
|
GUM_MEMOP_READ,
|
|
GUM_MEMOP_WRITE,
|
|
GUM_MEMOP_EXECUTE
|
|
};
|
|
|
|
enum _GumPageProtection
|
|
{
|
|
GUM_PAGE_NO_ACCESS = 0,
|
|
GUM_PAGE_READ = (1 << 0),
|
|
GUM_PAGE_WRITE = (1 << 1),
|
|
GUM_PAGE_EXECUTE = (1 << 2),
|
|
};
|
|
|
|
struct _GumAddressSpec
|
|
{
|
|
gpointer near_address;
|
|
gsize max_distance;
|
|
};
|
|
|
|
struct _GumMemoryRange
|
|
{
|
|
GumAddress base_address;
|
|
gsize size;
|
|
};
|
|
|
|
#define GUM_MEMORY_RANGE_INCLUDES(r, a) ((a) >= (r)->base_address && \
|
|
(a) < ((r)->base_address + (r)->size))
|
|
|
|
#define GUM_PAGE_RW ((GumPageProtection) (GUM_PAGE_READ | GUM_PAGE_WRITE))
|
|
#define GUM_PAGE_RX ((GumPageProtection) (GUM_PAGE_READ | GUM_PAGE_EXECUTE))
|
|
#define GUM_PAGE_RWX ((GumPageProtection) (GUM_PAGE_READ | GUM_PAGE_WRITE | GUM_PAGE_EXECUTE))
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef void (* GumMemoryPatchApplyFunc) (gpointer mem, gpointer user_data);
|
|
typedef gboolean (* GumMemoryScanMatchFunc) (GumAddress address, gsize size,
|
|
gpointer user_data);
|
|
|
|
void gum_memory_init (void);
|
|
void gum_memory_deinit (void);
|
|
|
|
guint gum_query_page_size (void);
|
|
gboolean gum_query_is_rwx_supported (void);
|
|
gboolean gum_memory_is_readable (GumAddress address, gsize len);
|
|
guint8 * gum_memory_read (GumAddress address, gsize len, gsize * n_bytes_read);
|
|
gboolean gum_memory_write (GumAddress address, const guint8 * bytes, gsize len);
|
|
gboolean gum_memory_patch_code (GumAddress address, gsize size,
|
|
GumMemoryPatchApplyFunc apply, gpointer apply_data);
|
|
|
|
void gum_memory_scan (const GumMemoryRange * range,
|
|
const GumMatchPattern * pattern,
|
|
GumMemoryScanMatchFunc func, gpointer user_data);
|
|
|
|
GumMatchPattern * gum_match_pattern_new_from_string (const gchar * match_str);
|
|
void gum_match_pattern_free (GumMatchPattern * pattern);
|
|
|
|
void gum_mprotect (gpointer address, gsize size, GumPageProtection page_prot);
|
|
gboolean gum_try_mprotect (gpointer address, gsize size, GumPageProtection page_prot);
|
|
|
|
void gum_clear_cache (gpointer address, gsize size);
|
|
|
|
#define gum_new(struct_type, n_structs) \
|
|
((struct_type *) gum_malloc (n_structs * sizeof (struct_type)))
|
|
#define gum_new0(struct_type, n_structs) \
|
|
((struct_type *) gum_malloc0 (n_structs * sizeof (struct_type)))
|
|
|
|
guint gum_peek_private_memory_usage (void);
|
|
|
|
gpointer gum_malloc (gsize size);
|
|
gpointer gum_malloc0 (gsize size);
|
|
gpointer gum_calloc (gsize count, gsize size);
|
|
gpointer gum_realloc (gpointer mem, gsize size);
|
|
gpointer gum_memdup (gconstpointer mem, gsize byte_size);
|
|
void gum_free (gpointer mem);
|
|
|
|
gpointer gum_alloc_n_pages (guint n_pages, GumPageProtection page_prot);
|
|
gpointer gum_alloc_n_pages_near (guint n_pages, GumPageProtection page_prot,
|
|
const GumAddressSpec * address_spec);
|
|
gpointer gum_try_alloc_n_pages_near (guint n_pages, GumPageProtection page_prot,
|
|
const GumAddressSpec * address_spec);
|
|
void gum_free_pages (gpointer mem);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif
|
|
/*
|
|
* Copyright (C) 2008-2015 Ole André Vadla Ravnås <ole.andre.ravnas@tillitech.com>
|
|
*
|
|
* Licence: wxWindows Library Licence, Version 3.1
|
|
*/
|
|
|
|
#ifndef __GUM_PROCESS_H__
|
|
#define __GUM_PROCESS_H__
|
|
|
|
|
|
typedef gsize GumThreadId;
|
|
typedef guint GumThreadState;
|
|
typedef struct _GumThreadDetails GumThreadDetails;
|
|
typedef struct _GumModuleDetails GumModuleDetails;
|
|
typedef guint GumImportType;
|
|
typedef guint GumExportType;
|
|
typedef struct _GumImportDetails GumImportDetails;
|
|
typedef struct _GumExportDetails GumExportDetails;
|
|
typedef struct _GumRangeDetails GumRangeDetails;
|
|
typedef struct _GumFileMapping GumFileMapping;
|
|
typedef struct _GumMallocRangeDetails GumMallocRangeDetails;
|
|
|
|
enum _GumThreadState
|
|
{
|
|
GUM_THREAD_RUNNING = 1,
|
|
GUM_THREAD_STOPPED,
|
|
GUM_THREAD_WAITING,
|
|
GUM_THREAD_UNINTERRUPTIBLE,
|
|
GUM_THREAD_HALTED
|
|
};
|
|
|
|
struct _GumThreadDetails
|
|
{
|
|
GumThreadId id;
|
|
GumThreadState state;
|
|
GumCpuContext cpu_context;
|
|
};
|
|
|
|
struct _GumModuleDetails
|
|
{
|
|
const gchar * name;
|
|
const GumMemoryRange * range;
|
|
const gchar * path;
|
|
};
|
|
|
|
enum _GumImportType
|
|
{
|
|
GUM_IMPORT_UNKNOWN,
|
|
GUM_IMPORT_FUNCTION,
|
|
GUM_IMPORT_VARIABLE
|
|
};
|
|
|
|
enum _GumExportType
|
|
{
|
|
GUM_EXPORT_FUNCTION = 1,
|
|
GUM_EXPORT_VARIABLE
|
|
};
|
|
|
|
struct _GumImportDetails
|
|
{
|
|
GumImportType type;
|
|
const gchar * name;
|
|
const gchar * module;
|
|
GumAddress address;
|
|
};
|
|
|
|
struct _GumExportDetails
|
|
{
|
|
GumExportType type;
|
|
const gchar * name;
|
|
GumAddress address;
|
|
};
|
|
|
|
struct _GumRangeDetails
|
|
{
|
|
const GumMemoryRange * range;
|
|
GumPageProtection prot;
|
|
const GumFileMapping * file;
|
|
};
|
|
|
|
struct _GumFileMapping
|
|
{
|
|
const gchar * path;
|
|
guint64 offset;
|
|
};
|
|
|
|
struct _GumMallocRangeDetails
|
|
{
|
|
const GumMemoryRange * range;
|
|
};
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef void (* GumModifyThreadFunc) (GumThreadId thread_id,
|
|
GumCpuContext * cpu_context, gpointer user_data);
|
|
typedef gboolean (* GumFoundThreadFunc) (const GumThreadDetails * details,
|
|
gpointer user_data);
|
|
typedef gboolean (* GumFoundModuleFunc) (const GumModuleDetails * details,
|
|
gpointer user_data);
|
|
typedef gboolean (* GumFoundImportFunc) (const GumImportDetails * details,
|
|
gpointer user_data);
|
|
typedef gboolean (* GumFoundExportFunc) (const GumExportDetails * details,
|
|
gpointer user_data);
|
|
typedef gboolean (* GumFoundRangeFunc) (const GumRangeDetails * details,
|
|
gpointer user_data);
|
|
typedef gboolean (* GumFoundMallocRangeFunc) (
|
|
const GumMallocRangeDetails * details, gpointer user_data);
|
|
|
|
GUM_API GumOS gum_process_get_native_os (void);
|
|
GUM_API gboolean gum_process_is_debugger_attached (void);
|
|
GUM_API GumThreadId gum_process_get_current_thread_id (void);
|
|
GUM_API gboolean gum_process_modify_thread (GumThreadId thread_id,
|
|
GumModifyThreadFunc func, gpointer user_data);
|
|
GUM_API void gum_process_enumerate_threads (GumFoundThreadFunc func,
|
|
gpointer user_data);
|
|
GUM_API void gum_process_enumerate_modules (GumFoundModuleFunc func,
|
|
gpointer user_data);
|
|
GUM_API void gum_process_enumerate_ranges (GumPageProtection prot,
|
|
GumFoundRangeFunc func, gpointer user_data);
|
|
GUM_API void gum_process_enumerate_malloc_ranges (
|
|
GumFoundMallocRangeFunc func, gpointer user_data);
|
|
GUM_API gboolean gum_thread_try_get_range (GumMemoryRange * range);
|
|
GUM_API gint gum_thread_get_system_error (void);
|
|
GUM_API void gum_thread_set_system_error (gint value);
|
|
GUM_API void gum_module_enumerate_imports (const gchar * module_name,
|
|
GumFoundImportFunc func, gpointer user_data);
|
|
GUM_API void gum_module_enumerate_exports (const gchar * module_name,
|
|
GumFoundExportFunc func, gpointer user_data);
|
|
GUM_API void gum_module_enumerate_ranges (const gchar * module_name,
|
|
GumPageProtection prot, GumFoundRangeFunc func, gpointer user_data);
|
|
GUM_API GumAddress gum_module_find_base_address (const gchar * module_name);
|
|
GUM_API GumAddress gum_module_find_export_by_name (const gchar * module_name,
|
|
const gchar * symbol_name);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
GUM_API void gum_cloak_add_thread (GumThreadId id);
|
|
GUM_API void gum_cloak_remove_thread (GumThreadId id);
|
|
GUM_API gboolean gum_cloak_has_thread (GumThreadId id);
|
|
|
|
GUM_API void gum_cloak_add_range (const GumMemoryRange * range);
|
|
GUM_API void gum_cloak_remove_range (const GumMemoryRange * range);
|
|
GUM_API GArray * gum_cloak_clip_range (const GumMemoryRange * range);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif
|
|
/*
|
|
* Copyright (C) 2010 Ole André Vadla Ravnås <ole.andre.ravnas@tillitech.com>
|
|
*
|
|
* Licence: wxWindows Library Licence, Version 3.1
|
|
*/
|
|
|
|
#ifndef __GUM_CODE_ALLOCATOR_H__
|
|
#define __GUM_CODE_ALLOCATOR_H__
|
|
|
|
|
|
typedef struct _GumCodeAllocator GumCodeAllocator;
|
|
typedef struct _GumCodeSlice GumCodeSlice;
|
|
typedef struct _GumCodeDeflector GumCodeDeflector;
|
|
|
|
struct _GumCodeAllocator
|
|
{
|
|
gsize slice_size;
|
|
gsize pages_per_batch;
|
|
gsize slices_per_batch;
|
|
gsize pages_metadata_size;
|
|
|
|
GSList * uncommitted_pages;
|
|
GHashTable * dirty_pages;
|
|
GList * free_slices;
|
|
|
|
GSList * dispatchers;
|
|
};
|
|
|
|
struct _GumCodeSlice
|
|
{
|
|
gpointer data;
|
|
gsize size;
|
|
};
|
|
|
|
struct _GumCodeDeflector
|
|
{
|
|
gpointer return_address;
|
|
gpointer target;
|
|
gpointer trampoline;
|
|
};
|
|
|
|
void gum_code_allocator_init (GumCodeAllocator * allocator, gsize slice_size);
|
|
void gum_code_allocator_free (GumCodeAllocator * allocator);
|
|
|
|
GumCodeSlice * gum_code_allocator_alloc_slice (GumCodeAllocator * self);
|
|
GumCodeSlice * gum_code_allocator_try_alloc_slice_near (GumCodeAllocator * self,
|
|
const GumAddressSpec * spec, gsize alignment);
|
|
void gum_code_allocator_commit (GumCodeAllocator * self);
|
|
void gum_code_slice_free (GumCodeSlice * slice);
|
|
|
|
GumCodeDeflector * gum_code_allocator_alloc_deflector (GumCodeAllocator * self,
|
|
const GumAddressSpec * caller, gpointer return_address, gpointer target,
|
|
gboolean dedicated);
|
|
void gum_code_deflector_free (GumCodeDeflector * deflector);
|
|
|
|
#endif
|
|
/*
|
|
* Copyright (C) 2016 Ole André Vadla Ravnås <oleavr@nowsecure.com>
|
|
*
|
|
* Licence: wxWindows Library Licence, Version 3.1
|
|
*/
|
|
|
|
#ifndef __GUM_CODE_SEGMENT_H__
|
|
#define __GUM_CODE_SEGMENT_H__
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GumCodeSegment GumCodeSegment;
|
|
|
|
gboolean gum_code_segment_is_supported (void);
|
|
|
|
GumCodeSegment * gum_code_segment_new (gsize size, const GumAddressSpec * spec);
|
|
void gum_code_segment_free (GumCodeSegment * segment);
|
|
|
|
gpointer gum_code_segment_get_address (GumCodeSegment * self);
|
|
gsize gum_code_segment_get_size (GumCodeSegment * self);
|
|
gsize gum_code_segment_get_virtual_size (GumCodeSegment * self);
|
|
|
|
void gum_code_segment_realize (GumCodeSegment * self);
|
|
void gum_code_segment_map (GumCodeSegment * self, gsize source_offset,
|
|
gsize source_size, gpointer target_address);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif
|
|
/*
|
|
* Copyright (C) 2009 Ole André Vadla Ravnås <ole.andre.ravnas@tillitech.com>
|
|
*
|
|
* Licence: wxWindows Library Licence, Version 3.1
|
|
*/
|
|
|
|
#ifndef __GUM_EVENT_H__
|
|
#define __GUM_EVENT_H__
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef guint GumEventType;
|
|
|
|
typedef union _GumEvent GumEvent;
|
|
|
|
typedef struct _GumAnyEvent GumAnyEvent;
|
|
typedef struct _GumCallEvent GumCallEvent;
|
|
typedef struct _GumRetEvent GumRetEvent;
|
|
typedef struct _GumExecEvent GumExecEvent;
|
|
|
|
enum _GumEventType
|
|
{
|
|
GUM_NOTHING = 0,
|
|
GUM_CALL = 1 << 0,
|
|
GUM_RET = 1 << 1,
|
|
GUM_EXEC = 1 << 2,
|
|
};
|
|
|
|
struct _GumAnyEvent
|
|
{
|
|
GumEventType type;
|
|
};
|
|
|
|
struct _GumCallEvent
|
|
{
|
|
GumEventType type;
|
|
|
|
gpointer location;
|
|
gpointer target;
|
|
gint depth;
|
|
};
|
|
|
|
struct _GumRetEvent
|
|
{
|
|
GumEventType type;
|
|
|
|
gpointer location;
|
|
gpointer target;
|
|
gint depth;
|
|
};
|
|
|
|
struct _GumExecEvent
|
|
{
|
|
GumEventType type;
|
|
|
|
gpointer location;
|
|
};
|
|
|
|
union _GumEvent
|
|
{
|
|
GumEventType type;
|
|
|
|
GumAnyEvent any;
|
|
GumCallEvent call;
|
|
GumRetEvent ret;
|
|
GumExecEvent exec;
|
|
};
|
|
|
|
G_END_DECLS
|
|
|
|
#endif
|
|
/*
|
|
* Copyright (C) 2009 Ole André Vadla Ravnås <ole.andre.ravnas@tillitech.com>
|
|
*
|
|
* Licence: wxWindows Library Licence, Version 3.1
|
|
*/
|
|
|
|
#ifndef __GUM_EVENT_SINK_H__
|
|
#define __GUM_EVENT_SINK_H__
|
|
|
|
|
|
#define GUM_TYPE_EVENT_SINK (gum_event_sink_get_type ())
|
|
#define GUM_EVENT_SINK(obj) (lG_TYPE_CHECK_INSTANCE_CAST ((obj),\
|
|
GUM_TYPE_EVENT_SINK, GumEventSink))
|
|
#define GUM_IS_EVENT_SINK(obj) (lG_TYPE_CHECK_INSTANCE_TYPE ((obj),\
|
|
GUM_TYPE_EVENT_SINK))
|
|
#define GUM_EVENT_SINK_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE (\
|
|
(inst), GUM_TYPE_EVENT_SINK, GumEventSinkIface))
|
|
|
|
typedef struct _GumEventSink GumEventSink;
|
|
typedef struct _GumEventSinkIface GumEventSinkIface;
|
|
|
|
struct _GumEventSinkIface
|
|
{
|
|
GTypeInterface parent;
|
|
|
|
GumEventType (* query_mask) (GumEventSink * self);
|
|
void (* start) (GumEventSink * self);
|
|
void (* process) (GumEventSink * self, const GumEvent * ev);
|
|
void (* stop) (GumEventSink * self);
|
|
};
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
GType gum_event_sink_get_type (void);
|
|
|
|
GUM_API GumEventType gum_event_sink_query_mask (GumEventSink * self);
|
|
GUM_API void gum_event_sink_start (GumEventSink * self);
|
|
GUM_API void gum_event_sink_process (GumEventSink * self, const GumEvent * ev);
|
|
GUM_API void gum_event_sink_stop (GumEventSink * self);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif
|
|
/*
|
|
* Copyright (C) 2015-2016 Ole André Vadla Ravnås <oleavr@nowsecure.com>
|
|
*
|
|
* Licence: wxWindows Library Licence, Version 3.1
|
|
*/
|
|
|
|
#ifndef __GUM_EXCEPTOR_H__
|
|
#define __GUM_EXCEPTOR_H__
|
|
|
|
#include <setjmp.h>
|
|
|
|
#define GUM_TYPE_EXCEPTOR (gum_exceptor_get_type ())
|
|
#define GUM_EXCEPTOR(obj) (lG_TYPE_CHECK_INSTANCE_CAST ((obj),\
|
|
GUM_TYPE_EXCEPTOR, GumExceptor))
|
|
#define GUM_EXCEPTOR_CAST(obj) ((GumExceptor *) (obj))
|
|
#define GUM_EXCEPTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass),\
|
|
GUM_TYPE_EXCEPTOR, GumExceptorClass))
|
|
#define GUM_IS_EXCEPTOR(obj) (lG_TYPE_CHECK_INSTANCE_TYPE ((obj),\
|
|
GUM_TYPE_EXCEPTOR))
|
|
#define GUM_IS_EXCEPTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE (\
|
|
(klass), GUM_TYPE_EXCEPTOR))
|
|
#define GUM_EXCEPTOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (\
|
|
(obj), GUM_TYPE_EXCEPTOR, GumExceptorClass))
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
#if defined (G_OS_WIN32) || defined (__APPLE__)
|
|
# define GUM_NATIVE_SETJMP(env) setjmp (env)
|
|
# define GUM_NATIVE_LONGJMP longjmp
|
|
typedef jmp_buf GumExceptorNativeJmpBuf;
|
|
#else
|
|
# define GUM_NATIVE_SETJMP(env) sigsetjmp (env, TRUE)
|
|
# define GUM_NATIVE_LONGJMP siglongjmp
|
|
typedef sigjmp_buf GumExceptorNativeJmpBuf;
|
|
#endif
|
|
|
|
typedef struct _GumExceptor GumExceptor;
|
|
typedef struct _GumExceptorClass GumExceptorClass;
|
|
typedef struct _GumExceptorPrivate GumExceptorPrivate;
|
|
|
|
typedef struct _GumExceptionDetails GumExceptionDetails;
|
|
typedef guint GumExceptionType;
|
|
typedef struct _GumExceptionMemoryDetails GumExceptionMemoryDetails;
|
|
typedef gboolean (* GumExceptionHandler) (GumExceptionDetails * details,
|
|
gpointer user_data);
|
|
|
|
typedef struct _GumExceptorScope GumExceptorScope;
|
|
|
|
struct _GumExceptor
|
|
{
|
|
GObject parent;
|
|
|
|
GumExceptorPrivate * priv;
|
|
};
|
|
|
|
struct _GumExceptorClass
|
|
{
|
|
GObjectClass parent_class;
|
|
};
|
|
|
|
enum _GumExceptionType
|
|
{
|
|
GUM_EXCEPTION_ABORT = 1,
|
|
GUM_EXCEPTION_ACCESS_VIOLATION,
|
|
GUM_EXCEPTION_GUARD_PAGE,
|
|
GUM_EXCEPTION_ILLEGAL_INSTRUCTION,
|
|
GUM_EXCEPTION_STACK_OVERFLOW,
|
|
GUM_EXCEPTION_ARITHMETIC,
|
|
GUM_EXCEPTION_BREAKPOINT,
|
|
GUM_EXCEPTION_SINGLE_STEP,
|
|
GUM_EXCEPTION_SYSTEM
|
|
};
|
|
|
|
struct _GumExceptionMemoryDetails
|
|
{
|
|
GumMemoryOperation operation;
|
|
gpointer address;
|
|
};
|
|
|
|
struct _GumExceptionDetails
|
|
{
|
|
GumThreadId thread_id;
|
|
GumExceptionType type;
|
|
gpointer address;
|
|
GumExceptionMemoryDetails memory;
|
|
GumCpuContext context;
|
|
gpointer native_context;
|
|
};
|
|
|
|
struct _GumExceptorScope
|
|
{
|
|
GumExceptionDetails exception;
|
|
|
|
/*< private */
|
|
gboolean exception_occurred;
|
|
gpointer padding[2];
|
|
jmp_buf env;
|
|
#ifdef __ANDROID__
|
|
sigset_t mask;
|
|
#endif
|
|
|
|
GumExceptorScope * next;
|
|
};
|
|
|
|
GUM_API GType gum_exceptor_get_type (void) G_GNUC_CONST;
|
|
|
|
GUM_API GumExceptor * gum_exceptor_obtain (void);
|
|
|
|
GUM_API void gum_exceptor_add (GumExceptor * self, GumExceptionHandler func,
|
|
gpointer user_data);
|
|
GUM_API void gum_exceptor_remove (GumExceptor * self, GumExceptionHandler func,
|
|
gpointer user_data);
|
|
|
|
#if defined (_MSC_VER) && GLIB_SIZEOF_VOID_P == 8
|
|
/*
|
|
* On MSVC/64-bit setjmp() is actually an intrinsic that calls _setjmp() with a
|
|
* a hidden second argument specifying the frame pointer. This makes sense when
|
|
* the longjmp() is guaranteed to happen from code we control, but is not
|
|
* reliable otherwise.
|
|
*/
|
|
# define gum_exceptor_try(self, scope) \
|
|
_gum_exceptor_prepare_try (self, scope), \
|
|
((int (*) (jmp_buf env, void * frame_pointer)) _setjmp) ( \
|
|
(scope)->env, NULL) == 0
|
|
#else
|
|
# define gum_exceptor_try(self, scope) \
|
|
_gum_exceptor_prepare_try (self, scope), \
|
|
GUM_NATIVE_SETJMP ((scope)->env) == 0
|
|
#endif
|
|
GUM_API gboolean gum_exceptor_catch (GumExceptor * self,
|
|
GumExceptorScope * scope);
|
|
|
|
GUM_API gchar * gum_exception_details_to_string (
|
|
const GumExceptionDetails * details);
|
|
|
|
GUM_API void _gum_exceptor_prepare_try (GumExceptor * self,
|
|
GumExceptorScope * scope);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif
|
|
/*
|
|
* Copyright (C) 2009 Ole André Vadla Ravnås <ole.andre.ravnas@tillitech.com>
|
|
*
|
|
* Licence: wxWindows Library Licence, Version 3.1
|
|
*/
|
|
|
|
#ifndef __GUM_FUNCTION_H__
|
|
#define __GUM_FUNCTION_H__
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GumFunctionDetails GumFunctionDetails;
|
|
|
|
struct _GumFunctionDetails
|
|
{
|
|
const gchar * name;
|
|
gpointer address;
|
|
gint num_arguments;
|
|
};
|
|
|
|
G_END_DECLS
|
|
|
|
#endif
|
|
/*
|
|
* Copyright (C) 2008-2010 Ole André Vadla Ravnås <ole.andre.ravnas@tillitech.com>
|
|
* Copyright (C) 2008 Christian Berentsen <jc.berentsen@gmail.com>
|
|
*
|
|
* Licence: wxWindows Library Licence, Version 3.1
|
|
*/
|
|
|
|
#ifndef __GUM_INTERCEPTOR_H__
|
|
#define __GUM_INTERCEPTOR_H__
|
|
|
|
/*
|
|
* Copyright (C) 2008-2010 Ole André Vadla Ravnås <ole.andre.ravnas@tillitech.com>
|
|
*
|
|
* Licence: wxWindows Library Licence, Version 3.1
|
|
*/
|
|
|
|
#ifndef __GUM_INVOCATION_LISTENER_H__
|
|
#define __GUM_INVOCATION_LISTENER_H__
|
|
|
|
/*
|
|
* Copyright (C) 2008-2010 Ole André Vadla Ravnås <ole.andre.ravnas@tillitech.com>
|
|
*
|
|
* Licence: wxWindows Library Licence, Version 3.1
|
|
*/
|
|
|
|
#ifndef __GUM_INVOCATION_CONTEXT_H__
|
|
#define __GUM_INVOCATION_CONTEXT_H__
|
|
|
|
|
|
|
|
#define GUM_LINCTX_GET_THREAD_DATA(context, data_type) \
|
|
((data_type *) gum_invocation_context_get_listener_thread_data (context, \
|
|
sizeof (data_type)))
|
|
#define GUM_LINCTX_GET_FUNC_DATA(context, data_type) \
|
|
((data_type) gum_invocation_context_get_listener_function_data (context))
|
|
#define GUM_LINCTX_GET_FUNC_INVDATA(context, data_type) \
|
|
((data_type *) \
|
|
gum_invocation_context_get_listener_function_invocation_data (context,\
|
|
sizeof (data_type)))
|
|
|
|
#define GUM_RINCTX_GET_FUNC_DATA(ctx, data_type) \
|
|
((data_type) gum_invocation_context_get_replacement_function_data (ctx))
|
|
|
|
typedef struct _GumInvocationBackend GumInvocationBackend;
|
|
typedef struct _GumInvocationContext GumInvocationContext;
|
|
typedef guint GumPointCut;
|
|
|
|
struct _GumInvocationBackend
|
|
{
|
|
GumPointCut (* get_point_cut) (GumInvocationContext * context);
|
|
|
|
gpointer (* get_nth_argument) (GumInvocationContext * context, guint n);
|
|
void (* replace_nth_argument) (GumInvocationContext * context, guint n,
|
|
gpointer value);
|
|
gpointer (* get_return_value) (GumInvocationContext * context);
|
|
void (* replace_return_value) (GumInvocationContext * context,
|
|
gpointer value);
|
|
|
|
GumThreadId (* get_thread_id) (GumInvocationContext * context);
|
|
guint (* get_depth) (GumInvocationContext * context);
|
|
|
|
gpointer (* get_listener_thread_data) (GumInvocationContext * context,
|
|
gsize required_size);
|
|
gpointer (* get_listener_function_data) (GumInvocationContext * context);
|
|
gpointer (* get_listener_function_invocation_data) (
|
|
GumInvocationContext * context, gsize required_size);
|
|
|
|
gpointer (* get_replacement_function_data) (GumInvocationContext * context);
|
|
|
|
gpointer state;
|
|
gpointer data;
|
|
};
|
|
|
|
struct _GumInvocationContext
|
|
{
|
|
GCallback function;
|
|
GumCpuContext * cpu_context;
|
|
gint system_error;
|
|
|
|
/*< private */
|
|
GumInvocationBackend * backend;
|
|
};
|
|
|
|
enum _GumPointCut
|
|
{
|
|
GUM_POINT_ENTER,
|
|
GUM_POINT_LEAVE
|
|
};
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
GUM_API GumPointCut gum_invocation_context_get_point_cut (
|
|
GumInvocationContext * context);
|
|
|
|
GUM_API gpointer gum_invocation_context_get_nth_argument (
|
|
GumInvocationContext * context, guint n);
|
|
GUM_API void gum_invocation_context_replace_nth_argument (
|
|
GumInvocationContext * context, guint n, gpointer value);
|
|
GUM_API gpointer gum_invocation_context_get_return_value (
|
|
GumInvocationContext * context);
|
|
GUM_API void gum_invocation_context_replace_return_value (
|
|
GumInvocationContext * context, gpointer value);
|
|
|
|
GUM_API gpointer gum_invocation_context_get_return_address (
|
|
GumInvocationContext * context);
|
|
|
|
GUM_API guint gum_invocation_context_get_thread_id (
|
|
GumInvocationContext * context);
|
|
GUM_API guint gum_invocation_context_get_depth (
|
|
GumInvocationContext * context);
|
|
|
|
GUM_API gpointer gum_invocation_context_get_listener_thread_data (
|
|
GumInvocationContext * context, gsize required_size);
|
|
GUM_API gpointer gum_invocation_context_get_listener_function_data (
|
|
GumInvocationContext * context);
|
|
GUM_API gpointer gum_invocation_context_get_listener_function_invocation_data (
|
|
GumInvocationContext * context, gsize required_size);
|
|
|
|
GUM_API gpointer gum_invocation_context_get_replacement_function_data (
|
|
GumInvocationContext * context);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif
|
|
|
|
#define lGUM_TYPE_INVOCATION_LISTENER (lgum_invocation_listener_get_type ())
|
|
#define GUM_INVOCATION_LISTENER(obj) (lG_TYPE_CHECK_INSTANCE_CAST ((obj),\
|
|
lGUM_TYPE_INVOCATION_LISTENER, GumInvocationListener))
|
|
#define GUM_INVOCATION_LISTENER_CAST(obj) ((GumInvocationListener *) (obj))
|
|
#define GUM_IS_INVOCATION_LISTENER(obj) (lG_TYPE_CHECK_INSTANCE_TYPE ((obj),\
|
|
lGUM_TYPE_INVOCATION_LISTENER))
|
|
#define GUM_INVOCATION_LISTENER_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE (\
|
|
(inst), lGUM_TYPE_INVOCATION_LISTENER, GumInvocationListenerIface))
|
|
|
|
typedef struct _GumInvocationListener GumInvocationListener;
|
|
typedef struct _GumInvocationListenerIface GumInvocationListenerIface;
|
|
|
|
struct _GumInvocationListenerIface
|
|
{
|
|
GTypeInterface parent;
|
|
|
|
void (* on_enter) (GumInvocationListener * self,
|
|
GumInvocationContext * context);
|
|
void (* on_leave) (GumInvocationListener * self,
|
|
GumInvocationContext * context);
|
|
};
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
GUM_API GType lgum_invocation_listener_get_type (void);
|
|
|
|
GUM_API void gum_invocation_listener_on_enter (GumInvocationListener * self,
|
|
GumInvocationContext * context);
|
|
GUM_API void gum_invocation_listener_on_leave (GumInvocationListener * self,
|
|
GumInvocationContext * context);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif
|
|
|
|
#define GUM_TYPE_INTERCEPTOR (gum_interceptor_get_type ())
|
|
#define GUM_INTERCEPTOR(obj) (lG_TYPE_CHECK_INSTANCE_CAST ((obj),\
|
|
GUM_TYPE_INTERCEPTOR, GumInterceptor))
|
|
#define GUM_INTERCEPTOR_CAST(obj) ((GumInterceptor *) (obj))
|
|
#define GUM_INTERCEPTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass),\
|
|
GUM_TYPE_INTERCEPTOR, GumInterceptorClass))
|
|
#define GUM_IS_INTERCEPTOR(obj) (lG_TYPE_CHECK_INSTANCE_TYPE ((obj),\
|
|
GUM_TYPE_INTERCEPTOR))
|
|
#define GUM_IS_INTERCEPTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE (\
|
|
(klass), GUM_TYPE_INTERCEPTOR))
|
|
#define GUM_INTERCEPTOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (\
|
|
(obj), GUM_TYPE_INTERCEPTOR, GumInterceptorClass))
|
|
|
|
typedef struct _GumInterceptor GumInterceptor;
|
|
typedef struct _GumInterceptorClass GumInterceptorClass;
|
|
typedef GArray GumInvocationStack;
|
|
|
|
typedef struct _GumInterceptorPrivate GumInterceptorPrivate;
|
|
|
|
typedef enum
|
|
{
|
|
GUM_ATTACH_OK = 0,
|
|
GUM_ATTACH_WRONG_SIGNATURE = -1,
|
|
GUM_ATTACH_ALREADY_ATTACHED = -2
|
|
} GumAttachReturn;
|
|
|
|
typedef enum
|
|
{
|
|
GUM_REPLACE_OK = 0,
|
|
GUM_REPLACE_WRONG_SIGNATURE = -1,
|
|
GUM_REPLACE_ALREADY_REPLACED = -2
|
|
} GumReplaceReturn;
|
|
|
|
struct _GumInterceptor
|
|
{
|
|
GObject parent;
|
|
|
|
GumInterceptorPrivate * priv;
|
|
};
|
|
|
|
struct _GumInterceptorClass
|
|
{
|
|
GObjectClass parent_class;
|
|
};
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
GUM_API GType gum_interceptor_get_type (void) G_GNUC_CONST;
|
|
|
|
GUM_API GumInterceptor * lgum_interceptor_obtain (void);
|
|
|
|
GUM_API GumAttachReturn lgum_interceptor_attach_listener (GumInterceptor * self,
|
|
gpointer function_address, GumInvocationListener * listener,
|
|
gpointer listener_function_data);
|
|
GUM_API void gum_interceptor_detach_listener (GumInterceptor * self,
|
|
GumInvocationListener * listener);
|
|
|
|
GUM_API GumReplaceReturn gum_interceptor_replace_function (
|
|
GumInterceptor * self, gpointer function_address,
|
|
gpointer replacement_function, gpointer replacement_function_data);
|
|
GUM_API void gum_interceptor_revert_function (GumInterceptor * self,
|
|
gpointer function_address);
|
|
|
|
GUM_API void lgum_interceptor_begin_transaction (GumInterceptor * self);
|
|
GUM_API void lgum_interceptor_end_transaction (GumInterceptor * self);
|
|
GUM_API gboolean gum_interceptor_flush (GumInterceptor * self);
|
|
|
|
GUM_API GumInvocationContext * gum_interceptor_get_current_invocation (void);
|
|
GUM_API GumInvocationStack * gum_interceptor_get_current_stack (void);
|
|
|
|
GUM_API void gum_interceptor_ignore_current_thread (GumInterceptor * self);
|
|
GUM_API void gum_interceptor_unignore_current_thread (GumInterceptor * self);
|
|
|
|
GUM_API void gum_interceptor_ignore_other_threads (GumInterceptor * self);
|
|
GUM_API void gum_interceptor_unignore_other_threads (GumInterceptor * self);
|
|
|
|
GUM_API gpointer gum_invocation_stack_translate (GumInvocationStack * self,
|
|
gpointer return_address);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif
|
|
/*
|
|
* Copyright (C) 2015 Ole André Vadla Ravnås <oleavr@nowsecure.com>
|
|
*
|
|
* Licence: wxWindows Library Licence, Version 3.1
|
|
*/
|
|
|
|
#ifndef __GUM_KERNEL_H__
|
|
#define __GUM_KERNEL_H__
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
GUM_API gboolean gum_kernel_api_is_available (void);
|
|
GUM_API guint8 * gum_kernel_read (GumAddress address, gsize len,
|
|
gsize * n_bytes_read);
|
|
GUM_API gboolean gum_kernel_write (GumAddress address, const guint8 * bytes,
|
|
gsize len);
|
|
GUM_API void gum_kernel_enumerate_ranges (GumPageProtection prot,
|
|
GumFoundRangeFunc func, gpointer user_data);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif
|
|
/*
|
|
* Copyright (C) 2010, 2015 Ole André Vadla Ravnås <ole.andre.ravnas@tillitech.com>
|
|
*
|
|
* Licence: wxWindows Library Licence, Version 3.1
|
|
*/
|
|
|
|
#ifndef __GUM_MEMORY_ACCESS_MONITOR_H__
|
|
#define __GUM_MEMORY_ACCESS_MONITOR_H__
|
|
|
|
|
|
#define GUM_TYPE_MEMORY_ACCESS_MONITOR (gum_memory_access_monitor_get_type ())
|
|
#define GUM_MEMORY_ACCESS_MONITOR(obj) (lG_TYPE_CHECK_INSTANCE_CAST ((obj),\
|
|
GUM_TYPE_MEMORY_ACCESS_MONITOR, GumMemoryAccessMonitor))
|
|
#define GUM_MEMORY_ACCESS_MONITOR_CAST(obj) ((GumMemoryAccessMonitor *) (obj))
|
|
#define GUM_MEMORY_ACCESS_MONITOR_CLASS(klass) \
|
|
(G_TYPE_CHECK_CLASS_CAST ((klass), GUM_TYPE_MEMORY_ACCESS_MONITOR,\
|
|
GumMemoryAccessMonitorClass))
|
|
#define GUM_IS_MEMORY_ACCESS_MONITOR(obj) (lG_TYPE_CHECK_INSTANCE_TYPE ((obj),\
|
|
GUM_TYPE_MEMORY_ACCESS_MONITOR))
|
|
#define GUM_IS_MEMORY_ACCESS_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE (\
|
|
(klass), GUM_TYPE_MEMORY_ACCESS_MONITOR))
|
|
#define GUM_MEMORY_ACCESS_MONITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (\
|
|
(obj), GUM_TYPE_MEMORY_ACCESS_MONITOR, GumMemoryAccessMonitorClass))
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GumMemoryAccessMonitor GumMemoryAccessMonitor;
|
|
typedef struct _GumMemoryAccessMonitorClass GumMemoryAccessMonitorClass;
|
|
typedef struct _GumMemoryAccessMonitorPrivate GumMemoryAccessMonitorPrivate;
|
|
typedef struct _GumMemoryAccessDetails GumMemoryAccessDetails;
|
|
|
|
typedef void (* GumMemoryAccessNotify) (GumMemoryAccessMonitor * monitor,
|
|
const GumMemoryAccessDetails * details, gpointer user_data);
|
|
|
|
struct _GumMemoryAccessMonitor
|
|
{
|
|
GObject parent;
|
|
|
|
GumMemoryAccessMonitorPrivate * priv;
|
|
};
|
|
|
|
struct _GumMemoryAccessMonitorClass
|
|
{
|
|
GObjectClass parent_class;
|
|
};
|
|
|
|
struct _GumMemoryAccessDetails
|
|
{
|
|
GumMemoryOperation operation;
|
|
gpointer from;
|
|
gpointer address;
|
|
|
|
guint range_index;
|
|
guint page_index;
|
|
guint pages_completed;
|
|
guint pages_total;
|
|
};
|
|
|
|
GUM_API GType gum_memory_access_monitor_get_type (void) G_GNUC_CONST;
|
|
|
|
GUM_API GumMemoryAccessMonitor * gum_memory_access_monitor_new (
|
|
const GumMemoryRange * ranges, guint num_ranges,
|
|
GumPageProtection access_mask, gboolean auto_reset,
|
|
GumMemoryAccessNotify func, gpointer data,
|
|
GDestroyNotify data_destroy);
|
|
|
|
GUM_API gboolean gum_memory_access_monitor_enable (
|
|
GumMemoryAccessMonitor * self, GError ** error);
|
|
GUM_API void gum_memory_access_monitor_disable (GumMemoryAccessMonitor * self);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif
|
|
/*
|
|
* Copyright (C) 2013 Ole André Vadla Ravnås <ole.andre.ravnas@tillitech.com>
|
|
*
|
|
* Licence: wxWindows Library Licence, Version 3.1
|
|
*/
|
|
|
|
#ifndef __GUM_MEMORY_MAP_H__
|
|
#define __GUM_MEMORY_MAP_H__
|
|
|
|
|
|
#define GUM_TYPE_MEMORY_MAP (gum_memory_map_get_type ())
|
|
#define GUM_MEMORY_MAP(obj) (lG_TYPE_CHECK_INSTANCE_CAST ((obj),\
|
|
GUM_TYPE_MEMORY_MAP, GumMemoryMap))
|
|
#define GUM_MEMORY_MAP_CAST(obj) ((GumMemoryMap *) (obj))
|
|
#define GUM_MEMORY_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass),\
|
|
GUM_TYPE_MEMORY_MAP, GumMemoryMapClass))
|
|
#define GUM_IS_MEMORY_MAP(obj) (lG_TYPE_CHECK_INSTANCE_TYPE ((obj),\
|
|
GUM_TYPE_MEMORY_MAP))
|
|
#define GUM_IS_MEMORY_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE (\
|
|
(klass), GUM_TYPE_MEMORY_MAP))
|
|
#define GUM_MEMORY_MAP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (\
|
|
(obj), GUM_TYPE_MEMORY_MAP, GumMemoryMapClass))
|
|
|
|
typedef struct _GumMemoryMap GumMemoryMap;
|
|
typedef struct _GumMemoryMapClass GumMemoryMapClass;
|
|
|
|
typedef struct _GumMemoryMapPrivate GumMemoryMapPrivate;
|
|
|
|
struct _GumMemoryMap
|
|
{
|
|
GObject parent;
|
|
|
|
GumMemoryMapPrivate * priv;
|
|
};
|
|
|
|
struct _GumMemoryMapClass
|
|
{
|
|
GObjectClass parent_class;
|
|
};
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
GType gum_memory_map_get_type (void) G_GNUC_CONST;
|
|
|
|
GUM_API GumMemoryMap * gum_memory_map_new (GumPageProtection prot);
|
|
|
|
GUM_API gboolean gum_memory_map_contains (GumMemoryMap * self,
|
|
const GumMemoryRange * range);
|
|
|
|
GUM_API void gum_memory_map_update (GumMemoryMap * self);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif
|
|
/*
|
|
* Copyright (C) 2016 Ole André Vadla Ravnås <oleavr@nowsecure.com>
|
|
*
|
|
* Licence: wxWindows Library Licence, Version 3.1
|
|
*/
|
|
|
|
#ifndef __GUM_MODULE_API_RESOLVER_H__
|
|
#define __GUM_MODULE_API_RESOLVER_H__
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
#define GUM_TYPE_MODULE_API_RESOLVER (gum_module_api_resolver_get_type ())
|
|
lG_DECLARE_FINAL_TYPE (GumModuleApiResolver, gum_module_api_resolver, GUM,
|
|
MODULE_API_RESOLVER, GObject)
|
|
|
|
GumApiResolver * gum_module_api_resolver_new (void);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif
|
|
/*
|
|
* Copyright (C) 2015 Ole André Vadla Ravnås <oleavr@nowsecure.com>
|
|
*
|
|
* Licence: wxWindows Library Licence, Version 3.1
|
|
*/
|
|
|
|
#ifndef __GUM_MODULE_MAP_H__
|
|
#define __GUM_MODULE_MAP_H__
|
|
|
|
|
|
#define GUM_TYPE_MODULE_MAP (gum_module_map_get_type ())
|
|
#define GUM_MODULE_MAP(obj) (lG_TYPE_CHECK_INSTANCE_CAST ((obj),\
|
|
GUM_TYPE_MODULE_MAP, GumModuleMap))
|
|
#define GUM_MODULE_MAP_CAST(obj) ((GumModuleMap *) (obj))
|
|
#define GUM_MODULE_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass),\
|
|
GUM_TYPE_MODULE_MAP, GumModuleMapClass))
|
|
#define GUM_IS_MODULE_MAP(obj) (lG_TYPE_CHECK_INSTANCE_TYPE ((obj),\
|
|
GUM_TYPE_MODULE_MAP))
|
|
#define GUM_IS_MODULE_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE (\
|
|
(klass), GUM_TYPE_MODULE_MAP))
|
|
#define GUM_MODULE_MAP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (\
|
|
(obj), GUM_TYPE_MODULE_MAP, GumModuleMapClass))
|
|
|
|
typedef struct _GumModuleMap GumModuleMap;
|
|
typedef struct _GumModuleMapClass GumModuleMapClass;
|
|
|
|
typedef struct _GumModuleMapPrivate GumModuleMapPrivate;
|
|
|
|
struct _GumModuleMap
|
|
{
|
|
GObject parent;
|
|
|
|
GumModuleMapPrivate * priv;
|
|
};
|
|
|
|
struct _GumModuleMapClass
|
|
{
|
|
GObjectClass parent_class;
|
|
};
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
GType gum_module_map_get_type (void) G_GNUC_CONST;
|
|
|
|
GUM_API GumModuleMap * gum_module_map_new (void);
|
|
|
|
GUM_API const GumModuleDetails * gum_module_map_find (GumModuleMap * self,
|
|
GumAddress address);
|
|
|
|
GUM_API void gum_module_map_update (GumModuleMap * self);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif
|
|
/*
|
|
* Copyright (C) 2010 Ole André Vadla Ravnås <ole.andre.ravnas@tillitech.com>
|
|
*
|
|
* Licence: wxWindows Library Licence, Version 3.1
|
|
*/
|
|
|
|
#ifndef __GUM_SPINLOCK_H__
|
|
#define __GUM_SPINLOCK_H__
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GumSpinlock GumSpinlock;
|
|
|
|
struct _GumSpinlock
|
|
{
|
|
gpointer data[8];
|
|
};
|
|
|
|
void gum_spinlock_init (GumSpinlock * spinlock);
|
|
void gum_spinlock_free (GumSpinlock * spinlock);
|
|
|
|
void gum_spinlock_acquire (GumSpinlock * spinlock);
|
|
void gum_spinlock_release (GumSpinlock * spinlock);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif
|
|
/*
|
|
* Copyright (C) 2009-2012 Ole André Vadla Ravnås <ole.andre.ravnas@tillitech.com>
|
|
* Copyright (C) 2010 Karl Trygve Kalleberg <karltk@boblycat.org>
|
|
*
|
|
* Licence: wxWindows Library Licence, Version 3.1
|
|
*/
|
|
|
|
#ifndef __GUM_STALKER_H__
|
|
#define __GUM_STALKER_H__
|
|
|
|
|
|
#define GUM_TYPE_STALKER (gum_stalker_get_type ())
|
|
#define GUM_STALKER(obj) (lG_TYPE_CHECK_INSTANCE_CAST ((obj),\
|
|
GUM_TYPE_STALKER, GumStalker))
|
|
#define GUM_STALKER_CAST(obj) ((GumStalker *) (obj))
|
|
#define GUM_STALKER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass),\
|
|
GUM_TYPE_STALKER, GumStalkerClass))
|
|
#define GUM_IS_STALKER(obj) (lG_TYPE_CHECK_INSTANCE_TYPE ((obj),\
|
|
GUM_TYPE_STALKER))
|
|
#define GUM_IS_STALKER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE (\
|
|
(klass), GUM_TYPE_STALKER))
|
|
#define GUM_STALKER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (\
|
|
(obj), GUM_TYPE_STALKER, GumStalkerClass))
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GumStalker GumStalker;
|
|
typedef struct _GumStalkerClass GumStalkerClass;
|
|
typedef struct _GumStalkerPrivate GumStalkerPrivate;
|
|
|
|
typedef guint GumProbeId;
|
|
typedef struct _GumCallSite GumCallSite;
|
|
typedef void (* GumCallProbeCallback) (GumCallSite * site, gpointer user_data);
|
|
|
|
struct _GumStalker
|
|
{
|
|
GObject parent;
|
|
|
|
GumStalkerPrivate * priv;
|
|
};
|
|
|
|
struct _GumStalkerClass
|
|
{
|
|
GObjectClass parent_class;
|
|
};
|
|
|
|
struct _GumCallSite
|
|
{
|
|
gpointer block_address;
|
|
gpointer stack_data;
|
|
GumCpuContext * cpu_context;
|
|
};
|
|
|
|
GUM_API GType gum_stalker_get_type (void) G_GNUC_CONST;
|
|
|
|
GUM_API GumStalker * gum_stalker_new (void);
|
|
|
|
GUM_API void gum_stalker_exclude (GumStalker * self,
|
|
const GumMemoryRange * range);
|
|
|
|
GUM_API gint gum_stalker_get_trust_threshold (GumStalker * self);
|
|
GUM_API void gum_stalker_set_trust_threshold (GumStalker * self,
|
|
gint trust_threshold);
|
|
|
|
GUM_API void gum_stalker_stop (GumStalker * self);
|
|
GUM_API gboolean gum_stalker_garbage_collect (GumStalker * self);
|
|
|
|
GUM_API void gum_stalker_follow_me (GumStalker * self, GumEventSink * sink);
|
|
GUM_API void gum_stalker_unfollow_me (GumStalker * self);
|
|
GUM_API gboolean gum_stalker_is_following_me (GumStalker * self);
|
|
|
|
GUM_API void gum_stalker_follow (GumStalker * self, GumThreadId thread_id,
|
|
GumEventSink * sink);
|
|
GUM_API void gum_stalker_unfollow (GumStalker * self, GumThreadId thread_id);
|
|
|
|
GUM_API GumProbeId gum_stalker_add_call_probe (GumStalker * self,
|
|
gpointer target_address, GumCallProbeCallback callback, gpointer data,
|
|
GDestroyNotify notify);
|
|
GUM_API void gum_stalker_remove_call_probe (GumStalker * self,
|
|
GumProbeId id);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif
|
|
/*
|
|
* Copyright (C) 2008-2010 Ole André Vadla Ravnås <ole.andre.ravnas@tillitech.com>
|
|
* Copyright (C) 2008 Christian Berentsen <jc.berentsen@gmail.com>
|
|
*
|
|
* Licence: wxWindows Library Licence, Version 3.1
|
|
*/
|
|
|
|
#ifndef __GUM_SYMBOL_UTIL_H__
|
|
#define __GUM_SYMBOL_UTIL_H__
|
|
|
|
|
|
typedef struct _GumSymbolDetails GumSymbolDetails;
|
|
|
|
struct _GumSymbolDetails
|
|
{
|
|
GumAddress address;
|
|
gchar module_name[GUM_MAX_PATH + 1];
|
|
gchar symbol_name[GUM_MAX_SYMBOL_NAME + 1];
|
|
gchar file_name[GUM_MAX_PATH + 1];
|
|
guint line_number;
|
|
};
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
GUM_API gboolean gum_symbol_details_from_address (gpointer address,
|
|
GumSymbolDetails * details);
|
|
GUM_API gchar * gum_symbol_name_from_address (gpointer address);
|
|
|
|
GUM_API gpointer gum_find_function (const gchar * name);
|
|
GUM_API GArray * gum_find_functions_named (const gchar * name);
|
|
GUM_API GArray * gum_find_functions_matching (const gchar * str);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif
|
|
/*
|
|
* Copyright (C) 2010-2014 Ole André Vadla Ravnås <ole.andre.ravnas@tillitech.com>
|
|
*
|
|
* Licence: wxWindows Library Licence, Version 3.1
|
|
*/
|
|
|
|
#ifndef __GUM_SYS_INTERNALS_H__
|
|
#define __GUM_SYS_INTERNALS_H__
|
|
|
|
|
|
#ifdef G_OS_WIN32
|
|
|
|
# if GLIB_SIZEOF_VOID_P == 4
|
|
# define GUM_TEB_OFFSET_SELF 0x0018
|
|
# define GUM_TEB_OFFSET_TID 0x0024
|
|
# else
|
|
# define GUM_TEB_OFFSET_SELF 0x0030
|
|
# define GUM_TEB_OFFSET_TID 0x0048
|
|
# endif
|
|
|
|
#endif
|
|
|
|
#endif
|
|
/*
|
|
* Copyright (C) 2010-2017 Ole André Vadla Ravnås <oleavr@nowsecure.com>
|
|
*
|
|
* Licence: wxWindows Library Licence, Version 3.1
|
|
*/
|
|
|
|
#ifndef __GUM_TLS_H__
|
|
#define __GUM_TLS_H__
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef gsize GumTlsKey;
|
|
|
|
GUM_API GumTlsKey gum_tls_key_new (GDestroyNotify notify);
|
|
GUM_API void gum_tls_key_free (GumTlsKey key);
|
|
|
|
GUM_API gpointer gum_tls_key_get_value (GumTlsKey key);
|
|
GUM_API void gum_tls_key_set_value (GumTlsKey key, gpointer value);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
GUM_API void gum_init (void);
|
|
GUM_API void gum_shutdown (void);
|
|
GUM_API void gum_deinit (void);
|
|
|
|
GUM_API void gum_init_embedded (void);
|
|
GUM_API void gum_deinit_embedded (void);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif
|