@@ -19,6 +19,7 @@ package za.co.absa.cobrix.cobol.parser.decoders
19
19
import java .nio .charset .{Charset , StandardCharsets }
20
20
import za .co .absa .cobrix .cobol .parser .ast .datatype ._
21
21
import za .co .absa .cobrix .cobol .parser .common .Constants
22
+ import za .co .absa .cobrix .cobol .parser .common .Constants .{maxIntegerPrecision , maxLongPrecision }
22
23
import za .co .absa .cobrix .cobol .parser .decoders .FloatingPointFormat .FloatingPointFormat
23
24
import za .co .absa .cobrix .cobol .parser .encoding ._
24
25
import za .co .absa .cobrix .cobol .parser .encoding .codepage .{CodePage , CodePageCommon }
@@ -255,26 +256,32 @@ object DecoderSelector {
255
256
val isSigned = signPosition.nonEmpty
256
257
257
258
val numOfBytes = BinaryUtils .getBytesCount(compact, precision, isSigned, isExplicitDecimalPt = false , isSignSeparate = false )
259
+ val isMaxUnsignedPrecision = precision == maxIntegerPrecision || precision == maxLongPrecision
260
+
258
261
val decoder = if (strictIntegralPrecision) {
259
262
(a : Array [Byte ]) => BinaryNumberDecoders .decodeBinaryAribtraryPrecision(a, isBigEndian, isSigned)
260
263
} else {
261
- (isSigned, isBigEndian, numOfBytes) match {
262
- case (true , true , 1 ) => BinaryNumberDecoders .decodeSignedByte _
263
- case (true , true , 2 ) => BinaryNumberDecoders .decodeBinarySignedShortBigEndian _
264
- case (true , true , 4 ) => BinaryNumberDecoders .decodeBinarySignedIntBigEndian _
265
- case (true , true , 8 ) => BinaryNumberDecoders .decodeBinarySignedLongBigEndian _
266
- case (true , false , 1 ) => BinaryNumberDecoders .decodeSignedByte _
267
- case (true , false , 2 ) => BinaryNumberDecoders .decodeBinarySignedShortLittleEndian _
268
- case (true , false , 4 ) => BinaryNumberDecoders .decodeBinarySignedIntLittleEndian _
269
- case (true , false , 8 ) => BinaryNumberDecoders .decodeBinarySignedLongLittleEndian _
270
- case (false , true , 1 ) => BinaryNumberDecoders .decodeUnsignedByte _
271
- case (false , true , 2 ) => BinaryNumberDecoders .decodeBinaryUnsignedShortBigEndian _
272
- case (false , true , 4 ) => BinaryNumberDecoders .decodeBinaryUnsignedIntBigEndian _
273
- case (false , true , 8 ) => BinaryNumberDecoders .decodeBinaryUnsignedLongBigEndian _
274
- case (false , false , 1 ) => BinaryNumberDecoders .decodeUnsignedByte _
275
- case (false , false , 2 ) => BinaryNumberDecoders .decodeBinaryUnsignedShortLittleEndian _
276
- case (false , false , 4 ) => BinaryNumberDecoders .decodeBinaryUnsignedIntLittleEndian _
277
- case (false , false , 8 ) => BinaryNumberDecoders .decodeBinaryUnsignedLongLittleEndian _
264
+ (isSigned, isBigEndian, isMaxUnsignedPrecision, numOfBytes) match {
265
+ case (true , true , _, 1 ) => BinaryNumberDecoders .decodeSignedByte _
266
+ case (true , true , _, 2 ) => BinaryNumberDecoders .decodeBinarySignedShortBigEndian _
267
+ case (true , true , _, 4 ) => BinaryNumberDecoders .decodeBinarySignedIntBigEndian _
268
+ case (true , true , _, 8 ) => BinaryNumberDecoders .decodeBinarySignedLongBigEndian _
269
+ case (true , false , _, 1 ) => BinaryNumberDecoders .decodeSignedByte _
270
+ case (true , false , _, 2 ) => BinaryNumberDecoders .decodeBinarySignedShortLittleEndian _
271
+ case (true , false , _, 4 ) => BinaryNumberDecoders .decodeBinarySignedIntLittleEndian _
272
+ case (true , false , _, 8 ) => BinaryNumberDecoders .decodeBinarySignedLongLittleEndian _
273
+ case (false , true , _, 1 ) => BinaryNumberDecoders .decodeUnsignedByte _
274
+ case (false , true , _, 2 ) => BinaryNumberDecoders .decodeBinaryUnsignedShortBigEndian _
275
+ case (false , true , false , 4 ) => BinaryNumberDecoders .decodeBinaryUnsignedIntBigEndian _
276
+ case (false , true , true , 4 ) => BinaryNumberDecoders .decodeBinaryUnsignedIntBigEndianAsLong _
277
+ case (false , true , false , 8 ) => BinaryNumberDecoders .decodeBinaryUnsignedLongBigEndian _
278
+ case (false , true , true , 8 ) => BinaryNumberDecoders .decodeBinaryUnsignedLongBigEndianAsDecimal _
279
+ case (false , false , _, 1 ) => BinaryNumberDecoders .decodeUnsignedByte _
280
+ case (false , false , _, 2 ) => BinaryNumberDecoders .decodeBinaryUnsignedShortLittleEndian _
281
+ case (false , false , false , 4 ) => BinaryNumberDecoders .decodeBinaryUnsignedIntLittleEndian _
282
+ case (false , false , true , 4 ) => BinaryNumberDecoders .decodeBinaryUnsignedIntLittleEndianAsLong _
283
+ case (false , false , false , 8 ) => BinaryNumberDecoders .decodeBinaryUnsignedLongLittleEndian _
284
+ case (false , false , true , 8 ) => BinaryNumberDecoders .decodeBinaryUnsignedLongLittleEndianAsDecimal _
278
285
case _ =>
279
286
(a : Array [Byte ]) => BinaryNumberDecoders .decodeBinaryAribtraryPrecision(a, isBigEndian, isSigned)
280
287
}
0 commit comments