- Lisp_Object tem;
-
- tem = Fmake_string (make_number (256), make_number (0));
- Vascii_downcase_table = tem;
- Vascii_canon_table = tem;
-
- for (i = 0; i < 256; i++)
- XSTRING (tem)->data[i] = (i >= 'A' && i <= 'Z') ? i + 040 : i;
-
- tem = Fmake_string (make_number (256), make_number (0));
- Vascii_upcase_table = tem;
- Vascii_eqv_table = tem;
-
- for (i = 0; i < 256; i++)
- XSTRING (tem)->data[i]
- = ((i >= 'A' && i <= 'Z')
- ? i + ('a' - 'A')
- : ((i >= 'a' && i <= 'z')
- ? i + ('A' - 'a')
- : i));
+ Lisp_Object down, up;
+ Qcase_table = intern ("case-table");
+ staticpro (&Qcase_table);
+
+ /* Intern this now in case it isn't already done.
+ Setting this variable twice is harmless.
+ But don't staticpro it here--that is done in alloc.c. */
+ Qchar_table_extra_slots = intern ("char-table-extra-slots");
+
+ /* Now we are ready to set up this property, so we can
+ create char tables. */
+ Fput (Qcase_table, Qchar_table_extra_slots, make_number (3));
+
+ down = Fmake_char_table (Qcase_table, Qnil);
+ Vascii_downcase_table = down;
+ XCHAR_TABLE (down)->purpose = Qcase_table;
+
+ for (i = 0; i < CHAR_TABLE_SINGLE_BYTE_SLOTS; i++)
+ XSETFASTINT (XCHAR_TABLE (down)->contents[i],
+ (i >= 'A' && i <= 'Z') ? i + ('a' - 'A') : i);
+
+ XCHAR_TABLE (down)->extras[1] = Fcopy_sequence (down);
+
+ up = Fmake_char_table (Qcase_table, Qnil);
+ XCHAR_TABLE (down)->extras[0] = up;
+
+ for (i = 0; i < CHAR_TABLE_SINGLE_BYTE_SLOTS; i++)
+ XSETFASTINT (XCHAR_TABLE (up)->contents[i],
+ ((i >= 'A' && i <= 'Z')
+ ? i + ('a' - 'A')
+ : ((i >= 'a' && i <= 'z')
+ ? i + ('A' - 'a')
+ : i)));
+
+ XCHAR_TABLE (down)->extras[2] = Fcopy_sequence (up);