You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@daffodil.apache.org by ja...@apache.org on 2018/07/09 14:52:40 UTC

[incubator-daffodil] 03/13: Added conversion function for AsciiTandemModified

This is an automated email from the ASF dual-hosted git repository.

jadams pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-daffodil.git

commit 6fd9ead0755cf8b2af4339fa740f673f938cc513
Author: Josh Adams <ja...@tresys.com>
AuthorDate: Tue Apr 10 16:37:12 2018 -0400

    Added conversion function for AsciiTandemModified
    
    Added test cases as well.
---
 .../org/apache/daffodil/util/DecimalUtils.scala    | 26 +++++---
 .../apache/daffodil/util/TestDecimalUtils.scala    | 70 ++++++++++++++++++++++
 .../apache/daffodil/xsd/DFDL_part1_simpletypes.xsd |  1 +
 3 files changed, 88 insertions(+), 9 deletions(-)

diff --git a/daffodil-lib/src/main/scala/org/apache/daffodil/util/DecimalUtils.scala b/daffodil-lib/src/main/scala/org/apache/daffodil/util/DecimalUtils.scala
index 87fc47f..5851369 100644
--- a/daffodil-lib/src/main/scala/org/apache/daffodil/util/DecimalUtils.scala
+++ b/daffodil-lib/src/main/scala/org/apache/daffodil/util/DecimalUtils.scala
@@ -336,7 +336,7 @@ object DecimalUtils {
   }
 
   def convertFromAsciiStandard(digit: Int): Int = {
-    if ((digit >= 48) && (digit <= 57))
+    if ((digit >= 48) && (digit <= 57)) // positive 0-9
       return digit - 48
     else if ((digit >= 112) && (digit <= 121)) // negative 0-9
       return -(digit - 112)
@@ -382,7 +382,7 @@ object DecimalUtils {
   }
 
   def convertFromAsciiCARealiaModified(digit: Int): Int = {
-    if ((digit >= 48) && (digit <= 57))
+    if ((digit >= 48) && (digit <= 57)) // positive 0-9
       return digit - 48
     else if ((digit >= 32) && (digit <= 41)) // negative 0-9
       return -(digit - 32)
@@ -396,14 +396,21 @@ object DecimalUtils {
       return (digit - 16).asInstanceOf[Char]
   }
 
-  /*def convertAsciiTandemModified(digit: Int): Int = {
-    if ((digit >= 0) && (digit <= 9))
-      return digit
-    else if ((digit >= 32) && (digit <= 41)) // negative 0-9
-      return -(digit - 32)
+  def convertFromAsciiTandemModified(digit: Int): Int = {
+    if ((digit >= 48) && (digit <= 57)) // positive 0-9
+      return digit - 48
+    else if ((digit >= 128) && (digit <= 137)) // negative 0-9
+      return -(digit - 128)
     else
       return 0
-  }*/
+  }
+
+  def convertToAsciiTandemModified(digit: Char, positive: Boolean): Char = {
+    if (positive)
+      return digit
+    else
+      return (digit + 80).asInstanceOf[Char]
+  }
 
   def zonedToInt(num: String, zonedStyle: TextZonedSignStyle): Int = {
     val decodedValue = new StringBuilder()
@@ -414,7 +421,7 @@ object DecimalUtils {
         case TextZonedSignStyle.AsciiStandard => convertFromAsciiStandard(char)
         case TextZonedSignStyle.AsciiTranslatedEBCDIC => convertFromAsciiTranslatedEBCDIC(char)
         case TextZonedSignStyle.AsciiCARealiaModified => convertFromAsciiCARealiaModified(char)
-        //case TextZonedSignStyle.AsciiTandemModified => convertAsciiTandemModified(char)
+        case TextZonedSignStyle.AsciiTandemModified => convertFromAsciiTandemModified(char)
       }
 
       if ((digit < 0) && !negative)
@@ -439,6 +446,7 @@ object DecimalUtils {
         case TextZonedSignStyle.AsciiStandard => convertToAsciiStandard(char, positive)
         case TextZonedSignStyle.AsciiTranslatedEBCDIC => convertToAsciiTranslatedEBCDIC(char, positive)
         case TextZonedSignStyle.AsciiCARealiaModified => convertToAsciiCARealiaModified(char, positive)
+        case TextZonedSignStyle.AsciiTandemModified => convertToAsciiTandemModified(char, positive)
       }
 
       encodedValue.append(digit)
diff --git a/daffodil-lib/src/test/scala/org/apache/daffodil/util/TestDecimalUtils.scala b/daffodil-lib/src/test/scala/org/apache/daffodil/util/TestDecimalUtils.scala
index 8b736a8..fc1c950 100644
--- a/daffodil-lib/src/test/scala/org/apache/daffodil/util/TestDecimalUtils.scala
+++ b/daffodil-lib/src/test/scala/org/apache/daffodil/util/TestDecimalUtils.scala
@@ -1390,4 +1390,74 @@ class TestDecimalUtils {
     assertEquals(zonedFromInt(result, TextZonedSignStyle.AsciiCARealiaModified), "!\"#$%&'() ")
   }
 
+  @Test def zonedIntAsciiTandemModifiedPos1() {
+    val num = "1"
+    val result = zonedToInt(num, TextZonedSignStyle.AsciiTandemModified)
+    assertEquals(result, 1)
+    assertEquals(zonedFromInt(result, TextZonedSignStyle.AsciiTandemModified), num)
+  }
+
+  @Test def zonedIntAsciiTandemModifiedPos2() {
+    val num = "12"
+    val result = zonedToInt(num, TextZonedSignStyle.AsciiTandemModified)
+    assertEquals(result, 12)
+    assertEquals(zonedFromInt(result, TextZonedSignStyle.AsciiTandemModified), num)
+  }
+
+  @Test def zonedIntAsciiTandemModifiedPos3() {
+    val num = "123"
+    val result = zonedToInt(num, TextZonedSignStyle.AsciiTandemModified)
+    assertEquals(result, 123)
+    assertEquals(zonedFromInt(result, TextZonedSignStyle.AsciiTandemModified), num)
+  }
+
+  @Test def zonedIntAsciiTandemModifiedPos4() {
+    val num = "1234567890"
+    val result = zonedToInt(num, TextZonedSignStyle.AsciiTandemModified)
+    assertEquals(result, 1234567890)
+    assertEquals(zonedFromInt(result, TextZonedSignStyle.AsciiTandemModified), num)
+  }
+
+  @Test def zonedIntAsciiTandemModifiedPos5() {
+    val num = "000000000001234567890"
+    val result = zonedToInt(num, TextZonedSignStyle.AsciiTandemModified)
+    assertEquals(result, 1234567890)
+    assertEquals(zonedFromInt(result, TextZonedSignStyle.AsciiTandemModified), "1234567890")
+  }
+
+  @Test def zonedIntAsciiTandemModifiedNeg1() {
+    val num = ""
+    val result = zonedToInt(num, TextZonedSignStyle.AsciiTandemModified)
+    assertEquals(result, -1)
+    assertEquals(zonedFromInt(result, TextZonedSignStyle.AsciiTandemModified), num)
+  }
+
+  @Test def zonedIntAsciiTandemModifiedNeg2() {
+    val num = "‚"
+    val result = zonedToInt(num, TextZonedSignStyle.AsciiTandemModified)
+    assertEquals(result, -12)
+    assertEquals(zonedFromInt(result, TextZonedSignStyle.AsciiTandemModified), num)
+  }
+
+  @Test def zonedIntAsciiTandemModifiedNeg3() {
+    val num = "‚ƒ"
+    val result = zonedToInt(num, TextZonedSignStyle.AsciiTandemModified)
+    assertEquals(result, -123)
+    assertEquals(zonedFromInt(result, TextZonedSignStyle.AsciiTandemModified), num)
+  }
+
+  @Test def zonedIntAsciiTandemModifiedNeg4() {
+    val num = "‚ƒ„…†‡ˆ‰€"
+    val result = zonedToInt(num, TextZonedSignStyle.AsciiTandemModified)
+    assertEquals(result, -1234567890)
+    assertEquals(zonedFromInt(result, TextZonedSignStyle.AsciiTandemModified), num)
+  }
+
+  @Test def zonedIntAsciiTandemModifiedNeg5() {
+    val num = "€€€€€€€€€€€‚ƒ„…†‡ˆ‰€"
+    val result = zonedToInt(num, TextZonedSignStyle.AsciiTandemModified)
+    assertEquals(result, -1234567890)
+    assertEquals(zonedFromInt(result, TextZonedSignStyle.AsciiTandemModified), "‚ƒ„…†‡ˆ‰€")
+  }
+
 }
diff --git a/daffodil-propgen/src/main/resources/org/apache/daffodil/xsd/DFDL_part1_simpletypes.xsd b/daffodil-propgen/src/main/resources/org/apache/daffodil/xsd/DFDL_part1_simpletypes.xsd
index 1d1635c..280c367 100644
--- a/daffodil-propgen/src/main/resources/org/apache/daffodil/xsd/DFDL_part1_simpletypes.xsd
+++ b/daffodil-propgen/src/main/resources/org/apache/daffodil/xsd/DFDL_part1_simpletypes.xsd
@@ -314,6 +314,7 @@
       <xsd:enumeration value="asciiStandard" />
       <xsd:enumeration value="asciiTranslatedEBCDIC" />
       <xsd:enumeration value="asciiCARealiaModified" />
+      <xsd:enumeration value="asciiTandemModified" />
     </xsd:restriction>
   </xsd:simpleType>