From c079afb7724ce4b9ff2d6b1ca4d7e3cdebcbcd1f Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Fri, 12 Sep 2014 14:58:55 -0700 Subject: [PATCH] Don't use a nested function in rpmatch. --- ChangeLog | 5 +++++ 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 + + * stdlib/rpmatch.c (try): New function, broken out of ... + (rpmatch): ... local function here. Also, prototypify definition. + 2014-09-12 Joseph Myers * 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 -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)); } -- 2.43.5