/* Synched up with: Not in FSF. */
-#ifndef _XEMACS_SPECIFIER_H_
-#define _XEMACS_SPECIFIER_H_
+#ifndef INCLUDED_specifier_h_
+#define INCLUDED_specifier_h_
/*
MAGIC SPECIFIERS
struct specifier_methods
{
- CONST char *name;
+ const char *name;
Lisp_Object predicate_symbol;
/* Implementation specific methods: */
/* type-specific extra data attached to a specifier */
char data[1];
};
+typedef struct Lisp_Specifier Lisp_Specifier;
-DECLARE_LRECORD (specifier, struct Lisp_Specifier);
-#define XSPECIFIER(x) XRECORD (x, specifier, struct Lisp_Specifier)
+DECLARE_LRECORD (specifier, Lisp_Specifier);
+#define XSPECIFIER(x) XRECORD (x, specifier, Lisp_Specifier)
#define XSETSPECIFIER(x, p) XSETRECORD (x, p, specifier)
#define SPECIFIERP(x) RECORDP (x, specifier)
#define CHECK_SPECIFIER(x) CHECK_RECORD (x, specifier)
#define SPECMETH(sp, m, args) (((sp)->methods->m##_method) args)
/* Call a void-returning specifier method, if it exists. */
-#define MAYBE_SPECMETH(sp, m, args) do { \
- struct Lisp_Specifier *maybe_specmeth_sp = (sp); \
- if (HAS_SPECMETH_P (maybe_specmeth_sp, m)) \
- SPECMETH (maybe_specmeth_sp, m, args); \
+#define MAYBE_SPECMETH(sp, m, args) do { \
+ Lisp_Specifier *maybe_specmeth_sp = (sp); \
+ if (HAS_SPECMETH_P (maybe_specmeth_sp, m)) \
+ SPECMETH (maybe_specmeth_sp, m, args); \
} while (0)
/***** Defining new specifier types *****/
-#define specifier_data_offset (offsetof(struct Lisp_Specifier, data))
+#define specifier_data_offset (offsetof (Lisp_Specifier, data))
extern const struct lrecord_description specifier_empty_extra_description[];
#ifdef ERROR_CHECK_TYPECHECK
#define DECLARE_SPECIFIER_TYPE(type) \
extern struct specifier_methods * type##_specifier_methods; \
-INLINE struct type##_specifier * \
-error_check_##type##_specifier_data (struct Lisp_Specifier *sp); \
-INLINE struct type##_specifier * \
-error_check_##type##_specifier_data (struct Lisp_Specifier *sp) \
+INLINE_HEADER struct type##_specifier * \
+error_check_##type##_specifier_data (Lisp_Specifier *sp); \
+INLINE_HEADER struct type##_specifier * \
+error_check_##type##_specifier_data (Lisp_Specifier *sp) \
{ \
if (SPECIFIERP (sp->magic_parent)) \
{ \
assert (SPECIFIER_TYPE_P (sp, type)); \
return (struct type##_specifier *) sp->data; \
} \
+INLINE_HEADER Lisp_Specifier * \
+error_check_##type##_specifier_type (Lisp_Object obj); \
+INLINE_HEADER Lisp_Specifier * \
+error_check_##type##_specifier_type (Lisp_Object obj) \
+{ \
+ Lisp_Specifier *sp = XSPECIFIER (obj); \
+ assert (SPECIFIER_TYPE_P (sp, type)); \
+ return sp; \
+} \
DECLARE_NOTHING
#else
-#define DECLARE_SPECIFIER_TYPE(type) \
+#define DECLARE_SPECIFIER_TYPE(type) \
extern struct specifier_methods * type##_specifier_methods
#endif /* ERROR_CHECK_TYPECHECK */
-#define DEFINE_SPECIFIER_TYPE(type) \
+#define DEFINE_SPECIFIER_TYPE(type) \
struct specifier_methods * type##_specifier_methods
#define INITIALIZE_SPECIFIER_TYPE(type, obj_name, pred_sym) do { \
type##_specifier_methods->name = obj_name; \
type##_specifier_methods->extra_description = \
specifier_empty_extra_description; \
- defsymbol_nodump (&type##_specifier_methods->predicate_symbol, pred_sym); \
- add_entry_to_specifier_type_list (Q##type, type##_specifier_methods); \
- dumpstruct (&type##_specifier_methods, &specifier_methods_description); \
+ defsymbol_nodump (&type##_specifier_methods->predicate_symbol, pred_sym); \
+ add_entry_to_specifier_type_list (Q##type, type##_specifier_methods); \
+ dumpstruct (&type##_specifier_methods, &specifier_methods_description); \
} while (0)
-#define REINITIALIZE_SPECIFIER_TYPE(type) do { \
+#define REINITIALIZE_SPECIFIER_TYPE(type) do { \
staticpro_nodump (&type##_specifier_methods->predicate_symbol); \
} while (0)
: (sp)->data))
#endif
-/* #### Need to create ERROR_CHECKING versions of these. */
+#ifdef ERROR_CHECK_TYPECHECK
+# define XSPECIFIER_TYPE(x, type) \
+ error_check_##type##_specifier_type (x)
+# define XSETSPECIFIER_TYPE(x, p, type) do \
+{ \
+ XSETSPECIFIER (x, p); \
+ assert (SPECIFIER_TYPEP (XSPECIFIER(x), type)); \
+} while (0)
+#else
+# define XSPECIFIER_TYPE(x, type) XSPECIFIER (x)
+# define XSETSPECIFIER_TYPE(x, p, type) XSETSPECIFIER (x, p)
+#endif /* ERROR_CHECK_TYPE_CHECK */
-#define XSPECIFIER_TYPE(x, type) XSPECIFIER (x)
-#define XSETSPECIFIER_TYPE(x, p, type) XSETSPECIFIER (x, p)
-#define SPECIFIER_TYPEP(x, type) \
+#define SPECIFIER_TYPEP(x, type) \
(SPECIFIERP (x) && SPECIFIER_TYPE_P (XSPECIFIER (x), type))
#define CHECK_SPECIFIER_TYPE(x, type) do { \
CHECK_SPECIFIER (x); \
#define CHECK_DISPLAYTABLE_SPECIFIER(x) CHECK_SPECIFIER_TYPE (x, display_table)
#define CONCHECK_DISPLAYTABLE_SPECIFIER(x) CONCHECK_SPECIFIER_TYPE (x, display_table)
-#endif /* _XEMACS_SPECIFIER_H_ */
+#endif /* INCLUDED_specifier_h_ */