]> code.delx.au - gnu-emacs/blobdiff - src/coding.c
Add a note how to use `tramp-own-remote-path'
[gnu-emacs] / src / coding.c
index f5fe52e04c072736c5ec5c3f1516603cc614726d..29c90f0a401b9769b27c84719cb22b73e7a182a3 100644 (file)
@@ -12,8 +12,8 @@ This file is part of GNU Emacs.
 
 GNU Emacs is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
 
 GNU Emacs is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -2365,7 +2365,8 @@ decode_coding_emacs_mule (struct coding_system *coding)
 
   while (1)
     {
-      int c, id IF_LINT (= 0);
+      int c;
+      int id UNINIT;
 
       src_base = src;
       consumed_chars_base = consumed_chars;
@@ -2410,7 +2411,7 @@ decode_coding_emacs_mule (struct coding_system *coding)
        }
       else
        {
-         int nchars IF_LINT (= 0), nbytes IF_LINT (= 0);
+         int nchars UNINIT, nbytes UNINIT;
          /* emacs_mule_char can load a charset map from a file, which
             allocates a large structure and might cause buffer text
             to be relocated as result.  Thus, we need to remember the
@@ -6825,7 +6826,14 @@ decode_eol (struct coding_system *coding)
 
       while (pos_byte < pos_end)
        {
+         int incr;
+
          p = BYTE_POS_ADDR (pos_byte);
+         if (coding->dst_multibyte)
+           incr = BYTES_BY_CHAR_HEAD (*p);
+         else
+           incr = 1;
+
          if (*p == '\r' && p[1] == '\n')
            {
              del_range_2 (pos, pos_byte, pos + 1, pos_byte + 1, 0);
@@ -6833,10 +6841,7 @@ decode_eol (struct coding_system *coding)
              pos_end--;
            }
          pos++;
-         if (coding->dst_multibyte)
-           pos_byte += BYTES_BY_CHAR_HEAD (*p);
-         else
-           pos_byte++;
+         pos_byte += incr;
        }
       coding->produced -= n;
       coding->produced_char -= n;
@@ -6947,18 +6952,21 @@ get_translation_table (Lisp_Object attrs, bool encodep, int *max_lookup)
 
 
 /* Return a translation of character(s) at BUF according to TRANS.
-   TRANS is TO-CHAR or ((FROM .  TO) ...) where
-   FROM = [FROM-CHAR ...], TO is TO-CHAR or [TO-CHAR ...].
-   The return value is TO-CHAR or ([FROM-CHAR ...] . TO) if a
-   translation is found, and Qnil if not found..
-   If BUF is too short to lookup characters in FROM, return Qt.  */
+   TRANS is TO-CHAR, [TO-CHAR ...], or ((FROM .  TO) ...) where FROM =
+   [FROM-CHAR ...], TO is TO-CHAR or [TO-CHAR ...].  The return value
+   is TO-CHAR or [TO-CHAR ...] if a translation is found, Qnil if not
+   found, or Qt if BUF is too short to lookup characters in FROM.  As
+   a side effect, if a translation is found, *NCHARS is set to the
+   number of characters being translated.  */
 
 static Lisp_Object
-get_translation (Lisp_Object trans, int *buf, int *buf_end)
+get_translation (Lisp_Object trans, int *buf, int *buf_end, ptrdiff_t *nchars)
 {
-
-  if (INTEGERP (trans))
-    return trans;
+  if (INTEGERP (trans) || VECTORP (trans))
+    {
+      *nchars = 1;
+      return trans;
+    }
   for (; CONSP (trans); trans = XCDR (trans))
     {
       Lisp_Object val = XCAR (trans);
@@ -6974,7 +6982,10 @@ get_translation (Lisp_Object trans, int *buf, int *buf_end)
            break;
        }
       if (i == len)
-       return val;
+       {
+         *nchars = len;
+         return XCDR (val);
+       }
     }
   return Qnil;
 }
@@ -7017,20 +7028,13 @@ produce_chars (struct coding_system *coding, Lisp_Object translation_table,
              LOOKUP_TRANSLATION_TABLE (translation_table, c, trans);
              if (! NILP (trans))
                {
-                 trans = get_translation (trans, buf, buf_end);
+                 trans = get_translation (trans, buf, buf_end, &from_nchars);
                  if (INTEGERP (trans))
                    c = XINT (trans);
-                 else if (CONSP (trans))
+                 else if (VECTORP (trans))
                    {
-                     from_nchars = ASIZE (XCAR (trans));
-                     trans = XCDR (trans);
-                     if (INTEGERP (trans))
-                       c = XINT (trans);
-                     else
-                       {
-                         to_nchars = ASIZE (trans);
-                         c = XINT (AREF (trans, 0));
-                       }
+                     to_nchars = ASIZE (trans);
+                     c = XINT (AREF (trans, 0));
                    }
                  else if (EQ (trans, Qt) && ! last_block)
                    break;
@@ -7671,22 +7675,16 @@ consume_chars (struct coding_system *coding, Lisp_Object translation_table,
          for (i = 1; i < max_lookup && p < src_end; i++)
            lookup_buf[i] = STRING_CHAR_ADVANCE (p);
          lookup_buf_end = lookup_buf + i;
-         trans = get_translation (trans, lookup_buf, lookup_buf_end);
+         trans = get_translation (trans, lookup_buf, lookup_buf_end,
+                                  &from_nchars);
          if (INTEGERP (trans))
            c = XINT (trans);
-         else if (CONSP (trans))
+         else if (VECTORP (trans))
            {
-             from_nchars = ASIZE (XCAR (trans));
-             trans = XCDR (trans);
-             if (INTEGERP (trans))
-               c = XINT (trans);
-             else
-               {
-                 to_nchars = ASIZE (trans);
-                 if (buf_end - buf < to_nchars)
-                   break;
-                 c = XINT (AREF (trans, 0));
-               }
+             to_nchars = ASIZE (trans);
+             if (buf_end - buf < to_nchars)
+               break;
+             c = XINT (AREF (trans, 0));
            }
          else
            break;
@@ -8015,12 +8013,12 @@ decode_coding_object (struct coding_system *coding,
                      Lisp_Object dst_object)
 {
   ptrdiff_t count = SPECPDL_INDEX ();
-  unsigned char *destination IF_LINT (= NULL);
-  ptrdiff_t dst_bytes IF_LINT (= 0);
+  unsigned char *destination;
+  ptrdiff_t dst_bytes;
   ptrdiff_t chars = to - from;
   ptrdiff_t bytes = to_byte - from_byte;
   Lisp_Object attrs;
-  ptrdiff_t saved_pt = -1, saved_pt_byte IF_LINT (= 0);
+  ptrdiff_t saved_pt = -1, saved_pt_byte;
   bool need_marker_adjustment = 0;
   Lisp_Object old_deactivate_mark;
 
@@ -8198,7 +8196,7 @@ encode_coding_object (struct coding_system *coding,
   ptrdiff_t chars = to - from;
   ptrdiff_t bytes = to_byte - from_byte;
   Lisp_Object attrs;
-  ptrdiff_t saved_pt = -1, saved_pt_byte IF_LINT (= 0);
+  ptrdiff_t saved_pt = -1, saved_pt_byte;
   bool need_marker_adjustment = 0;
   bool kill_src_buffer = 0;
   Lisp_Object old_deactivate_mark;
@@ -8419,11 +8417,10 @@ from_unicode (Lisp_Object str)
 Lisp_Object
 from_unicode_buffer (const wchar_t *wstr)
 {
-    return from_unicode (
-        make_unibyte_string (
-            (char *) wstr,
-            /* we get one of the two final 0 bytes for free. */
-            1 + sizeof (wchar_t) * wcslen (wstr)));
+  /* We get one of the two final null bytes for free.  */
+  ptrdiff_t len = 1 + sizeof (wchar_t) * wcslen (wstr);
+  AUTO_STRING_WITH_LEN (str, (char *) wstr, len);
+  return from_unicode (str);
 }
 
 wchar_t *
@@ -8573,8 +8570,8 @@ detect_coding_system (const unsigned char *src,
   base_category = XINT (CODING_ATTR_CATEGORY (attrs));
   if (base_category == coding_category_undecided)
     {
-      enum coding_category category IF_LINT (= 0);
-      struct coding_system *this IF_LINT (= NULL);
+      enum coding_category category UNINIT;
+      struct coding_system *this UNINIT;
       int c, i;
       bool inhibit_nbd = inhibit_flag (coding.spec.undecided.inhibit_nbd,
                                       inhibit_null_byte_detection);
@@ -9790,7 +9787,7 @@ DEFUN ("find-operation-coding-system", Ffind_operation_coding_system,
        doc: /* Choose a coding system for an operation based on the target name.
 The value names a pair of coding systems: (DECODING-SYSTEM . ENCODING-SYSTEM).
 DECODING-SYSTEM is the coding system to use for decoding
-(in case OPERATION does decoding), and ENCODING-SYSTEM is the coding system
+\(in case OPERATION does decoding), and ENCODING-SYSTEM is the coding system
 for encoding (in case OPERATION does encoding).
 
 The first argument OPERATION specifies an I/O primitive:
@@ -9844,7 +9841,8 @@ usage: (find-operation-coding-system OPERATION ARGUMENTS...)  */)
   if (!(STRINGP (target)
        || (EQ (operation, Qinsert_file_contents) && CONSP (target)
            && STRINGP (XCAR (target)) && BUFFERP (XCDR (target)))
-       || (EQ (operation, Qopen_network_stream) && INTEGERP (target))))
+       || (EQ (operation, Qopen_network_stream)
+           && (INTEGERP (target) || EQ (target, Qt)))))
     error ("Invalid argument %"pI"d of operation `%s'",
           XFASTINT (target_idx) + 1, SDATA (SYMBOL_NAME (operation)));
   if (CONSP (target))
@@ -11165,7 +11163,7 @@ the cdr part is used for encoding a text to be sent to a process.  */);
 Table of extra Latin codes in the range 128..159 (inclusive).
 This is a vector of length 256.
 If Nth element is non-nil, the existence of code N in a file
-(or output of subprocess) doesn't prevent it to be detected as
+\(or output of subprocess) doesn't prevent it to be detected as
 a coding system of ISO 2022 variant which has a flag
 `accept-latin-extra-code' t (e.g. iso-latin-1) on reading a file
 or reading output of a subprocess.
@@ -11309,24 +11307,4 @@ internal character representation.  */);
 #endif
   staticpro (&system_eol_type);
 }
-
-char *
-emacs_strerror (int error_number)
-{
-  char *str;
-
-  synchronize_system_messages_locale ();
-  str = strerror (error_number);
-
-  if (! NILP (Vlocale_coding_system))
-    {
-      Lisp_Object dec = code_convert_string_norecord (build_string (str),
-                                                     Vlocale_coding_system,
-                                                     0);
-      str = SSDATA (dec);
-    }
-
-  return str;
-}
-
 #endif /* emacs */