]> code.delx.au - gnu-emacs/commitdiff
Consolidate common path transformation code.
authorDmitry Antipov <dmantipov@yandex.ru>
Wed, 14 Jan 2015 07:08:44 +0000 (10:08 +0300)
committerDmitry Antipov <dmantipov@yandex.ru>
Wed, 14 Jan 2015 07:08:44 +0000 (10:08 +0300)
* process.h (remove_slash_colon): New function.
* callproc.c (encode_current_directory, call_process):
* process.c (Fstart_process): Use it.

src/ChangeLog
src/callproc.c
src/process.c
src/process.h

index 5055ed16fb4346880595ea46a8fafc98ddb30549..126781663172fec4f9ecacc504c3d41fc8597796 100644 (file)
@@ -6,6 +6,10 @@
        Do not check for STRING_MULTIBYTE because encode_file_name
        is a no-op for unibyte strings.
 
+       * process.h (remove_slash_colon): New function.
+       * callproc.c (encode_current_directory, call_process):
+       * process.c (Fstart_process): Use it.
+
 2015-01-14  Paul Eggert  <eggert@cs.ucla.edu>
 
        Use bool for boolean in xmenu.c, xml.c
index 970a2017b387ac84d1b4fd4280f9ae279b8ba86d..63ab9bf70db870015d8e79aa4c231f93c3d81519 100644 (file)
@@ -131,11 +131,9 @@ encode_current_directory (void)
     report_file_error ("Setting current directory",
                       BVAR (current_buffer, directory));
 
-  /* Remove "/:" from dir.  */
-  if (! NILP (Fstring_match (build_string ("^/:"), dir, Qnil)))
-    dir = Fsubstring (dir, make_number (2), Qnil);
+  /* Remove "/:" from DIR and encode it.  */
+  dir = ENCODE_FILE (remove_slash_colon (dir));
 
-  dir = ENCODE_FILE (dir);
   if (! file_accessible_directory_p (dir))
     report_file_error ("Setting current directory",
                       BVAR (current_buffer, directory));
@@ -467,11 +465,8 @@ call_process (ptrdiff_t nargs, Lisp_Object *args, int filefd,
       report_file_error ("Searching for program", args[0]);
   }
 
-  /* If program file name starts with /: for quoting a magic name,
-     discard that.  */
-  if (SBYTES (path) > 2 && SREF (path, 0) == '/'
-      && SREF (path, 1) == ':')
-    path = Fsubstring (path, make_number (2), Qnil);
+  /* Remove "/:" from PATH.  */
+  path = remove_slash_colon (path);
 
   SAFE_NALLOCA (new_argv, 1, nargs < 4 ? 2 : nargs - 2);
 
index 9015383b8b53d28c0c605c14648b34705d337f06..166bf851a8ee2833067c4ed319b75f0028843a2e 100644 (file)
@@ -1517,11 +1517,8 @@ usage: (start-process NAME BUFFER PROGRAM &rest PROGRAM-ARGS)  */)
          tem = program;
        }
 
-      /* If program file name starts with /: for quoting a magic name,
-        discard that.  */
-      if (SBYTES (tem) > 2 && SREF (tem, 0) == '/'
-         && SREF (tem, 1) == ':')
-       tem = Fsubstring (tem, make_number (2), Qnil);
+      /* Remove "/:" from TEM.  */
+      tem = remove_slash_colon (tem);
 
       {
        Lisp_Object arg_encoding = Qnil;
index 7803672d61a68cd2eda5db617b4f4bda7da1cad9..58b1daecfe6c8d2ff2fbe4ae439382f9a7681ca7 100644 (file)
@@ -237,4 +237,17 @@ extern Lisp_Object network_interface_list (void);
 extern Lisp_Object network_interface_info (Lisp_Object);
 #endif
 
+/* If program file NAME starts with /: for quoting a magic
+   name, remove that, preserving the multibyteness of NAME.  */
+
+INLINE Lisp_Object
+remove_slash_colon (Lisp_Object name)
+{
+  return
+    ((SBYTES (name) > 2 && SREF (name, 0) == '/' && SREF (name, 1) == ':')
+     ? make_specified_string (SSDATA (name) + 2, SCHARS (name) - 2,
+                             SBYTES (name) - 2, STRING_MULTIBYTE (name))
+     : name);
+}
+
 INLINE_HEADER_END