changeset 22451:2da4749dc8cc

(Finsert_file_contents): Undo the previous change for handling set-ault-coding.
author Kenichi Handa <handa@m17n.org>
date Fri, 12 Jun 1998 08:44:43 +0000
parents 455438d7b6c7
children 337f283a8035
files src/fileio.c
diffstat 1 files changed, 153 insertions(+), 184 deletions(-) [+]
line wrap: on
line diff
--- a/src/fileio.c	Fri Jun 12 08:35:09 1998 +0000
+++ b/src/fileio.c	Fri Jun 12 08:44:43 1998 +0000
@@ -3246,26 +3246,6 @@
 #define READ_BUF_SIZE (64 << 10)
 #endif
 
-/* This function is called when a function bound to
-   Vset_auto_coding_function causes some error.  At that time, a text
-   of a file has already been inserted in the current buffer, but,
-   markers has not yet been adjusted.  Thus we must adjust markers
-   here.  We are sure that the buffer was empty before the text of the
-   file was inserted.  */
-
-static Lisp_Object
-set_auto_coding_unwind (multibyte)
-     Lisp_Object multibyte;
-{
-  int inserted = Z_BYTE - BEG_BYTE;
-
-  if (!NILP (multibyte))
-    inserted = multibyte_chars_in_text (GPT_ADDR - inserted, inserted);
-  adjust_after_insert (PT, PT_BYTE, Z, Z_BYTE, inserted);
-
-  return Qnil;
-}
-
 DEFUN ("insert-file-contents", Finsert_file_contents, Sinsert_file_contents,
   1, 5, 0,
   "Insert contents of file FILENAME after point.\n\
@@ -3310,7 +3290,6 @@
   unsigned char buffer[1 << 14];
   int replace_handled = 0;
   int set_coding_system = 0;
-  int coding_system_decided = 0;
 
   if (current_buffer->base_buffer && ! NILP (visit))
     error ("Cannot do file visiting in an indirect buffer");
@@ -3415,107 +3394,161 @@
 	}
     }
 
