From e75bbf6218579db0658e9d135f0ff9f4551676fa Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 7 Jan 2020 17:29:45 +0100 Subject: [PATCH] Check for existence of slash before trimming Rather than creating multiple matchers for no good reason at all, check if the string contains a backslash character before going in and performing escaping. JIRA: YANGTOOLS-652 Change-Id: I77fb02bad4ffb13a8393956c56b15ebe3e1dbf3f Signed-off-by: Robert Varga --- .../rfc7950/repo/ArgumentContextUtils.java | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/ArgumentContextUtils.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/ArgumentContextUtils.java index 375b7f7565..20657353b7 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/ArgumentContextUtils.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/ArgumentContextUtils.java @@ -48,16 +48,7 @@ final class ArgumentContextUtils { * in the inner string and trim the result. */ checkDoubleQuotedString(innerStr, yangVersion, ref); - - sb.append(ESCAPED_TAB.matcher( - ESCAPED_LF.matcher( - ESCAPED_BACKSLASH.matcher( - ESCAPED_DQUOT.matcher( - trimWhitespace(innerStr, stringNode.getSymbol().getCharPositionInLine())) - .replaceAll("\\\"")) - .replaceAll("\\\\")) - .replaceAll("\\\n")) - .replaceAll("\\\t")); + sb.append(unescape(trimWhitespace(innerStr, stringNode.getSymbol().getCharPositionInLine()))); } else if (firstChar == '\'' && lastChar == '\'') { /* * According to RFC6020 a single quote character cannot occur in @@ -72,6 +63,22 @@ final class ArgumentContextUtils { return sb.toString(); } + private static String unescape(final String str) { + final int backslash = str.indexOf('\\'); + if (backslash == -1) { + return str; + } + + // FIXME: given we the leading backslash, it would be more efficient to walk the string and unescape in one go + return ESCAPED_TAB.matcher( + ESCAPED_LF.matcher( + ESCAPED_BACKSLASH.matcher( + ESCAPED_DQUOT.matcher(str).replaceAll("\\\"")) + .replaceAll("\\\\")) + .replaceAll("\\\n")) + .replaceAll("\\\t"); + } + private static void checkUnquotedString(final String str, final YangVersion yangVersion, final StatementSourceReference ref) { if (yangVersion == YangVersion.VERSION_1_1) { -- 2.36.6