X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fspecifier.c;h=6c5942ad71065ff3b7bf6607dfa05d84db7aab1e;hb=debb7eb5baa3e6aae77e4fc0b7704887baf3006e;hp=a0e53876bf3aea4eb694ae47a782c8d6e8cada12;hpb=77dcef404dc78635f6ffa8f71a803d2bc7cc8921;p=chise%2Fxemacs-chise.git diff --git a/src/specifier.c b/src/specifier.c index a0e5387..6c5942a 100644 --- a/src/specifier.c +++ b/src/specifier.c @@ -37,7 +37,8 @@ Boston, MA 02111-1307, USA. */ #include "opaque.h" #include "specifier.h" #include "window.h" -#include "glyphs.h" /* for DISP_TABLE_SIZE definition */ +#include "chartab.h" +#include "rangetab.h" Lisp_Object Qspecifierp; Lisp_Object Qprepend, Qappend, Qremove_tag_set_prepend, Qremove_tag_set_append; @@ -346,7 +347,7 @@ sizeof_specifier (CONST void *header) DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION ("specifier", specifier, mark_specifier, print_specifier, finalize_specifier, - specifier_equal, specifier_hash, + specifier_equal, specifier_hash, 0, sizeof_specifier, struct Lisp_Specifier); @@ -414,7 +415,7 @@ make_specifier_internal (struct specifier_methods *spec_meths, Lisp_Object specifier; struct Lisp_Specifier *sp = (struct Lisp_Specifier *) alloc_lcrecord (sizeof (struct Lisp_Specifier) + - data_size - 1, lrecord_specifier); + data_size - 1, &lrecord_specifier); sp->methods = spec_meths; sp->global_specs = Qnil; @@ -2998,14 +2999,38 @@ Return non-nil if OBJECT is a boolean specifier. DEFINE_SPECIFIER_TYPE (display_table); +#define VALID_SINGLE_DISPTABLE_INSTANTIATOR_P(instantiator) \ + (VECTORP (instantiator) \ + || (CHAR_TABLEP (instantiator) \ + && (XCHAR_TABLE_TYPE (instantiator) == CHAR_TABLE_TYPE_CHAR \ + || XCHAR_TABLE_TYPE (instantiator) == CHAR_TABLE_TYPE_GENERIC)) \ + || RANGE_TABLEP (instantiator)) + static void display_table_validate (Lisp_Object instantiator) { - if (!NILP(instantiator) && - (!VECTORP (instantiator) || - XVECTOR_LENGTH (instantiator) != DISP_TABLE_SIZE)) - dead_wrong_type_argument (display_table_specifier_methods->predicate_symbol, - instantiator); + if (NILP (instantiator)) + /* OK */ + ; + else if (CONSP (instantiator)) + { + Lisp_Object tail; + EXTERNAL_LIST_LOOP (tail, instantiator) + { + Lisp_Object car = XCAR (tail); + if (!VALID_SINGLE_DISPTABLE_INSTANTIATOR_P (car)) + goto lose; + } + } + else + { + if (!VALID_SINGLE_DISPTABLE_INSTANTIATOR_P (instantiator)) + { + lose: + dead_wrong_type_argument (display_table_specifier_methods->predicate_symbol, + instantiator); + } + } } DEFUN ("display-table-specifier-p", Fdisplay_table_specifier_p, 1, 1, 0, /*