diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2022-04-14 23:09:41 +0200 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2022-04-15 08:39:21 +0200 |
commit | 6a9f342addf8b1c766163575c7b63e7fcc1f714e (patch) | |
tree | 6101583969fb87c1467d9fa2b8feb638187eae27 /sal/rtl | |
parent | d7480ed72d225ee1b2b9a6ec996eeeb7a18c98a8 (diff) |
Introduce rtl::createUriCharClass
...to make those char class array initializations more readable. (Making the
corresponding variables constexpr is mostly done so that failures in the
provided `unencoded` arguments, like non-ASCII characters or duplicate
character typos, would lead to compile-time errors also for !HAVE_CPP_CONSTEVAL.
And assigning to a sal_Bool std::array needs another hack to avoid false
loplugin:implicitboolconversion warnings.)
Change-Id: Ieb8827f69f55f1212a9428817d5331fcb18ef1d8
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/133058
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Diffstat (limited to 'sal/rtl')
-rw-r--r-- | sal/rtl/uri.cxx | 159 |
1 files changed, 26 insertions, 133 deletions
diff --git a/sal/rtl/uri.cxx b/sal/rtl/uri.cxx index 0c5479563405..3414552615e6 100644 --- a/sal/rtl/uri.cxx +++ b/sal/rtl/uri.cxx @@ -22,6 +22,7 @@ #include <rtl/textenc.h> #include <rtl/textcvt.h> #include <rtl/uri.h> +#include <rtl/uri.hxx> #include <rtl/ustrbuf.h> #include <rtl/ustrbuf.hxx> #include <rtl/ustring.h> @@ -36,8 +37,6 @@ namespace { -std::size_t const nCharClassSize = 128; - sal_Unicode const cEscapePrefix = 0x25; // '%' int getHexWeight(sal_uInt32 nUtf32) @@ -53,7 +52,7 @@ int getHexWeight(sal_uInt32 nUtf32) bool isValid(sal_Bool const * pCharClass, sal_uInt32 nUtf32) { - return nUtf32 < nCharClassSize && pCharClass[nUtf32]; + return nUtf32 < rtl::UriCharClassSize && pCharClass[nUtf32]; } void writeUnicode(rtl_uString ** pBuffer, sal_Int32 * pCapacity, @@ -465,141 +464,35 @@ void appendPath( sal_Bool const * SAL_CALL rtl_getUriCharClass(rtl_UriCharClass eCharClass) SAL_THROW_EXTERN_C() { - static sal_Bool const aCharClass[][nCharClassSize] = { - {false, false, false, false, false, false, false, false,// None - false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, // !"#$%&' - false, false, false, false, false, false, false, false, // ()*+,-./ - false, false, false, false, false, false, false, false, // 01234567 - false, false, false, false, false, false, false, false, // 89:;<=>? - false, false, false, false, false, false, false, false, // @ABCDEFG - false, false, false, false, false, false, false, false, // HIJKLMNO - false, false, false, false, false, false, false, false, // PQRSTUVW - false, false, false, false, false, false, false, false, // XYZ[\]^_ - false, false, false, false, false, false, false, false, // `abcdefg - false, false, false, false, false, false, false, false, // hijklmno - false, false, false, false, false, false, false, false, // pqrstuvw - false, false, false, false, false, false, false, false}, // xyz{|}~ - {false, false, false, false, false, false, false, false,// Uric - false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, - false, true, false, false, true, false, true, true, // !"#$%&' - true, true, true, true, true, true, true, true, // ()*+,-./ - true, true, true, true, true, true, true, true, // 01234567 - true, true, true, true, false, true, false, true, // 89:;<=>? - true, true, true, true, true, true, true, true, // @ABCDEFG - true, true, true, true, true, true, true, true, // HIJKLMNO - true, true, true, true, true, true, true, true, // PQRSTUVW - true, true, true, true, false, true, false, true, // XYZ[\]^_ - false, true, true, true, true, true, true, true, // `abcdefg - true, true, true, true, true, true, true, true, // hijklmno - true, true, true, true, true, true, true, true, // pqrstuvw - true, true, true, false, false, false, true, false}, // xyz{|}~ - {false, false, false, false, false, false, false, false,// UricNoSlash - false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, - false, true, false, false, true, false, true, true, // !"#$%&' - true, true, true, true, true, true, true, false, // ()*+,-./ - true, true, true, true, true, true, true, true, // 01234567 - true, true, true, true, false, true, false, true, // 89:;<=>? - true, true, true, true, true, true, true, true, // @ABCDEFG - true, true, true, true, true, true, true, true, // HIJKLMNO - true, true, true, true, true, true, true, true, // PQRSTUVW - true, true, true, false, false, false, false, true, // XYZ[\]^_ - false, true, true, true, true, true, true, true, // `abcdefg - true, true, true, true, true, true, true, true, // hijklmno - true, true, true, true, true, true, true, true, // pqrstuvw - true, true, true, false, false, false, true, false}, // xyz{|}~ - {false, false, false, false, false, false, false, false,// RelSegment - false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, - false, true, false, false, true, false, true, true, // !"#$%&' - true, true, true, true, true, true, true, false, // ()*+,-./ - true, true, true, true, true, true, true, true, // 01234567 - true, true, false, true, false, true, false, false, // 89:;<=>? - true, true, true, true, true, true, true, true, // @ABCDEFG - true, true, true, true, true, true, true, true, // HIJKLMNO - true, true, true, true, true, true, true, true, // PQRSTUVW - true, true, true, false, false, false, false, true, // XYZ[\]^_ - false, true, true, true, true, true, true, true, // `abcdefg - true, true, true, true, true, true, true, true, // hijklmno - true, true, true, true, true, true, true, true, // pqrstuvw - true, true, true, false, false, false, true, false}, // xyz{|}~ - {false, false, false, false, false, false, false, false,// RegName - false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, - false, true, false, false, true, false, true, true, // !"#$%&' - true, true, true, true, true, true, true, false, // ()*+,-./ - true, true, true, true, true, true, true, true, // 01234567 - true, true, true, true, false, true, false, false, // 89:;<=>? - true, true, true, true, true, true, true, true, // @ABCDEFG - true, true, true, true, true, true, true, true, // HIJKLMNO - true, true, true, true, true, true, true, true, // PQRSTUVW - true, true, true, false, false, false, false, true, // XYZ[\]^_ - false, true, true, true, true, true, true, true, // `abcdefg - true, true, true, true, true, true, true, true, // hijklmno - true, true, true, true, true, true, true, true, // pqrstuvw - true, true, true, false, false, false, true, false}, // xyz{|}~ - {false, false, false, false, false, false, false, false,// Userinfo - false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, - false, true, false, false, true, false, true, true, // !"#$%&' - true, true, true, true, true, true, true, false, // ()*+,-./ - true, true, true, true, true, true, true, true, // 01234567 - true, true, true, true, false, true, false, false, // 89:;<=>? - false, true, true, true, true, true, true, true, // @ABCDEFG - true, true, true, true, true, true, true, true, // HIJKLMNO - true, true, true, true, true, true, true, true, // PQRSTUVW - true, true, true, false, false, false, false, true, // XYZ[\]^_ - false, true, true, true, true, true, true, true, // `abcdefg - true, true, true, true, true, true, true, true, // hijklmno - true, true, true, true, true, true, true, true, // pqrstuvw - true, true, true, false, false, false, true, false}, // xyz{|}~ - {false, false, false, false, false, false, false, false,// Pchar - false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, - false, true, false, false, true, false, true, true, // !"#$%&' - true, true, true, true, true, true, true, false, // ()*+,-./ - true, true, true, true, true, true, true, true, // 01234567 - true, true, true, false, false, true, false, false, // 89:;<=>? - true, true, true, true, true, true, true, true, // @ABCDEFG - true, true, true, true, true, true, true, true, // HIJKLMNO - true, true, true, true, true, true, true, true, // PQRSTUVW - true, true, true, false, false, false, false, true, // XYZ[\]^_ - false, true, true, true, true, true, true, true, // `abcdefg - true, true, true, true, true, true, true, true, // hijklmno - true, true, true, true, true, true, true, true, // pqrstuvw - true, true, true, false, false, false, true, false}, // xyz{|}~ - {false, false, false, false, false, false, false, false,// UnoParamValue - false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, - false, true, false, false, true, false, true, true, // !"#$%&' - true, true, true, true, false, true, true, true, // ()*+,-./ - true, true, true, true, true, true, true, true, // 01234567 - true, true, true, false, false, false, false, true, // 89:;<=>? - true, true, true, true, true, true, true, true, // @ABCDEFG - true, true, true, true, true, true, true, true, // HIJKLMNO - true, true, true, true, true, true, true, true, // PQRSTUVW - true, true, true, false, false, false, false, true, // XYZ[\]^_ - false, true, true, true, true, true, true, true, // `abcdefg - true, true, true, true, true, true, true, true, // hijklmno - true, true, true, true, true, true, true, true, // pqrstuvw - true, true, true, false, false, false, true, false}}; // xyz{|}~ + static constexpr std::array<sal_Bool, rtl::UriCharClassSize> aCharClass[] = { + rtl::createUriCharClass(u8""), // None + rtl::createUriCharClass( + u8"!$&'()*+,-./:;=?@[]_~" + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"), // Uric + rtl::createUriCharClass( + u8"!$&'()*+,-.:;=?@_~" + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"), // UricNoSlash + rtl::createUriCharClass( + u8"!$&'()*+,-.;=@_~" + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"), // RelSegment + rtl::createUriCharClass( + u8"!$&'()*+,-.:;=@_~" + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"), // RegName + rtl::createUriCharClass( + u8"!$&'()*+,-.:;=_~" + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"), // Userinfo + rtl::createUriCharClass( + u8"!$&'()*+,-.:=@_~" + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"), // Pchar + rtl::createUriCharClass( + u8"!$&'()*+-./:?@_~" + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")}; // UnoParamValue assert( (eCharClass >= 0 && (sal::static_int_cast< std::size_t >(eCharClass) < SAL_N_ELEMENTS(aCharClass)))); // bad eCharClass - return aCharClass[eCharClass]; + return aCharClass[eCharClass].data(); } void SAL_CALL rtl_uriEncode(rtl_uString * pText, sal_Bool const * pCharClass, |