]> code.delx.au - gnu-emacs/commitdiff
Use known length of a Lisp string to copy it faster.
authorDmitry Antipov <dmantipov@yandex.ru>
Tue, 23 Sep 2014 15:49:00 +0000 (19:49 +0400)
committerDmitry Antipov <dmantipov@yandex.ru>
Tue, 23 Sep 2014 15:49:00 +0000 (19:49 +0400)
* lisp.h (lispstrcpy): New function.  Add comment.
* callproc.c (child_setup):
* dbusbind.c (xd_append_arg):
* doc.c (get_doc_string):
* font.c (Ffont_xlfd_name):
* frame.c (xrdb_get_resource):
* process.c (Fmake_network_process, network_interface_info):
* w32fns.c (Fx_open_connection):
* w32proc.c (sys_spawnve):
* xfns.c (select_visual):
* xfont.c (xfont_list):
* xsmfns.c (x_session_initialize):
* xterm.c (x_term_init): Use it.

14 files changed:
src/ChangeLog
src/callproc.c
src/dbusbind.c
src/doc.c
src/font.c
src/frame.c
src/lisp.h
src/process.c
src/w32fns.c
src/w32proc.c
src/xfns.c
src/xfont.c
src/xsmfns.c
src/xterm.c

index 02d7871e8848e743983cefc1af1c18435823eb78..63d732c8d2c6f61a3ffcd955e864585272ec253a 100644 (file)
@@ -1,7 +1,24 @@
+2014-09-23  Dmitry Antipov  <dmantipov@yandex.ru>
+
+       Use known length of a Lisp string to copy it faster.
+       * lisp.h (lispstrcpy): New function.  Add comment.
+       * callproc.c (child_setup):
+       * dbusbind.c (xd_append_arg):
+       * doc.c (get_doc_string):
+       * font.c (Ffont_xlfd_name):
+       * frame.c (xrdb_get_resource):
+       * process.c (Fmake_network_process, network_interface_info):
+       * w32fns.c (Fx_open_connection):
+       * w32proc.c (sys_spawnve):
+       * xfns.c (select_visual):
+       * xfont.c (xfont_list):
+       * xsmfns.c (x_session_initialize):
+       * xterm.c (x_term_init): Use it.
+
 2014-09-23  Paul Eggert  <eggert@cs.ucla.edu>
 
        Fix SAFE_ALLOCA to not exhaust the stack when in a loop.
-       Problem reported by Dmietry Antipov in thread leading to:
+       Problem reported by Dmitry Antipov in thread leading to:
        http://lists.gnu.org/archive/html/emacs-devel/2014-09/msg00713.html
        This patch fixes only SAFE_ALLOCA, SAFE_NALLOCA, and SAFE_ALLOCA_LISP;
        the experimental local_* macros enabled by USE_LOCAL_ALLOCATORS
index 4bedf671e83de2413486e7adb990981eb43dad01..2fa475e72df223e51a3e12d5221517c29b07ea99 100644 (file)
@@ -1235,7 +1235,7 @@ child_setup (int in, int out, int err, char **new_argv, bool set_pgrp,
 #endif
     temp = pwd_var + 4;
     memcpy (pwd_var, "PWD=", 4);
-    strcpy (temp, SSDATA (current_dir));
+    lispstrcpy (temp, current_dir);
 
 #ifndef DOS_NT
     /* We can't signal an Elisp error here; we're in a vfork.  Since
index 8997e01b068881387ac2446d2d558db60b0e8b08..58302df49271e62e884659b3f238a4975dce21c7 100644 (file)
@@ -761,7 +761,7 @@ xd_append_arg (int dtype, Lisp_Object object, DBusMessageIter *iter)
                && STRINGP (CAR_SAFE (XD_NEXT_VALUE (object)))
                && NILP (CDR_SAFE (XD_NEXT_VALUE (object))))
              {
-               strcpy (signature, SSDATA (CAR_SAFE (XD_NEXT_VALUE (object))));
+               lispstrcpy (signature, CAR_SAFE (XD_NEXT_VALUE (object)));
                object = CDR_SAFE (XD_NEXT_VALUE (object));
              }
 
index 98f2f8563a12bf1d5a5cba12e18da788f3946e9f..da6a9deb9779a476c757eb2609c2c6c51ed98953 100644 (file)
--- a/src/doc.c
+++ b/src/doc.c
@@ -121,7 +121,7 @@ get_doc_string (Lisp_Object filepos, bool unibyte, bool definition)
       if (minsize < 8)
        minsize = 8;
       name = SAFE_ALLOCA (minsize + SCHARS (file) + 8);
-      strcpy (name, SSDATA (docdir));
+      lispstrcpy (name, docdir);
       strcat (name, SSDATA (file));
     }
   else
index 838600908203611296e6a7d3fbe9a5c4479d63ce..e8a13b7eeda88e8eede9822841a0e64c6205a01e 100644 (file)
@@ -4266,7 +4266,7 @@ the consecutive wildcards are folded into one.  */)
        {
          if (NILP (fold_wildcards))
            return font_name;
-         strcpy (name, SSDATA (font_name));
+         lispstrcpy (name, font_name);
          namelen = SBYTES (font_name);
          goto done;
        }
