Author: mdiep
Date: Mon Jan  8 15:31:43 2007
New Revision: 16505

Modified:
   trunk/languages/tcl/src/binary.c
   trunk/languages/tcl/t/cmd_binary.t

Log:
[tcl]: [binary] opcodes:
  - Add support for f, n
  - Add some more tests


Modified: trunk/languages/tcl/src/binary.c
==============================================================================
--- trunk/languages/tcl/src/binary.c    (original)
+++ trunk/languages/tcl/src/binary.c    Mon Jan  8 15:31:43 2007
@@ -13,6 +13,9 @@
 {
     char *c;
     double *d;
+    float *f;
+    int *n;
+
     int len;
     PMC *value = PMCNULL;
     int pos = *_pos;
@@ -35,6 +38,24 @@
             VTABLE_set_number_native(interp, value, *d);
             pos += len;
             break;
+        case 'f':
+            len = sizeof(float)/sizeof(char);
+            if (pos + len > length)
+                break;
+            f     = (float *)(binstr + pos);
+            value = pmc_new(interp, class_TclFloat);
+            VTABLE_set_number_native(interp, value, *f);
+            pos += len;
+            break;
+        case 'n':
+            len = sizeof(int)/sizeof(char);
+            if (pos + len > length)
+                break;
+            n     = (int *)(binstr + pos);
+            value = pmc_new(interp, class_TclInt);
+            VTABLE_set_integer_native(interp, value, *n);
+            pos += len;
+            break;
     }
     (*_pos) = pos;
     return value;
@@ -98,6 +119,9 @@
 {
     char c;
     double d;
+    float f;
+    int n;
+
     INTVAL len;
 
     switch (field)
@@ -113,6 +137,18 @@
             len    = sizeof(double)/sizeof(char);
             binstr = string_concat(interp, binstr, string_from_cstring(interp, 
&d, len), len);
             break;
+        /* a float */
+        case 'f':
+            f      = (float)VTABLE_get_number(interp, value);
+            len    = sizeof(float)/sizeof(char);
+            binstr = string_concat(interp, binstr, string_from_cstring(interp, 
&f, len), len);
+            break;
+        /* a native integer */
+        case 'n':
+            n      = (int)VTABLE_get_integer(interp, value);
+            len    = sizeof(int)/sizeof(char);
+            binstr = string_concat(interp, binstr, string_from_cstring(interp, 
&n, len), len);
+            break;
     }
 
     return binstr;

Modified: trunk/languages/tcl/t/cmd_binary.t
==============================================================================
--- trunk/languages/tcl/t/cmd_binary.t  (original)
+++ trunk/languages/tcl/t/cmd_binary.t  Mon Jan  8 15:31:43 2007
@@ -7,7 +7,7 @@
 __DATA__
 
 source lib/test_more.tcl
-plan 5
+plan 12
 
 eval_is {binary} {wrong # args: should be "binary option ?arg arg ...?"} \
   {binary: no args}
@@ -15,7 +15,30 @@
 eval_is {binary foo} {bad option "foo": must be format or scan} \
   {binary: bad subcommand}
 
+# we test the default precision (which is special) elsewhere
+# so just set a precision to work around a bug
+set tcl_precision 17
+
 binary scan [binary format dccc -1.3 6 7 8] dcc* d c c*
 is $d    -1.3  {binary: reversible d}
 is $c       6  {binary: reversible c}
 is ${c*} {7 8} {binary: scan [format cc] c*}
+
+binary scan [binary format f -1.3] f f
+is $f -1.2999999523162842  {binary: reversible f}
+
+binary scan [binary format n 9] n n
+is $n 9 {binary: reversible n}
+
+set TODO {TODO unimplemented}
+
+binary scan [binary format A6A foo bar] A* string
+eval_is {set string} {foo   b} {binary: format A6A, scan A*} $TODO
+
+binary scan [binary format A* {foo bar}] A7 string
+eval_is {set string} {foo bar} {binary: format A*, scan A7} $TODO
+
+binary scan [binary format a4a foo bar] a3ca string1 c string2
+eval_is {set string1} foo {binary: format a4a, scan a3ca} $TODO
+eval_is {set c}       0   {binary: format a4a, scan a3ca} $TODO
+eval_is {set string2} b   {binary: format a4a, scan a3ca} $TODO

Reply via email to