From ef1193c0484682536fbcee9a8c8a89b61a54c847 Mon Sep 17 00:00:00 2001 From: Tomas Stupka <tomas.stupka@oracle.com> Date: Fri, 6 Apr 2018 17:06:18 +0200 Subject: [PATCH] trivial agrep(ignore.case=T, fixed=T) impl --- .../r/nodes/builtin/base/GrepFunctions.java | 18 +++++++-- .../truffle/r/test/ExpectedTestOutput.test | 40 +++++++++++++++++++ .../r/test/builtins/TestBuiltin_agrep.java | 15 ++++++- 3 files changed, 68 insertions(+), 5 deletions(-) diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/GrepFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/GrepFunctions.java index 0925aa27d1..a86a84b9c3 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/GrepFunctions.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/GrepFunctions.java @@ -181,8 +181,12 @@ public class GrepFunctions { } else { // trim array to the appropriate size int[] result = new int[numMatches]; - for (int i = 0; i < result.length; i++) { - result[i] = tmp[i]; + int resultIdx = 0; + for (int i = 0; i < tmp.length; i++) { + if (tmp[i] > 0) { + result[resultIdx] = tmp[i]; + resultIdx++; + } } return result; } @@ -1250,14 +1254,20 @@ public class GrepFunctions { protected Object aGrep(String pattern, RAbstractStringVector vector, boolean ignoreCase, boolean value, RAbstractIntVector costs, RAbstractDoubleVector bounds, boolean useBytes, boolean fixed, @Cached("createCommon()") CommonCodeNode common) { // TODO implement completely; this is a very basic implementation for fixed=TRUE only. - common.checkExtraArgs(ignoreCase, false, false, useBytes, false); + common.checkExtraArgs(!fixed && ignoreCase, false, false, useBytes, false); common.valueCheck(value); common.checkNotImplemented(!fixed, "fixed", false); int[] tmp = new int[vector.getLength()]; int numMatches = 0; long maxDistance = Math.round(pattern.length() * bounds.getDataAt(0)); for (int i = 0; i < vector.getLength(); i++) { - int ld = ld(pattern, vector.getDataAt(i)); + int ld; + if (ignoreCase) { + // reliable only with fixed=true + ld = ld(pattern.toLowerCase(), vector.getDataAt(i).toLowerCase()); + } else { + ld = ld(pattern, vector.getDataAt(i)); + } if (ld <= maxDistance) { tmp[i] = i + 1; numMatches++; diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test index 72c6e21212..1109e690af 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test @@ -2518,6 +2518,46 @@ Error: invalid 'pattern' argument #{ .Internal(agrepl(character(), "42", F, F, NULL, NULL, F, F)) } Error: invalid 'pattern' argument +##com.oracle.truffle.r.test.builtins.TestBuiltin_agrep.testAgrep# +#{ agrep('A', c('a'), ignore.case=T) } +[1] 1 + +##com.oracle.truffle.r.test.builtins.TestBuiltin_agrep.testAgrep# +#{ agrep('A', c('b', 'a', 'z'), max.distance=0, ignore.case=T) } +[1] 2 + +##com.oracle.truffle.r.test.builtins.TestBuiltin_agrep.testAgrep# +#{ agrep('A', c('b', 'a', 'z'), max.distance=1, ignore.case=T) } +[1] 1 2 3 + +##com.oracle.truffle.r.test.builtins.TestBuiltin_agrep.testAgrep# +#{ agrep('a', c('A'), ignore.case=T) } +[1] 1 + +##com.oracle.truffle.r.test.builtins.TestBuiltin_agrep.testAgrep# +#{ agrep('a', c('a'), ignore.case=T) } +[1] 1 + +##com.oracle.truffle.r.test.builtins.TestBuiltin_agrep.testAgrep#Ignored.ImplementationError# +#{ agrep('a', c('a', 'b'), ignore.case=T) } +[1] 1 2 + +##com.oracle.truffle.r.test.builtins.TestBuiltin_agrep.testAgrep#Ignored.ImplementationError# +#{ agrep('a', c('b', 'a'), ignore.case=F) } +[1] 1 2 + +##com.oracle.truffle.r.test.builtins.TestBuiltin_agrep.testAgrep#Ignored.ImplementationError# +#{ agrep('a', c('b', 'a'), ignore.case=T) } +[1] 1 2 + +##com.oracle.truffle.r.test.builtins.TestBuiltin_agrep.testAgrep# +#{ agrep('a', c('b', 'a', 'z'), max.distance=0, ignore.case=T) } +[1] 2 + +##com.oracle.truffle.r.test.builtins.TestBuiltin_agrep.testAgrep# +#{ agrep('a', c('b', 'a', 'z'), max.distance=1, ignore.case=T) } +[1] 1 2 3 + ##com.oracle.truffle.r.test.builtins.TestBuiltin_agrep.testagrep1# #argv <- list('x86_64-linux-gnu', 'x86_64-linux-gnu', FALSE, FALSE, c(1L, 1L, 1L), c(0.1, NA, NA, NA, NA), FALSE, TRUE); .Internal(agrep(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]], argv[[6]], argv[[7]], argv[[8]])) [1] 1 diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_agrep.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_agrep.java index e8fb56be98..d383e72f09 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_agrep.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_agrep.java @@ -4,7 +4,7 @@ * http://www.gnu.org/licenses/gpl-2.0.html * * Copyright (c) 2014, Purdue University - * Copyright (c) 2014, 2017, Oracle and/or its affiliates + * Copyright (c) 2014, 2018, Oracle and/or its affiliates * * All rights reserved. */ @@ -54,5 +54,18 @@ public class TestBuiltin_agrep extends TestBase { assertEval("{ .Internal(agrepl(7, \"42\", F, F, NULL, NULL, F, F)) }"); assertEval("{ .Internal(agrepl(character(), \"42\", F, F, NULL, NULL, F, F)) }"); assertEval("{ .Internal(agrepl(\"7\", 42, F, F, NULL, NULL, F, F)) }"); + + assertEval("{ agrep('a', c('a'), ignore.case=T) }"); + assertEval("{ agrep('A', c('a'), ignore.case=T) }"); + assertEval("{ agrep('a', c('A'), ignore.case=T) }"); + assertEval(Ignored.ImplementationError, "{ agrep('a', c('a', 'b'), ignore.case=T) }"); + assertEval(Ignored.ImplementationError, "{ agrep('a', c('b', 'a'), ignore.case=T) }"); + assertEval(Ignored.ImplementationError, "{ agrep('a', c('b', 'a'), ignore.case=F) }"); + + assertEval("{ agrep('a', c('b', 'a', 'z'), max.distance=0, ignore.case=T) }"); + assertEval("{ agrep('A', c('b', 'a', 'z'), max.distance=0, ignore.case=T) }"); + assertEval("{ agrep('a', c('b', 'a', 'z'), max.distance=1, ignore.case=T) }"); + assertEval("{ agrep('A', c('b', 'a', 'z'), max.distance=1, ignore.case=T) }"); + } } -- GitLab