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 0925aa27d1f64b30e5e755d0ab023c34bd2508c1..a86a84b9c3763eff4fea3d79d19683954eadfec4 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 72c6e21212ac8da5a68b88a650b97445379336f6..1109e690af21d63fa98a86560ab9f1f98f5f1b82 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 e8fb56be9845788a1566dcdad90d445142759a96..d383e72f0904043c2d31311e23a11a60240793ff 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) }"); + } }