diff options
author | Ron Yorston <rmy@pobox.com> | 2021-08-09 14:58:37 +0100 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2021-08-09 14:58:37 +0100 |
commit | 56e1d04ae71a05586fa3414aabdef0de720d0720 (patch) | |
tree | e06c0b37c22dd811e48b7a9886a4de2bf04b129f | |
parent | dd10dfda5834b0e67ebab0425d0a48fbfc939d7f (diff) | |
download | busybox-w32-56e1d04ae71a05586fa3414aabdef0de720d0720.tar.gz busybox-w32-56e1d04ae71a05586fa3414aabdef0de720d0720.tar.bz2 busybox-w32-56e1d04ae71a05586fa3414aabdef0de720d0720.zip |
win32: code shrink character class detection
Add a routine to detect the names of character classes. Use it
in fnmatch(3) and regcomp(3), replacing local code in the former.
Saves 216 bytes.
-rw-r--r-- | win32/Kbuild | 1 | ||||
-rw-r--r-- | win32/fnmatch.c | 32 | ||||
-rw-r--r-- | win32/match_class.c | 7 | ||||
-rw-r--r-- | win32/match_class.h | 11 | ||||
-rw-r--r-- | win32/regcomp.c | 50 |
5 files changed, 83 insertions, 18 deletions
diff --git a/win32/Kbuild b/win32/Kbuild index cabd70849..6ab0dc077 100644 --- a/win32/Kbuild +++ b/win32/Kbuild | |||
@@ -13,6 +13,7 @@ lib-$(CONFIG_PLATFORM_MINGW32) += ioctl.o | |||
13 | lib-$(CONFIG_FEATURE_PRNG_ISAAC) += isaac.o | 13 | lib-$(CONFIG_FEATURE_PRNG_ISAAC) += isaac.o |
14 | lib-$(CONFIG_PLATFORM_MINGW32) += mingw.o | 14 | lib-$(CONFIG_PLATFORM_MINGW32) += mingw.o |
15 | lib-$(CONFIG_PLATFORM_MINGW32) += process.o | 15 | lib-$(CONFIG_PLATFORM_MINGW32) += process.o |
16 | lib-$(CONFIG_PLATFORM_MINGW32) += match_class.o | ||
16 | lib-$(CONFIG_PLATFORM_MINGW32) += mntent.o | 17 | lib-$(CONFIG_PLATFORM_MINGW32) += mntent.o |
17 | lib-$(CONFIG_PLATFORM_MINGW32) += net.o | 18 | lib-$(CONFIG_PLATFORM_MINGW32) += net.o |
18 | lib-$(CONFIG_PLATFORM_MINGW32) += poll.o | 19 | lib-$(CONFIG_PLATFORM_MINGW32) += poll.o |
diff --git a/win32/fnmatch.c b/win32/fnmatch.c index 0e76a7ba1..7d8fde6a2 100644 --- a/win32/fnmatch.c +++ b/win32/fnmatch.c | |||
@@ -17,7 +17,7 @@ | |||
17 | Boston, MA 02111-1307, USA. */ | 17 | Boston, MA 02111-1307, USA. */ |
18 | 18 | ||
19 | #include <platform.h> | 19 | #include <platform.h> |
20 | int index_in_strings(const char *strings, const char *key) FAST_FUNC; | 20 | #include "match_class.h" |
21 | 21 | ||
22 | #if HAVE_CONFIG_H | 22 | #if HAVE_CONFIG_H |
23 | # include <config.h> | 23 | # include <config.h> |
@@ -373,56 +373,52 @@ internal_fnmatch (const char *pattern, const char *string, | |||
373 | if (__iswctype (__btowc ((unsigned char) *n), wt)) | 373 | if (__iswctype (__btowc ((unsigned char) *n), wt)) |
374 | goto matched; | 374 | goto matched; |
375 | # else | 375 | # else |
376 | #define CHAR_CLASSES \ | 376 | switch (match_class(str)) { |
377 | "alnum\0alpha\0blank\0cntrl\0digit\0graph\0" \ | 377 | case CCLASS_ALNUM: |
378 | "lower\0print\0punct\0space\0upper\0xdigit\0" | ||
379 | |||
380 | switch (index_in_strings(CHAR_CLASSES, str)) { | ||
381 | case 0: | ||
382 | if (ISALNUM ((unsigned char) *n)) | 378 | if (ISALNUM ((unsigned char) *n)) |
383 | goto matched; | 379 | goto matched; |
384 | break; | 380 | break; |
385 | case 1: | 381 | case CCLASS_ALPHA: |
386 | if (ISALPHA ((unsigned char) *n)) | 382 | if (ISALPHA ((unsigned char) *n)) |
387 | goto matched; | 383 | goto matched; |
388 | break; | 384 | break; |
389 | case 2: | 385 | case CCLASS_BLANK: |
390 | if (ISBLANK ((unsigned char) *n)) | 386 | if (ISBLANK ((unsigned char) *n)) |
391 | goto matched; | 387 | goto matched; |
392 | break; | 388 | break; |
393 | case 3: | 389 | case CCLASS_CNTRL: |
394 | if (ISCNTRL ((unsigned char) *n)) | 390 | if (ISCNTRL ((unsigned char) *n)) |
395 | goto matched; | 391 | goto matched; |
396 | break; | 392 | break; |
397 | case 4: | 393 | case CCLASS_DIGIT: |
398 | if (ISDIGIT ((unsigned char) *n)) | 394 | if (ISDIGIT ((unsigned char) *n)) |
399 | goto matched; | 395 | goto matched; |
400 | break; | 396 | break; |
401 | case 5: | 397 | case CCLASS_GRAPH: |
402 | if (ISGRAPH ((unsigned char) *n)) | 398 | if (ISGRAPH ((unsigned char) *n)) |
403 | goto matched; | 399 | goto matched; |
404 | break; | 400 | break; |
405 | case 6: | 401 | case CCLASS_LOWER: |
406 | if (ISLOWER ((unsigned char) *n)) | 402 | if (ISLOWER ((unsigned char) *n)) |
407 | goto matched; | 403 | goto matched; |
408 | break; | 404 | break; |
409 | case 7: | 405 | case CCLASS_PRINT: |
410 | if (ISPRINT ((unsigned char) *n)) | 406 | if (ISPRINT ((unsigned char) *n)) |
411 | goto matched; | 407 | goto matched; |
412 | break; | 408 | break; |
413 | case 8: | 409 | case CCLASS_PUNCT: |
414 | if (ISPUNCT ((unsigned char) *n)) | 410 | if (ISPUNCT ((unsigned char) *n)) |
415 | goto matched; | 411 | goto matched; |
416 | break; | 412 | break; |
417 | case 9: | 413 | case CCLASS_SPACE: |
418 | if (ISSPACE ((unsigned char) *n)) | 414 | if (ISSPACE ((unsigned char) *n)) |
419 | goto matched; | 415 | goto matched; |
420 | break; | 416 | break; |
421 | case 10: | 417 | case CCLASS_UPPER: |
422 | if (ISUPPER ((unsigned char) *n)) | 418 | if (ISUPPER ((unsigned char) *n)) |
423 | goto matched; | 419 | goto matched; |
424 | break; | 420 | break; |
425 | case 11: | 421 | case CCLASS_XDIGIT: |
426 | if (ISXDIGIT ((unsigned char) *n)) | 422 | if (ISXDIGIT ((unsigned char) *n)) |
427 | goto matched; | 423 | goto matched; |
428 | break; | 424 | break; |
diff --git a/win32/match_class.c b/win32/match_class.c new file mode 100644 index 000000000..789e0df02 --- /dev/null +++ b/win32/match_class.c | |||
@@ -0,0 +1,7 @@ | |||
1 | #include "libbb.h" | ||
2 | #include "match_class.h" | ||
3 | |||
4 | int match_class(const char *name) | ||
5 | { | ||
6 | return index_in_strings(CHAR_CLASSES, name); | ||
7 | } | ||
diff --git a/win32/match_class.h b/win32/match_class.h new file mode 100644 index 000000000..92fd1323f --- /dev/null +++ b/win32/match_class.h | |||
@@ -0,0 +1,11 @@ | |||
1 | #define CHAR_CLASSES \ | ||
2 | "alnum\0alpha\0blank\0cntrl\0digit\0graph\0" \ | ||
3 | "lower\0print\0punct\0space\0upper\0xdigit\0" | ||
4 | |||
5 | enum { | ||
6 | CCLASS_ALNUM, CCLASS_ALPHA, CCLASS_BLANK, CCLASS_CNTRL, | ||
7 | CCLASS_DIGIT, CCLASS_GRAPH, CCLASS_LOWER, CCLASS_PRINT, | ||
8 | CCLASS_PUNCT, CCLASS_SPACE, CCLASS_UPPER, CCLASS_XDIGIT | ||
9 | }; | ||
10 | |||
11 | extern int match_class(const char *name); | ||
diff --git a/win32/regcomp.c b/win32/regcomp.c index dca7e6ef3..e1692d341 100644 --- a/win32/regcomp.c +++ b/win32/regcomp.c | |||
@@ -18,6 +18,8 @@ | |||
18 | Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | 18 | Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
19 | 02110-1301 USA. */ | 19 | 02110-1301 USA. */ |
20 | 20 | ||
21 | #include "match_class.h" | ||
22 | |||
21 | #define UNUSED_PARAM __attribute__ ((__unused__)) | 23 | #define UNUSED_PARAM __attribute__ ((__unused__)) |
22 | 24 | ||
23 | static reg_errcode_t re_compile_internal (regex_t *preg, const char * pattern, | 25 | static reg_errcode_t re_compile_internal (regex_t *preg, const char * pattern, |
@@ -3571,6 +3573,7 @@ build_charclass (RE_TRANSLATE_TYPE trans, bitset_t sbcset, | |||
3571 | } \ | 3573 | } \ |
3572 | } while (0) | 3574 | } while (0) |
3573 | 3575 | ||
3576 | #if 0 | ||
3574 | if (strcmp (class_name, "alnum") == 0) | 3577 | if (strcmp (class_name, "alnum") == 0) |
3575 | BUILD_CHARCLASS_LOOP (isalnum); | 3578 | BUILD_CHARCLASS_LOOP (isalnum); |
3576 | else if (strcmp (class_name, "cntrl") == 0) | 3579 | else if (strcmp (class_name, "cntrl") == 0) |
@@ -3602,6 +3605,53 @@ build_charclass (RE_TRANSLATE_TYPE trans, bitset_t sbcset, | |||
3602 | BUILD_CHARCLASS_LOOP (isxdigit); | 3605 | BUILD_CHARCLASS_LOOP (isxdigit); |
3603 | else | 3606 | else |
3604 | return REG_ECTYPE; | 3607 | return REG_ECTYPE; |
3608 | #else | ||
3609 | switch (match_class(class_name)) { | ||
3610 | case CCLASS_ALNUM: | ||
3611 | BUILD_CHARCLASS_LOOP (isalnum); | ||
3612 | break; | ||
3613 | case CCLASS_CNTRL: | ||
3614 | BUILD_CHARCLASS_LOOP (iscntrl); | ||
3615 | break; | ||
3616 | case CCLASS_LOWER: | ||
3617 | BUILD_CHARCLASS_LOOP (islower); | ||
3618 | break; | ||
3619 | case CCLASS_SPACE: | ||
3620 | BUILD_CHARCLASS_LOOP (isspace); | ||
3621 | break; | ||
3622 | case CCLASS_ALPHA: | ||
3623 | BUILD_CHARCLASS_LOOP (isalpha); | ||
3624 | break; | ||
3625 | case CCLASS_DIGIT: | ||
3626 | BUILD_CHARCLASS_LOOP (isdigit); | ||
3627 | break; | ||
3628 | case CCLASS_PRINT: | ||
3629 | BUILD_CHARCLASS_LOOP (isprint); | ||
3630 | break; | ||
3631 | case CCLASS_UPPER: | ||
3632 | BUILD_CHARCLASS_LOOP (isupper); | ||
3633 | break; | ||
3634 | case CCLASS_BLANK: | ||
3635 | #ifndef GAWK | ||
3636 | BUILD_CHARCLASS_LOOP (isblank); | ||
3637 | #else | ||
3638 | /* see comments above */ | ||
3639 | BUILD_CHARCLASS_LOOP (is_blank); | ||
3640 | #endif | ||
3641 | break; | ||
3642 | case CCLASS_GRAPH: | ||
3643 | BUILD_CHARCLASS_LOOP (isgraph); | ||
3644 | break; | ||
3645 | case CCLASS_PUNCT: | ||
3646 | BUILD_CHARCLASS_LOOP (ispunct); | ||
3647 | break; | ||
3648 | case CCLASS_XDIGIT: | ||
3649 | BUILD_CHARCLASS_LOOP (isxdigit); | ||
3650 | break; | ||
3651 | default: | ||
3652 | return REG_ECTYPE; | ||
3653 | } | ||
3654 | #endif | ||
3605 | 3655 | ||
3606 | return REG_NOERROR; | 3656 | return REG_NOERROR; |
3607 | } | 3657 | } |