From 2c34d33d3ba48b1db0a5378a7dc747a25a84273c Mon Sep 17 00:00:00 2001 From: root Date: Mon, 23 Oct 2023 15:02:09 +0900 Subject: [PATCH 1/8] add FUNCTION SUBSTITUTE --- .../libcobj/common/CobolIntrinsic.java | 87 +++++++++++++++++++ tests/run.src/functions.at | 1 - texi/open-cobol.info | 2 +- 3 files changed, 88 insertions(+), 2 deletions(-) diff --git a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java index bc3b14ed..3ef16723 100644 --- a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java +++ b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java @@ -2184,4 +2184,91 @@ public static AbstractCobolField funcStoredCharLength(AbstractCobolField srcfiel currField.setInt(count); return currField; } + + public static AbstractCobolField funcSubstitute(int offset, int length, int params, AbstractCobolField... fields){ + int numreps = params / 2; + AbstractCobolField[] f1 = new AbstractCobolField[numreps]; + AbstractCobolField[] f2 = new AbstractCobolField[numreps]; + byte[] f1Data; + byte[] f2Data; + int i, j, n; + int pi1 = 0; + int pi2 = 0; + int calcsize = 0; + int found = 0; + + for (i = 0; i < params - 1; i++){ + if((i % 2) == 0){ + f1[i / 2] = fields[i + 1]; + }else{ + f2[i / 2] = fields[i + 1]; + } + } + + + byte[] p1 = fields[0].getDataStorage().getByteArray(); + int varsize = p1.length; + + for(n = 0; n < varsize; ){ + for(i = 0; i < numreps; i++){ + if(n + f1[i].getSize() <= varsize){ + f1Data = f1[i].getDataStorage().getByteArray(); + if(Arrays.compare(p1, pi1, pi1 + f1[i].getSize(), f1Data, 0, f1[i].getSize()) == 0){ + pi1 += f1[i].getSize(); + n += f1[i].getSize(); + calcsize += f2[i].getSize(); + found = 1; + break; + } + } + } + if(found == 1){ + found = 0; + continue; + } + n++; + pi1++; + calcsize++; + } + + CobolFieldAttribute attr = + new CobolFieldAttribute(CobolFieldAttribute.COB_TYPE_ALPHANUMERIC, 0, 0, 0, null); + AbstractCobolField field = CobolFieldFactory.makeCobolField(0, (CobolDataStorage) null, attr); + field.setSize(calcsize); + makeFieldEntry(field); + + byte[] p2 = currField.getDataStorage().getByteArray(); + found = 0; + pi1 = 0; + + for(n = 0; n < varsize; ){ + for(i = 0; i < numreps; ++i){ + if(n + f1[i].getSize() <= varsize){ + f1Data = f1[i].getDataStorage().getByteArray(); + if(Arrays.compare(p1, pi1, pi1 + f1[i].getSize(), f1Data, 0, f1[i].getSize()) == 0){ + f2Data = f2[i].getDataStorage().getByteArray(); + for(j = 0; j < f2[i].getSize(); j++){ + p2[j + pi2] = f2Data[j]; + } + pi1 += f1[i].getSize(); + pi2 += f2[i].getSize(); + n += f1[i].getSize(); + found = 1; + break; + } + } + } + if(found == 1){ + found = 0; + continue; + } + n++; + p2[pi2++] = p1[pi1++]; + } + if(offset > 0){ + calcRefMod(currField, offset, length); + } + currField.setDataStorage(new CobolDataStorage(p2)); + return currField; + } } diff --git a/tests/run.src/functions.at b/tests/run.src/functions.at index 3d3f5ad5..dfad8b0c 100755 --- a/tests/run.src/functions.at +++ b/tests/run.src/functions.at @@ -1625,7 +1625,6 @@ AT_CHECK([java prog], [0], AT_CLEANUP AT_SETUP([FUNCTION SUBSTITUTE]) -AT_CHECK([${SKIP_TEST}]) AT_DATA([prog.cob], [ IDENTIFICATION DIVISION. diff --git a/texi/open-cobol.info b/texi/open-cobol.info index 7b4fe514..b886fbec 100644 --- a/texi/open-cobol.info +++ b/texi/open-cobol.info @@ -1,4 +1,4 @@ -This is open-cobol.info, produced by makeinfo version 6.7 from +This is open-cobol.info, produced by makeinfo version 6.8 from open-cobol.texi. INFO-DIR-SECTION COBOL From 15ea311bfda253d4d28cc48d587d90448322a8d9 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 23 Oct 2023 15:31:13 +0900 Subject: [PATCH 2/8] fix FUNCTION SUBSTITUTE --- .../opensourcecobol/libcobj/common/CobolIntrinsic.java | 4 +++- tests/run.src/functions.at | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java index 3ef16723..5189fe38 100644 --- a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java +++ b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java @@ -2265,10 +2265,12 @@ public static AbstractCobolField funcSubstitute(int offset, int length, int para n++; p2[pi2++] = p1[pi1++]; } + currField.setDataStorage(new CobolDataStorage(p2)); + if(offset > 0){ calcRefMod(currField, offset, length); } - currField.setDataStorage(new CobolDataStorage(p2)); + return currField; } } diff --git a/tests/run.src/functions.at b/tests/run.src/functions.at index dfad8b0c..e021aa4d 100755 --- a/tests/run.src/functions.at +++ b/tests/run.src/functions.at @@ -1647,7 +1647,6 @@ AT_CHECK([java prog], [0], AT_CLEANUP AT_SETUP([FUNCTION SUBSTITUTE with reference modding]) -AT_CHECK([${SKIP_TEST}]) AT_DATA([prog.cob], [ IDENTIFICATION DIVISION. From 1137564e381fc971295987f92546130ad6abbd83 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 31 Oct 2023 09:33:36 +0900 Subject: [PATCH 3/8] FUNCTION SUBSTITUTE and FUNCTION SUBSTITUTE-CASE are added. --- .../libcobj/common/CobolIntrinsic.java | 134 +++++++++++++++--- tests/run.src/functions.at | 2 - 2 files changed, 114 insertions(+), 22 deletions(-) diff --git a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java index 5189fe38..d25d9383 100644 --- a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java +++ b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java @@ -2185,7 +2185,8 @@ public static AbstractCobolField funcStoredCharLength(AbstractCobolField srcfiel return currField; } - public static AbstractCobolField funcSubstitute(int offset, int length, int params, AbstractCobolField... fields){ + public static AbstractCobolField funcSubstitute( + int offset, int length, int params, AbstractCobolField... fields) { int numreps = params / 2; AbstractCobolField[] f1 = new AbstractCobolField[numreps]; AbstractCobolField[] f2 = new AbstractCobolField[numreps]; @@ -2197,23 +2198,22 @@ public static AbstractCobolField funcSubstitute(int offset, int length, int para int calcsize = 0; int found = 0; - for (i = 0; i < params - 1; i++){ - if((i % 2) == 0){ + for (i = 0; i < params - 1; i++) { + if ((i % 2) == 0) { f1[i / 2] = fields[i + 1]; - }else{ + } else { f2[i / 2] = fields[i + 1]; } } - - + byte[] p1 = fields[0].getDataStorage().getByteArray(); int varsize = p1.length; - for(n = 0; n < varsize; ){ - for(i = 0; i < numreps; i++){ - if(n + f1[i].getSize() <= varsize){ + for (n = 0; n < varsize; ) { + for (i = 0; i < numreps; i++) { + if (n + f1[i].getSize() <= varsize) { f1Data = f1[i].getDataStorage().getByteArray(); - if(Arrays.compare(p1, pi1, pi1 + f1[i].getSize(), f1Data, 0, f1[i].getSize()) == 0){ + if (Arrays.compare(p1, pi1, pi1 + f1[i].getSize(), f1Data, 0, f1[i].getSize()) == 0) { pi1 += f1[i].getSize(); n += f1[i].getSize(); calcsize += f2[i].getSize(); @@ -2222,7 +2222,7 @@ public static AbstractCobolField funcSubstitute(int offset, int length, int para } } } - if(found == 1){ + if (found == 1) { found = 0; continue; } @@ -2241,13 +2241,13 @@ public static AbstractCobolField funcSubstitute(int offset, int length, int para found = 0; pi1 = 0; - for(n = 0; n < varsize; ){ - for(i = 0; i < numreps; ++i){ - if(n + f1[i].getSize() <= varsize){ + for (n = 0; n < varsize; ) { + for (i = 0; i < numreps; ++i) { + if (n + f1[i].getSize() <= varsize) { f1Data = f1[i].getDataStorage().getByteArray(); - if(Arrays.compare(p1, pi1, pi1 + f1[i].getSize(), f1Data, 0, f1[i].getSize()) == 0){ + if (Arrays.compare(p1, pi1, pi1 + f1[i].getSize(), f1Data, 0, f1[i].getSize()) == 0) { f2Data = f2[i].getDataStorage().getByteArray(); - for(j = 0; j < f2[i].getSize(); j++){ + for (j = 0; j < f2[i].getSize(); j++) { p2[j + pi2] = f2Data[j]; } pi1 += f1[i].getSize(); @@ -2258,19 +2258,113 @@ public static AbstractCobolField funcSubstitute(int offset, int length, int para } } } - if(found == 1){ + if (found == 1) { found = 0; continue; } n++; - p2[pi2++] = p1[pi1++]; + p2[pi2++] = p1[pi1++]; } currField.setDataStorage(new CobolDataStorage(p2)); - - if(offset > 0){ + + if (offset > 0) { calcRefMod(currField, offset, length); } return currField; } + + public static AbstractCobolField funcSubstituteCase( + int offset, int length, int params, AbstractCobolField... fields) { + int numreps = params / 2; + AbstractCobolField[] f1 = new AbstractCobolField[numreps]; + AbstractCobolField[] f2 = new AbstractCobolField[numreps]; + int varsize = fields[0].getSize(); + int i, j, n; + int calcsize = 0; + int found = 0; + int size1, size2; + + for (i = 0; i < params - 1; i++) { + if (i % 2 == 0) { + f1[i / 2] = fields[i + 1]; + } else { + f2[i / 2] = fields[i + 1]; + } + } + + byte[] p1 = fields[0].getDataStorage().getByteArray(); + int pi1 = 0; + String ps1, fs1; + + for (n = 0; n < varsize; ) { + for (i = 0; i < numreps; i++) { + if (n + f1[i].getSize() <= varsize) { + size1 = f1[i].getSize(); + ps1 = new String(Arrays.copyOfRange(p1, pi1, pi1 + size1)); + fs1 = new String(f1[i].getDataStorage().getByteArray()); + if (ps1.equalsIgnoreCase(fs1)) { + size2 = f2[i].getSize(); + pi1 += size1; + n += size1; + calcsize += size2; + found = 1; + break; + } + } + } + if (found == 1) { + found = 0; + continue; + } + n++; + pi1++; + calcsize++; + } + + CobolFieldAttribute attr = + new CobolFieldAttribute(CobolFieldAttribute.COB_TYPE_ALPHANUMERIC, 0, 0, 0, null); + AbstractCobolField field = CobolFieldFactory.makeCobolField(0, (CobolDataStorage) null, attr); + field.setSize(calcsize); + makeFieldEntry(field); + + byte[] p2 = currField.getDataStorage().getByteArray(); + int pi2 = 0; + byte[] fd2; + + pi1 = 0; + found = 0; + for (n = 0; n < varsize; ) { + for (i = 0; i < numreps; i++) { + if (n + f1[i].getSize() <= varsize) { + size1 = f1[i].getSize(); + ps1 = new String(Arrays.copyOfRange(p1, pi1, pi1 + size1)); + fs1 = new String(f1[i].getDataStorage().getByteArray()); + fd2 = f2[i].getDataStorage().getByteArray(); + if (ps1.equalsIgnoreCase(fs1)) { + for (j = 0; j < f2[i].getSize(); j++) { + p2[j + pi2] = fd2[j]; + } + pi1 += f1[i].getSize(); + pi2 += f2[i].getSize(); + n += f1[i].getSize(); + found = 1; + break; + } + } + } + if (found == 1) { + found = 0; + continue; + } + n++; + p2[pi2++] = p1[pi1++]; + } + currField.setDataStorage(new CobolDataStorage(p2)); + + if (offset > 0) { + calcRefMod(currField, offset, length); + } + return currField; + } } diff --git a/tests/run.src/functions.at b/tests/run.src/functions.at index e021aa4d..c28a3ca0 100755 --- a/tests/run.src/functions.at +++ b/tests/run.src/functions.at @@ -1670,7 +1670,6 @@ AT_CHECK([java prog], [0], AT_CLEANUP AT_SETUP([FUNCTION SUBSTITUTE-CASE]) -AT_CHECK([${SKIP_TEST}]) AT_DATA([prog.cob], [ IDENTIFICATION DIVISION. @@ -1693,7 +1692,6 @@ AT_CHECK([java prog], [0], AT_CLEANUP AT_SETUP([FUNCTION SUBSTITUTE-CASE with reference mod]) -AT_CHECK([${SKIP_TEST}]) AT_DATA([prog.cob], [ IDENTIFICATION DIVISION. From 673c86ea9080179b85666e1fa726d36aeaa4947c Mon Sep 17 00:00:00 2001 From: root Date: Tue, 31 Oct 2023 09:56:48 +0900 Subject: [PATCH 4/8] Some variable names were changed. --- .../libcobj/common/CobolIntrinsic.java | 54 +++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java index d25d9383..841f8849 100644 --- a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java +++ b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java @@ -2187,16 +2187,10 @@ public static AbstractCobolField funcStoredCharLength(AbstractCobolField srcfiel public static AbstractCobolField funcSubstitute( int offset, int length, int params, AbstractCobolField... fields) { + int i, j, n; int numreps = params / 2; AbstractCobolField[] f1 = new AbstractCobolField[numreps]; AbstractCobolField[] f2 = new AbstractCobolField[numreps]; - byte[] f1Data; - byte[] f2Data; - int i, j, n; - int pi1 = 0; - int pi2 = 0; - int calcsize = 0; - int found = 0; for (i = 0; i < params - 1; i++) { if ((i % 2) == 0) { @@ -2207,13 +2201,17 @@ public static AbstractCobolField funcSubstitute( } byte[] p1 = fields[0].getDataStorage().getByteArray(); + byte[] fData1; int varsize = p1.length; + int pi1 = 0; + int calcsize = 0; + int found = 0; for (n = 0; n < varsize; ) { for (i = 0; i < numreps; i++) { if (n + f1[i].getSize() <= varsize) { - f1Data = f1[i].getDataStorage().getByteArray(); - if (Arrays.compare(p1, pi1, pi1 + f1[i].getSize(), f1Data, 0, f1[i].getSize()) == 0) { + fData1 = f1[i].getDataStorage().getByteArray(); + if (Arrays.compare(p1, pi1, pi1 + f1[i].getSize(), fData1, 0, f1[i].getSize()) == 0) { pi1 += f1[i].getSize(); n += f1[i].getSize(); calcsize += f2[i].getSize(); @@ -2238,17 +2236,19 @@ public static AbstractCobolField funcSubstitute( makeFieldEntry(field); byte[] p2 = currField.getDataStorage().getByteArray(); - found = 0; - pi1 = 0; + byte[] fData2; + int pi2 = 0; + pi1 = 0; + found = 0; for (n = 0; n < varsize; ) { for (i = 0; i < numreps; ++i) { if (n + f1[i].getSize() <= varsize) { - f1Data = f1[i].getDataStorage().getByteArray(); - if (Arrays.compare(p1, pi1, pi1 + f1[i].getSize(), f1Data, 0, f1[i].getSize()) == 0) { - f2Data = f2[i].getDataStorage().getByteArray(); + fData1 = f1[i].getDataStorage().getByteArray(); + if (Arrays.compare(p1, pi1, pi1 + f1[i].getSize(), fData1, 0, f1[i].getSize()) == 0) { + fData2 = f2[i].getDataStorage().getByteArray(); for (j = 0; j < f2[i].getSize(); j++) { - p2[j + pi2] = f2Data[j]; + p2[j + pi2] = fData2[j]; } pi1 += f1[i].getSize(); pi2 += f2[i].getSize(); @@ -2276,14 +2276,10 @@ public static AbstractCobolField funcSubstitute( public static AbstractCobolField funcSubstituteCase( int offset, int length, int params, AbstractCobolField... fields) { + int i, j, n; int numreps = params / 2; AbstractCobolField[] f1 = new AbstractCobolField[numreps]; AbstractCobolField[] f2 = new AbstractCobolField[numreps]; - int varsize = fields[0].getSize(); - int i, j, n; - int calcsize = 0; - int found = 0; - int size1, size2; for (i = 0; i < params - 1; i++) { if (i % 2 == 0) { @@ -2294,16 +2290,20 @@ public static AbstractCobolField funcSubstituteCase( } byte[] p1 = fields[0].getDataStorage().getByteArray(); + String pStr1, fStr1; + int size1, size2; + int varsize = p1.length; int pi1 = 0; - String ps1, fs1; + int calcsize = 0; + int found = 0; for (n = 0; n < varsize; ) { for (i = 0; i < numreps; i++) { if (n + f1[i].getSize() <= varsize) { size1 = f1[i].getSize(); - ps1 = new String(Arrays.copyOfRange(p1, pi1, pi1 + size1)); - fs1 = new String(f1[i].getDataStorage().getByteArray()); - if (ps1.equalsIgnoreCase(fs1)) { + pStr1 = new String(Arrays.copyOfRange(p1, pi1, pi1 + size1)); + fStr1 = new String(f1[i].getDataStorage().getByteArray()); + if (pStr1.equalsIgnoreCase(fStr1)) { size2 = f2[i].getSize(); pi1 += size1; n += size1; @@ -2338,10 +2338,10 @@ public static AbstractCobolField funcSubstituteCase( for (i = 0; i < numreps; i++) { if (n + f1[i].getSize() <= varsize) { size1 = f1[i].getSize(); - ps1 = new String(Arrays.copyOfRange(p1, pi1, pi1 + size1)); - fs1 = new String(f1[i].getDataStorage().getByteArray()); + pStr1 = new String(Arrays.copyOfRange(p1, pi1, pi1 + size1)); + fStr1 = new String(f1[i].getDataStorage().getByteArray()); fd2 = f2[i].getDataStorage().getByteArray(); - if (ps1.equalsIgnoreCase(fs1)) { + if (pStr1.equalsIgnoreCase(fStr1)) { for (j = 0; j < f2[i].getSize(); j++) { p2[j + pi2] = fd2[j]; } From 0c457b65e4ebd007e15ac26a5c10d78abb03024f Mon Sep 17 00:00:00 2001 From: root Date: Thu, 9 Nov 2023 17:43:53 +0900 Subject: [PATCH 5/8] fix FUNCTION SUBSTITUTE and FUNCTION SUBSTITUTE-CASE --- .../libcobj/common/CobolIntrinsic.java | 161 +++++------------- .../libcobj/data/CobolDataStorage.java | 7 - tests/run.src/functions.at | 23 ++- 3 files changed, 66 insertions(+), 125 deletions(-) mode change 100644 => 100755 libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java mode change 100644 => 100755 libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/data/CobolDataStorage.java diff --git a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java old mode 100644 new mode 100755 index 1ee73d83..b2d5615e --- a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java +++ b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java @@ -2187,10 +2187,14 @@ public static AbstractCobolField funcStoredCharLength(AbstractCobolField srcfiel public static AbstractCobolField funcSubstitute( int offset, int length, int params, AbstractCobolField... fields) { - int i, j, n; + int i, j, k; int numreps = params / 2; AbstractCobolField[] f1 = new AbstractCobolField[numreps]; AbstractCobolField[] f2 = new AbstractCobolField[numreps]; + byte[] src = fields[0].getDataStorage().getByteArray(0, fields[0].getSize()); + byte[] fData1; + String rtn = new String(); + int fSize1; for (i = 0; i < params - 1; i++) { if ((i % 2) == 0) { @@ -2200,72 +2204,33 @@ public static AbstractCobolField funcSubstitute( } } - byte[] p1 = fields[0].getDataStorage().getByteArray(); - byte[] fData1; - int varsize = p1.length; - int pi1 = 0; - int calcsize = 0; - int found = 0; - - for (n = 0; n < varsize; ) { - for (i = 0; i < numreps; i++) { - if (n + f1[i].getSize() <= varsize) { - fData1 = f1[i].getDataStorage().getByteArray(); - if (Arrays.compare(p1, pi1, pi1 + f1[i].getSize(), fData1, 0, f1[i].getSize()) == 0) { - pi1 += f1[i].getSize(); - n += f1[i].getSize(); - calcsize += f2[i].getSize(); - found = 1; + for (i = 0; i < src.length; ) { + for (j = 0; j < numreps; j++) { + fData1 = f1[j].getBytes(); + fSize1 = fData1.length; + for (k = fSize1 - 1; k >= 0; k--) { + if (i + k >= src.length || src[i + k] != fData1[k]) { break; } } + if (k < 0) { + rtn += f2[j].getString(); + i += fSize1; + break; + } } - if (found == 1) { - found = 0; - continue; + if (j == numreps) { + rtn += String.valueOf((char) src[i]); + i++; } - n++; - pi1++; - calcsize++; } CobolFieldAttribute attr = new CobolFieldAttribute(CobolFieldAttribute.COB_TYPE_ALPHANUMERIC, 0, 0, 0, null); AbstractCobolField field = CobolFieldFactory.makeCobolField(0, (CobolDataStorage) null, attr); - field.setSize(calcsize); + field.setSize(rtn.getBytes().length); makeFieldEntry(field); - - byte[] p2 = currField.getDataStorage().getByteArray(); - byte[] fData2; - int pi2 = 0; - - pi1 = 0; - found = 0; - for (n = 0; n < varsize; ) { - for (i = 0; i < numreps; ++i) { - if (n + f1[i].getSize() <= varsize) { - fData1 = f1[i].getDataStorage().getByteArray(); - if (Arrays.compare(p1, pi1, pi1 + f1[i].getSize(), fData1, 0, f1[i].getSize()) == 0) { - fData2 = f2[i].getDataStorage().getByteArray(); - for (j = 0; j < f2[i].getSize(); j++) { - p2[j + pi2] = fData2[j]; - } - pi1 += f1[i].getSize(); - pi2 += f2[i].getSize(); - n += f1[i].getSize(); - found = 1; - break; - } - } - } - if (found == 1) { - found = 0; - continue; - } - n++; - p2[pi2++] = p1[pi1++]; - } - currField.setDataStorage(new CobolDataStorage(p2)); + currField.setDataStorage(new CobolDataStorage(rtn.getBytes())); if (offset > 0) { calcRefMod(currField, offset, length); @@ -2275,10 +2240,14 @@ public static AbstractCobolField funcSubstitute( public static AbstractCobolField funcSubstituteCase( int offset, int length, int params, AbstractCobolField... fields) { - int i, j, n; + int i, j, k; int numreps = params / 2; AbstractCobolField[] f1 = new AbstractCobolField[numreps]; AbstractCobolField[] f2 = new AbstractCobolField[numreps]; + byte[] src = fields[0].getDataStorage().getByteArray(0, fields[0].getSize()); + byte[] fData1; + String rtn = new String(); + int fSize1; for (i = 0; i < params - 1; i++) { if (i % 2 == 0) { @@ -2288,78 +2257,36 @@ public static AbstractCobolField funcSubstituteCase( } } - byte[] p1 = fields[0].getDataStorage().getByteArray(); - String pStr1, fStr1; - int size1, size2; - int varsize = p1.length; - int pi1 = 0; - int calcsize = 0; - int found = 0; - - for (n = 0; n < varsize; ) { - for (i = 0; i < numreps; i++) { - if (n + f1[i].getSize() <= varsize) { - size1 = f1[i].getSize(); - pStr1 = new String(Arrays.copyOfRange(p1, pi1, pi1 + size1)); - fStr1 = new String(f1[i].getDataStorage().getByteArray()); - if (pStr1.equalsIgnoreCase(fStr1)) { - size2 = f2[i].getSize(); - pi1 += size1; - n += size1; - calcsize += size2; - found = 1; + for (i = 0; i < src.length; ) { + for (j = 0; j < numreps; j++) { + fData1 = f1[j].getBytes(); + fSize1 = fData1.length; + for (k = fSize1 - 1; k >= 0; k--) { + if (i + k >= src.length + || Character.toLowerCase((char) fData1[k]) + != Character.toLowerCase((char) src[i + k])) { break; } } + if (k < 0) { + rtn += f2[j].getString(); + i += fSize1; + break; + } } - if (found == 1) { - found = 0; - continue; + if (j == numreps) { + rtn += String.valueOf((char) src[i]); + i++; } - n++; - pi1++; - calcsize++; } CobolFieldAttribute attr = new CobolFieldAttribute(CobolFieldAttribute.COB_TYPE_ALPHANUMERIC, 0, 0, 0, null); AbstractCobolField field = CobolFieldFactory.makeCobolField(0, (CobolDataStorage) null, attr); - field.setSize(calcsize); + field.setSize(rtn.getBytes().length); makeFieldEntry(field); - byte[] p2 = currField.getDataStorage().getByteArray(); - int pi2 = 0; - byte[] fd2; - - pi1 = 0; - found = 0; - for (n = 0; n < varsize; ) { - for (i = 0; i < numreps; i++) { - if (n + f1[i].getSize() <= varsize) { - size1 = f1[i].getSize(); - pStr1 = new String(Arrays.copyOfRange(p1, pi1, pi1 + size1)); - fStr1 = new String(f1[i].getDataStorage().getByteArray()); - fd2 = f2[i].getDataStorage().getByteArray(); - if (pStr1.equalsIgnoreCase(fStr1)) { - for (j = 0; j < f2[i].getSize(); j++) { - p2[j + pi2] = fd2[j]; - } - pi1 += f1[i].getSize(); - pi2 += f2[i].getSize(); - n += f1[i].getSize(); - found = 1; - break; - } - } - } - if (found == 1) { - found = 0; - continue; - } - n++; - p2[pi2++] = p1[pi1++]; - } - currField.setDataStorage(new CobolDataStorage(p2)); + currField.setDataStorage(new CobolDataStorage(rtn.getBytes())); if (offset > 0) { calcRefMod(currField, offset, length); } diff --git a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/data/CobolDataStorage.java b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/data/CobolDataStorage.java old mode 100644 new mode 100755 index 9eee80b5..4ab8779a --- a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/data/CobolDataStorage.java +++ b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/data/CobolDataStorage.java @@ -158,13 +158,6 @@ public byte[] getByteArray(int index, int length) { return result; } - public byte[] getByteArray() { - int length = this.data.length; - byte[] result = new byte[length]; - System.arraycopy(this.data, this.index, result, 0, length); - return result; - } - /** * C言語のmemcpy * diff --git a/tests/run.src/functions.at b/tests/run.src/functions.at index 03f2fe96..c3788b92 100755 --- a/tests/run.src/functions.at +++ b/tests/run.src/functions.at @@ -1636,12 +1636,22 @@ AT_DATA([prog.cob], [ MOVE "abc111444555defxxabc" TO Y. DISPLAY FUNCTION SUBSTITUTE ( Y "abc" "zz" "55" "666" ) END-DISPLAY. + MOVE "abc111444555defxxabc" TO Y. + DISPLAY FUNCTION SUBSTITUTE + ( Y "abc" "55" "55" "666" ) + END-DISPLAY. + MOVE "abc111444555defxxabc" TO Y. + DISPLAY FUNCTION SUBSTITUTE + ( Y "abc1" "666" "abc" "zz" ) + END-DISPLAY. STOP RUN. ]) AT_CHECK([${COMPILE} prog.cob]) AT_CHECK([java prog], [0], [zz1114446665defxxzz +551114446665defxx55 +66611444555defxxzz ]) AT_CLEANUP @@ -1681,12 +1691,23 @@ AT_DATA([prog.cob], [ MOVE "ABC111444555defxxabc" TO Y. DISPLAY FUNCTION SUBSTITUTE-CASE (Y "abc" "zz" "55" "666") END-DISPLAY. + MOVE "abc111444555defxxABC" TO Y. + DISPLAY FUNCTION SUBSTITUTE-CASE + ( Y "abc" "55" "55" "666" ) + END-DISPLAY. + + MOVE "abc111444555defxxABC" TO Y. + DISPLAY FUNCTION SUBSTITUTE-CASE + ( Y "abc1" "666" "abc" "zz" ) + END-DISPLAY. STOP RUN. ]) AT_CHECK([${COMPILE} prog.cob]) AT_CHECK([java prog], [0], [zz1114446665defxxzz +551114446665defxx55 +66611444555defxxzz ]) AT_CLEANUP @@ -1700,7 +1721,7 @@ AT_DATA([prog.cob], [ WORKING-STORAGE SECTION. 01 Y PIC X(20). PROCEDURE DIVISION. - MOVE "abc111444555defxxabc" TO Y. + MOVE "abc111444555defxxABC" TO Y. DISPLAY FUNCTION SUBSTITUTE-CASE ( Y "ABC" "zz" "55" "666" ) (2 : 9) END-DISPLAY. From f05a01bff2578d1851cea8ab18965b862fcc624e Mon Sep 17 00:00:00 2001 From: root Date: Thu, 9 Nov 2023 17:44:47 +0900 Subject: [PATCH 6/8] fix file status --- .../jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java | 0 .../jp/osscons/opensourcecobol/libcobj/data/CobolDataStorage.java | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java mode change 100755 => 100644 libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/data/CobolDataStorage.java diff --git a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java old mode 100755 new mode 100644 diff --git a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/data/CobolDataStorage.java b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/data/CobolDataStorage.java old mode 100755 new mode 100644 From b32c900add4346657145c721f5cb84de8fd02cc1 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 11 Nov 2023 15:59:22 +0900 Subject: [PATCH 7/8] Improved performance --- .../libcobj/common/CobolIntrinsic.java | 50 ++++++++++--------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java index b2d5615e..7e029e70 100644 --- a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java +++ b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java @@ -2191,10 +2191,11 @@ public static AbstractCobolField funcSubstitute( int numreps = params / 2; AbstractCobolField[] f1 = new AbstractCobolField[numreps]; AbstractCobolField[] f2 = new AbstractCobolField[numreps]; - byte[] src = fields[0].getDataStorage().getByteArray(0, fields[0].getSize()); - byte[] fData1; - String rtn = new String(); + CobolDataStorage src = fields[0].getDataStorage(); + CobolDataStorage fData1; + int srcSize = fields[0].getSize(); int fSize1; + StringBuilder rtn = new StringBuilder(); for (i = 0; i < params - 1; i++) { if ((i % 2) == 0) { @@ -2204,23 +2205,23 @@ public static AbstractCobolField funcSubstitute( } } - for (i = 0; i < src.length; ) { + for (i = 0; i < srcSize; ) { for (j = 0; j < numreps; j++) { - fData1 = f1[j].getBytes(); - fSize1 = fData1.length; + fData1 = f1[j].getDataStorage(); + fSize1 = f1[j].getSize(); for (k = fSize1 - 1; k >= 0; k--) { - if (i + k >= src.length || src[i + k] != fData1[k]) { + if (i + k >= srcSize || src.getByte(i + k) != fData1.getByte(k)) { break; } } if (k < 0) { - rtn += f2[j].getString(); + rtn.append(f2[j].getString()); i += fSize1; break; } } if (j == numreps) { - rtn += String.valueOf((char) src[i]); + rtn.append((char) src.getByte(i)); i++; } } @@ -2228,9 +2229,9 @@ public static AbstractCobolField funcSubstitute( CobolFieldAttribute attr = new CobolFieldAttribute(CobolFieldAttribute.COB_TYPE_ALPHANUMERIC, 0, 0, 0, null); AbstractCobolField field = CobolFieldFactory.makeCobolField(0, (CobolDataStorage) null, attr); - field.setSize(rtn.getBytes().length); + field.setSize(rtn.length()); makeFieldEntry(field); - currField.setDataStorage(new CobolDataStorage(rtn.getBytes())); + currField.setDataStorage(new CobolDataStorage(rtn.toString())); if (offset > 0) { calcRefMod(currField, offset, length); @@ -2244,10 +2245,11 @@ public static AbstractCobolField funcSubstituteCase( int numreps = params / 2; AbstractCobolField[] f1 = new AbstractCobolField[numreps]; AbstractCobolField[] f2 = new AbstractCobolField[numreps]; - byte[] src = fields[0].getDataStorage().getByteArray(0, fields[0].getSize()); - byte[] fData1; - String rtn = new String(); + CobolDataStorage src = fields[0].getDataStorage(); + CobolDataStorage fData1; + int srcSize = fields[0].getSize(); int fSize1; + StringBuilder rtn = new StringBuilder(); for (i = 0; i < params - 1; i++) { if (i % 2 == 0) { @@ -2257,25 +2259,25 @@ public static AbstractCobolField funcSubstituteCase( } } - for (i = 0; i < src.length; ) { + for (i = 0; i < srcSize; ) { for (j = 0; j < numreps; j++) { - fData1 = f1[j].getBytes(); - fSize1 = fData1.length; + fData1 = f1[j].getDataStorage(); + fSize1 = f1[j].getSize(); for (k = fSize1 - 1; k >= 0; k--) { - if (i + k >= src.length - || Character.toLowerCase((char) fData1[k]) - != Character.toLowerCase((char) src[i + k])) { + if (i + k >= srcSize + || Character.toLowerCase((char) fData1.getByte(k)) + != Character.toLowerCase((char) src.getByte(i + k))) { break; } } if (k < 0) { - rtn += f2[j].getString(); + rtn.append(f2[j].getString()); i += fSize1; break; } } if (j == numreps) { - rtn += String.valueOf((char) src[i]); + rtn.append((char) src.getByte(i)); i++; } } @@ -2283,10 +2285,10 @@ public static AbstractCobolField funcSubstituteCase( CobolFieldAttribute attr = new CobolFieldAttribute(CobolFieldAttribute.COB_TYPE_ALPHANUMERIC, 0, 0, 0, null); AbstractCobolField field = CobolFieldFactory.makeCobolField(0, (CobolDataStorage) null, attr); - field.setSize(rtn.getBytes().length); + field.setSize(rtn.length()); makeFieldEntry(field); - currField.setDataStorage(new CobolDataStorage(rtn.getBytes())); + currField.setDataStorage(new CobolDataStorage(rtn.toString())); if (offset > 0) { calcRefMod(currField, offset, length); } From 06030b40221e567c83caf235586a66b45858cca2 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 13 Nov 2023 15:27:54 +0900 Subject: [PATCH 8/8] Minor corrections were made. --- .../opensourcecobol/libcobj/common/CobolIntrinsic.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java index 7e029e70..3a1404b3 100644 --- a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java +++ b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/common/CobolIntrinsic.java @@ -2228,8 +2228,8 @@ public static AbstractCobolField funcSubstitute( CobolFieldAttribute attr = new CobolFieldAttribute(CobolFieldAttribute.COB_TYPE_ALPHANUMERIC, 0, 0, 0, null); - AbstractCobolField field = CobolFieldFactory.makeCobolField(0, (CobolDataStorage) null, attr); - field.setSize(rtn.length()); + AbstractCobolField field = + CobolFieldFactory.makeCobolField(rtn.length(), (CobolDataStorage) null, attr); makeFieldEntry(field); currField.setDataStorage(new CobolDataStorage(rtn.toString())); @@ -2284,8 +2284,8 @@ public static AbstractCobolField funcSubstituteCase( CobolFieldAttribute attr = new CobolFieldAttribute(CobolFieldAttribute.COB_TYPE_ALPHANUMERIC, 0, 0, 0, null); - AbstractCobolField field = CobolFieldFactory.makeCobolField(0, (CobolDataStorage) null, attr); - field.setSize(rtn.length()); + AbstractCobolField field = + CobolFieldFactory.makeCobolField(rtn.length(), (CobolDataStorage) null, attr); makeFieldEntry(field); currField.setDataStorage(new CobolDataStorage(rtn.toString()));