@@ -19,6 +19,7 @@ package za.co.absa.cobrix.cobol.parser.decoders
1919import java .nio .charset .{Charset , StandardCharsets }
2020import za .co .absa .cobrix .cobol .parser .ast .datatype ._
2121import za .co .absa .cobrix .cobol .parser .common .Constants
22+ import za .co .absa .cobrix .cobol .parser .common .Constants .{maxIntegerPrecision , maxLongPrecision }
2223import za .co .absa .cobrix .cobol .parser .decoders .FloatingPointFormat .FloatingPointFormat
2324import za .co .absa .cobrix .cobol .parser .encoding ._
2425import za .co .absa .cobrix .cobol .parser .encoding .codepage .{CodePage , CodePageCommon }
@@ -255,26 +256,32 @@ object DecoderSelector {
255256 val isSigned = signPosition.nonEmpty
256257
257258 val numOfBytes = BinaryUtils .getBytesCount(compact, precision, isSigned, isExplicitDecimalPt = false , isSignSeparate = false )
259+ val isMaxUnsignedPrecision = precision == maxIntegerPrecision || precision == maxLongPrecision
260+
258261 val decoder = if (strictIntegralPrecision) {
259262 (a : Array [Byte ]) => BinaryNumberDecoders .decodeBinaryAribtraryPrecision(a, isBigEndian, isSigned)
260263 } 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 _
278285 case _ =>
279286 (a : Array [Byte ]) => BinaryNumberDecoders .decodeBinaryAribtraryPrecision(a, isBigEndian, isSigned)
280287 }
0 commit comments