diff --git a/src/ly_common.c b/src/ly_common.c index b24dd1f38..a9bfbccc9 100644 --- a/src/ly_common.c +++ b/src/ly_common.c @@ -813,7 +813,7 @@ ly_pat_compile_xmlschema_chblocks_xmlschema2perl(const char *pattern, char **reg {NULL, NULL} }; - size_t idx, idx2, start, end; + size_t idx, idx2, start, end, ublock; char *perl_regex, *ptr; perl_regex = *regex; @@ -849,6 +849,7 @@ ly_pat_compile_xmlschema_chblocks_xmlschema2perl(const char *pattern, char **reg return ly_err_new(err, LY_EVALID, 0, NULL, NULL, "Regular expression \"%s\" is not valid (\"%s\": %s).", pattern, perl_regex + start + 5, "unknown block name"); } + ublock = idx; /* make the space in the string and replace the block (but we cannot include brackets if it was already enclosed in them) */ for (idx2 = 0, idx = 0; idx2 < start; ++idx2) { @@ -863,10 +864,10 @@ ly_pat_compile_xmlschema_chblocks_xmlschema2perl(const char *pattern, char **reg if (idx) { /* skip brackets */ memmove(perl_regex + start + (URANGE_LEN - 2), perl_regex + end, strlen(perl_regex + end) + 1); - memcpy(perl_regex + start, ublock2urange[idx][1] + 1, URANGE_LEN - 2); + memcpy(perl_regex + start, ublock2urange[ublock][1] + 1, URANGE_LEN - 2); } else { memmove(perl_regex + start + URANGE_LEN, perl_regex + end, strlen(perl_regex + end) + 1); - memcpy(perl_regex + start, ublock2urange[idx][1], URANGE_LEN); + memcpy(perl_regex + start, ublock2urange[ublock][1], URANGE_LEN); } } diff --git a/tests/utests/types/string.c b/tests/utests/types/string.c index a921427ad..e0ef60411 100644 --- a/tests/utests/types/string.c +++ b/tests/utests/types/string.c @@ -817,6 +817,52 @@ test_data_xml(void **state) CHECK_LOG_CTX("Unsatisfied pattern - \"abc\" does not match \"a.*b\".", "/T_ANCHOR:port", 1); TEST_ERROR_XML("T_ANCHOR", "cab"); CHECK_LOG_CTX("Unsatisfied pattern - \"cab\" does not match \"a.*b\".", "/T_ANCHOR:port", 1); + + /* Unicode block test 1 - Basic Latin */ + schema = MODULE_CREATE_YANG("T_UB_1", "leaf port {type string { pattern '\\p{IsBasicLatin}+';} } "); + UTEST_ADD_MODULE(schema, LYS_IN_YANG, NULL, NULL); + TEST_SUCCESS_XML("T_UB_1", "B4s1cLatin!", STRING, "B4s1cLatin!"); + + /* Unicode block test 2 - Basic Latin within brackets */ + schema = MODULE_CREATE_YANG("T_UB_2", "leaf port {type string { pattern '[\\p{IsBasicLatin}]+';} } "); + UTEST_ADD_MODULE(schema, LYS_IN_YANG, NULL, NULL); + TEST_SUCCESS_XML("T_UB_2", "B4s1cLatin!", STRING, "B4s1cLatin!"); + + /* Unicode block test 3 - Latin-1 Supplement */ + schema = MODULE_CREATE_YANG("T_UB_3", "leaf port {type string { pattern '[\\p{IsLatin-1Supplement}]+';} } "); + UTEST_ADD_MODULE(schema, LYS_IN_YANG, NULL, NULL); + TEST_SUCCESS_XML("T_UB_3", "ÁÉÍÓÖÜ", STRING, "ÁÉÍÓÖÜ"); + + /* Unicode block test 4 - Latin-1 Supplement */ + schema = MODULE_CREATE_YANG("T_UB_4", "leaf port {type string { pattern '[\\p{IsLatin-1Supplement}]+';} } "); + UTEST_ADD_MODULE(schema, LYS_IN_YANG, NULL, NULL); + TEST_SUCCESS_XML("T_UB_4", "ÁÉÍÓÖÜ", STRING, "ÁÉÍÓÖÜ"); + + /* Unicode block test 5 - Latin Extended-A */ + schema = MODULE_CREATE_YANG("T_UB_5", "leaf port {type string { pattern '[\\p{IsLatinExtended-A}]+';} } "); + UTEST_ADD_MODULE(schema, LYS_IN_YANG, NULL, NULL); + TEST_SUCCESS_XML("T_UB_5", "ŐŰőű", STRING, "ŐŰőű"); + + /* Unicode block test 6 - Basic Latin, Latin-1 Supplement, and Latin Extended-A */ + schema = MODULE_CREATE_YANG("T_UB_6", "leaf port {type string {" + " pattern '[\\p{IsBasicLatin}\\p{IsLatin-1Supplement}\\p{IsLatinExtended-A}]+';" + "}} "); + UTEST_ADD_MODULE(schema, LYS_IN_YANG, NULL, NULL); + TEST_SUCCESS_XML("T_UB_6", "Árvíztűrő tükörfúrógép!", STRING, "Árvíztűrő tükörfúrógép!"); + + /* Unicode block test 7 - Unknown Unicode block */ + schema = MODULE_CREATE_YANG("T_UB_7", "leaf port {type string { pattern '\\p{IsUnknownUnicodeBlock}+';} } "); + UTEST_INVALID_MODULE(schema, LYS_IN_YANG, NULL, LY_EVALID); + CHECK_LOG_CTX("Regular expression \"\\p{IsUnknownUnicodeBlock}+\" " + "is not valid (\"UnknownUnicodeBlock}+\": unknown block name).", "/T_UB_7:port", 0); + + /* Unicode block test 8 - Unknown Unicode block with Basic Latin */ + schema = MODULE_CREATE_YANG("T_UB_8", "leaf port {type string { " + " pattern '[\\p{IsBasicLatin}\\p{IsUnknownUnicodeBlock}]+';" + "}} "); + UTEST_INVALID_MODULE(schema, LYS_IN_YANG, NULL, LY_EVALID); + CHECK_LOG_CTX("Regular expression \"[\\p{IsBasicLatin}\\p{IsUnknownUnicodeBlock}]+\" " + "is not valid (\"UnknownUnicodeBlock}]+\": unknown block name).", "/T_UB_8:port", 0); } static void