stevedlawrence commented on code in PR #1337:
URL: https://github.com/apache/daffodil/pull/1337#discussion_r1820739495
##########
daffodil-runtime1-unparser/src/main/scala/org/apache/daffodil/unparsers/runtime1/BinaryNumberUnparsers.scala:
##########
@@ -78,17 +76,61 @@ abstract class BinaryNumberBaseUnparser(override val
context: ElementRuntimeData
}
-abstract class BinaryIntegerBaseUnparser(e: ElementRuntimeData, signed:
Boolean)
+abstract class BinaryIntegerBaseUnparser(e: ElementRuntimeData)
extends BinaryNumberBaseUnparser(e) {
+ private val primNumeric =
e.optPrimType.get.asInstanceOf[NodeInfo.PrimType.PrimNumeric]
+
override def putNumber(
dos: DataOutputStream,
value: JNumber,
nBits: Int,
finfo: FormatInfo
): Boolean = {
+ val state = finfo.asInstanceOf[UState]
+ if (primNumeric.minWidth.isDefined) {
+ val isSigned = primNumeric.isSigned
+ val signedStr = if (isSigned) "signed" else "unsigned"
+ val minWidth = primNumeric.minWidth.get
+ if(nBits < minWidth) {
+ val outOfRangeFmtStr =
+ "Minimum length for a %s binary integer is %d bit(s), number of bits
%d out of range. " +
+ "An unsigned integer with length 1 bit could be used instead."
+ if (isSigned && state.tunable.allowSignedIntegerLength1Bit) {
+ state.SDW(
+ WarnID.SignedBinaryIntegerLength1Bit,
+ outOfRangeFmtStr,
+ signedStr,
+ minWidth,
+ nBits
+ )
+ return false
Review Comment:
(previous removed, it was wrong)
So it looks like, for parse
0x0 -> 0
0x1 -> 1
And for unparse:
0 -> 0x0
1 -> 0x1
-1 -> 0x1
Other infoset values do not throw an error, so I guess we just aren't doing
proper range checking that the value fits in the number of bits?
I'm not sure 2's complement really makes sense with just a single bit, so I
guess always parsing/unparse to 0 or 1 is just as logical as something else,
and at least it's symmetric.
##########
daffodil-runtime1-unparser/src/main/scala/org/apache/daffodil/unparsers/runtime1/BinaryNumberUnparsers.scala:
##########
@@ -78,17 +76,61 @@ abstract class BinaryNumberBaseUnparser(override val
context: ElementRuntimeData
}
-abstract class BinaryIntegerBaseUnparser(e: ElementRuntimeData, signed:
Boolean)
+abstract class BinaryIntegerBaseUnparser(e: ElementRuntimeData)
extends BinaryNumberBaseUnparser(e) {
+ private val primNumeric =
e.optPrimType.get.asInstanceOf[NodeInfo.PrimType.PrimNumeric]
+
override def putNumber(
dos: DataOutputStream,
value: JNumber,
nBits: Int,
finfo: FormatInfo
): Boolean = {
+ val state = finfo.asInstanceOf[UState]
+ if (primNumeric.minWidth.isDefined) {
+ val isSigned = primNumeric.isSigned
+ val signedStr = if (isSigned) "signed" else "unsigned"
+ val minWidth = primNumeric.minWidth.get
+ if(nBits < minWidth) {
+ val outOfRangeFmtStr =
+ "Minimum length for a %s binary integer is %d bit(s), number of bits
%d out of range. " +
+ "An unsigned integer with length 1 bit could be used instead."
+ if (isSigned && state.tunable.allowSignedIntegerLength1Bit) {
+ state.SDW(
+ WarnID.SignedBinaryIntegerLength1Bit,
+ outOfRangeFmtStr,
+ signedStr,
+ minWidth,
+ nBits
+ )
+ return false
Review Comment:
(previous comment removed, it was wrong)
So it looks like, for parse
0x0 -> 0
0x1 -> 1
And for unparse:
0 -> 0x0
1 -> 0x1
-1 -> 0x1
Other infoset values do not throw an error, so I guess we just aren't doing
proper range checking that the value fits in the number of bits?
I'm not sure 2's complement really makes sense with just a single bit, so I
guess always parsing/unparse to 0 or 1 is just as logical as something else,
and at least it's symmetric.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]