From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Paul Eggert Newsgroups: gmane.emacs.devel Subject: Re: Using stpcpy Date: Mon, 22 Dec 2014 22:47:34 -0800 Organization: UCLA Computer Science Department Message-ID: <54991006.8030208@cs.ucla.edu> References: <549849A7.3070208@yandex.ru> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------060902000208090901060402" X-Trace: ger.gmane.org 1419317293 4659 80.91.229.3 (23 Dec 2014 06:48:13 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Tue, 23 Dec 2014 06:48:13 +0000 (UTC) To: Dmitry Antipov , Emacs development discussions Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Tue Dec 23 07:48:07 2014 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1Y3JGI-0000pe-P4 for ged-emacs-devel@m.gmane.org; Tue, 23 Dec 2014 07:48:07 +0100 Original-Received: from localhost ([::1]:43302 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Y3JGH-0005Rt-Sh for ged-emacs-devel@m.gmane.org; Tue, 23 Dec 2014 01:48:05 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:38967) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Y3JFx-0005Rm-WF for emacs-devel@gnu.org; Tue, 23 Dec 2014 01:47:51 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Y3JFs-0007De-TB for emacs-devel@gnu.org; Tue, 23 Dec 2014 01:47:45 -0500 Original-Received: from smtp.cs.ucla.edu ([131.179.128.62]:44631) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Y3JFs-0007DW-FX for emacs-devel@gnu.org; Tue, 23 Dec 2014 01:47:40 -0500 Original-Received: from localhost (localhost.localdomain [127.0.0.1]) by smtp.cs.ucla.edu (Postfix) with ESMTP id AA748A60043; Mon, 22 Dec 2014 22:47:38 -0800 (PST) X-Virus-Scanned: amavisd-new at smtp.cs.ucla.edu Original-Received: from smtp.cs.ucla.edu ([127.0.0.1]) by localhost (smtp.cs.ucla.edu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id c8KPUzXz70ij; Mon, 22 Dec 2014 22:47:34 -0800 (PST) Original-Received: from [192.168.1.9] (pool-71-177-17-123.lsanca.dsl-w.verizon.net [71.177.17.123]) by smtp.cs.ucla.edu (Postfix) with ESMTPSA id BBC6FA60042; Mon, 22 Dec 2014 22:47:34 -0800 (PST) User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.3.0 In-Reply-To: <549849A7.3070208@yandex.ru> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 131.179.128.62 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:180540 Archived-At: This is a multi-part message in MIME format. --------------060902000208090901060402 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Dmitry Antipov wrote: > Can we assume that stpcpy(3) is mature enough to be used in Emacs? > It can help to simplify strcpy/strlen/strcat mess here and there. > (IIUC there is a gnulib module as well). Yes, stpcpy is mature enough; it's been around for ages in the GNU C library and is not likely to change. That being said, stpcpy isn't universal, so for Emacs to be portable we should add gnulib's stpcpy module. Something like the attached patch, perhaps? Tested on both GNU/Linux and Solaris 10 (which lacks stpcpy). --------------060902000208090901060402 Content-Type: text/x-diff; name="0001-Prefer-stpcpy-to-strcat.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="0001-Prefer-stpcpy-to-strcat.patch" =46rom 1a89819dcbe51883cb63c411179af1db77ffb32d Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Mon, 22 Dec 2014 22:13:02 -0800 Subject: [PATCH] Prefer stpcpy to strcat * admin/merge-gnulib (GNULIB_MODULES): Add stpcpy. * lib/gnulib.mk, m4/gnulib-comp.m4: Regenerate. * lib/stpcpy.c, m4/stpcpy.m4: New files, from gnulib. * src/callproc.c (child_setup): * src/dbusbind.c (xd_signature_cat): * src/doc.c (get_doc_string, Fsnarf_documentation): * src/editfns.c (Fuser_full_name): * src/frame.c (xrdb_get_resource): * src/gtkutil.c (xg_get_file_with_chooser): * src/tparam.c (tparam1): * src/xfns.c (xic_create_fontsetname): * src/xrdb.c (gethomedir, get_user_db, get_environ_db): * src/xsmfns.c (smc_save_yourself_CB): Rewrite to avoid the need for strcat, typically by using stpcpy. strcat tends to be part of O(N**2) algorithms. --- ChangeLog | 17 +++++++++++++++++ admin/merge-gnulib | 2 +- lib/gnulib.mk | 11 ++++++++++- lib/stpcpy.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++= + m4/gnulib-comp.m4 | 9 +++++++++ m4/stpcpy.m4 | 25 +++++++++++++++++++++++++ src/callproc.c | 7 ++----- src/dbusbind.c | 2 +- src/doc.c | 6 ++---- src/editfns.c | 5 ++--- src/frame.c | 20 ++++++++++---------- src/gtkutil.c | 6 +++--- src/tparam.c | 4 ++-- src/xfns.c | 34 +++++++++++++++++----------------- src/xrdb.c | 45 +++++++++++++++++++++------------------------ src/xsmfns.c | 6 ++---- 16 files changed, 173 insertions(+), 75 deletions(-) create mode 100644 lib/stpcpy.c create mode 100644 m4/stpcpy.m4 diff --git a/ChangeLog b/ChangeLog index 7e68314..acafad6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,22 @@ 2014-12-23 Paul Eggert =20 + Prefer stpcpy to strcat + * admin/merge-gnulib (GNULIB_MODULES): Add stpcpy. + * lib/gnulib.mk, m4/gnulib-comp.m4: Regenerate. + * lib/stpcpy.c, m4/stpcpy.m4: New files, from gnulib. + * src/callproc.c (child_setup): + * src/dbusbind.c (xd_signature_cat): + * src/doc.c (get_doc_string, Fsnarf_documentation): + * src/editfns.c (Fuser_full_name): + * src/frame.c (xrdb_get_resource): + * src/gtkutil.c (xg_get_file_with_chooser): + * src/tparam.c (tparam1): + * src/xfns.c (xic_create_fontsetname): + * src/xrdb.c (gethomedir, get_user_db, get_environ_db): + * src/xsmfns.c (smc_save_yourself_CB): + Rewrite to avoid the need for strcat, typically by using stpcpy. + strcat tends to be part of O(N**2) algorithms. + Merge from gnulib 2014-12-20 utimens: remove unnecessary assert 2014-12-16 stdalign: port better to HP compilers diff --git a/admin/merge-gnulib b/admin/merge-gnulib index 64514f7..84c6ebf 100755 --- a/admin/merge-gnulib +++ b/admin/merge-gnulib @@ -36,7 +36,7 @@ GNULIB_MODULES=3D' manywarnings memrchr mkostemp mktime pipe2 pselect pthread_sigmask putenv qacl readlink readlinkat sig2str socklen stat-time stdalign stddef stdio - strftime strtoimax strtoumax symlink sys_stat + stpcpy strftime strtoimax strtoumax symlink sys_stat sys_time time time_r timer-time timespec-add timespec-sub unsetenv update-copyright utimens vla warnings diff --git a/lib/gnulib.mk b/lib/gnulib.mk index 740ebb1..27a5964 100644 --- a/lib/gnulib.mk +++ b/lib/gnulib.mk @@ -21,7 +21,7 @@ # the same distribution terms as the rest of that program. # # Generated by gnulib-tool. -# Reproduce by: gnulib-tool --import --dir=3D. --lib=3Dlibgnu --source-b= ase=3Dlib --m4-base=3Dm4 --doc-base=3Ddoc --tests-base=3Dtests --aux-dir=3D= build-aux --avoid=3Dclose --avoid=3Ddup --avoid=3Dfchdir --avoid=3Dfstat = --avoid=3Dmalloc-posix --avoid=3Dmsvc-inval --avoid=3Dmsvc-nothrow --avoi= d=3Dopen --avoid=3Dopenat-die --avoid=3Dopendir --avoid=3Draise --avoid=3D= save-cwd --avoid=3Dselect --avoid=3Dsigprocmask --avoid=3Dstdarg --avoid=3D= stdbool --avoid=3Dthreadlib --makefile-name=3Dgnulib.mk --conditional-dep= endencies --no-libtool --macro-prefix=3Dgl --no-vc-files alloca-opt binar= y-io byteswap c-ctype c-strcase careadlinkat close-stream count-one-bits = count-trailing-zeros crypto/md5 crypto/sha1 crypto/sha256 crypto/sha512 d= toastr dtotimespec dup2 environ execinfo faccessat fcntl fcntl-h fdatasyn= c fdopendir filemode fstatat fsync getloadavg getopt-gnu gettime gettimeo= fday intprops largefile lstat manywarnings memrchr mkostemp mktime pipe2 = pselect pthread_sigmask putenv qacl readlink readlinkat sig2str socklen s= tat-time stdalign stddef stdio strftime strtoimax strtoumax symlink sys_s= tat sys_time time time_r timer-time timespec-add timespec-sub unsetenv up= date-copyright utimens vla warnings +# Reproduce by: gnulib-tool --import --dir=3D. --lib=3Dlibgnu --source-b= ase=3Dlib --m4-base=3Dm4 --doc-base=3Ddoc --tests-base=3Dtests --aux-dir=3D= build-aux --avoid=3Dclose --avoid=3Ddup --avoid=3Dfchdir --avoid=3Dfstat = --avoid=3Dmalloc-posix --avoid=3Dmsvc-inval --avoid=3Dmsvc-nothrow --avoi= d=3Dopen --avoid=3Dopenat-die --avoid=3Dopendir --avoid=3Draise --avoid=3D= save-cwd --avoid=3Dselect --avoid=3Dsigprocmask --avoid=3Dstdarg --avoid=3D= stdbool --avoid=3Dthreadlib --makefile-name=3Dgnulib.mk --conditional-dep= endencies --no-libtool --macro-prefix=3Dgl --no-vc-files alloca-opt binar= y-io byteswap c-ctype c-strcase careadlinkat close-stream count-one-bits = count-trailing-zeros crypto/md5 crypto/sha1 crypto/sha256 crypto/sha512 d= toastr dtotimespec dup2 environ execinfo faccessat fcntl fcntl-h fdatasyn= c fdopendir filemode fstatat fsync getloadavg getopt-gnu gettime gettimeo= fday intprops largefile lstat manywarnings memrchr mkostemp mktime pipe2 = pselect pthread_sigmask putenv qacl readlink readlinkat sig2str socklen s= tat-time stdalign stddef stdio stpcpy strftime strtoimax strtoumax symlin= k sys_stat sys_time time time_r timer-time timespec-add timespec-sub unse= tenv update-copyright utimens vla warnings =20 =20 MOSTLYCLEANFILES +=3D core *.stackdump @@ -1214,6 +1214,15 @@ EXTRA_DIST +=3D stdlib.in.h =20 ## end gnulib module stdlib =20 +## begin gnulib module stpcpy + + +EXTRA_DIST +=3D stpcpy.c + +EXTRA_libgnu_a_SOURCES +=3D stpcpy.c + +## end gnulib module stpcpy + ## begin gnulib module strftime =20 libgnu_a_SOURCES +=3D strftime.c diff --git a/lib/stpcpy.c b/lib/stpcpy.c new file mode 100644 index 0000000..880a706 --- /dev/null +++ b/lib/stpcpy.c @@ -0,0 +1,49 @@ +/* stpcpy.c -- copy a string and return pointer to end of new string + Copyright (C) 1992, 1995, 1997-1998, 2006, 2009-2014 Free Software + Foundation, Inc. + + NOTE: The canonical source of this file is maintained with the GNU C = Library. + Bugs can be reported to bug-glibc@prep.ai.mit.edu. + + This program 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 any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see .= */ + +#include + +#include + +#undef __stpcpy +#ifdef _LIBC +# undef stpcpy +#endif + +#ifndef weak_alias +# define __stpcpy stpcpy +#endif + +/* Copy SRC to DEST, returning the address of the terminating '\0' in DE= ST. */ +char * +__stpcpy (char *dest, const char *src) +{ + register char *d =3D dest; + register const char *s =3D src; + + do + *d++ =3D *s; + while (*s++ !=3D '\0'); + + return d - 1; +} +#ifdef weak_alias +weak_alias (__stpcpy, stpcpy) +#endif diff --git a/m4/gnulib-comp.m4 b/m4/gnulib-comp.m4 index 39ec8ae..49fdf5e 100644 --- a/m4/gnulib-comp.m4 +++ b/m4/gnulib-comp.m4 @@ -123,6 +123,7 @@ AC_DEFUN([gl_EARLY], # Code from module stdint: # Code from module stdio: # Code from module stdlib: + # Code from module stpcpy: # Code from module strftime: # Code from module string: # Code from module strtoimax: @@ -341,6 +342,12 @@ AC_DEFUN([gl_INIT], gl_STDINT_H gl_STDIO_H gl_STDLIB_H + gl_FUNC_STPCPY + if test $HAVE_STPCPY =3D 0; then + AC_LIBOBJ([stpcpy]) + gl_PREREQ_STPCPY + fi + gl_STRING_MODULE_INDICATOR([stpcpy]) gl_FUNC_GNU_STRFTIME gl_HEADER_STRING_H gl_FUNC_STRTOIMAX @@ -889,6 +896,7 @@ AC_DEFUN([gl_FILE_LIST], [ lib/stdint.in.h lib/stdio.in.h lib/stdlib.in.h + lib/stpcpy.c lib/strftime.c lib/strftime.h lib/string.in.h @@ -995,6 +1003,7 @@ AC_DEFUN([gl_FILE_LIST], [ m4/stdint.m4 m4/stdio_h.m4 m4/stdlib_h.m4 + m4/stpcpy.m4 m4/strftime.m4 m4/string_h.m4 m4/strtoimax.m4 diff --git a/m4/stpcpy.m4 b/m4/stpcpy.m4 new file mode 100644 index 0000000..966ba95 --- /dev/null +++ b/m4/stpcpy.m4 @@ -0,0 +1,25 @@ +# stpcpy.m4 serial 8 +dnl Copyright (C) 2002, 2007, 2009-2014 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_FUNC_STPCPY], +[ + dnl Persuade glibc to declare stpcpy(). + AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) + + dnl The stpcpy() declaration in lib/string.in.h uses 'restrict'. + AC_REQUIRE([AC_C_RESTRICT]) + + AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) + AC_CHECK_FUNCS([stpcpy]) + if test $ac_cv_func_stpcpy =3D no; then + HAVE_STPCPY=3D0 + fi +]) + +# Prerequisites of lib/stpcpy.c. +AC_DEFUN([gl_PREREQ_STPCPY], [ + : +]) diff --git a/src/callproc.c b/src/callproc.c index a677334..7705ab0 100644 --- a/src/callproc.c +++ b/src/callproc.c @@ -1315,13 +1315,10 @@ child_setup (int in, int out, int err, char **new= _argv, bool set_pgrp, =20 if (STRINGP (display)) { - char *vdata; - if (MAX_ALLOCA - sizeof "DISPLAY=3D" < SBYTES (display)) exec_failed (new_argv[0], ENOMEM); - vdata =3D alloca (sizeof "DISPLAY=3D" + SBYTES (display)); - strcpy (vdata, "DISPLAY=3D"); - strcat (vdata, SSDATA (display)); + char *vdata =3D alloca (sizeof "DISPLAY=3D" + SBYTES (display)); + strcpy (stpcpy (vdata, "DISPLAY=3D"), SSDATA (display)); new_env =3D add_env (env, new_env, vdata); } =20 diff --git a/src/dbusbind.c b/src/dbusbind.c index 4852739..983b05c 100644 --- a/src/dbusbind.c +++ b/src/dbusbind.c @@ -357,7 +357,7 @@ xd_signature_cat (char *signature, char const *x) ptrdiff_t xlen =3D strlen (x); if (DBUS_MAXIMUM_SIGNATURE_LENGTH - xlen <=3D siglen) string_overflow (); - strcat (signature, x); + strcpy (signature + siglen, x); } =20 /* Compute SIGNATURE of OBJECT. It must have a form that it can be diff --git a/src/doc.c b/src/doc.c index 1b87c23..c6c3251 100644 --- a/src/doc.c +++ b/src/doc.c @@ -137,8 +137,7 @@ get_doc_string (Lisp_Object filepos, bool unibyte, bo= ol definition) { /* Preparing to dump; DOC file is probably not installed. So check in ../etc. */ - strcpy (name, "../etc/"); - strcat (name, SSDATA (file)); + strcpy (stpcpy (name, "../etc/"), SSDATA (file)); =20 fd =3D emacs_open (name, O_RDONLY, 0); } @@ -594,8 +593,7 @@ the same file name is found in the `doc-directory'. = */) count =3D SPECPDL_INDEX (); USE_SAFE_ALLOCA; name =3D SAFE_ALLOCA (dirlen + SBYTES (filename) + 1); - strcpy (name, dirname); - strcat (name, SSDATA (filename)); /*** Add this line ***/ + strcpy (stpcpy (name, dirname), SSDATA (filename)); /*** Add this lin= e ***/ =20 /* Vbuild_files is nil when temacs is run, and non-nil after that. */= if (NILP (Vbuild_files)) diff --git a/src/editfns.c b/src/editfns.c index 0a07886..955e962 100644 --- a/src/editfns.c +++ b/src/editfns.c @@ -1350,10 +1350,9 @@ name, or nil if there is no such user. */) USE_SAFE_ALLOCA; char *r =3D SAFE_ALLOCA (strlen (p) + SBYTES (login) + 1); memcpy (r, p, q - p); - r[q - p] =3D 0; - strcat (r, SSDATA (login)); + char *s =3D stpcpy (&r[q - p], SSDATA (login)); r[q - p] =3D upcase ((unsigned char) r[q - p]); - strcat (r, q + 1); + strcpy (s, q + 1); full =3D build_string (r); SAFE_FREE (); } diff --git a/src/frame.c b/src/frame.c index 3127366..d71a26c 100644 --- a/src/frame.c +++ b/src/frame.c @@ -4076,23 +4076,23 @@ xrdb_get_resource (XrmDatabase rdb, Lisp_Object a= ttribute, Lisp_Object class, Li =20 /* Start with emacs.FRAMENAME for the name (the specific one) and with `Emacs' for the class key (the general one). */ - lispstpcpy (name_key, Vx_resource_name); - lispstpcpy (class_key, Vx_resource_class); + char *nz =3D lispstpcpy (name_key, Vx_resource_name); + char *cz =3D lispstpcpy (class_key, Vx_resource_class); =20 - strcat (class_key, "."); - strcat (class_key, SSDATA (class)); + *cz++ =3D '.'; + cz =3D stpcpy (cz, SSDATA (class)); =20 if (!NILP (component)) { - strcat (class_key, "."); - strcat (class_key, SSDATA (subclass)); + *cz++ =3D '.'; + strcpy (cz, SSDATA (subclass)); =20 - strcat (name_key, "."); - strcat (name_key, SSDATA (component)); + *nz++ =3D '.'; + nz =3D stpcpy (nz, SSDATA (component)); } =20 - strcat (name_key, "."); - strcat (name_key, SSDATA (attribute)); + *nz++ =3D '.'; + strcpy (nz, SSDATA (attribute)); =20 char *value =3D x_get_string_resource (rdb, name_key, class_key); SAFE_FREE(); diff --git a/src/gtkutil.c b/src/gtkutil.c index 9465d54..f61cbc2 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c @@ -1839,12 +1839,12 @@ xg_get_file_with_chooser (struct frame *f, =20 if (x_gtk_file_dialog_help_text) { - msgbuf[0] =3D '\0'; + char *z =3D msgbuf; /* Gtk+ 2.10 has the file name text entry box integrated in the di= alog. Show the C-l help text only for versions < 2.10. */ if (gtk_check_version (2, 10, 0) && action !=3D GTK_FILE_CHOOSER_A= CTION_SAVE) - strcat (msgbuf, "\nType C-l to display a file name text entry bo= x.\n"); - strcat (msgbuf, "\nIf you don't like this file selector, use the "= + z =3D stpcpy (z, "\nType C-l to display a file name text entry b= ox.\n"); + strcpy (z, "\nIf you don't like this file selector, use the " "corresponding\nkey binding or customize " "use-file-dialog to turn it off."); =20 diff --git a/src/tparam.c b/src/tparam.c index e02cea3..b0cd004 100644 --- a/src/tparam.c +++ b/src/tparam.c @@ -255,9 +255,9 @@ tparam1 (const char *string, char *outstring, int len= , } *op =3D 0; while (doup-- > 0) - strcat (op, up); + op =3D stpcpy (op, up); while (doleft-- > 0) - strcat (op, left); + op =3D stpcpy (op, left); return outstring; } =0C diff --git a/src/xfns.c b/src/xfns.c index 1b17311..ba2601d 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -1710,13 +1710,14 @@ xic_create_fontsetname (const char *base_fontname= , int motif) { const char *sep =3D motif ? ";" : ","; char *fontsetname; + char *z; =20 /* Make a fontset name from the base font name. */ if (xic_default_fontset =3D=3D base_fontname) { /* There is no base font name, use the default. */ fontsetname =3D xmalloc (strlen (base_fontname) + 2); - strcpy (fontsetname, base_fontname); + z =3D stpcpy (fontsetname, base_fontname); } else { @@ -1737,9 +1738,9 @@ xic_create_fontsetname (const char *base_fontname, = int motif) Use the specified font plus the default. */ fontsetname =3D xmalloc (strlen (base_fontname) + strlen (xic_default_fontset) + 3); - strcpy (fontsetname, base_fontname); - strcat (fontsetname, sep); - strcat (fontsetname, xic_default_fontset); + z =3D stpcpy (fontsetname, base_fontname); + z =3D stpcpy (z, sep); + z =3D stpcpy (z, xic_default_fontset); } else { @@ -1800,27 +1801,26 @@ xic_create_fontsetname (const char *base_fontname= , int motif) /* Build the font spec that matches all. */ len =3D p - p2 + strlen (allcs) + strlen (all) + strlen (allfamilies)= + 1; font_all =3D alloca (len); - strcpy (font_all, allfamilies); - strcat (font_all, all); - memcpy (font_all + strlen (all) + strlen (allfamilies), p2, p - p2); - strcpy (font_all + strlen (all) + strlen (allfamilies) + (p - p2), - allcs); + z =3D stpcpy (font_all, allfamilies); + z =3D stpcpy (z, all); + memcpy (z, p2, p - p2); + strcpy (z + (p - p2), allcs); =20 /* Build the actual font set name. */ len =3D strlen (base_fontname) + strlen (font_allcs) + strlen (font_allfamilies) + strlen (font_all) + 5; fontsetname =3D xmalloc (len); - strcpy (fontsetname, base_fontname); - strcat (fontsetname, sep); - strcat (fontsetname, font_allcs); - strcat (fontsetname, sep); - strcat (fontsetname, font_allfamilies); - strcat (fontsetname, sep); - strcat (fontsetname, font_all); + z =3D stpcpy (fontsetname, base_fontname); + z =3D stpcpy (z, sep); + z =3D stpcpy (z, font_allcs); + z =3D stpcpy (z, sep); + z =3D stpcpy (z, font_allfamilies); + z =3D stpcpy (z, sep); + z =3D stpcpy (z, font_all); } } if (motif) - return strcat (fontsetname, ":"); + strcpy (z, ":"); return fontsetname; } #endif /* HAVE_X_WINDOWS && USE_X_TOOLKIT */ diff --git a/src/xrdb.c b/src/xrdb.c index 32ad3c7..c653373 100644 --- a/src/xrdb.c +++ b/src/xrdb.c @@ -232,9 +232,10 @@ gethomedir (void) if (ptr =3D=3D NULL) return xstrdup ("/"); =20 - copy =3D xmalloc (strlen (ptr) + 2); - strcpy (copy, ptr); - return strcat (copy, "/"); + ptrdiff_t len =3D strlen (ptr); + copy =3D xmalloc (len + 2); + strcpy (copy + len, "/"); + return memcpy (copy, ptr, len); } =20 =20 @@ -334,6 +335,7 @@ get_user_app (const char *class) return db; } =20 +static char const xdefaults[] =3D ".Xdefaults"; =20 static XrmDatabase get_user_db (Display *display) @@ -351,16 +353,12 @@ get_user_db (Display *display) db =3D XrmGetStringDatabase (xdefs); else { - char *home; - char *xdefault; - - home =3D gethomedir (); - xdefault =3D xmalloc (strlen (home) + sizeof ".Xdefaults"); - strcpy (xdefault, home); - strcat (xdefault, ".Xdefaults"); - db =3D XrmGetFileDatabase (xdefault); - xfree (home); - xfree (xdefault); + char *home =3D gethomedir (); + ptrdiff_t homelen =3D strlen (home); + char *filename =3D xrealloc (home, homelen + sizeof xdefaults); + strcpy (filename + homelen, xdefaults); + db =3D XrmGetFileDatabase (filename); + xfree (filename); } =20 #ifdef HAVE_XSCREENRESOURCESTRING @@ -380,24 +378,23 @@ static XrmDatabase get_environ_db (void) { XrmDatabase db; - char *p; - char *path =3D 0; + char *p =3D getenv ("XENVIRONMENT"); + char *filename =3D 0; =20 - if ((p =3D getenv ("XENVIRONMENT")) =3D=3D NULL) + if (!p) { - static char const xdefaults[] =3D ".Xdefaults-"; char *home =3D gethomedir (); - char const *host =3D SSDATA (Vsystem_name); - ptrdiff_t pathsize =3D (strlen (home) + sizeof xdefaults - + SBYTES (Vsystem_name)); - path =3D xrealloc (home, pathsize); - strcat (strcat (path, xdefaults), host); - p =3D path; + ptrdiff_t homelen =3D strlen (home); + char *host =3D SSDATA (Vsystem_name); + ptrdiff_t filenamesize =3D (homelen + sizeof xdefaults + + SBYTES (Vsystem_name)); + p =3D filename =3D xrealloc (home, filenamesize); + strcpy (stpcpy (filename + homelen, xdefaults), host); } =20 db =3D XrmGetFileDatabase (p); =20 - xfree (path); + xfree (filename); =20 return db; } diff --git a/src/xsmfns.c b/src/xsmfns.c index cd4f9ce..8a835cf 100644 --- a/src/xsmfns.c +++ b/src/xsmfns.c @@ -230,8 +230,7 @@ smc_save_yourself_CB (SmcConn smcConn, props[props_idx]->vals[vp_idx++].value =3D emacs_program; =20 smid_opt =3D xmalloc (strlen (SMID_OPT) + strlen (client_id) + 1); - strcpy (smid_opt, SMID_OPT); - strcat (smid_opt, client_id); + strcpy (stpcpy (smid_opt, SMID_OPT), client_id); =20 props[props_idx]->vals[vp_idx].length =3D strlen (smid_opt); props[props_idx]->vals[vp_idx++].value =3D smid_opt; @@ -242,8 +241,7 @@ smc_save_yourself_CB (SmcConn smcConn, if (cwd) { chdir_opt =3D xmalloc (strlen (CHDIR_OPT) + strlen (cwd) + 1); - strcpy (chdir_opt, CHDIR_OPT); - strcat (chdir_opt, cwd); + strcpy (stpcpy (chdir_opt, CHDIR_OPT), cwd); =20 props[props_idx]->vals[vp_idx].length =3D strlen (chdir_opt); props[props_idx]->vals[vp_idx++].value =3D chdir_opt; --=20 1.9.3 --------------060902000208090901060402--