Author: mdiep
Date: Sat Jan  6 12:38:20 2007
New Revision: 16439

Modified:
   trunk/languages/tcl/src/ops/tcl.ops

Log:
[tcl]: Add "c" to the [binary] opcodes

Modified: trunk/languages/tcl/src/ops/tcl.ops
==============================================================================
--- trunk/languages/tcl/src/ops/tcl.ops (original)
+++ trunk/languages/tcl/src/ops/tcl.ops Sat Jan  6 12:38:20 2007
@@ -45,21 +45,36 @@
 
     while (formatpos < formatlen)
     {
-        INTVAL d, len;
+        char *c;
+        double *d;
+        INTVAL len;
         PMC *pmcval;
         switch (format[formatpos++])
         {
+            case 'c':
+                if (binstrpos + 1 > binstrlen)
+                {
+                    formatpos = formatlen;
+                    break;
+                }
+                c = binstr + binstrpos;
+                pmcval = pmc_new(interp, enum_class_Integer);
+                VTABLE_set_integer_native(interp, pmcval, (int)(char)*c);
+                VTABLE_push_pmc(interp, $1, pmcval);
+                binstrpos += 1;
+                break;
             case 'd':
-                len = sizeof(int)/sizeof(char);
+                len = sizeof(double)/sizeof(char);
                 if (binstrpos + len > binstrlen)
                 {
                     formatpos = formatlen;
                     break;
                 }
-                d = *(binstr + binstrpos);
-                pmcval = pmc_new(interp, enum_class_Integer);
-                VTABLE_set_integer_native(interp, pmcval, d);
+                d = (double *)(binstr + binstrpos);
+                pmcval = pmc_new(interp, enum_class_Float);
+                VTABLE_set_number_native(interp, pmcval, *d);
                 VTABLE_push_pmc(interp, $1, pmcval);
+                binstrpos += len;
                 break;
             default:
                 break;
@@ -84,12 +99,18 @@
 
     while (pos < formatlen)
     {
-        INTVAL d, len;
+        char c;
+        double d;
+        INTVAL len;
         switch (format[pos++])
         {
+            case 'c':
+                c  = (char)VTABLE_get_integer_keyed_int(interp, $3, value++);
+                $1 = string_concat(interp, $1, string_from_cstring(interp, &c, 
1), 1);
+                break;
             case 'd':
                 d   = VTABLE_get_integer_keyed_int(interp, $3, value++);
-                len = sizeof(int)/sizeof(char);
+                len = sizeof(double)/sizeof(char);
                 $1  = string_concat(interp, $1, string_from_cstring(interp, 
&d, len), len);
                 break;
             default:

Reply via email to