1616
1717package za .co .absa .cobrix .cobol .parser .encoding
1818
19- import za .co .absa .cobrix .cobol .parser .ast .datatype .{AlphaNumeric , COMP3 , COMP3U , CobolType , Decimal , Integral }
19+ import za .co .absa .cobrix .cobol .parser .ast .datatype .{AlphaNumeric , COMP3 , COMP3U , COMP4 , COMP9 , CobolType , Decimal , Integral , Usage }
20+ import za .co .absa .cobrix .cobol .parser .decoders .BinaryUtils
2021import za .co .absa .cobrix .cobol .parser .encoding .codepage .{CodePage , CodePageCommon }
2122
2223import java .nio .charset .{Charset , StandardCharsets }
@@ -29,16 +30,24 @@ object EncoderSelector {
2930 ebcdicCodePage : CodePage = new CodePageCommon ,
3031 asciiCharset : Charset = StandardCharsets .US_ASCII ): Option [Encoder ] = {
3132 dataType match {
32- case alphaNumeric : AlphaNumeric if alphaNumeric.compact.isEmpty =>
33+ case alphaNumeric : AlphaNumeric if alphaNumeric.compact.isEmpty =>
3334 getStringEncoder(alphaNumeric.enc.getOrElse(EBCDIC ), ebcdicCodePage, asciiCharset, alphaNumeric.length)
34- case integralComp3 : Integral if integralComp3.compact.exists(_.isInstanceOf [COMP3 ]) =>
35+ case integralComp3 : Integral if integralComp3.compact.exists(_.isInstanceOf [COMP3 ]) =>
3536 Option (getBdcEncoder(integralComp3.precision, 0 , 0 , integralComp3.signPosition.isDefined, mandatorySignNibble = true ))
36- case integralComp3 : Integral if integralComp3.compact.exists(_.isInstanceOf [COMP3U ]) =>
37+ case integralComp3 : Integral if integralComp3.compact.exists(_.isInstanceOf [COMP3U ]) =>
3738 Option (getBdcEncoder(integralComp3.precision, 0 , 0 , integralComp3.signPosition.isDefined, mandatorySignNibble = false ))
38- case decimalComp3 : Decimal if decimalComp3.compact.exists(_.isInstanceOf [COMP3 ]) =>
39+ case decimalComp3 : Decimal if decimalComp3.compact.exists(_.isInstanceOf [COMP3 ]) =>
3940 Option (getBdcEncoder(decimalComp3.precision, decimalComp3.scale, decimalComp3.scaleFactor, decimalComp3.signPosition.isDefined, mandatorySignNibble = true ))
40- case decimalComp3 : Decimal if decimalComp3.compact.exists(_.isInstanceOf [COMP3U ]) =>
41+ case decimalComp3 : Decimal if decimalComp3.compact.exists(_.isInstanceOf [COMP3U ]) =>
4142 Option (getBdcEncoder(decimalComp3.precision, decimalComp3.scale, decimalComp3.scaleFactor, decimalComp3.signPosition.isDefined, mandatorySignNibble = false ))
43+ case integralBinary : Integral if integralBinary.compact.exists(_.isInstanceOf [COMP4 ]) =>
44+ Option (getBinaryEncoder(integralBinary.compact, integralBinary.precision, 0 , 0 , integralBinary.signPosition.isDefined, isBigEndian = true ))
45+ case integralBinary : Integral if integralBinary.compact.exists(_.isInstanceOf [COMP9 ]) =>
46+ Option (getBinaryEncoder(integralBinary.compact, integralBinary.precision, 0 , 0 , integralBinary.signPosition.isDefined, isBigEndian = false ))
47+ case decimalBinary : Decimal if decimalBinary.compact.exists(_.isInstanceOf [COMP4 ]) =>
48+ Option (getBinaryEncoder(decimalBinary.compact, decimalBinary.precision, decimalBinary.scale, decimalBinary.scaleFactor, decimalBinary.signPosition.isDefined, isBigEndian = true ))
49+ case decimalBinary : Decimal if decimalBinary.compact.exists(_.isInstanceOf [COMP9 ]) =>
50+ Option (getBinaryEncoder(decimalBinary.compact, decimalBinary.precision, decimalBinary.scale, decimalBinary.scaleFactor, decimalBinary.signPosition.isDefined, isBigEndian = false ))
4251 case _ =>
4352 None
4453 }
@@ -88,6 +97,27 @@ object EncoderSelector {
8897 buf
8998 }
9099
100+ def getBinaryEncoder (compression : Option [Usage ],
101+ precision : Int ,
102+ scale : Int ,
103+ scaleFactor : Int ,
104+ isSigned : Boolean ,
105+ isBigEndian : Boolean ): Encoder = {
106+ val numBytes = BinaryUtils .getBytesCount(compression, precision, isSigned, isExplicitDecimalPt = false , isSignSeparate = false )
107+ (a : Any ) => {
108+ val number = a match {
109+ case null => null
110+ case d : java.math.BigDecimal => d
111+ case n : java.math.BigInteger => new java.math.BigDecimal (n)
112+ case n : Byte => new java.math.BigDecimal (n)
113+ case n : Int => new java.math.BigDecimal (n)
114+ case n : Long => new java.math.BigDecimal (n)
115+ case x => new java.math.BigDecimal (x.toString)
116+ }
117+ BinaryEncoders .encodeBinaryNumber(number, isSigned, numBytes, isBigEndian, precision, scale, scaleFactor)
118+ }
119+ }
120+
91121 def getBdcEncoder (precision : Int ,
92122 scale : Int ,
93123 scaleFactor : Int ,
0 commit comments