Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libc/regex Add glue to disable locale code in order to b...



details:   https://anonhg.NetBSD.org/src/rev/1046144ba37c
branches:  trunk
changeset: 959801:1046144ba37c
user:      christos <christos%NetBSD.org@localhost>
date:      Thu Feb 25 21:28:40 2021 +0000

description:
Add glue to disable locale code in order to be smaller.

diffstat:

 lib/libc/regex/engine.c  |   11 +++-
 lib/libc/regex/regcomp.c |  107 ++++++++++++++++++++++++++++++++++++++++------
 lib/libc/regex/regexec.c |   16 ++++--
 lib/libc/regex/regfree.c |    6 +-
 lib/libc/regex/utils.h   |   22 +++++++++-
 5 files changed, 134 insertions(+), 28 deletions(-)

diffs (truncated from 415 to 300 lines):

diff -r 122b09de1dd9 -r 1046144ba37c lib/libc/regex/engine.c
--- a/lib/libc/regex/engine.c   Thu Feb 25 21:24:00 2021 +0000
+++ b/lib/libc/regex/engine.c   Thu Feb 25 21:28:40 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: engine.c,v 1.27 2021/02/24 18:13:21 christos Exp $ */
+/* $NetBSD: engine.c,v 1.28 2021/02/25 21:28:40 christos Exp $ */
 
 /*-
  * SPDX-License-Identifier: BSD-3-Clause
@@ -41,7 +41,7 @@
 #ifdef __FBSDID
 __FBSDID("$FreeBSD: head/lib/libc/regex/engine.c 368358 2020-12-05 03:16:05Z kevans $");
 #endif
-__RCSID("$NetBSD: engine.c,v 1.27 2021/02/24 18:13:21 christos Exp $");
+__RCSID("$NetBSD: engine.c,v 1.28 2021/02/25 21:28:40 christos Exp $");
 
 #include <stdbool.h>
 
@@ -161,13 +161,14 @@
 static const char *
 stepback(const char *start, const char *cur, int nchar)
 {
+#ifdef NLS
        const char *ret;
        size_t wc, mbc;
        mbstate_t mbs;
        size_t clen;
 
        if (MB_CUR_MAX == 1)
-               return ((cur - nchar) > start ? cur - nchar : NULL);
+               goto out;
 
        ret = cur;
        for (wc = nchar; wc > 0; wc--) {
@@ -185,6 +186,10 @@
        }
 
        return (ret);
+out:
+#else
+       return (cur - nchar) > start ? cur - nchar : NULL;
+#endif
 }
 
 /*
diff -r 122b09de1dd9 -r 1046144ba37c lib/libc/regex/regcomp.c
--- a/lib/libc/regex/regcomp.c  Thu Feb 25 21:24:00 2021 +0000
+++ b/lib/libc/regex/regcomp.c  Thu Feb 25 21:28:40 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: regcomp.c,v 1.41 2021/02/25 13:42:16 christos Exp $    */
+/*     $NetBSD: regcomp.c,v 1.42 2021/02/25 21:28:40 christos Exp $    */
 
 /*-
  * SPDX-License-Identifier: BSD-3-Clause
@@ -47,12 +47,15 @@
 static char sccsid[] = "@(#)regcomp.c  8.5 (Berkeley) 3/20/94";
 __FBSDID("$FreeBSD: head/lib/libc/regex/regcomp.c 368359 2020-12-05 03:18:48Z kevans $");
 #endif
-__RCSID("$NetBSD: regcomp.c,v 1.41 2021/02/25 13:42:16 christos Exp $");
+__RCSID("$NetBSD: regcomp.c,v 1.42 2021/02/25 21:28:40 christos Exp $");
 
 #define _OPENBSD_SOURCE
+
+#ifndef LIBHACK
 #define REGEX_GNU_EXTENSIONS
 
 #include "namespace.h"
+#endif
 #include <sys/types.h>
 #include <stdio.h>
 #include <string.h>
@@ -61,10 +64,8 @@
 #include <stdlib.h>
 #include <regex.h>
 #include <stdbool.h>
-#include <wchar.h>
-#include <wctype.h>
 
-#ifdef __weak_alias
+#if defined(_weak_alias) && !defined(LIBHACK)
 __weak_alias(regcomp,_regcomp)
 #endif
 
@@ -222,6 +223,46 @@
 #define MIN(a,b)       ((a)<(b)?(a):(b))
 #endif
 
+#ifndef NLS
+static const struct {
+       const char *name;
+       int (*func)(int);
+} wctypes[] = {
+#define ADD(x) { .name = # x, .func = is ## x }
+       ADD(alnum),
+       ADD(alpha),
+       ADD(blank),
+       ADD(cntrl),
+       ADD(digit),
+       ADD(graph),
+       ADD(lower),
+       ADD(print),
+       ADD(punct),
+       ADD(space),
+       ADD(upper),
+       ADD(xdigit),
+#undef ADD
+};
+
+wctype_t
+__regex_wctype(const char *str)
+{
+       for (size_t i = 0; i < __arraycount(wctypes); i++) {
+               if (strcmp(wctypes[i].name, str) == 0)
+                       return (wctype_t)(i + 1);
+       }
+       return (wctype_t)0;
+}
+
+int
+__regex_iswctype(wint_t c, wctype_t ct)
+{
+       if (ct == 0)
+               return 0;
+       return (*wctypes[ct - 1].func)(c);
+}
+#endif
+
 static int                             /* 0 success, otherwise REG_something */
 regcomp_internal(regex_t * __restrict preg,
        const char * __restrict pattern,
@@ -1063,7 +1104,7 @@
 {
 #ifdef REGEX_LIBC_COLLATE
        return __wcollate_range_cmp(c1, c2);
-#else
+#elif defined(NLS)
        /* Copied from libc/collate __wcollate_range_cmp */
        wchar_t s1[2], s2[2];
 
@@ -1071,7 +1112,15 @@
        s1[1] = L'\0';
        s2[0] = c2;
        s2[1] = L'\0';
-       return (wcscoll(s1, s2));
+       return wcscoll(s1, s2);
+#else
+       char s1[2], s2[2];
+
+       s1[0] = (char)c1;
+       s1[1] = '\0';
+       s2[0] = (char)c2;
+       s2[1] = '\0';
+       return strcoll(s1, s2);
 #endif
 }
 
@@ -1219,6 +1268,7 @@
 
        p_b_cclass_named(p, cs, clname);
 }
