+Sat Oct 31 05:08:26 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h: removed old G_ENUM(), G_FLAGS(), G_NV() and G_SV() macros.
+ added macros G_STRUCT_OFFSET(), G_STRUCT_MEMBER_P() and
+ G_STRUCT_MEMBER() for handling structure fields through their offsets.
+ (struct _GHookList): added a hook_free function member, that can be used
+ to free additional fields in derived hook structures.
+ g_hook_free(): if hook_list->hook_free != NULL, call this function prior
+ to freeing the hook. (this functionality should have been there in the
+ first place, it just got forgotten as an implementation detail).
+
Wed Oct 28 00:49:32 PST 1998 Manish Singh <yosh@gimp.org>
* glib.h: G_BREAKPOINT for alpha from Robert Wilhelm
+Sat Oct 31 05:08:26 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h: removed old G_ENUM(), G_FLAGS(), G_NV() and G_SV() macros.
+ added macros G_STRUCT_OFFSET(), G_STRUCT_MEMBER_P() and
+ G_STRUCT_MEMBER() for handling structure fields through their offsets.
+ (struct _GHookList): added a hook_free function member, that can be used
+ to free additional fields in derived hook structures.
+ g_hook_free(): if hook_list->hook_free != NULL, call this function prior
+ to freeing the hook. (this functionality should have been there in the
+ first place, it just got forgotten as an implementation detail).
+
Wed Oct 28 00:49:32 PST 1998 Manish Singh <yosh@gimp.org>
* glib.h: G_BREAKPOINT for alpha from Robert Wilhelm
+Sat Oct 31 05:08:26 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h: removed old G_ENUM(), G_FLAGS(), G_NV() and G_SV() macros.
+ added macros G_STRUCT_OFFSET(), G_STRUCT_MEMBER_P() and
+ G_STRUCT_MEMBER() for handling structure fields through their offsets.
+ (struct _GHookList): added a hook_free function member, that can be used
+ to free additional fields in derived hook structures.
+ g_hook_free(): if hook_list->hook_free != NULL, call this function prior
+ to freeing the hook. (this functionality should have been there in the
+ first place, it just got forgotten as an implementation detail).
+
Wed Oct 28 00:49:32 PST 1998 Manish Singh <yosh@gimp.org>
* glib.h: G_BREAKPOINT for alpha from Robert Wilhelm
+Sat Oct 31 05:08:26 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h: removed old G_ENUM(), G_FLAGS(), G_NV() and G_SV() macros.
+ added macros G_STRUCT_OFFSET(), G_STRUCT_MEMBER_P() and
+ G_STRUCT_MEMBER() for handling structure fields through their offsets.
+ (struct _GHookList): added a hook_free function member, that can be used
+ to free additional fields in derived hook structures.
+ g_hook_free(): if hook_list->hook_free != NULL, call this function prior
+ to freeing the hook. (this functionality should have been there in the
+ first place, it just got forgotten as an implementation detail).
+
Wed Oct 28 00:49:32 PST 1998 Manish Singh <yosh@gimp.org>
* glib.h: G_BREAKPOINT for alpha from Robert Wilhelm
+Sat Oct 31 05:08:26 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h: removed old G_ENUM(), G_FLAGS(), G_NV() and G_SV() macros.
+ added macros G_STRUCT_OFFSET(), G_STRUCT_MEMBER_P() and
+ G_STRUCT_MEMBER() for handling structure fields through their offsets.
+ (struct _GHookList): added a hook_free function member, that can be used
+ to free additional fields in derived hook structures.
+ g_hook_free(): if hook_list->hook_free != NULL, call this function prior
+ to freeing the hook. (this functionality should have been there in the
+ first place, it just got forgotten as an implementation detail).
+
Wed Oct 28 00:49:32 PST 1998 Manish Singh <yosh@gimp.org>
* glib.h: G_BREAKPOINT for alpha from Robert Wilhelm
+Sat Oct 31 05:08:26 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h: removed old G_ENUM(), G_FLAGS(), G_NV() and G_SV() macros.
+ added macros G_STRUCT_OFFSET(), G_STRUCT_MEMBER_P() and
+ G_STRUCT_MEMBER() for handling structure fields through their offsets.
+ (struct _GHookList): added a hook_free function member, that can be used
+ to free additional fields in derived hook structures.
+ g_hook_free(): if hook_list->hook_free != NULL, call this function prior
+ to freeing the hook. (this functionality should have been there in the
+ first place, it just got forgotten as an implementation detail).
+
Wed Oct 28 00:49:32 PST 1998 Manish Singh <yosh@gimp.org>
* glib.h: G_BREAKPOINT for alpha from Robert Wilhelm
+Sat Oct 31 05:08:26 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h: removed old G_ENUM(), G_FLAGS(), G_NV() and G_SV() macros.
+ added macros G_STRUCT_OFFSET(), G_STRUCT_MEMBER_P() and
+ G_STRUCT_MEMBER() for handling structure fields through their offsets.
+ (struct _GHookList): added a hook_free function member, that can be used
+ to free additional fields in derived hook structures.
+ g_hook_free(): if hook_list->hook_free != NULL, call this function prior
+ to freeing the hook. (this functionality should have been there in the
+ first place, it just got forgotten as an implementation detail).
+
Wed Oct 28 00:49:32 PST 1998 Manish Singh <yosh@gimp.org>
* glib.h: G_BREAKPOINT for alpha from Robert Wilhelm
+Sat Oct 31 05:08:26 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h: removed old G_ENUM(), G_FLAGS(), G_NV() and G_SV() macros.
+ added macros G_STRUCT_OFFSET(), G_STRUCT_MEMBER_P() and
+ G_STRUCT_MEMBER() for handling structure fields through their offsets.
+ (struct _GHookList): added a hook_free function member, that can be used
+ to free additional fields in derived hook structures.
+ g_hook_free(): if hook_list->hook_free != NULL, call this function prior
+ to freeing the hook. (this functionality should have been there in the
+ first place, it just got forgotten as an implementation detail).
+
Wed Oct 28 00:49:32 PST 1998 Manish Singh <yosh@gimp.org>
* glib.h: G_BREAKPOINT for alpha from Robert Wilhelm
hook_size,
hook_size * G_HOOKS_PREALLOC,
G_ALLOC_AND_FREE);
+ hook_list->hook_free = NULL;
}
void
g_return_if_fail (hook_list->is_setup);
g_return_if_fail (hook != NULL);
g_return_if_fail (G_HOOK_IS_UNLINKED (hook));
+
+ if (hook_list->hook_free)
+ hook_list->hook_free (hook_list, hook);
g_chunk_free (hook, hook_list->hook_memchunk);
}
}
hook->prev = NULL;
- g_chunk_free (hook, hook_list->hook_memchunk);
+ g_hook_free (hook_list, hook);
if (!hook_list->hooks &&
!hook_list->is_setup)
#endif /* !G_VA_COPY */
-/* Provide simple enum value macro wrappers that ease automated
- * enum value stringification code. [abandoned]
- */
-#if !defined (G_CODE_GENERATION)
-#define G_ENUM( EnumerationName ) EnumerationName
-#define G_FLAGS( EnumerationName ) EnumerationName
-#define G_NV( VALUE_NAME , value_nick, VALUE) VALUE_NAME = (VALUE)
-#define G_SV( VALUE_NAME, value_nick ) VALUE_NAME
-#else /* G_CODE_GENERATION */
-#define G_ENUM( EnumerationName ) G_ENUM_E + EnumerationName +
-#define G_FLAGS( EnumerationName ) G_ENUM_F + EnumerationName +
-#define G_NV( VALUE_NAME , value_nick, VALUE) G_ENUM_V + VALUE_NAME + value_nick +
-#define G_SV( VALUE_NAME, value_nick ) G_ENUM_V + VALUE_NAME + value_nick +
-#endif /* G_CODE_GENERATION */
+/* Provide convenience macros for handling structure
+ * fields through their offsets.
+ */
+#define G_STRUCT_OFFSET(struct_type, member) \
+ ((gulong) ((gchar*) &((struct_type*) 0)->member))
+#define G_STRUCT_MEMBER_P(struct_p, struct_offset) \
+ ((gpointer) ((gchar*) (struct_p) + (gulong) (struct_offset)))
+#define G_STRUCT_MEMBER(member_type, struct_p, struct_offset) \
+ (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
/* inlining hassle. for compilers that don't allow the `inline' keyword,
gpointer data);
typedef void (*GHookFunc) (gpointer data);
typedef gboolean (*GHookCheckFunc) (gpointer data);
+typedef void (*GHookFreeFunc) (GHookList *hook_list,
+ GHook *hook);
typedef void (*GLogFunc) (const gchar *log_domain,
GLogLevelFlags log_level,
const gchar *message,
guint is_setup : 1;
GHook *hooks;
GMemChunk *hook_memchunk;
+ GHookFreeFunc hook_free; /* virtual function */
};
struct _GHook
hook_size,
hook_size * G_HOOKS_PREALLOC,
G_ALLOC_AND_FREE);
+ hook_list->hook_free = NULL;
}
void
g_return_if_fail (hook_list->is_setup);
g_return_if_fail (hook != NULL);
g_return_if_fail (G_HOOK_IS_UNLINKED (hook));
+
+ if (hook_list->hook_free)
+ hook_list->hook_free (hook_list, hook);
g_chunk_free (hook, hook_list->hook_memchunk);
}
}
hook->prev = NULL;
- g_chunk_free (hook, hook_list->hook_memchunk);
+ g_hook_free (hook_list, hook);
if (!hook_list->hooks &&
!hook_list->is_setup)
#endif /* !G_VA_COPY */
-/* Provide simple enum value macro wrappers that ease automated
- * enum value stringification code. [abandoned]
- */
-#if !defined (G_CODE_GENERATION)
-#define G_ENUM( EnumerationName ) EnumerationName
-#define G_FLAGS( EnumerationName ) EnumerationName
-#define G_NV( VALUE_NAME , value_nick, VALUE) VALUE_NAME = (VALUE)
-#define G_SV( VALUE_NAME, value_nick ) VALUE_NAME
-#else /* G_CODE_GENERATION */
-#define G_ENUM( EnumerationName ) G_ENUM_E + EnumerationName +
-#define G_FLAGS( EnumerationName ) G_ENUM_F + EnumerationName +
-#define G_NV( VALUE_NAME , value_nick, VALUE) G_ENUM_V + VALUE_NAME + value_nick +
-#define G_SV( VALUE_NAME, value_nick ) G_ENUM_V + VALUE_NAME + value_nick +
-#endif /* G_CODE_GENERATION */
+/* Provide convenience macros for handling structure
+ * fields through their offsets.
+ */
+#define G_STRUCT_OFFSET(struct_type, member) \
+ ((gulong) ((gchar*) &((struct_type*) 0)->member))
+#define G_STRUCT_MEMBER_P(struct_p, struct_offset) \
+ ((gpointer) ((gchar*) (struct_p) + (gulong) (struct_offset)))
+#define G_STRUCT_MEMBER(member_type, struct_p, struct_offset) \
+ (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
/* inlining hassle. for compilers that don't allow the `inline' keyword,
gpointer data);
typedef void (*GHookFunc) (gpointer data);
typedef gboolean (*GHookCheckFunc) (gpointer data);
+typedef void (*GHookFreeFunc) (GHookList *hook_list,
+ GHook *hook);
typedef void (*GLogFunc) (const gchar *log_domain,
GLogLevelFlags log_level,
const gchar *message,
guint is_setup : 1;
GHook *hooks;
GMemChunk *hook_memchunk;
+ GHookFreeFunc hook_free; /* virtual function */
};
struct _GHook