diff options
| author | Paul Eggert | 2019-06-25 14:53:39 -0700 |
|---|---|---|
| committer | Paul Eggert | 2019-06-25 14:55:08 -0700 |
| commit | d7c6836288c91bb639956cb8c748dd6597c55cd4 (patch) | |
| tree | 687f6f257d3cb5f4bd54eb634aef2737eb9c0856 /src | |
| parent | 349b778dde7f583a92dd1531aef3ff5c336e9aee (diff) | |
| download | emacs-d7c6836288c91bb639956cb8c748dd6597c55cd4.tar.gz emacs-d7c6836288c91bb639956cb8c748dd6597c55cd4.zip | |
Avoid some strlen work, primarily via strnlen
* admin/merge-gnulib (GNULIB_MODULES): Add strnlen.
* lib-src/etags.c (find_entries):
* src/emacs.c (main):
* src/nsmenu.m (parseKeyEquiv:):
* src/nsterm.m (ns_xlfd_to_fontname):
* src/term.c (vfatal):
Prefer !*X to !strlen (X).
* lib-src/etags.c (pfnote, add_regex):
* lib-src/pop.c (pop_open):
* lib-src/update-game-score.c (main):
* lwlib/lwlib.c (lw_separator_p):
* src/doprnt.c (doprnt):
* src/emacs.c (main):
* src/inotify.c (inotifyevent_to_event):
* src/keyboard.c (menu_separator_name_p, parse_tool_bar_item):
* src/sysdep.c (get_current_dir_name_or_unreachable):
* src/xdisp.c (store_mode_line_string):
Use strnlen to avoid unnecessary work with strlen.
* lib-src/etags.c (Prolog_functions, prolog_pr)
(Erlang_functions, erlang_func):
Prefer ptrdiff_t to size_t when either will do.
(prolog_pr, erlang_func): New arg LASTLEN, to avoid
unnecessary strlen call. All callers changed.
* lib/gnulib.mk.in, m4/gnulib-comp.m4: Regenerate.
* lib/strnlen.c, m4/strnlen.m4: New files, copied from Gnulib.
* lwlib/lwlib.c (lw_separator_p):
* src/json.c (json_has_prefix):
Use strncmp to avoid unecessary work with strlen + memcmp.
* src/process.c (set_socket_option): Use SBYTES instead of strlen.
Diffstat (limited to 'src')
| -rw-r--r-- | src/doprnt.c | 4 | ||||
| -rw-r--r-- | src/emacs.c | 4 | ||||
| -rw-r--r-- | src/inotify.c | 3 | ||||
| -rw-r--r-- | src/json.c | 4 | ||||
| -rw-r--r-- | src/keyboard.c | 15 | ||||
| -rw-r--r-- | src/nsmenu.m | 2 | ||||
| -rw-r--r-- | src/nsterm.m | 2 | ||||
| -rw-r--r-- | src/process.c | 6 | ||||
| -rw-r--r-- | src/sysdep.c | 4 | ||||
| -rw-r--r-- | src/term.c | 2 | ||||
| -rw-r--r-- | src/xdisp.c | 4 |
11 files changed, 21 insertions, 29 deletions
diff --git a/src/doprnt.c b/src/doprnt.c index 5fb70634048..64bb368ee3e 100644 --- a/src/doprnt.c +++ b/src/doprnt.c | |||
| @@ -357,8 +357,8 @@ doprnt (char *buffer, ptrdiff_t bufsize, const char *format, | |||
| 357 | if (fmtcpy[1] != 's') | 357 | if (fmtcpy[1] != 's') |
| 358 | minlen = atoi (&fmtcpy[1]); | 358 | minlen = atoi (&fmtcpy[1]); |
| 359 | string = va_arg (ap, char *); | 359 | string = va_arg (ap, char *); |
| 360 | tem = strlen (string); | 360 | tem = strnlen (string, STRING_BYTES_BOUND + 1); |
| 361 | if (STRING_BYTES_BOUND < tem) | 361 | if (tem == STRING_BYTES_BOUND + 1) |
| 362 | error ("String for %%s or %%S format is too long"); | 362 | error ("String for %%s or %%S format is too long"); |
| 363 | width = strwidth (string, tem); | 363 | width = strwidth (string, tem); |
| 364 | goto doit1; | 364 | goto doit1; |
diff --git a/src/emacs.c b/src/emacs.c index 1ddd10b8051..231acc0ef32 100644 --- a/src/emacs.c +++ b/src/emacs.c | |||
| @@ -1520,8 +1520,8 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem | |||
| 1520 | } | 1520 | } |
| 1521 | 1521 | ||
| 1522 | /* In exec'd: parse special dname into pipe and name info. */ | 1522 | /* In exec'd: parse special dname into pipe and name info. */ |
| 1523 | if (!dname_arg || !strchr (dname_arg, '\n') | 1523 | if (!dname_arg || !*dname_arg || strnlen (dname_arg, 71) == 71 |
| 1524 | || strlen (dname_arg) < 1 || strlen (dname_arg) > 70) | 1524 | || !strchr (dname_arg, '\n')) |
| 1525 | { | 1525 | { |
| 1526 | fprintf (stderr, "emacs daemon: daemon name absent or too long\n"); | 1526 | fprintf (stderr, "emacs daemon: daemon name absent or too long\n"); |
| 1527 | exit (EXIT_CANNOT_INVOKE); | 1527 | exit (EXIT_CANNOT_INVOKE); |
diff --git a/src/inotify.c b/src/inotify.c index 9a7dbb8f413..e8891aefc7a 100644 --- a/src/inotify.c +++ b/src/inotify.c | |||
| @@ -181,8 +181,7 @@ inotifyevent_to_event (Lisp_Object watch, struct inotify_event const *ev) | |||
| 181 | 181 | ||
| 182 | if (ev->len > 0) | 182 | if (ev->len > 0) |
| 183 | { | 183 | { |
| 184 | size_t const len = strlen (ev->name); | 184 | name = make_unibyte_string (ev->name, strnlen (ev->name, ev->len)); |
| 185 | name = make_unibyte_string (ev->name, min (len, ev->len)); | ||
| 186 | name = DECODE_FILE (name); | 185 | name = DECODE_FILE (name); |
| 187 | } | 186 | } |
| 188 | else | 187 | else |
diff --git a/src/json.c b/src/json.c index e2a4424463b..23234c767d8 100644 --- a/src/json.c +++ b/src/json.c | |||
| @@ -197,9 +197,7 @@ init_json (void) | |||
| 197 | static bool | 197 | static bool |
| 198 | json_has_prefix (const char *string, const char *prefix) | 198 | json_has_prefix (const char *string, const char *prefix) |
| 199 | { | 199 | { |
| 200 | size_t string_len = strlen (string); | 200 | return strncmp (string, prefix, strlen (prefix)) == 0; |
| 201 | size_t prefix_len = strlen (prefix); | ||
| 202 | return string_len >= prefix_len && memcmp (string, prefix, prefix_len) == 0; | ||
| 203 | } | 201 | } |
| 204 | 202 | ||
| 205 | /* Return whether STRING ends with SUFFIX. */ | 203 | /* Return whether STRING ends with SUFFIX. */ |
diff --git a/src/keyboard.c b/src/keyboard.c index 0d7f124f5f3..56916e0cb4e 100644 --- a/src/keyboard.c +++ b/src/keyboard.c | |||
| @@ -7331,7 +7331,7 @@ menu_separator_name_p (const char *label) | |||
| 7331 | { | 7331 | { |
| 7332 | if (!label) | 7332 | if (!label) |
| 7333 | return 0; | 7333 | return 0; |
| 7334 | else if (strlen (label) > 3 | 7334 | else if (strnlen (label, 4) == 4 |
| 7335 | && memcmp (label, "--", 2) == 0 | 7335 | && memcmp (label, "--", 2) == 0 |
| 7336 | && label[2] != '-') | 7336 | && label[2] != '-') |
| 7337 | { | 7337 | { |
| @@ -8248,13 +8248,13 @@ parse_tool_bar_item (Lisp_Object key, Lisp_Object item) | |||
| 8248 | Lisp_Object tcapt = PROP (TOOL_BAR_ITEM_CAPTION); | 8248 | Lisp_Object tcapt = PROP (TOOL_BAR_ITEM_CAPTION); |
| 8249 | const char *label = SYMBOLP (tkey) ? SSDATA (SYMBOL_NAME (tkey)) : ""; | 8249 | const char *label = SYMBOLP (tkey) ? SSDATA (SYMBOL_NAME (tkey)) : ""; |
| 8250 | const char *capt = STRINGP (tcapt) ? SSDATA (tcapt) : ""; | 8250 | const char *capt = STRINGP (tcapt) ? SSDATA (tcapt) : ""; |
| 8251 | ptrdiff_t max_lbl = | 8251 | ptrdiff_t max_lbl_size = |
| 8252 | 2 * max (0, min (tool_bar_max_label_size, STRING_BYTES_BOUND / 2)); | 8252 | 2 * max (0, min (tool_bar_max_label_size, STRING_BYTES_BOUND / 2)) + 1; |
| 8253 | char *buf = xmalloc (max_lbl + 1); | 8253 | char *buf = xmalloc (max_lbl_size); |
| 8254 | Lisp_Object new_lbl; | 8254 | Lisp_Object new_lbl; |
| 8255 | ptrdiff_t caption_len = strlen (capt); | 8255 | ptrdiff_t caption_len = strnlen (capt, max_lbl_size); |
| 8256 | 8256 | ||
| 8257 | if (caption_len <= max_lbl && capt[0] != '\0') | 8257 | if (0 < caption_len && caption_len < max_lbl_size) |
| 8258 | { | 8258 | { |
| 8259 | strcpy (buf, capt); | 8259 | strcpy (buf, capt); |
| 8260 | while (caption_len > 0 && buf[caption_len - 1] == '.') | 8260 | while (caption_len > 0 && buf[caption_len - 1] == '.') |
| @@ -8263,7 +8263,8 @@ parse_tool_bar_item (Lisp_Object key, Lisp_Object item) | |||
| 8263 | label = capt = buf; | 8263 | label = capt = buf; |
| 8264 | } | 8264 | } |
| 8265 | 8265 | ||
| 8266 | if (strlen (label) <= max_lbl && label[0] != '\0') | 8266 | ptrdiff_t label_len = strnlen (label, max_lbl_size); |
| 8267 | if (0 < label_len && label_len < max_lbl_size) | ||
| 8267 | { | 8268 | { |
| 8268 | ptrdiff_t j; | 8269 | ptrdiff_t j; |
| 8269 | if (label != buf) | 8270 | if (label != buf) |
diff --git a/src/nsmenu.m b/src/nsmenu.m index 3fe06cda02a..817f8cff184 100644 --- a/src/nsmenu.m +++ b/src/nsmenu.m | |||
| @@ -611,7 +611,7 @@ ns_activate_menubar (struct frame *f) | |||
| 611 | const char *tpos = key; | 611 | const char *tpos = key; |
| 612 | keyEquivModMask = NSEventModifierFlagCommand; | 612 | keyEquivModMask = NSEventModifierFlagCommand; |
| 613 | 613 | ||
| 614 | if (!key || !strlen (key)) | 614 | if (!key || !*key) |
| 615 | return @""; | 615 | return @""; |
| 616 | 616 | ||
| 617 | while (*tpos == ' ' || *tpos == '(') | 617 | while (*tpos == ' ' || *tpos == '(') |
diff --git a/src/nsterm.m b/src/nsterm.m index 0ab03b46df1..8d46a49cc5e 100644 --- a/src/nsterm.m +++ b/src/nsterm.m | |||
| @@ -9298,7 +9298,7 @@ ns_xlfd_to_fontname (const char *xlfd) | |||
| 9298 | sscanf (xlfd, "-%*[^-]-%179[^-]-", name); | 9298 | sscanf (xlfd, "-%*[^-]-%179[^-]-", name); |
| 9299 | 9299 | ||
| 9300 | /* stopgap for malformed XLFD input */ | 9300 | /* stopgap for malformed XLFD input */ |
| 9301 | if (strlen (name) == 0) | 9301 | if (!*name) |
| 9302 | strcpy (name, "Monaco"); | 9302 | strcpy (name, "Monaco"); |
| 9303 | 9303 | ||
| 9304 | /* undo hack in ns_fontname_to_xlfd, converting '$' to '-', '_' to ' ' | 9304 | /* undo hack in ns_fontname_to_xlfd, converting '$' to '-', '_' to ' ' |
diff --git a/src/process.c b/src/process.c index 6717ccb4187..15d87cf6015 100644 --- a/src/process.c +++ b/src/process.c | |||
| @@ -2857,11 +2857,7 @@ set_socket_option (int s, Lisp_Object opt, Lisp_Object val) | |||
| 2857 | This should work on all systems. KFS. 2003-09-23. */ | 2857 | This should work on all systems. KFS. 2003-09-23. */ |
| 2858 | memset (devname, 0, sizeof devname); | 2858 | memset (devname, 0, sizeof devname); |
| 2859 | if (STRINGP (val)) | 2859 | if (STRINGP (val)) |
| 2860 | { | 2860 | memcpy (devname, SDATA (val), min (SBYTES (val), IFNAMSIZ)); |
| 2861 | char *arg = SSDATA (val); | ||
| 2862 | int len = min (strlen (arg), IFNAMSIZ); | ||
| 2863 | memcpy (devname, arg, len); | ||
| 2864 | } | ||
| 2865 | else if (!NILP (val)) | 2861 | else if (!NILP (val)) |
| 2866 | error ("Bad option value for %s", name); | 2862 | error ("Bad option value for %s", name); |
| 2867 | ret = setsockopt (s, sopt->optlevel, sopt->optnum, | 2863 | ret = setsockopt (s, sopt->optlevel, sopt->optnum, |
diff --git a/src/sysdep.c b/src/sysdep.c index 0910b69f8bc..b702bae5818 100644 --- a/src/sysdep.c +++ b/src/sysdep.c | |||
| @@ -281,7 +281,7 @@ get_current_dir_name_or_unreachable (void) | |||
| 281 | pwd = get_current_dir_name (); | 281 | pwd = get_current_dir_name (); |
| 282 | if (pwd) | 282 | if (pwd) |
| 283 | { | 283 | { |
| 284 | if (strlen (pwd) < dirsize_max) | 284 | if (strnlen (pwd, dirsize_max) < dirsize_max) |
| 285 | return pwd; | 285 | return pwd; |
| 286 | free (pwd); | 286 | free (pwd); |
| 287 | errno = ERANGE; | 287 | errno = ERANGE; |
| @@ -298,7 +298,7 @@ get_current_dir_name_or_unreachable (void) | |||
| 298 | sometimes a nicer name, and using it may avoid a fatal error if a | 298 | sometimes a nicer name, and using it may avoid a fatal error if a |
| 299 | parent directory is searchable but not readable. */ | 299 | parent directory is searchable but not readable. */ |
| 300 | if (pwd | 300 | if (pwd |
| 301 | && (pwdlen = strlen (pwd)) < bufsize_max | 301 | && (pwdlen = strnlen (pwd, bufsize_max)) < bufsize_max |
| 302 | && IS_DIRECTORY_SEP (pwd[pwdlen && IS_DEVICE_SEP (pwd[1]) ? 2 : 0]) | 302 | && IS_DIRECTORY_SEP (pwd[pwdlen && IS_DEVICE_SEP (pwd[1]) ? 2 : 0]) |
| 303 | && stat (pwd, &pwdstat) == 0 | 303 | && stat (pwd, &pwdstat) == 0 |
| 304 | && stat (".", &dotstat) == 0 | 304 | && stat (".", &dotstat) == 0 |
diff --git a/src/term.c b/src/term.c index ce06e1cd4e5..8b5a710d80a 100644 --- a/src/term.c +++ b/src/term.c | |||
| @@ -4400,7 +4400,7 @@ vfatal (const char *str, va_list ap) | |||
| 4400 | { | 4400 | { |
| 4401 | fprintf (stderr, "emacs: "); | 4401 | fprintf (stderr, "emacs: "); |
| 4402 | vfprintf (stderr, str, ap); | 4402 | vfprintf (stderr, str, ap); |
| 4403 | if (!(strlen (str) > 0 && str[strlen (str) - 1] == '\n')) | 4403 | if (! (str[0] && str[strlen (str) - 1] == '\n')) |
| 4404 | fprintf (stderr, "\n"); | 4404 | fprintf (stderr, "\n"); |
| 4405 | exit (1); | 4405 | exit (1); |
| 4406 | } | 4406 | } |
diff --git a/src/xdisp.c b/src/xdisp.c index 25e8932945e..9f63ef4b180 100644 --- a/src/xdisp.c +++ b/src/xdisp.c | |||
| @@ -24341,9 +24341,7 @@ store_mode_line_string (const char *string, Lisp_Object lisp_string, | |||
| 24341 | 24341 | ||
| 24342 | if (string != NULL) | 24342 | if (string != NULL) |
| 24343 | { | 24343 | { |
| 24344 | len = strlen (string); | 24344 | len = strnlen (string, precision <= 0 ? SIZE_MAX : precision); |
| 24345 | if (precision > 0 && len > precision) | ||
| 24346 | len = precision; | ||
| 24347 | lisp_string = make_string (string, len); | 24345 | lisp_string = make_string (string, len); |
| 24348 | if (NILP (props)) | 24346 | if (NILP (props)) |
| 24349 | props = mode_line_string_face_prop; | 24347 | props = mode_line_string_face_prop; |