+
 /*
  - p_b_cclass_named - deal with a named character class
  == static void p_b_cclass_named(struct parse *p, cset *cs, const char []);
@@ -1283,9 +1333,7 @@
 {
        const char *sp = p->next;
        struct cname *cp;
-       mbstate_t mbs;
-       wchar_t wc;
-       size_t clen, len;
+       size_t len;
 
        _DIAGASSERT(p != NULL);
 
@@ -1299,6 +1347,11 @@
        for (cp = cnames; cp->name != NULL; cp++)
                if (strncmp(cp->name, sp, len) == 0 && strlen(cp->name) == len)
                        return(cp->code);       /* known name */
+#ifdef NLS
+       mbstate_t mbs;
+       wchar_t wc;
+       size_t clen;
+
        memset(&mbs, 0, sizeof(mbs));
        if ((clen = mbrtowc(&wc, sp, len, &mbs)) == len)
                return (wc);                    /* single character */
@@ -1307,6 +1360,12 @@
        else
                SETERROR(REG_ECOLLATE);         /* neither */
        return(0);
+#else
+       if (len == 1)
+               return *sp;    /* single character */
+       SETERROR(REG_ECOLLATE);                 /* neither */
+       return 0;
+#endif
 }
 
 /*
@@ -1387,15 +1446,20 @@
        const char *oldend = p->end;
        char bracket[3 + MB_LEN_MAX];
        size_t n;
-       mbstate_t mbs;
 
        _DIAGASSERT(p != NULL);
 
        assert(othercase(ch) != ch);    /* p_bracket() would recurse */
        p->next = bracket;
+#ifdef NLS
+       mbstate_t mbs;
        memset(&mbs, 0, sizeof(mbs));
        n = wcrtomb(bracket, ch, &mbs);
        assert(n != (size_t)-1);
+#else
+       n = 0;
+       bracket[n++] = ch;
+#endif
        bracket[n] = ']';
        bracket[n + 1] = '\0';
        p->end = bracket+n+1;
@@ -1540,6 +1604,7 @@
 static wint_t
 wgetnext(struct parse *p)
 {
+#ifdef NLS
        mbstate_t mbs;
        wchar_t wc;
        size_t n;
@@ -1553,7 +1618,10 @@
        if (n == 0)
                n = 1;
        p->next += n;
-       return (wc);
+       return wc;
+#else
+       return *p->next++;
+#endif
 }
 
 /*
@@ -1898,8 +1966,6 @@
        sop s;
        char *cp;
        int offset;
-       char buf[MB_LEN_MAX];
-       size_t clen;
        mbstate_t mbs;
 
        _DIAGASSERT(p != NULL);
@@ -1933,10 +1999,15 @@
                                memset(&mbs, 0, sizeof(mbs));
                                newstart = scan - 1;
                        }
-                       clen = wcrtomb(buf, (int)OPND(s), &mbs);
+#ifdef NLS
+                       char buf[MB_LEN_MAX];
+                       size_t clen = wcrtomb(buf, (int)OPND(s), &mbs);
                        if (clen == (size_t)-1)
                                goto toohard;
                        newlen += (sopno)clen;
+#else
+                       newlen++;
+#endif
                        break;
                case OPLUS_:            /* things that don't break one */
                case OLPAREN:
@@ -2017,7 +2088,9 @@
                                offset++;
                        newlen = 0;
                        break;
+#ifdef NLS
                toohard:/*FALLTHROUGH*/
+#endif
                default:
                        /* Anything here makes it impossible or too hard
                         * to calculate the offset -- so we give up;
@@ -2056,9 +2129,13 @@
        while (cp < g->must + g->mlen) {
                while (OP(s = *scan++) != OCHAR)
                        continue;
+#ifdef NLS
                clen = wcrtomb(cp, (int)OPND(s), &mbs);
                assert(clen != (size_t)-1);
                cp += clen;
+#else
+               *cp++ = OPND(s);
+#endif
        }
        assert(cp == g->must + g->mlen);
        *cp++ = '\0';           /* just on general principles */
diff -r 122b09de1dd9 -r 1046144ba37c lib/libc/regex/regexec.c
--- a/lib/libc/regex/regexec.c  Thu Feb 25 21:24:00 2021 +0000
+++ b/lib/libc/regex/regexec.c  Thu Feb 25 21:28:40 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: regexec.c,v 1.24 2021/02/24 18:13:21 christos Exp $    */
+/*     $NetBSD: regexec.c,v 1.25 2021/02/25 21:28:40 christos Exp $    */
 
 /*-



Home | Main Index | Thread Index | Old Index