diff options
| author | Paul Eggert <eggert@cs.ucla.edu> | 2014-12-25 04:19:17 -0800 |
|---|---|---|
| committer | Paul Eggert <eggert@cs.ucla.edu> | 2014-12-25 15:44:23 -0800 |
| commit | 1e6879dbdb0832427f5c588c89a53a8a80768a00 (patch) | |
| tree | 155493c6e140264c05356c667a1c9547a45e336f /src | |
| parent | 8dba53d239f5ac00e930f13b73f59cb5b53ffbd1 (diff) | |
| download | emacs-1e6879dbdb0832427f5c588c89a53a8a80768a00.tar.gz | |
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.
* lib-src/ebrowse.c (sym_scope_1, operator_name, open_file):
* lib-src/emacsclient.c (get_server_config, set_local_socket)
(start_daemon_and_retry_set_socket):
* lib-src/etags.c (main, C_entries, relative_filename):
* lib-src/pop.c (sendline):
* lib-src/update-game-score.c (main):
* lwlib/xlwmenu.c (resource_widget_value):
* 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
and/or lispstpcpy. strcat tends to be part of O(N**2) algorithms.
* src/doc.c (sibling_etc):
* src/xrdb.c (xdefaults):
Now a top-level static constant.
Diffstat (limited to 'src')
| -rw-r--r-- | src/callproc.c | 7 | ||||
| -rw-r--r-- | src/dbusbind.c | 2 | ||||
| -rw-r--r-- | src/doc.c | 33 | ||||
| -rw-r--r-- | src/editfns.c | 5 | ||||
| -rw-r--r-- | src/frame.c | 20 | ||||
| -rw-r--r-- | src/gtkutil.c | 6 | ||||
| -rw-r--r-- | src/tparam.c | 4 | ||||
| -rw-r--r-- | src/xfns.c | 34 | ||||
| -rw-r--r-- | src/xrdb.c | 44 | ||||
| -rw-r--r-- | src/xsmfns.c | 6 |
10 files changed, 71 insertions, 90 deletions
diff --git a/src/callproc.c b/src/callproc.c index a677334b3b7..f40ed3244a5 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, if (STRINGP (display)) { - char *vdata; - if (MAX_ALLOCA - sizeof "DISPLAY=" < SBYTES (display)) exec_failed (new_argv[0], ENOMEM); - vdata = alloca (sizeof "DISPLAY=" + SBYTES (display)); - strcpy (vdata, "DISPLAY="); - strcat (vdata, SSDATA (display)); + char *vdata = alloca (sizeof "DISPLAY=" + SBYTES (display)); + lispstpcpy (stpcpy (vdata, "DISPLAY="), display); new_env = add_env (env, new_env, vdata); } diff --git a/src/dbusbind.c b/src/dbusbind.c index 4852739d8e4..983b05c4206 100644 --- a/src/dbusbind.c +++ b/src/dbusbind.c @@ -357,7 +357,7 @@ xd_signature_cat (char *signature, char const *x) ptrdiff_t xlen = strlen (x); if (DBUS_MAXIMUM_SIGNATURE_LENGTH - xlen <= siglen) string_overflow (); - strcat (signature, x); + strcpy (signature + siglen, x); } /* Compute SIGNATURE of OBJECT. It must have a form that it can be diff --git a/src/doc.c b/src/doc.c index 1b87c23e949..1d9c330d12c 100644 --- a/src/doc.c +++ b/src/doc.c @@ -42,6 +42,8 @@ static ptrdiff_t get_doc_string_buffer_size; static unsigned char *read_bytecode_pointer; +static char const sibling_etc[] = "../etc/"; + /* `readchar' in lread.c calls back here to fetch the next byte. If UNREADFLAG is 1, we unread a byte. */ @@ -80,7 +82,6 @@ get_doc_string (Lisp_Object filepos, bool unibyte, bool definition) { char *from, *to, *name, *p, *p1; int fd; - ptrdiff_t minsize; int offset; EMACS_INT position; Lisp_Object file, tem, pos; @@ -113,21 +114,14 @@ get_doc_string (Lisp_Object filepos, bool unibyte, bool definition) tem = Ffile_name_absolute_p (file); file = ENCODE_FILE (file); - if (NILP (tem)) - { - Lisp_Object docdir = ENCODE_FILE (Vdoc_directory); - minsize = SCHARS (docdir); - /* sizeof ("../etc/") == 8 */ - if (minsize < 8) - minsize = 8; - name = SAFE_ALLOCA (minsize + SCHARS (file) + 8); - char *z = lispstpcpy (name, docdir); - strcpy (z, SSDATA (file)); - } - else - { - name = SSDATA (file); - } + Lisp_Object docdir + = NILP (tem) ? ENCODE_FILE (Vdoc_directory) : empty_unibyte_string; + ptrdiff_t docdir_sizemax = SBYTES (docdir) + 1; +#ifndef CANNOT_DUMP + docdir_sizemax = max (docdir_sizemax, sizeof sibling_etc); +#endif + name = SAFE_ALLOCA (docdir_sizemax + SBYTES (file)); + lispstpcpy (lispstpcpy (name, docdir), file); fd = emacs_open (name, O_RDONLY, 0); if (fd < 0) @@ -137,8 +131,7 @@ get_doc_string (Lisp_Object filepos, bool unibyte, bool definition) { /* Preparing to dump; DOC file is probably not installed. So check in ../etc. */ - strcpy (name, "../etc/"); - strcat (name, SSDATA (file)); + lispstpcpy (stpcpy (name, sibling_etc), file); fd = emacs_open (name, O_RDONLY, 0); } @@ -580,7 +573,6 @@ the same file name is found in the `doc-directory'. */) (0) #endif /* CANNOT_DUMP */ { - static char const sibling_etc[] = "../etc/"; dirname = sibling_etc; dirlen = sizeof sibling_etc - 1; } @@ -594,8 +586,7 @@ the same file name is found in the `doc-directory'. */) count = SPECPDL_INDEX (); USE_SAFE_ALLOCA; name = SAFE_ALLOCA (dirlen + SBYTES (filename) + 1); - strcpy (name, dirname); - strcat (name, SSDATA (filename)); /*** Add this line ***/ + lispstpcpy (stpcpy (name, dirname), filename); /*** Add this line ***/ /* 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 0a07886934c..430c4c91fb3 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 = SAFE_ALLOCA (strlen (p) + SBYTES (login) + 1); memcpy (r, p, q - p); - r[q - p] = 0; - strcat (r, SSDATA (login)); + char *s = lispstpcpy (&r[q - p], login); r[q - p] = upcase ((unsigned char) r[q - p]); - strcat (r, q + 1); + strcpy (s, q + 1); full = build_string (r); SAFE_FREE (); } diff --git a/src/frame.c b/src/frame.c index 31273665e88..2ad1c1b52b7 100644 --- a/src/frame.c +++ b/src/frame.c @@ -4076,23 +4076,23 @@ 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). */ - lispstpcpy (name_key, Vx_resource_name); - lispstpcpy (class_key, Vx_resource_class); + char *nz = lispstpcpy (name_key, Vx_resource_name); + char *cz = lispstpcpy (class_key, Vx_resource_class); - strcat (class_key, "."); - strcat (class_key, SSDATA (class)); + *cz++ = '.'; + cz = lispstpcpy (cz, class); if (!NILP (component)) { - strcat (class_key, "."); - strcat (class_key, SSDATA (subclass)); + *cz++ = '.'; + lispstpcpy (cz, subclass); - strcat (name_key, "."); - strcat (name_key, SSDATA (component)); + *nz++ = '.'; + nz = lispstpcpy (nz, component); } - strcat (name_key, "."); - strcat (name_key, SSDATA (attribute)); + *nz++ = '.'; + lispstpcpy (nz, attribute); char *value = x_get_string_resource (rdb, name_key, class_key); SAFE_FREE(); diff --git a/src/gtkutil.c b/src/gtkutil.c index 9465d5479df..f61cbc2c85c 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c @@ -1839,12 +1839,12 @@ xg_get_file_with_chooser (struct frame *f, if (x_gtk_file_dialog_help_text) { - msgbuf[0] = '\0'; + char *z = msgbuf; /* Gtk+ 2.10 has the file name text entry box integrated in the dialog. Show the C-l help text only for versions < 2.10. */ if (gtk_check_version (2, 10, 0) && action != GTK_FILE_CHOOSER_ACTION_SAVE) - strcat (msgbuf, "\nType C-l to display a file name text entry box.\n"); - strcat (msgbuf, "\nIf you don't like this file selector, use the " + z = stpcpy (z, "\nType C-l to display a file name text entry box.\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."); diff --git a/src/tparam.c b/src/tparam.c index e02cea3689e..b0cd0047ba2 100644 --- a/src/tparam.c +++ b/src/tparam.c @@ -255,9 +255,9 @@ tparam1 (const char *string, char *outstring, int len, } *op = 0; while (doup-- > 0) - strcat (op, up); + op = stpcpy (op, up); while (doleft-- > 0) - strcat (op, left); + op = stpcpy (op, left); return outstring; } diff --git a/src/xfns.c b/src/xfns.c index 1b17311f99c..ba2601daca4 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 = motif ? ";" : ","; char *fontsetname; + char *z; /* Make a fontset name from the base font name. */ if (xic_default_fontset == base_fontname) { /* There is no base font name, use the default. */ fontsetname = xmalloc (strlen (base_fontname) + 2); - strcpy (fontsetname, base_fontname); + z = 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 = xmalloc (strlen (base_fontname) + strlen (xic_default_fontset) + 3); - strcpy (fontsetname, base_fontname); - strcat (fontsetname, sep); - strcat (fontsetname, xic_default_fontset); + z = stpcpy (fontsetname, base_fontname); + z = stpcpy (z, sep); + z = 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 = p - p2 + strlen (allcs) + strlen (all) + strlen (allfamilies) + 1; font_all = 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 = stpcpy (font_all, allfamilies); + z = stpcpy (z, all); + memcpy (z, p2, p - p2); + strcpy (z + (p - p2), allcs); /* Build the actual font set name. */ len = strlen (base_fontname) + strlen (font_allcs) + strlen (font_allfamilies) + strlen (font_all) + 5; fontsetname = 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 = stpcpy (fontsetname, base_fontname); + z = stpcpy (z, sep); + z = stpcpy (z, font_allcs); + z = stpcpy (z, sep); + z = stpcpy (z, font_allfamilies); + z = stpcpy (z, sep); + z = 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 32ad3c7f01e..e21206d0800 100644 --- a/src/xrdb.c +++ b/src/xrdb.c @@ -232,9 +232,10 @@ gethomedir (void) if (ptr == NULL) return xstrdup ("/"); - copy = xmalloc (strlen (ptr) + 2); - strcpy (copy, ptr); - return strcat (copy, "/"); + ptrdiff_t len = strlen (ptr); + copy = xmalloc (len + 2); + strcpy (copy + len, "/"); + return memcpy (copy, ptr, len); } @@ -334,6 +335,7 @@ get_user_app (const char *class) return db; } +static char const xdefaults[] = ".Xdefaults"; static XrmDatabase get_user_db (Display *display) @@ -351,16 +353,12 @@ get_user_db (Display *display) db = XrmGetStringDatabase (xdefs); else { - char *home; - char *xdefault; - - home = gethomedir (); - xdefault = xmalloc (strlen (home) + sizeof ".Xdefaults"); - strcpy (xdefault, home); - strcat (xdefault, ".Xdefaults"); - db = XrmGetFileDatabase (xdefault); - xfree (home); - xfree (xdefault); + char *home = gethomedir (); + ptrdiff_t homelen = strlen (home); + char *filename = xrealloc (home, homelen + sizeof xdefaults); + strcpy (filename + homelen, xdefaults); + db = XrmGetFileDatabase (filename); + xfree (filename); } #ifdef HAVE_XSCREENRESOURCESTRING @@ -380,24 +378,22 @@ static XrmDatabase get_environ_db (void) { XrmDatabase db; - char *p; - char *path = 0; + char *p = getenv ("XENVIRONMENT"); + char *filename = 0; - if ((p = getenv ("XENVIRONMENT")) == NULL) + if (!p) { - static char const xdefaults[] = ".Xdefaults-"; char *home = gethomedir (); - char const *host = SSDATA (Vsystem_name); - ptrdiff_t pathsize = (strlen (home) + sizeof xdefaults - + SBYTES (Vsystem_name)); - path = xrealloc (home, pathsize); - strcat (strcat (path, xdefaults), host); - p = path; + ptrdiff_t homelen = strlen (home); + ptrdiff_t filenamesize = (homelen + sizeof xdefaults + + SBYTES (Vsystem_name)); + p = filename = xrealloc (home, filenamesize); + lispstpcpy (stpcpy (filename + homelen, xdefaults), Vsystem_name); } db = XrmGetFileDatabase (p); - xfree (path); + xfree (filename); return db; } diff --git a/src/xsmfns.c b/src/xsmfns.c index cd4f9ce57fa..8a835cf95f1 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 = emacs_program; smid_opt = 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); props[props_idx]->vals[vp_idx].length = strlen (smid_opt); props[props_idx]->vals[vp_idx++].value = smid_opt; @@ -242,8 +241,7 @@ smc_save_yourself_CB (SmcConn smcConn, if (cwd) { chdir_opt = xmalloc (strlen (CHDIR_OPT) + strlen (cwd) + 1); - strcpy (chdir_opt, CHDIR_OPT); - strcat (chdir_opt, cwd); + strcpy (stpcpy (chdir_opt, CHDIR_OPT), cwd); props[props_idx]->vals[vp_idx].length = strlen (chdir_opt); props[props_idx]->vals[vp_idx++].value = chdir_opt; |
