Author: mdiep
Date: Sat Jan  6 14:03:06 2007
New Revision: 16447

Added:
   trunk/languages/tcl/src/binary.c
   trunk/languages/tcl/src/binary.h
Modified:
   trunk/MANIFEST
   trunk/languages/tcl/config/makefiles/root.in
   trunk/languages/tcl/src/ops/tcl.ops

Log:
[tcl]: Create a .c file for [binary] functions

Modified: trunk/MANIFEST
==============================================================================
--- trunk/MANIFEST      (original)
+++ trunk/MANIFEST      Sat Jan  6 14:03:06 2007
@@ -1934,6 +1934,8 @@
 languages/tcl/src/pmc/tcllist.pmc                           [tcl]
 languages/tcl/src/pmc/tclobject.pmc                         [tcl]
 languages/tcl/src/pmc/tclstring.pmc                         [tcl]
+languages/tcl/src/binary.c                                  [tcl]
+languages/tcl/src/binary.h                                  [tcl]
 languages/tcl/src/returncodes.pir                           [tcl]
 languages/tcl/src/tclsh.pir                                 [tcl]
 languages/tcl/t/cmd_after.t                                 [tcl]

Modified: trunk/languages/tcl/config/makefiles/root.in
==============================================================================
--- trunk/languages/tcl/config/makefiles/root.in        (original)
+++ trunk/languages/tcl/config/makefiles/root.in        Sat Jan  6 14:03:06 2007
@@ -16,8 +16,6 @@
 PGE_DIR  = ../../compilers/pge
 TGE_DIR  = ../../compilers/tge
 
-OPSLIBS   = tcl
-
 # can't use $(wildcard) and friends for PMCS, as these have to be in 
 # dependency order; with no duplicates. 
 PMCS = \
@@ -110,11 +108,20 @@
        @cd $(PMCDIR) && $(PMCBUILD) linklibs $(PMCS)
        @cd $(PMCDIR) && $(PMCBUILD) copy "--destination=$(DESTDIR)" $(PMCS)
 
-ops:
-       @cd $(OPSDIR) && $(OPSBUILD) generate $(OPSLIBS)
-       @cd $(OPSDIR) && $(OPSBUILD) compile $(OPSLIBS)
-       @cd $(OPSDIR) && $(OPSBUILD) linklibs $(OPSLIBS)
-       @cd $(OPSDIR) && $(OPSBUILD) copy "--destination=$(DESTDIR)" $(OPSLIBS)
+# THIS WAS COPIED FROM THE ROOT MAKEFILE
+# Passing an empty argument in @ARGV to cc_flags.pl to indicate where extra -Is
+# (etc) should go. Otherwise it will insert them after the first space, which
+# makes life go horribly wrong if $(CC) contains spaces but can't have -I
+# arguments (etc) injected in the middle.
+# There is probably a better way to do this, but I can't work it out right now.
+.c$(O) :   
+       @$(PERL) ../../tools/dev/cc_flags.pl ../../CFLAGS $(CC) "" $(CFLAGS) 
[EMAIL PROTECTED]@@[EMAIL PROTECTED] @[EMAIL PROTECTED]@ -c $<
+
+ops: src/binary.o
+       @cd $(OPSDIR) && $(OPSBUILD) generate tcl
+       @cd $(OPSDIR) && $(OPSBUILD) compile  tcl
+       @cd $(OPSDIR) && $(OPSBUILD) linklibs tcl ../binary.o
+       @cd $(OPSDIR) && $(OPSBUILD) copy "--destination=$(DESTDIR)" tcl
 
 runtime/builtins.pir: $(GENERATED_INLINES) $(DEPS) tools/gen_builtins.pl
        $(PERL) tools/gen_builtins.pl > runtime/builtins.pir
@@ -306,6 +313,7 @@
 $(GENERATED_INLINES) \
 "$(OPSDIR)/*.c" \
 "$(OPSDIR)/*.h" \
+"src/*$(O)" \
 "$(OPSDIR)/*$(O)" \
 "$(OPSDIR)/*.bundle" \
 "$(TCL_LIB)/*.pir"

