diff options
author | Roland McGrath <roland@hack.frob.com> | 2014-09-12 14:58:55 -0700 |
---|---|---|
committer | Roland McGrath <roland@hack.frob.com> | 2014-09-12 14:58:55 -0700 |
commit | c079afb7724ce4b9ff2d6b1ca4d7e3cdebcbcd1f (patch) | |
tree | 369a6ad855b46e8086b33166ceec3c13e374949c | |
parent | ba90e05052ce57db51e3cb18978614fd0db5c7ef (diff) | |
download | glibc-c079afb7724ce4b9ff2d6b1ca4d7e3cdebcbcd1f.tar.gz glibc-c079afb7724ce4b9ff2d6b1ca4d7e3cdebcbcd1f.tar.xz glibc-c079afb7724ce4b9ff2d6b1ca4d7e3cdebcbcd1f.zip |
Don't use a nested function in rpmatch.
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | stdlib/rpmatch.c | 58 |
2 files changed, 33 insertions, 30 deletions
diff --git a/ChangeLog b/ChangeLog index d02d8b6c1b..67c502530c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2014-09-12 Roland McGrath <roland@hack.frob.com> + + * stdlib/rpmatch.c (try): New function, broken out of ... + (rpmatch): ... local function here. Also, prototypify definition. + 2014-09-12 Joseph Myers <joseph@codesourcery.com> * scripts/soversions.awk: Do not handle configuration names. diff --git a/stdlib/rpmatch.c b/stdlib/rpmatch.c index 4d667a64a7..ae1b530702 100644 --- a/stdlib/rpmatch.c +++ b/stdlib/rpmatch.c @@ -22,42 +22,40 @@ #include <regex.h> -int -rpmatch (response) - const char *response; +/* Match against one of the response patterns, compiling the pattern + first if necessary. */ +static int +try (const char *response, + const int tag, const int match, const int nomatch, + const char **lastp, regex_t *re) { - /* Match against one of the response patterns, compiling the pattern - first if necessary. */ - auto int try (const int tag, const int match, const int nomatch, - const char **lastp, regex_t *re); - - int try (const int tag, const int match, const int nomatch, - const char **lastp, regex_t *re) + const char *pattern = nl_langinfo (tag); + if (pattern != *lastp) { - const char *pattern = nl_langinfo (tag); - if (pattern != *lastp) - { - /* The pattern has changed. */ - if (*lastp) - { - /* Free the old compiled pattern. */ - __regfree (re); - *lastp = NULL; - } - /* Compile the pattern and cache it for future runs. */ - if (__regcomp (re, pattern, REG_EXTENDED) != 0) - return -1; - *lastp = pattern; - } - - /* Try the pattern. */ - return __regexec (re, response, 0, NULL, 0) == 0 ? match : nomatch; + /* The pattern has changed. */ + if (*lastp != NULL) + { + /* Free the old compiled pattern. */ + __regfree (re); + *lastp = NULL; + } + /* Compile the pattern and cache it for future runs. */ + if (__regcomp (re, pattern, REG_EXTENDED) != 0) + return -1; + *lastp = pattern; } + /* Try the pattern. */ + return __regexec (re, response, 0, NULL, 0) == 0 ? match : nomatch; +} + +int +rpmatch (const char *response) +{ /* We cache the response patterns and compiled regexps here. */ static const char *yesexpr, *noexpr; static regex_t yesre, nore; - return (try (YESEXPR, 1, 0, &yesexpr, &yesre) ?: - try (NOEXPR, 0, -1, &noexpr, &nore)); + return (try (response, YESEXPR, 1, 0, &yesexpr, &yesre) ?: + try (response, NOEXPR, 0, -1, &noexpr, &nore)); } |