Skip to content

Commit 4a63b30

Browse files
committed
#813 Fix compatibility of the relaxed sign overpunching.
1 parent 2435219 commit 4a63b30

File tree

5 files changed

+362
-262
lines changed

5 files changed

+362
-262
lines changed

cobol-parser/src/main/scala/za/co/absa/cobrix/cobol/parser/decoders/DecoderSelector.scala

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
package za.co.absa.cobrix.cobol.parser.decoders
1818

19-
import java.nio.charset.{Charset, StandardCharsets}
2019
import za.co.absa.cobrix.cobol.parser.ast.datatype._
2120
import za.co.absa.cobrix.cobol.parser.common.Constants
2221
import za.co.absa.cobrix.cobol.parser.common.Constants.{maxIntegerPrecision, maxLongPrecision}
@@ -25,6 +24,7 @@ import za.co.absa.cobrix.cobol.parser.encoding._
2524
import za.co.absa.cobrix.cobol.parser.encoding.codepage.{CodePage, CodePageCommon}
2625
import za.co.absa.cobrix.cobol.parser.position.Position
2726

27+
import java.nio.charset.{Charset, StandardCharsets}
2828
import scala.util.control.NonFatal
2929

3030
object DecoderSelector {
@@ -128,14 +128,14 @@ object DecoderSelector {
128128
case None =>
129129
if (decimalType.explicitDecimal) {
130130
if (isEbcidic)
131-
StringDecoders.decodeEbcdicBigDecimal(_, !isSigned, isSigned || !strictSignOverpunch, improvedNullDetection)
131+
(bytes: Array[Byte]) => StringDecoders.decodeEbcdicBigDecimal(bytes, !isSigned, isSigned || !strictSignOverpunch, !strictSignOverpunch, improvedNullDetection)
132132
else
133-
StringDecoders.decodeAsciiBigDecimal(_, !isSigned, isSigned || !strictSignOverpunch, improvedNullDetection)
133+
StringDecoders.decodeAsciiBigDecimal(_, !isSigned, isSigned || !strictSignOverpunch, !strictSignOverpunch, improvedNullDetection)
134134
} else {
135135
if (isEbcidic)
136-
StringDecoders.decodeEbcdicBigNumber(_, !isSigned, isSigned || !strictSignOverpunch, improvedNullDetection, decimalType.scale, decimalType.scaleFactor)
136+
(bytes: Array[Byte]) => StringDecoders.decodeEbcdicBigNumber(bytes, !isSigned, isSigned || !strictSignOverpunch, !strictSignOverpunch, improvedNullDetection, decimalType.scale, decimalType.scaleFactor)
137137
else
138-
StringDecoders.decodeAsciiBigNumber(_, !isSigned, isSigned || !strictSignOverpunch, improvedNullDetection, decimalType.scale, decimalType.scaleFactor)
138+
StringDecoders.decodeAsciiBigNumber(_, !isSigned, isSigned || !strictSignOverpunch, !strictSignOverpunch, improvedNullDetection, decimalType.scale, decimalType.scaleFactor)
139139
}
140140
// case Some(COMP()) =>
141141
// // COMP aka BINARY encoded number
@@ -207,24 +207,24 @@ object DecoderSelector {
207207
case None =>
208208
if (strictIntegralPrecision) {
209209
if (isEbcidic)
210-
StringDecoders.decodeEbcdicBigNumber(_, !isSigned, isSigned || !strictSignOverpunch, improvedNullDetection)
210+
(bytes: Array[Byte]) => StringDecoders.decodeEbcdicBigNumber(bytes, !isSigned, isSigned || !strictSignOverpunch, !strictSignOverpunch, improvedNullDetection)
211211
else
212-
StringDecoders.decodeAsciiBigNumber(_, !isSigned, isSigned || !strictSignOverpunch, improvedNullDetection)
212+
StringDecoders.decodeAsciiBigNumber(_, !isSigned, isSigned || !strictSignOverpunch, !strictSignOverpunch, improvedNullDetection)
213213
} else if (integralType.precision <= Constants.maxIntegerPrecision) {
214214
if (isEbcidic)
215-
StringDecoders.decodeEbcdicInt(_, !isSigned, isSigned || !strictSignOverpunch, improvedNullDetection)
215+
(bytes: Array[Byte]) => StringDecoders.decodeEbcdicInt(bytes, !isSigned, isSigned || !strictSignOverpunch, !strictSignOverpunch, improvedNullDetection)
216216
else
217-
StringDecoders.decodeAsciiInt(_, !isSigned, isSigned || !strictSignOverpunch, improvedNullDetection)
217+
StringDecoders.decodeAsciiInt(_, !isSigned, isSigned || !strictSignOverpunch, !strictSignOverpunch, improvedNullDetection)
218218
} else if (integralType.precision <= Constants.maxLongPrecision) {
219219
if (isEbcidic)
220-
StringDecoders.decodeEbcdicLong(_, !isSigned, isSigned || !strictSignOverpunch, improvedNullDetection)
220+
StringDecoders.decodeEbcdicLong(_, !isSigned, isSigned || !strictSignOverpunch, improvedNullDetection, !strictSignOverpunch)
221221
else
222-
StringDecoders.decodeAsciiLong(_, !isSigned, isSigned || !strictSignOverpunch, improvedNullDetection)
222+
StringDecoders.decodeAsciiLong(_, !isSigned, isSigned || !strictSignOverpunch, !strictSignOverpunch, improvedNullDetection)
223223
} else {
224224
if (isEbcidic)
225-
StringDecoders.decodeEbcdicBigNumber(_, !isSigned, isSigned || !strictSignOverpunch, improvedNullDetection)
225+
(bytes: Array[Byte]) => StringDecoders.decodeEbcdicBigNumber(bytes, !isSigned, isSigned || !strictSignOverpunch, !strictSignOverpunch, improvedNullDetection)
226226
else
227-
StringDecoders.decodeAsciiBigNumber(_, !isSigned, isSigned || !strictSignOverpunch, improvedNullDetection)
227+
StringDecoders.decodeAsciiBigNumber(_, !isSigned, isSigned || !strictSignOverpunch, !strictSignOverpunch, improvedNullDetection)
228228
}
229229
// case Some(Constants.compBinary1) =>
230230
// // COMP aka BINARY encoded number
@@ -267,11 +267,11 @@ object DecoderSelector {
267267

268268
if (isEbcdic) {
269269
bytes: Array[Byte] => {
270-
StringDecoders.decodeEbcdicNumber(bytes, !isSigned, allowedSignOverpunch, improvedNullDetection)
270+
StringDecoders.decodeEbcdicNumber(bytes, !isSigned, allowedSignOverpunch, !strictSignOverpunch, improvedNullDetection)
271271
}
272272
} else {
273273
bytes: Array[Byte] => {
274-
StringDecoders.decodeAsciiNumber(bytes, !isSigned, allowedSignOverpunch, improvedNullDetection)
274+
StringDecoders.decodeAsciiNumber(bytes, !isSigned, allowedSignOverpunch, !strictSignOverpunch, improvedNullDetection)
275275
}
276276
}
277277
}

0 commit comments

Comments
 (0)