changeset 55964:49894995b543

(find_safe_codings): Check NILP (safe_codings) only at the necessary places.
author Kenichi Handa <handa@m17n.org>
date Sun, 06 Jun 2004 23:59:19 +0000
parents e2a4206075f9
children a98219d0f4e4
files src/coding.c
diffstat 1 files changed, 26 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/coding.c	Sun Jun 06 22:40:53 2004 +0000
+++ b/src/coding.c	Sun Jun 06 23:59:19 2004 +0000
@@ -6570,8 +6570,8 @@
     possible coding systems.  If it is nil, it means that we have not
     yet found any coding systems.
 
-    WORK_TABLE is a copy of the char-table Vchar_coding_system_table.  An
-    element of WORK_TABLE is set to t once the element is looked up.
+    WORK_TABLE a char-table of which element is set to t once the
+    element is looked up.
 
     If a non-ASCII single byte char is found, set
     *single_byte_char_found to 1.  */
@@ -6586,6 +6586,8 @@
   Lisp_Object val, ch;
   Lisp_Object prev, tail;
 
+  if (NILP (safe_codings))
+    goto done_safe_codings;
   while (p < pend)
     {
       c = STRING_CHAR_AND_LENGTH (p, pend - p, len);
@@ -6595,11 +6597,6 @@
 	continue;
       if (SINGLE_BYTE_CHAR_P (c))
 	*single_byte_char_found = 1;
-      if (NILP (safe_codings))
-	/* Already all coding systems are excluded.  But, we can't
-	   terminate the loop here because non-ASCII single-byte char
-	   must be found.  */
-	continue;
       /* Check the safe coding systems for C.  */
       ch = make_number (c);
       val = Faref (work_table, ch);
@@ -6677,12 +6674,33 @@
 	    {
 	      /* Exclude this coding system from SAFE_CODINGS.  */
 	      if (EQ (tail, safe_codings))
-		safe_codings = XCDR (safe_codings);
+		{
+		  safe_codings = XCDR (safe_codings);
+		  if (NILP (safe_codings))
+		    goto done_safe_codings;
+		}
 	      else
 		XSETCDR (prev, XCDR (tail));
 	    }
 	}
     }
+
+ done_safe_codings:
+  /* If the above loop was terminated before P reaches PEND, it means
+     SAFE_CODINGS was set to nil.  If we have not yet found an
+     non-ASCII single-byte char, check it now.  */
+  if (! *single_byte_char_found)
+    while (p < pend)
+      {
+	c = STRING_CHAR_AND_LENGTH (p, pend - p, len);
+	p += len;
+	if (! ASCII_BYTE_P (c)
+	    && SINGLE_BYTE_CHAR_P (c))
+	  {
+	    *single_byte_char_found = 1;
+	    break;
+	  }
+      }
   return safe_codings;
 }