changeset 17327:0cb065f8702e

(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
author Kenichi Handa <handa@m17n.org>
date Mon, 07 Apr 1997 07:12:13 +0000
parents bd34aa57f3f5
children e2a6f31ee014
files src/keymap.c
diffstat 1 files changed, 65 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- a/src/keymap.c	Mon Apr 07 07:12:13 1997 +0000
+++ b/src/keymap.c	Mon Apr 07 07:12:13 1997 +0000
@@ -2552,7 +2552,7 @@
       /* Prepare for handling a nested char-table.  */
       if (NILP (elt_prefix))
 	{
-	  /* VECTOR is the top level of char-table.  */
+	  /* VECTOR is a top level char-table.  */
 	  this_level = 0;
 	  complete_char = 0;
 	  from = 0;
@@ -2560,11 +2560,11 @@
 	}
       else
 	{
-	  /* VECTOR is the deeper level of char-table.  */
+	  /* VECTOR is a sub char-table.  */
 	  this_level = XVECTOR (elt_prefix)->size;
 	  if (this_level >= 3)
 	    /* A char-table is not that deep.  */
-	    wrong_type_argument (Qchar_table_p, vector);
+	    error ("Too deep char table");
 
 	  /* For multibyte characters, the top level index for
              charsets starts from 256.  */
@@ -2578,7 +2578,7 @@
 
 	  /* Meaningful elements are from 32th to 127th.  */
 	  from = 32;
-	  to = 128;
+	  to = SUB_CHAR_TABLE_ORDINARY_SLOTS;
 	}
       chartable_kludge = Fmake_vector (make_number (this_level + 1), Qnil);
       if (this_level != 0)
@@ -2599,13 +2599,16 @@
     {
       QUIT;
 
-      if (this_level == 0
-	  && i >= CHAR_TABLE_SINGLE_BYTE_SLOTS
-	  && !CHARSET_DEFINED_P (i - 128))
-	continue;
-
-      definition = get_keyelt (XVECTOR (vector)->contents[i], 0);
-      if (NILP (definition)) continue;      
+      if (CHAR_TABLE_P (vector))
+	{
+	  if (i >= CHAR_TABLE_SINGLE_BYTE_SLOTS
+	      && !CHARSET_DEFINED_P (i - 128))
+	    continue;
+	  definition = get_keyelt (XCHAR_TABLE (vector)->contents[i]);
+	  if (NILP (definition)) continue;      
+	}
+      else
+	definition = get_keyelt (XVECTOR (vector)->contents[i], 0);
 
       /* Don't mention suppressed commands.  */
       if (SYMBOLP (definition) && partial)
@@ -2648,7 +2651,7 @@
 	  first = 0;
 	}
 
-      /* If VECTOR is a deeper char-table, show the depth by indentation.
+      /* If VECTOR is a sub char-table, show the depth by indentation.
 	 THIS_LEVEL can be greater than 0 only for char-table.  */
       if (this_level > 0)
 	insert ("    ", this_level * 2); /* THIS_LEVEL is 1 or 2.  */
@@ -2656,7 +2659,23 @@
       /* Get a Lisp object for the character I.  */
       XSETFASTINT (dummy, i);
 
-      if (CHAR_TABLE_P (vector))
+      if (this_level == 0 && CHAR_TABLE_P (vector))
+	{
+	  if (i < CHAR_TABLE_SINGLE_BYTE_SLOTS)
+	    insert1 (Fsingle_key_description (dummy));
+	  else
+	    {
+	      /* Print the information for this character set.  */
+	      insert_string ("<");
+	      tem2 = CHARSET_TABLE_INFO (i - 128, CHARSET_SHORT_NAME_IDX);
+	      if (STRINGP (tem2))
+		insert_from_string (tem2, 0 , XSTRING (tem2)->size, 0);
+	      else
+		insert ("?", 1);
+	      insert (">", 1);
+	    }
+	}
+      else if (this_level > 0 && SUB_CHAR_TABLE_P (vector))
 	{
 	  if (complete_char)
 	    {
@@ -2665,15 +2684,14 @@
 	      idx[this_level] = i;
 	      insert_char (MAKE_NON_ASCII_CHAR (idx[0], idx[1], idx[2]));
 	    }
-	  else if (this_level > 0)
+	  else
 	    {
-	      /* We need an octal representation.  */
+	      /* We need an octal representation for this block of
+                 characters.  */
 	      char work[5];
 	      sprintf (work, "\\%03o", i & 255);
 	      insert (work, 4);
 	    }
-	  else
-	    insert1 (Fsingle_key_description (dummy));
 	}
       else
 	{
@@ -2685,22 +2703,11 @@
 	  insert1 (Fsingle_key_description (dummy));
 	}
 
-      /* If we find a char-table within a char-table,
+      /* If we find a sub char-table within a char-table,
 	 scan it recursively; it defines the details for
 	 a character set or a portion of a character set.  */
-      if (multibyte && CHAR_TABLE_P (vector) && CHAR_TABLE_P (definition))
+      if (multibyte && CHAR_TABLE_P (vector) && SUB_CHAR_TABLE_P (definition))
 	{
-	  if (this_level == 0
-	      && CHARSET_VALID_P (i - 128))
-	    {
-	      /* Before scanning the deeper table, print the
-		 information for this character set.  */
-	      insert_string ("\t\t<charset:");
-	      tem2 = CHARSET_TABLE_INFO (i - 128, CHARSET_SHORT_NAME_IDX);
-	      insert_from_string (tem2, 0 , XSTRING (tem2)->size, 0);
-	      insert (">", 1);
-	    }
-
 	  insert ("\n", 1);
 	  XVECTOR (chartable_kludge)->contents[this_level] = make_number (i);
 	  describe_vector (definition, chartable_kludge, elt_describer,
@@ -2708,12 +2715,33 @@
 	  continue;
 	}
 
-      /* Find all consecutive characters that have the same definition.  */
-      while (i + 1 < to
-	     && (tem2 = get_keyelt (XVECTOR (vector)->contents[i+1], 0),
-		 !NILP (tem2))
-	     && !NILP (Fequal (tem2, definition)))
-	i++;
+      /* Find all consecutive characters that have the same
+         definition.  But, for elements of a top level char table, if
+         they are for charsets, we had better describe one by one even
+         if they have the same definition.  */
+      if (CHAR_TABLE_P (vector))
+	{
+	  if (this_level == 0)
+	    while (i + 1 < CHAR_TABLE_SINGLE_BYTE_SLOTS
+		   && (tem2
+		       = get_keyelt (XCHAR_TABLE (vector)->contents[i + 1], 0),
+		       !NILP (tem2))
+		   && !NILP (Fequal (tem2, definition)))
+	      i++;
+	  else
+	    while (i + 1 < to
+		   && (tem2 = get_keyelt (XCHAR_TABLE (vector)->contents[i + 1], 0),
+		       !NILP (tem2))
+		   && !NILP (Fequal (tem2, definition)))
+	      i++;
+	}
+      else
+	while (i + 1 < CHAR_TABLE_SINGLE_BYTE_SLOTS
+	       && (tem2 = get_keyelt (XVECTOR (vector)->contents[i + 1], 0),
+		   !NILP (tem2))
+	       && !NILP (Fequal (tem2, definition)))
+	  i++;
+      
 
       /* If we have a range of more than one character,
 	 print where the range reaches to.  */
@@ -2756,7 +2784,7 @@
       (*elt_describer) (definition);
     }
 
-  /* For char-table, print `defalt' slot at last.  */
+  /* For (sub) char-table, print `defalt' slot at last.  */
   if (CHAR_TABLE_P (vector) && !NILP (XCHAR_TABLE (vector)->defalt))
     {
       insert ("    ", this_level * 2);