Mercurial > vim
changeset 4857:84a8d1ba81c3 v7.3.1175
updated for version 7.3.1175
Problem: Using isalpha() and isalnum() can be slow.
Solution: Use range checks. (Mike Williams)
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Wed, 12 Jun 2013 17:12:24 +0200 |
parents | 0195e997d5a5 |
children | a1c85064b551 |
files | src/ex_docmd.c src/macros.h src/version.c |
diffstat | 3 files changed, 10 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -3120,7 +3120,7 @@ modifier_len(cmd) for (j = 0; p[j] != NUL; ++j) if (p[j] != cmdmods[i].name[j]) break; - if (!isalpha(p[j]) && j >= cmdmods[i].minlen + if (!ASCII_ISALPHA(p[j]) && j >= cmdmods[i].minlen && (p == cmd || cmdmods[i].has_count)) return j + (int)(p - cmd); }
--- a/src/macros.h +++ b/src/macros.h @@ -99,6 +99,11 @@ # define MB_TOUPPER(c) TOUPPER_LOC(c) #endif +/* Use our own isdigit() replacement, because on MS-Windows isdigit() returns + * non-zero for superscript 1. Also avoids that isdigit() crashes for numbers + * below 0 and above 255. */ +#define VIM_ISDIGIT(c) ((unsigned)(c) - '0' < 10) + /* Like isalpha() but reject non-ASCII characters. Can't be used with a * special key (negative value). */ #ifdef EBCDIC @@ -107,17 +112,12 @@ # define ASCII_ISLOWER(c) islower(c) # define ASCII_ISUPPER(c) isupper(c) #else -# define ASCII_ISALPHA(c) ((c) < 0x7f && isalpha(c)) -# define ASCII_ISALNUM(c) ((c) < 0x7f && isalnum(c)) # define ASCII_ISLOWER(c) ((unsigned)(c) - 'a' < 26) # define ASCII_ISUPPER(c) ((unsigned)(c) - 'A' < 26) +# define ASCII_ISALPHA(c) (ASCII_ISUPPER(c) || ASCII_ISLOWER(c)) +# define ASCII_ISALNUM(c) (ASCII_ISALPHA(c) || VIM_ISDIGIT(c)) #endif -/* Use our own isdigit() replacement, because on MS-Windows isdigit() returns - * non-zero for superscript 1. Also avoids that isdigit() crashes for numbers - * below 0 and above 255. */ -#define VIM_ISDIGIT(c) ((unsigned)(c) - '0' < 10) - /* macro version of chartab(). * Only works with values 0-255! * Doesn't work for UTF-8 mode with chars >= 0x80. */