comparison src/chartab.c @ 5495:1f0b15040456

Merge.
author Aidan Kehoe <kehoea@parhasard.net>
date Sun, 01 May 2011 18:44:03 +0100
parents 6506fcb40fcf
children 58b38d5b32d0
comparison
equal deleted inserted replaced
5494:861f2601a38b 5495:1f0b15040456
5 Copyright (C) 1995, 1997, 1999 Electrotechnical Laboratory, JAPAN. 5 Copyright (C) 1995, 1997, 1999 Electrotechnical Laboratory, JAPAN.
6 Licensed to the Free Software Foundation. 6 Licensed to the Free Software Foundation.
7 7
8 This file is part of XEmacs. 8 This file is part of XEmacs.
9 9
10 XEmacs is free software; you can redistribute it and/or modify it 10 XEmacs is free software: you can redistribute it and/or modify it
11 under the terms of the GNU General Public License as published by the 11 under the terms of the GNU General Public License as published by the
12 Free Software Foundation; either version 2, or (at your option) any 12 Free Software Foundation, either version 3 of the License, or (at your
13 later version. 13 option) any later version.
14 14
15 XEmacs is distributed in the hope that it will be useful, but WITHOUT 15 XEmacs is distributed in the hope that it will be useful, but WITHOUT
16 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 16 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 17 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 for more details. 18 for more details.
19 19
20 You should have received a copy of the GNU General Public License 20 You should have received a copy of the GNU General Public License
21 along with XEmacs; see the file COPYING. If not, write to 21 along with XEmacs. If not, see <http://www.gnu.org/licenses/>. */
22 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 Boston, MA 02111-1307, USA. */
24 22
25 /* Synched up with: Mule 2.3. Not synched with FSF. 23 /* Synched up with: Mule 2.3. Not synched with FSF.
26 24
27 This file was written independently of the FSF implementation, 25 This file was written independently of the FSF implementation,
28 and is not compatible. */ 26 and is not compatible. */
126 124
127 return 1; 125 return 1;
128 } 126 }
129 127
130 static Hashcode 128 static Hashcode
131 char_table_entry_hash (Lisp_Object obj, int depth) 129 char_table_entry_hash (Lisp_Object obj, int depth, Boolint equalp)
132 { 130 {
133 Lisp_Char_Table_Entry *cte = XCHAR_TABLE_ENTRY (obj); 131 Lisp_Char_Table_Entry *cte = XCHAR_TABLE_ENTRY (obj);
134 132
135 return internal_array_hash (cte->level2, 96, depth + 1); 133 return internal_array_hash (cte->level2, 96, depth + 1, equalp);
136 } 134 }
137 135
138 static const struct memory_description char_table_entry_description[] = { 136 static const struct memory_description char_table_entry_description[] = {
139 { XD_LISP_OBJECT_ARRAY, offsetof (Lisp_Char_Table_Entry, level2), 96 }, 137 { XD_LISP_OBJECT_ARRAY, offsetof (Lisp_Char_Table_Entry, level2), 96 },
140 { XD_END } 138 { XD_END }
141 }; 139 };
142 140
143 DEFINE_LRECORD_IMPLEMENTATION ("char-table-entry", char_table_entry, 141 DEFINE_DUMPABLE_LISP_OBJECT ("char-table-entry", char_table_entry,
144 1, /* dumpable flag */ 142 mark_char_table_entry, internal_object_printer,
145 mark_char_table_entry, internal_object_printer, 143 0, char_table_entry_equal,
146 0, char_table_entry_equal, 144 char_table_entry_hash,
147 char_table_entry_hash, 145 char_table_entry_description,
148 char_table_entry_description, 146 Lisp_Char_Table_Entry);
149 Lisp_Char_Table_Entry);
150 147
151 #endif /* MULE */ 148 #endif /* MULE */
152 149
153 static Lisp_Object 150 static Lisp_Object
154 mark_char_table (Lisp_Object obj) 151 mark_char_table (Lisp_Object obj)
256 case CHARSET_TYPE_94: 253 case CHARSET_TYPE_94:
257 case CHARSET_TYPE_96: 254 case CHARSET_TYPE_96:
258 sferror ("Charset in row vector must be multi-byte", 255 sferror ("Charset in row vector must be multi-byte",
259 outrange->charset); 256 outrange->charset);
260 case CHARSET_TYPE_94X94: 257 case CHARSET_TYPE_94X94:
261 check_int_range (outrange->row, 33, 126); 258 check_integer_range (make_int (outrange->row), make_int (33),
259 make_int (126));
262 break; 260 break;
263 case CHARSET_TYPE_96X96: 261 case CHARSET_TYPE_96X96:
264 check_int_range (outrange->row, 32, 127); 262 check_integer_range (make_int (outrange->row), make_int (32),
263 make_int (127));
265 break; 264 break;
266 default: 265 default:
267 ABORT (); 266 ABORT ();
268 } 267 }
269 } 268 }
298 return make_char (range->ch); 297 return make_char (range->ch);
299 default: 298 default:
300 ABORT (); 299 ABORT ();
301 } 300 }
302 return Qnil; /* not reached */ 301 return Qnil; /* not reached */
302 }
303
304 static Lisp_Object
305 char_table_default_for_type (enum char_table_type type)
306 {
307 switch (type)
308 {
309 case CHAR_TABLE_TYPE_CHAR:
310 return make_char (0);
311 break;
312 case CHAR_TABLE_TYPE_DISPLAY:
313 case CHAR_TABLE_TYPE_GENERIC:
314 #ifdef MULE
315 case CHAR_TABLE_TYPE_CATEGORY:
316 #endif /* MULE */
317 return Qnil;
318 break;
319
320 case CHAR_TABLE_TYPE_SYNTAX:
321 return make_integer (Sinherit);
322 break;
323 }
324 ABORT();
325 return Qzero;
303 } 326 }
304 327
305 struct ptemap 328 struct ptemap
306 { 329 {
307 Lisp_Object printcharfun; 330 Lisp_Object printcharfun;
335 358
336 range.type = CHARTAB_RANGE_ALL; 359 range.type = CHARTAB_RANGE_ALL;
337 arg.printcharfun = printcharfun; 360 arg.printcharfun = printcharfun;
338 arg.first = 1; 361 arg.first = 1;
339 362
340 write_fmt_string_lisp (printcharfun, "#s(char-table type %s data (", 363 write_fmt_string_lisp (printcharfun,
341 1, char_table_type_to_symbol (ct->type)); 364 "#s(char-table :type %s", 1,
365 char_table_type_to_symbol (ct->type));
366 if (!(EQ (ct->default_, char_table_default_for_type (ct->type))))
367 {
368 write_fmt_string_lisp (printcharfun, " :default %S", 1, ct->default_);
369 }
370
371 write_ascstring (printcharfun, " :data (");
342 map_char_table (obj, &range, print_table_entry, &arg); 372 map_char_table (obj, &range, print_table_entry, &arg);
343 write_ascstring (printcharfun, "))"); 373 write_ascstring (printcharfun, "))");
344 374
345 /* #### need to print and read the default; but that will allow the 375 /* #### need to print and read the default; but that will allow the
346 default to be modified, which we don't (yet) support -- but FSF does */ 376 default to be modified, which we don't (yet) support -- but FSF does */
368 398
369 return internal_equal_0 (ct1->default_, ct2->default_, depth + 1, foldcase); 399 return internal_equal_0 (ct1->default_, ct2->default_, depth + 1, foldcase);
370 } 400 }
371 401
372 static Hashcode 402 static Hashcode
373 char_table_hash (Lisp_Object obj, int depth) 403 char_table_hash (Lisp_Object obj, int depth, Boolint equalp)
374 { 404 {
375 Lisp_Char_Table *ct = XCHAR_TABLE (obj); 405 Lisp_Char_Table *ct = XCHAR_TABLE (obj);
376 Hashcode hashval = internal_array_hash (ct->ascii, NUM_ASCII_CHARS, 406 Hashcode hashval = internal_array_hash (ct->ascii, NUM_ASCII_CHARS,
377 depth + 1); 407 depth + 1, equalp);
378 #ifdef MULE 408 #ifdef MULE
379 hashval = HASH2 (hashval, 409 hashval = HASH2 (hashval,
380 internal_array_hash (ct->level1, NUM_LEADING_BYTES, 410 internal_array_hash (ct->level1, NUM_LEADING_BYTES,
381 depth + 1)); 411 depth + 1, equalp));
382 #endif /* MULE */ 412 #endif /* MULE */
383 return HASH2 (hashval, internal_hash (ct->default_, depth + 1)); 413 return HASH2 (hashval, internal_hash (ct->default_, depth + 1, equalp));
384 } 414 }
385 415
386 static const struct memory_description char_table_description[] = { 416 static const struct memory_description char_table_description[] = {
387 { XD_LISP_OBJECT_ARRAY, offsetof (Lisp_Char_Table, ascii), NUM_ASCII_CHARS }, 417 { XD_LISP_OBJECT_ARRAY, offsetof (Lisp_Char_Table, ascii), NUM_ASCII_CHARS },
388 #ifdef MULE 418 #ifdef MULE
393 { XD_LISP_OBJECT, offsetof (Lisp_Char_Table, mirror_table) }, 423 { XD_LISP_OBJECT, offsetof (Lisp_Char_Table, mirror_table) },
394 { XD_LO_LINK, offsetof (Lisp_Char_Table, next_table) }, 424 { XD_LO_LINK, offsetof (Lisp_Char_Table, next_table) },
395 { XD_END } 425 { XD_END }
396 }; 426 };
397 427
398 DEFINE_LRECORD_IMPLEMENTATION ("char-table", char_table, 428 DEFINE_DUMPABLE_LISP_OBJECT ("char-table", char_table,
399 1, /*dumpable-flag*/ 429 mark_char_table, print_char_table, 0,
400 mark_char_table, print_char_table, 0, 430 char_table_equal, char_table_hash,
401 char_table_equal, char_table_hash, 431 char_table_description,
402 char_table_description, 432 Lisp_Char_Table);
403 Lisp_Char_Table);
404 433
405 DEFUN ("char-table-p", Fchar_table_p, 1, 1, 0, /* 434 DEFUN ("char-table-p", Fchar_table_p, 1, 1, 0, /*
406 Return non-nil if OBJECT is a char table. 435 Return non-nil if OBJECT is a char table.
407 */ 436 */
408 (object)) 437 (object))
477 /* Don't get stymied when initting the table, or when trying to 506 /* Don't get stymied when initting the table, or when trying to
478 free a pdump object. */ 507 free a pdump object. */
479 if (!EQ (ct->level1[i], Qnull_pointer) && 508 if (!EQ (ct->level1[i], Qnull_pointer) &&
480 CHAR_TABLE_ENTRYP (ct->level1[i]) && 509 CHAR_TABLE_ENTRYP (ct->level1[i]) &&
481 !OBJECT_DUMPED_P (ct->level1[1])) 510 !OBJECT_DUMPED_P (ct->level1[1]))
482 FREE_LCRECORD (ct->level1[i]); 511 free_normal_lisp_object (ct->level1[i]);
483 ct->level1[i] = value; 512 ct->level1[i] = value;
484 } 513 }
485 #endif /* MULE */ 514 #endif /* MULE */
486 515
487 if (ct->type == CHAR_TABLE_TYPE_SYNTAX) 516 if (ct->type == CHAR_TABLE_TYPE_SYNTAX)
492 Reset CHAR-TABLE to its default state. 521 Reset CHAR-TABLE to its default state.
493 */ 522 */
494 (char_table)) 523 (char_table))
495 { 524 {
496 Lisp_Char_Table *ct; 525 Lisp_Char_Table *ct;
497 Lisp_Object def;
498 526
499 CHECK_CHAR_TABLE (char_table); 527 CHECK_CHAR_TABLE (char_table);
500 ct = XCHAR_TABLE (char_table); 528 ct = XCHAR_TABLE (char_table);
501 529
502 switch (ct->type)
503 {
504 case CHAR_TABLE_TYPE_CHAR:
505 def = make_char (0);
506 break;
507 case CHAR_TABLE_TYPE_DISPLAY:
508 case CHAR_TABLE_TYPE_GENERIC:
509 #ifdef MULE
510 case CHAR_TABLE_TYPE_CATEGORY:
511 #endif /* MULE */
512 def = Qnil;
513 break;
514
515 case CHAR_TABLE_TYPE_SYNTAX:
516 def = make_int (Sinherit);
517 break;
518
519 default:
520 ABORT ();
521 def = Qnil;
522 break;
523 }
524
525 /* Avoid doubly updating the syntax table by setting the default ourselves, 530 /* Avoid doubly updating the syntax table by setting the default ourselves,
526 since set_char_table_default() also updates. */ 531 since set_char_table_default() also updates. */
527 ct->default_ = def; 532 ct->default_ = char_table_default_for_type (ct->type);
528 fill_char_table (ct, Qunbound); 533 fill_char_table (ct, Qunbound);
529 534
530 return Qnil; 535 return Qnil;
531 } 536 }
532 537
596 default result given by `get-char-table' is the syntax code for 601 default result given by `get-char-table' is the syntax code for
597 `inherit'. 602 `inherit'.
598 */ 603 */
599 (type)) 604 (type))
600 { 605 {
601 Lisp_Char_Table *ct; 606 Lisp_Object obj = ALLOC_NORMAL_LISP_OBJECT (char_table);
602 Lisp_Object obj; 607 Lisp_Char_Table *ct = XCHAR_TABLE (obj);
603 enum char_table_type ty = symbol_to_char_table_type (type); 608 enum char_table_type ty = symbol_to_char_table_type (type);
604 609
605 ct = ALLOC_LCRECORD_TYPE (Lisp_Char_Table, &lrecord_char_table);
606 ct->type = ty; 610 ct->type = ty;
607 obj = wrap_char_table (ct);
608 if (ty == CHAR_TABLE_TYPE_SYNTAX) 611 if (ty == CHAR_TABLE_TYPE_SYNTAX)
609 { 612 {
610 /* Qgeneric not Qsyntax because a syntax table has a mirror table 613 /* Qgeneric not Qsyntax because a syntax table has a mirror table
611 and we don't want infinite recursion */ 614 and we don't want infinite recursion */
612 ct->mirror_table = Fmake_char_table (Qgeneric); 615 ct->mirror_table = Fmake_char_table (Qgeneric);
632 635
633 static Lisp_Object 636 static Lisp_Object
634 make_char_table_entry (Lisp_Object initval) 637 make_char_table_entry (Lisp_Object initval)
635 { 638 {
636 int i; 639 int i;
637 Lisp_Char_Table_Entry *cte = 640 Lisp_Object obj = ALLOC_NORMAL_LISP_OBJECT (char_table_entry);
638 ALLOC_LCRECORD_TYPE (Lisp_Char_Table_Entry, &lrecord_char_table_entry); 641 Lisp_Char_Table_Entry *cte = XCHAR_TABLE_ENTRY (obj);
639 642
640 for (i = 0; i < 96; i++) 643 for (i = 0; i < 96; i++)
641 cte->level2[i] = initval; 644 cte->level2[i] = initval;
642 645
643 return wrap_char_table_entry (cte); 646 return obj;
644 } 647 }
645 648
646 static Lisp_Object 649 static Lisp_Object
647 copy_char_table_entry (Lisp_Object entry) 650 copy_char_table_entry (Lisp_Object entry)
648 { 651 {
649 Lisp_Char_Table_Entry *cte = XCHAR_TABLE_ENTRY (entry); 652 Lisp_Char_Table_Entry *cte = XCHAR_TABLE_ENTRY (entry);
650 int i; 653 int i;
651 Lisp_Char_Table_Entry *ctenew = 654 Lisp_Object obj = ALLOC_NORMAL_LISP_OBJECT (char_table_entry);
652 ALLOC_LCRECORD_TYPE (Lisp_Char_Table_Entry, &lrecord_char_table_entry); 655 Lisp_Char_Table_Entry *ctenew = XCHAR_TABLE_ENTRY (obj);
653 656
654 for (i = 0; i < 96; i++) 657 for (i = 0; i < 96; i++)
655 { 658 {
656 Lisp_Object new_ = cte->level2[i]; 659 Lisp_Object new_ = cte->level2[i];
657 if (CHAR_TABLE_ENTRYP (new_)) 660 if (CHAR_TABLE_ENTRYP (new_))
658 ctenew->level2[i] = copy_char_table_entry (new_); 661 ctenew->level2[i] = copy_char_table_entry (new_);
659 else 662 else
660 ctenew->level2[i] = new_; 663 ctenew->level2[i] = new_;
661 } 664 }
662 665
663 return wrap_char_table_entry (ctenew); 666 return obj;
664 } 667 }
665 668
666 #endif /* MULE */ 669 #endif /* MULE */
667 670
668 DEFUN ("copy-char-table", Fcopy_char_table, 1, 1, 0, /* 671 DEFUN ("copy-char-table", Fcopy_char_table, 1, 1, 0, /*
677 int i; 680 int i;
678 681
679 CHECK_CHAR_TABLE (char_table); 682 CHECK_CHAR_TABLE (char_table);
680 ct = XCHAR_TABLE (char_table); 683 ct = XCHAR_TABLE (char_table);
681 assert(!ct->mirror_table_p); 684 assert(!ct->mirror_table_p);
682 ctnew = ALLOC_LCRECORD_TYPE (Lisp_Char_Table, &lrecord_char_table); 685 obj = ALLOC_NORMAL_LISP_OBJECT (char_table);
686 ctnew = XCHAR_TABLE (obj);
683 ctnew->type = ct->type; 687 ctnew->type = ct->type;
684 ctnew->parent = ct->parent; 688 ctnew->parent = ct->parent;
685 ctnew->default_ = ct->default_; 689 ctnew->default_ = ct->default_;
686 ctnew->mirror_table_p = 0; 690 ctnew->mirror_table_p = 0;
687 obj = wrap_char_table (ctnew);
688 691
689 for (i = 0; i < NUM_ASCII_CHARS; i++) 692 for (i = 0; i < NUM_ASCII_CHARS; i++)
690 { 693 {
691 Lisp_Object new_ = ct->ascii[i]; 694 Lisp_Object new_ = ct->ascii[i];
692 #ifdef MULE 695 #ifdef MULE
1073 else 1076 else
1074 { 1077 {
1075 int lb = XCHARSET_LEADING_BYTE (range->charset) - MIN_LEADING_BYTE; 1078 int lb = XCHARSET_LEADING_BYTE (range->charset) - MIN_LEADING_BYTE;
1076 if (CHAR_TABLE_ENTRYP (ct->level1[lb]) && 1079 if (CHAR_TABLE_ENTRYP (ct->level1[lb]) &&
1077 !OBJECT_DUMPED_P (ct->level1[lb])) 1080 !OBJECT_DUMPED_P (ct->level1[lb]))
1078 FREE_LCRECORD (ct->level1[lb]); 1081 free_normal_lisp_object (ct->level1[lb]);
1079 ct->level1[lb] = val; 1082 ct->level1[lb] = val;
1080 } 1083 }
1081 break; 1084 break;
1082 1085
1083 case CHARTAB_RANGE_ROW: 1086 case CHARTAB_RANGE_ROW:
1545 } 1548 }
1546 1549
1547 return 1; 1550 return 1;
1548 } 1551 }
1549 1552
1553 static int
1554 chartab_default_validate (Lisp_Object UNUSED (keyword),
1555 Lisp_Object UNUSED (value),
1556 Error_Behavior UNUSED (errb))
1557 {
1558 /* We can't yet validate this, since we don't know what the type of the
1559 char table is. We do the validation below in chartab_instantiate(). */
1560 return 1;
1561 }
1562
1550 static Lisp_Object 1563 static Lisp_Object
1551 chartab_instantiate (Lisp_Object data) 1564 chartab_instantiate (Lisp_Object plist)
1552 { 1565 {
1553 Lisp_Object chartab; 1566 Lisp_Object chartab;
1554 Lisp_Object type = Qgeneric; 1567 Lisp_Object type = Qgeneric;
1555 Lisp_Object dataval = Qnil; 1568 Lisp_Object dataval = Qnil, default_ = Qunbound;
1556 1569
1557 while (!NILP (data)) 1570 if (KEYWORDP (Fcar (plist)))
1558 { 1571 {
1559 Lisp_Object keyw = Fcar (data); 1572 PROPERTY_LIST_LOOP_3 (key, value, plist)
1560 Lisp_Object valw; 1573 {
1561 1574 if (EQ (key, Q_data))
1562 data = Fcdr (data); 1575 {
1563 valw = Fcar (data); 1576 dataval = value;
1564 data = Fcdr (data); 1577 }
1565 if (EQ (keyw, Qtype)) 1578 else if (EQ (key, Q_type))
1566 type = valw; 1579 {
1567 else if (EQ (keyw, Qdata)) 1580 type = value;
1568 dataval = valw; 1581 }
1569 } 1582 else if (EQ (key, Q_default_))
1583 {
1584 default_ = value;
1585 }
1586 else if (!KEYWORDP (key))
1587 {
1588 signal_error
1589 (Qinvalid_read_syntax,
1590 "can't mix keyword and non-keyword structure syntax",
1591 key);
1592 }
1593 else
1594 ABORT ();
1595 }
1596 }
1597 #ifdef NEED_TO_HANDLE_21_4_CODE
1598 else
1599 {
1600 PROPERTY_LIST_LOOP_3 (key, value, plist)
1601 {
1602 if (EQ (key, Qdata))
1603 {
1604 dataval = value;
1605 }
1606 else if (EQ (key, Qtype))
1607 {
1608 type = value;
1609 }
1610 else if (KEYWORDP (key))
1611 signal_error
1612 (Qinvalid_read_syntax,
1613 "can't mix keyword and non-keyword structure syntax",
1614 key);
1615 else
1616 ABORT ();
1617 }
1618 }
1619 #endif /* NEED_TO_HANDLE_21_4_CODE */
1570 1620
1571 chartab = Fmake_char_table (type); 1621 chartab = Fmake_char_table (type);
1572 1622 if (!UNBOUNDP (default_))
1573 data = dataval; 1623 {
1574 while (!NILP (data)) 1624 check_valid_char_table_value (default_, XCHAR_TABLE_TYPE (chartab),
1575 { 1625 ERROR_ME);
1576 Lisp_Object range = Fcar (data); 1626 set_char_table_default (chartab, default_);
1577 Lisp_Object val = Fcar (Fcdr (data)); 1627 if (!NILP (XCHAR_TABLE (chartab)->mirror_table))
1578 1628 {
1579 data = Fcdr (Fcdr (data)); 1629 set_char_table_default (XCHAR_TABLE (chartab)->mirror_table,
1630 default_);
1631 }
1632 }
1633
1634 while (!NILP (dataval))
1635 {
1636 Lisp_Object range = Fcar (dataval);
1637 Lisp_Object val = Fcar (Fcdr (dataval));
1638
1639 dataval = Fcdr (Fcdr (dataval));
1580 if (CONSP (range)) 1640 if (CONSP (range))
1581 { 1641 {
1582 if (CHAR_OR_CHAR_INTP (XCAR (range))) 1642 if (CHAR_OR_CHAR_INTP (XCAR (range)))
1583 { 1643 {
1584 Ichar first = XCHAR_OR_CHAR_INT (Fcar (range)); 1644 Ichar first = XCHAR_OR_CHAR_INT (Fcar (range));
1830 1890
1831 1891
1832 void 1892 void
1833 syms_of_chartab (void) 1893 syms_of_chartab (void)
1834 { 1894 {
1835 INIT_LRECORD_IMPLEMENTATION (char_table); 1895 INIT_LISP_OBJECT (char_table);
1836 1896
1837 #ifdef MULE 1897 #ifdef MULE
1838 INIT_LRECORD_IMPLEMENTATION (char_table_entry); 1898 INIT_LISP_OBJECT (char_table_entry);
1839 1899
1840 DEFSYMBOL (Qcategory_table_p); 1900 DEFSYMBOL (Qcategory_table_p);
1841 DEFSYMBOL (Qcategory_designator_p); 1901 DEFSYMBOL (Qcategory_designator_p);
1842 DEFSYMBOL (Qcategory_table_value_p); 1902 DEFSYMBOL (Qcategory_table_value_p);
1843 #endif /* MULE */ 1903 #endif /* MULE */
1889 { 1949 {
1890 struct structure_type *st; 1950 struct structure_type *st;
1891 1951
1892 st = define_structure_type (Qchar_table, 0, chartab_instantiate); 1952 st = define_structure_type (Qchar_table, 0, chartab_instantiate);
1893 1953
1954 #ifdef NEED_TO_HANDLE_21_4_CODE
1894 define_structure_type_keyword (st, Qtype, chartab_type_validate); 1955 define_structure_type_keyword (st, Qtype, chartab_type_validate);
1895 define_structure_type_keyword (st, Qdata, chartab_data_validate); 1956 define_structure_type_keyword (st, Qdata, chartab_data_validate);
1957 #endif /* NEED_TO_HANDLE_21_4_CODE */
1958
1959 define_structure_type_keyword (st, Q_type, chartab_type_validate);
1960 define_structure_type_keyword (st, Q_data, chartab_data_validate);
1961 define_structure_type_keyword (st, Q_default_, chartab_default_validate);
1896 } 1962 }
1897 1963
1898 void 1964 void
1899 complex_vars_of_chartab (void) 1965 complex_vars_of_chartab (void)
1900 { 1966 {