+ rainj.type = CHARTAB_RANGE_CHAR;
+
+ for (retval = 0; c < c1 && retval == 0; c++)
+ {
+ Lisp_Object ret = get_char_id_table (ct, c);
+
+ if (!UNBOUNDP (ret))
+ {
+ rainj.ch = c;
+ retval = (fn) (&rainj, ct->table, arg);
+ }
+ }
+ return retval;
+#else
+ ct->table = Qunbound;
+#endif
+ }
+ else if (!UNBOUNDP (ct->table))
+ return (fn) (range, ct->table, arg);
+ return 0;
+#else
+ {
+ int retval;
+
+ retval = map_over_charset_ascii (ct, fn, arg);
+ if (retval)
+ return retval;
+#ifdef MULE
+ retval = map_over_charset_control_1 (ct, fn, arg);
+ if (retval)
+ return retval;
+ {
+ Charset_ID i;
+ Charset_ID start = MIN_LEADING_BYTE;
+ Charset_ID stop = start + NUM_LEADING_BYTES;
+
+ for (i = start, retval = 0; i < stop && retval == 0; i++)
+ {
+ retval = map_over_other_charset (ct, i, fn, arg);
+ }
+ }
+#endif /* MULE */
+ return retval;
+ }
+#endif
+
+#ifdef UTF2000
+ case CHARTAB_RANGE_DEFAULT:
+ if (!UNBOUNDP (ct->default_value))
+ return (fn) (range, ct->default_value, arg);
+ return 0;
+#endif
+
+#ifdef MULE
+ case CHARTAB_RANGE_CHARSET:
+#ifdef UTF2000
+ {
+ Lisp_Object encoding_table
+ = XCHARSET_ENCODING_TABLE (range->charset);
+
+ if (!NILP (encoding_table))
+ {
+ struct chartab_range rainj;
+ struct map_char_table_for_charset_arg mcarg;
+
+#ifdef HAVE_DATABASE
+ if (XCHAR_TABLE_UNLOADED(encoding_table))
+ Fload_char_attribute_table (XCHAR_TABLE_NAME (encoding_table));
+#endif
+ mcarg.fn = fn;
+ mcarg.ct = ct;
+ mcarg.arg = arg;
+ rainj.type = CHARTAB_RANGE_ALL;
+ return map_char_table (XCHAR_TABLE(encoding_table),
+ &rainj,
+ &map_char_table_for_charset_fun,
+ &mcarg);
+ }
+ }
+ return 0;
+#else
+ return map_over_other_charset (ct,
+ XCHARSET_LEADING_BYTE (range->charset),
+ fn, arg);
+#endif
+
+ case CHARTAB_RANGE_ROW:
+#ifdef UTF2000
+ {
+ int cell_min, cell_max, i;
+ int retval;
+ struct chartab_range rainj;
+
+ i = XCHARSET_CELL_RANGE (range->charset);
+ cell_min = i >> 8;
+ cell_max = i & 0xFF;
+ rainj.type = CHARTAB_RANGE_CHAR;
+ for (retval =0, i = cell_min; i <= cell_max && retval == 0; i++)
+ {
+ Emchar ch = DECODE_CHAR (range->charset, (range->row << 8) | i);
+
+ if ( charset_code_point (range->charset, ch) >= 0 )
+ {
+ Lisp_Object val
+ = get_byte_table (get_byte_table
+ (get_byte_table
+ (get_byte_table
+ (ct->table,
+ (unsigned char)(ch >> 24)),
+ (unsigned char) (ch >> 16)),
+ (unsigned char) (ch >> 8)),
+ (unsigned char) ch);
+
+ if (UNBOUNDP (val))
+ val = ct->default_value;
+ rainj.ch = ch;
+ retval = (fn) (&rainj, val, arg);
+ }
+ }
+ return retval;
+ }
+#else
+ {
+ Lisp_Object val = ct->level1[XCHARSET_LEADING_BYTE (range->charset)
+ - MIN_LEADING_BYTE];
+ if (!CHAR_TABLE_ENTRYP (val))
+ {
+ struct chartab_range rainj;
+
+ rainj.type = CHARTAB_RANGE_ROW;
+ rainj.charset = range->charset;
+ rainj.row = range->row;
+ return (fn) (&rainj, val, arg);
+ }
+ else
+ return map_over_charset_row (XCHAR_TABLE_ENTRY (val),
+ range->charset, range->row,
+ fn, arg);
+ }
+#endif /* not UTF2000 */
+#endif /* MULE */
+
+ case CHARTAB_RANGE_CHAR:
+ {
+ Emchar ch = range->ch;
+ Lisp_Object val = CHAR_TABLE_VALUE_UNSAFE (ct, ch);