-  if (BEG < Z)
-    {
-      /* Decide the coding system to use for reading the file now
-         because we can't use an optimized method for handling
-         `coding:' tag if the current buffer is not empty.  */
-      Lisp_Object val;
-      val = Qnil;
-
-      if (!NILP (Vcoding_system_for_read))
-	val = Vcoding_system_for_read;
-      else if (! NILP (replace))
-	/* In REPLACE mode, we can use the same coding system
-	   that was used to visit the file.  */
-	val = current_buffer->buffer_file_coding_system;
-      else
-	{
-	  /* Don't try looking inside a file for a coding system
-	     specification if it is not seekable.  */
-	  if (! not_regular && ! NILP (Vset_auto_coding_function))
-	    {
-	      /* Find a coding system specified in the heading two
-		 lines or in the tailing several lines of the file.
-		 We assume that the 1K-byte and 3K-byte for heading
-		 and tailing respectively are sufficient fot this
-		 purpose.  */
-	      int how_many, nread;
-
-	      if (st.st_size <= (1024 * 4))
+  /* Decide the coding-system of the file.  */
+  {
+    Lisp_Object val;
+    val = Qnil;
+
+    if (!NILP (Vcoding_system_for_read))
+      val = Vcoding_system_for_read;
+    else if (! NILP (replace))
+      /* In REPLACE mode, we can use the same coding system
+	 that was used to visit the file.  */
+      val = current_buffer->buffer_file_coding_system;
+    else if (! not_regular)
+      {
+	/* Don't try looking inside a file for a coding system specification
+	   if it is not seekable.  */
+	if (! NILP (Vset_auto_coding_function))
+	  {
+	    /* Find a coding system specified in the heading two lines
+	       or in the tailing several lines of the file.  We assume
+	       that the 1K-byte and 3K-byte for heading and tailing
+	       respectively are sufficient fot this purpose.  */
+	    int nread;
+	    int beginning_of_end, end_of_beginning;
+
+	    if (st.st_size <= (1024 * 4))
+	      {
 		nread = read (fd, read_buf, 1024 * 4);
-	      else
-		{
-		  nread = read (fd, read_buf, 1024);
-		  if (nread >= 0)
-		    {
-		      if (lseek (fd, st.st_size - (1024 * 3), 0) < 0)
-			report_file_error ("Setting file position",
-					   Fcons (orig_filename, Qnil));
-		      nread += read (fd, read_buf + nread, 1024 * 3);
-		    }
-		}
-
-	      if (nread < 0)
-		error ("IO error reading %s: %s",
-		       XSTRING (orig_filename)->data, strerror (errno));
-	      else if (nread > 0)
-		{
-		  int count = specpdl_ptr - specpdl;
-		  struct buffer *prev = current_buffer;
-
-		  record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
-		  temp_output_buffer_setup (" *code-converting-work*");
-		  set_buffer_internal (XBUFFER (Vstandard_output));
-		  current_buffer->enable_multibyte_characters = Qnil;
-		  insert_1_both (read_buf, nread, nread, 0, 0, 0);
-		  TEMP_SET_PT_BOTH (BEG, BEG_BYTE);
-		  val = call1 (Vset_auto_coding_function, make_number (nread));
-		  set_buffer_internal (prev);
-		  /* Discard the unwind protect for recovering the
-                     current buffer.  */
-		  specpdl_ptr--;
-
-		  /* Rewind the file for the actual read done later.  */
-		  if (lseek (fd, 0, 0) < 0)
-		    report_file_error ("Setting file position",
-				       Fcons (orig_filename, Qnil));
-		}
-	    }
-
-	  if (NILP (val))
-	    {
-	      /* If we have not yet decided a coding system, check
-                 file-coding-system-alist.  */
-	      Lisp_Object args[6], coding_systems;
-
-	      args[0] = Qinsert_file_contents, args[1] = orig_filename;
-	      args[2] = visit, args[3] = beg, args[4] = end, args[5] = replace;
-	      coding_systems = Ffind_operation_coding_system (6, args);
-	      if (CONSP (coding_systems))
-		val = XCONS (coding_systems)->car;
-	    }
-	}
-
+		end_of_beginning = nread;
+		beginning_of_end = 0;
+	      }
+	    else
+	      {
+		nread = read (fd, read_buf, 1024);
+		end_of_beginning = nread;
+		beginning_of_end = nread;
+		if (nread >= 0)
+		  {
+		    if (lseek (fd, st.st_size - (1024 * 3), 0) < 0)
+		      report_file_error ("Setting file position",
+					 Fcons (orig_filename, Qnil));
+		    nread += read (fd, read_buf + nread, 1024 * 3);
+		  }
+	      }
+
+	    if (nread < 0)
+	      error ("IO error reading %s: %s",
+		     XSTRING (orig_filename)->data, strerror (errno));
+	    else if (nread > 0)
+	      {
+		int i;
+		int possible_spec = 0;
+		unsigned char *p, *p1;
+		Lisp_Object tem;
+		unsigned char *copy = (unsigned char *) alloca (nread + 1);
+
+		/* Make a copy of the contents of read_buf in COPY, 
+		   and convert it to lower case so we can compare
+		   more efficiently.  */
+		bcopy (read_buf, copy, nread);
+		for (i = 0; i < nread; i++)
+		  copy[i] = DOWNCASE (copy[i]);
+		/* Ensure various comparisons fail at end of data.  */
+		copy[nread] = 0;
+
+		/* Now test quickly whether the file contains a -*- line.  */
+		p = copy;
+		while (*p != '\n' && p - copy < end_of_beginning)
+		  p++;
+		if (copy[0] == '#' && copy[1] == '!')
+		  while (*p != '\n' && p - copy < end_of_beginning)
+		    p++;
+		p1 = copy;
+		while (p - p1 >= 3)
+		  {
+		    if (p1[0] == '-' && p1[1] == '*' && p1[2] == '-')
+		      {
+			while (p - p1 >= 7)
+			  {
+			    if (! bcmp ("coding:", p1, 7))
+			      {
+				possible_spec = 1;
+				goto win;
+			      }
+			    p1++;
+			  }
+			break;
+		      }
+		    p1++;
+		  }
+
+		/* Test quickly whether the file
+		   contains a local variables list.  */
+		p = &copy[nread - 1];
+		p1 = &copy[beginning_of_end];
+		while (p > p1)
+		  {
+		    if (p[0] == '\n' && p[1] == '\f')
+		      break;
+		    p--;
+		  }
+		p1 = &copy[nread];
+		while (p1 - p >= 16)
+		  {
+		    if (! bcmp ("local variables:", p, 16))
+		      {
+			possible_spec = 1;
+			break;
+		      }
+		    p++;
+		  }
+	      win:
+
+		if (possible_spec)
+		  {
+		    /* Always make this a unibyte string
+		       because we have not yet decoded it.  */ 
+		    tem = make_unibyte_string (read_buf, nread);
+		    val = call1 (Vset_auto_coding_function, tem);
+		  }
+
+		/* Rewind the file for the actual read done later.  */
+		if (lseek (fd, 0, 0) < 0)
+		  report_file_error ("Setting file position",
+				     Fcons (orig_filename, Qnil));
+	      }
+	  }
+	if (NILP (val))
+	  {
+	    Lisp_Object args[6], coding_systems;
+
+	    args[0] = Qinsert_file_contents, args[1] = orig_filename;
+	    args[2] = visit, args[3] = beg, args[4] = end, args[5] = replace;
+	    coding_systems = Ffind_operation_coding_system (6, args);
+	    if (CONSP (coding_systems))
+	      val = XCONS (coding_systems)->car;
+	  }
+      }
+
+    if (NILP (Vcoding_system_for_read)
+	&& NILP (current_buffer->enable_multibyte_characters))
+      {
+	/* We must suppress all text conversion except for end-of-line
+	   conversion.  */
+	struct coding_system coding_temp;
+
+	setup_coding_system (Fcheck_coding_system (val), &coding_temp);
+	setup_coding_system (Qraw_text, &coding);
+	coding.eol_type = coding_temp.eol_type;
+      }
+    else
       setup_coding_system (Fcheck_coding_system (val), &coding);
 
-      if (NILP (Vcoding_system_for_read)
-	  && NILP (current_buffer->enable_multibyte_characters))
-	{
-	  /* We must suppress all text conversion except for end-of-line
-	     conversion.  */
-	  int eol_type;
-
-	  eol_type = coding.eol_type;
-	  setup_coding_system (Qraw_text, &coding);
-	  coding.eol_type = eol_type;
-	}
-
-      coding_system_decided = 1;
-    }
-
-  /* Ensure we always set Vlast_coding_system_used.  */
-  set_coding_system = 1;
+    /* Ensure we always set Vlast_coding_system_used.  */
+    set_coding_system = 1;
+  }
 
   /* If requested, replace the accessible part of the buffer
      with the file contents.  Avoid replacing text at the
@@ -3532,7 +3565,6 @@
      But if we discover the need for conversion, we give up on this method
      and let the following if-statement handle the replace job.  */
   if (!NILP (replace)
-      && BEGV < ZV
       && ! CODING_REQUIRE_DECODING (&coding)
       && (coding.eol_type == CODING_EOL_UNDECIDED
 	  || coding.eol_type == CODING_EOL_LF))