Added: trunk/languages/tcl/src/binary.c
==============================================================================
--- (empty file)
+++ trunk/languages/tcl/src/binary.c    Sat Jan  6 14:03:06 2007
@@ -0,0 +1,88 @@
+
+#include "parrot/parrot.h"
+
+#include "binary.h"
+
+PMC *ParTcl_binary_scan(Interp *interp, STRING *BINSTR, STRING *FORMAT)
+{
+    char *binstr     = string_to_cstring(interp, BINSTR);
+    INTVAL binstrlen = string_length(interp, BINSTR);
+    INTVAL binstrpos = 0;
+    char *format     = string_to_cstring(interp, FORMAT);
+    INTVAL formatlen = string_length(interp, FORMAT);
+    INTVAL formatpos = 0;
+    INTVAL value     = 0;
+    PMC *values      = pmc_new(interp, enum_class_ResizablePMCArray);
+    
+    while (formatpos < formatlen)
+    {
+        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, values, pmcval);
+                binstrpos += 1;
+                break;
+            case 'd':
+                len = sizeof(double)/sizeof(char);
+                if (binstrpos + len > binstrlen)
+                {
+                    formatpos = formatlen;
+                    break;
+                }
+                    d = (double *)(binstr + binstrpos);
+                pmcval = pmc_new(interp, enum_class_Float);
+                VTABLE_set_number_native(interp, pmcval, *d);
+                VTABLE_push_pmc(interp, values, pmcval);
+                binstrpos += len;
+                break;
+            default:
+                break;
+        }
+    }
+
+    return values;
+}
+
+STRING *ParTcl_binary_format(Interp *interp, STRING *FORMAT, PMC *values)
+{
+    char *format      = string_to_cstring(interp, FORMAT);
+    INTVAL formatlen  = string_length(interp, FORMAT);
+    INTVAL pos        = 0;
+    INTVAL value      = 0;
+    STRING *binstr    = string_from_cstring(interp, "", 0);
+    
+    while (pos < formatlen)
+    {
+        char c;
+        double d;
+        INTVAL len;
+        switch (format[pos++])
+        {
+            case 'c':
+                c      = (char)VTABLE_get_integer_keyed_int(interp, values, 
value++);
+                binstr = string_concat(interp, binstr, 
string_from_cstring(interp, &c, 1), 1);
+                break;
+            case 'd':
+                d      = VTABLE_get_integer_keyed_int(interp, values, value++);
+                len    = sizeof(double)/sizeof(char);
+                binstr = string_concat(interp, binstr, 
string_from_cstring(interp, &d, len), len);
+                break;
+            default:
+                break;
+        }
+    }
+
+    return binstr;
+}

Added: trunk/languages/tcl/src/binary.h
==============================================================================
--- (empty file)
+++ trunk/languages/tcl/src/binary.h    Sat Jan  6 14:03:06 2007
@@ -0,0 +1,3 @@
+
+PMC *ParTcl_binary_scan(Interp *interp, STRING *BINSTR, STRING *FORMAT);
+STRING *ParTcl_binary_format(Interp *interp, STRING *FORMAT, PMC *values);

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 14:03:06 2007
@@ -2,9 +2,11 @@
 ** tcl.ops
 */
 
-#include "parrot/dynext.h"
+#include "parrot/parrot.h"
 #include "parrot/string_funcs.h"
 
+#include "../binary.h"
+
 VERSION = PARROT_VERSION;
 
 =head1 NAME
@@ -34,53 +36,7 @@
 =cut
 
 inline op tcl_binary_scan(out PMC, in STR, in STR) {
-    char *binstr     = string_to_cstring(interp, $2);
-    INTVAL binstrlen = string_length(interp, $2);
-    INTVAL binstrpos = 0;
-    char *format     = string_to_cstring(interp, $3);
-    INTVAL formatlen = string_length(interp, $3);
-    INTVAL formatpos = 0;
-    INTVAL value     = 0;
-    $1               = pmc_new(interp, enum_class_ResizablePMCArray);
-
-    while (formatpos < formatlen)
-    {
-        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(double)/sizeof(char);
-                if (binstrpos + len > binstrlen)
-                {
-                    formatpos = formatlen;
-                    break;
-                }
-                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;
-        }
-    }
-
+    $1 = ParTcl_binary_scan(interp, $2, $3);
     goto NEXT();
 }
 
@@ -91,33 +47,7 @@
 =cut
 
 inline op tcl_binary_format(out STR, in STR, in PMC) {
-    char *format      = string_to_cstring(interp, $2);
-    INTVAL formatlen  = string_length(interp, $2);
-    INTVAL pos        = 0;
-    INTVAL value      = 0;
-    $1                = string_from_cstring(interp, "", 0);
-
-    while (pos < formatlen)
-    {
-        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(double)/sizeof(char);
-                $1  = string_concat(interp, $1, string_from_cstring(interp, 
&d, len), len);
-                break;
-            default:
-                break;
-        }
-    }
-
+    $1 = ParTcl_binary_format(interp, $2, $3);
     goto NEXT();
 }
 

Reply via email to