index d56b11d962c857a57cdf5abf6a561de17ec5bfdd..51bd8fa7cfc42585b3e0d089d8ce157970048062 100644 (file)
@@ -4036,8 +4036,8 @@ xrdb_get_resource (XrmDatabase rdb, Lisp_Object attribute, Lisp_Object class, Li
 
   /* Start with emacs.FRAMENAME for the name (the specific one)
      and with `Emacs' for the class key (the general one).  */
-  strcpy (name_key, SSDATA (Vx_resource_name));
-  strcpy (class_key, SSDATA (Vx_resource_class));
+  lispstrcpy (name_key, Vx_resource_name);
+  lispstrcpy (class_key, Vx_resource_class);
 
   strcat (class_key, ".");
   strcat (class_key, SSDATA (class));
index 21f652b81aceba8400dd9df14fdfa83a9b9e416a..6ece4810b0becc5b59e7302b3072fa8e775ad53e 100644 (file)
@@ -4462,6 +4462,15 @@ extern void *xpalloc (void *, ptrdiff_t *, ptrdiff_t, ptrdiff_t, ptrdiff_t);
 extern char *xstrdup (const char *) ATTRIBUTE_MALLOC;
 extern char *xlispstrdup (Lisp_Object) ATTRIBUTE_MALLOC;
 extern void dupstring (char **, char const *);
+
+/* Like strcpy but uses known length of a Lisp string.  */
+
+INLINE char *
+lispstrcpy (const char *dest, Lisp_Object string)
+{
+  return memcpy ((void *) dest, SSDATA (string), SBYTES (string) + 1);
+}
+
 extern void xputenv (const char *);
 
 extern char *egetenv_internal (const char *, ptrdiff_t);
index 0807939dd25dbf8ec291c7cf3d3b210958831533..c61400837844174855cd184f02a2759db9b26327 100644 (file)
@@ -2989,7 +2989,7 @@ usage: (make-network-process &rest ARGS)  */)
       address_un.sun_family = AF_LOCAL;
       if (sizeof address_un.sun_path <= SBYTES (service))
        error ("Service name too long");
-      strcpy (address_un.sun_path, SSDATA (service));
+      lispstrcpy (address_un.sun_path, service);
       ai.ai_addr = (struct sockaddr *) &address_un;
       ai.ai_addrlen = sizeof address_un;
       goto open_socket;
@@ -3680,7 +3680,7 @@ network_interface_info (Lisp_Object ifname)
 
   if (sizeof rq.ifr_name <= SBYTES (ifname))
     error ("interface name too long");
-  strcpy (rq.ifr_name, SSDATA (ifname));
+  lispstrcpy (rq.ifr_name, ifname);
 
   s = socket (AF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0);
   if (s < 0)
index fee80d24690da2693779e8b54363e4774a7f83f5..a58a9ced85c1196625b2b67b3fe4bc8b07bafed2 100644 (file)
@@ -5339,7 +5339,7 @@ terminate Emacs if we can't open the connection.
   {
     char basename[ MAX_PATH ], *str;
 
-    strcpy (basename, SDATA (Vinvocation_name));
+    lispstrcpy (basename, Vinvocation_name);
     str = strrchr (basename, '.');
     if (str) *str = 0;
     Vinvocation_name = build_string (basename);
index 96f94a116af0b0e20dd05124bf7e1fe7893d3294..795df31c858451d8097e109a4b2d5b25269b0b92 100644 (file)
@@ -1647,7 +1647,7 @@ sys_spawnve (int mode, char *cmdname, char **argv, char **envp)
        strcpy (cmdname, egetenv ("CMDPROXY"));
       else
        {
-         strcpy (cmdname, SDATA (Vinvocation_directory));
+         lispstrcpy (cmdname, Vinvocation_directory);
          strcat (cmdname, "cmdproxy.exe");
        }
 
index b107f6e688c5921a9f0eb72dd84943743972e42d..7ecd15aea916611de0727f7b543129675d079111 100644 (file)
@@ -4289,7 +4289,7 @@ select_visual (struct x_display_info *dpyinfo)
       int i, class = -1;
       XVisualInfo vinfo;
 
-      strcpy (s, SSDATA (value));
+      lispstrcpy (s, value);
       dash = strchr (s, '-');
       if (dash)
        {
index 90b69ad5187998c6d3e3ad567b513a34762e2e19..db0449716ab6fbc68b43743ab36c2a1c4bd44190 100644 (file)
@@ -541,7 +541,7 @@ xfont_list (struct frame *f, Lisp_Object spec)
            if (STRINGP (XCAR (alter))
                && ((r - name) + SBYTES (XCAR (alter))) < 256)
              {
-               strcpy (r, SSDATA (XCAR (alter)));
+               lispstrcpy (r, XCAR (alter));
                list = xfont_list_pattern (display, name, registry, script);
                if (! NILP (list))
                  break;
index 8721cc81b03f47e7b7e24e7e90594103579a0b41..5efbfaafa8faf3fd1a07a94ad964892f9c681bbc 100644 (file)
@@ -418,7 +418,7 @@ x_session_initialize (struct x_display_info *dpyinfo)
   emacs_program[0] = '\0';
 
   if (! EQ (Vinvocation_directory, Qnil))
-    strcpy (emacs_program, SSDATA (Vinvocation_directory));
+    lispstrcpy (emacs_program, Vinvocation_directory);
   strcat (emacs_program, SSDATA (Vinvocation_name));
 
   /* The SM protocol says all callbacks are mandatory, so set up all
index 4b4349d2622d51f57fdb9ed99bc30cb12c686650..1b721b042beb1f6134c768641ad94b9cd896db4b 100644 (file)
@@ -10902,7 +10902,7 @@ x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name)
   dpyinfo->x_id = ++x_display_id;
   dpyinfo->x_id_name = xmalloc (SBYTES (Vinvocation_name)
                                + SBYTES (Vsystem_name) + 2);
-  strcat (strcat (strcpy (dpyinfo->x_id_name, SSDATA (Vinvocation_name)), "@"),
+  strcat (strcat (lispstrcpy (dpyinfo->x_id_name, Vinvocation_name), "@"),
          SSDATA (Vsystem_name));
 
   /* Figure out which modifier bits mean what.  */