@@ -3711,7 +3743,7 @@
      is needed, in a simple way that needs a lot of memory.
      The preceding if-statement handles the case of no conversion
      in a more optimized way.  */
-  if (!NILP (replace) && ! replace_handled && BEGV < ZV)
+  if (!NILP (replace) && ! replace_handled)
     {
       int same_at_start = BEGV_BYTE;
       int same_at_end = ZV_BYTE;
@@ -3963,69 +3995,6 @@
 
   if (inserted > 0)
     {
-      if (! coding_system_decided)
-	{
-	  /* The coding system is not yet decided.  Decide it by an
-	     optimized method for handling `coding:' tag.  */
-	  Lisp_Object val;
-	  val = Qnil;
-
-	  if (!NILP (Vcoding_system_for_read))
-	    val = Vcoding_system_for_read;
-	  else
-	    {
-	      if (! NILP (Vset_auto_coding_function))
-		{
-		  /* Since we are sure that the current buffer was
-		     empty before the insertion, we can toggle
-		     enable-multibyte-characters directly here without
-		     taking care of marker adjustment and byte
-		     combining problem.  */
-		  Lisp_Object prev_multibyte;
-		  int count = specpdl_ptr - specpdl;
-
-		  prev_multibyte = current_buffer->enable_multibyte_characters;
-		  current_buffer->enable_multibyte_characters = Qnil;
-		  record_unwind_protect (set_auto_coding_unwind,
-					 prev_multibyte);
-		  val = call1 (Vset_auto_coding_function,
-			       make_number (inserted));
-		  /* Discard the unwind protect for recovering the
-		     error of Vset_auto_coding_function.  */
-		  specpdl_ptr--;
-		  current_buffer->enable_multibyte_characters = prev_multibyte;
-		  TEMP_SET_PT_BOTH (BEG, BEG_BYTE);
-		}
-
-	      if (NILP (val))
-		{
-		  /* If the coding system is not yet decided, check
-		     file-coding-system-alist.  */
-		  Lisp_Object args[6], coding_systems;
-
-		  args[0] = Qinsert_file_contents, args[1] = orig_filename;
-		  args[2] = visit, args[3] = beg, args[4] = end, args[5] = Qnil;
-		  coding_systems = Ffind_operation_coding_system (6, args);
-		  if (CONSP (coding_systems))
-		    val = XCONS (coding_systems)->car;
-		}
-	    }
-
-	  setup_coding_system (Fcheck_coding_system (val), &coding);
-
-	  if (NILP (Vcoding_system_for_read)
-	      && NILP (current_buffer->enable_multibyte_characters))
-	    {
-	      /* We must suppress all text conversion except for
-		 end-of-line conversion.  */
-	      int eol_type;
-
-	      eol_type = coding.eol_type;
-	      setup_coding_system (Qraw_text, &coding);
-	      coding.eol_type = eol_type;
-	    }
-	}
-
       if (CODING_MAY_REQUIRE_DECODING (&coding))
 	{
 	  /* Here, we don't have to consider byte combining (see the