diff options
author | Raiki Tamura <tamaron1203@gmail.com> | 2023-09-08 16:59:09 +0200 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2024-01-04 16:30:01 +0100 |
commit | 00dea7e8c41b672730d6e2c891b6012a83d8842c (patch) | |
tree | e06acd702f0bc7fc68d1406f7543b355680c8712 /libcpp | |
parent | 4ded42c2c5a5c977dbf67b71c5d78f8a6dca7cbb (diff) | |
download | gcc-00dea7e8c41b672730d6e2c891b6012a83d8842c.zip gcc-00dea7e8c41b672730d6e2c891b6012a83d8842c.tar.gz gcc-00dea7e8c41b672730d6e2c891b6012a83d8842c.tar.bz2 |
libcpp: add function to check XID properties
This commit adds a new function intended for checking the XID properties
of a possibly unicode character, as well as the accompanying enum
describing the possible properties.
libcpp/ChangeLog:
* charset.cc (cpp_check_xid_property): New.
* include/cpplib.h
(cpp_check_xid_property): New.
(enum cpp_xid_property): New.
Signed-off-by: Raiki Tamura <tamaron1203@gmail.com>
Diffstat (limited to 'libcpp')
-rw-r--r-- | libcpp/charset.cc | 36 | ||||
-rw-r--r-- | libcpp/include/cpplib.h | 7 |
2 files changed, 43 insertions, 0 deletions
diff --git a/libcpp/charset.cc b/libcpp/charset.cc index 95ca381..54d7b9e 100644 --- a/libcpp/charset.cc +++ b/libcpp/charset.cc @@ -1332,6 +1332,42 @@ _cpp_uname2c_uax44_lm2 (const char *name, size_t len, char *canon_name) return result; } +/* Returns flags representing the XID properties of the given codepoint. */ +unsigned int +cpp_check_xid_property (cppchar_t c) +{ + // fast path for ASCII + if (c < 0x80) + { + if (('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z')) + return CPP_XID_START | CPP_XID_CONTINUE; + if (('0' <= c && c <= '9') || c == '_') + return CPP_XID_CONTINUE; + } + + if (c > UCS_LIMIT) + return 0; + + int mn, mx, md; + mn = 0; + mx = ARRAY_SIZE (ucnranges) - 1; + while (mx != mn) + { + md = (mn + mx) / 2; + if (c <= ucnranges[md].end) + mx = md; + else + mn = md + 1; + } + + unsigned short flags = ucnranges[mn].flags; + + if (flags & CXX23) + return CPP_XID_START | CPP_XID_CONTINUE; + if (flags & NXX23) + return CPP_XID_CONTINUE; + return 0; +} /* Returns 1 if C is valid in an identifier, 2 if C is valid except at the start of an identifier, and 0 if C is not valid in an diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h index f699daa..5746aac 100644 --- a/libcpp/include/cpplib.h +++ b/libcpp/include/cpplib.h @@ -1631,4 +1631,11 @@ bool cpp_valid_utf8_p (const char *data, size_t num_bytes); bool cpp_is_combining_char (cppchar_t c); bool cpp_is_printable_char (cppchar_t c); +enum cpp_xid_property { + CPP_XID_START = 1, + CPP_XID_CONTINUE = 2 +}; + +unsigned int cpp_check_xid_property (cppchar_t c); + #endif /* ! LIBCPP_CPPLIB_H */ |