<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,8 +1,7 @@
 #! /usr/bin/env mzscheme -rq
-(require (file &quot;../src/erlen.scm&quot;))
+(require (file &quot;../src/erlenmeyer.scm&quot;))
 
 (define (read-loop)
-  (bind-ports)
   (for-each-erlang-packet (lambda (x) (fprintf (current-error-port) &quot;got ~s~n&quot; x))))
 
 (read-loop)</diff>
      <filename>bin/test-node.scm</filename>
    </modified>
    <modified>
      <diff>@@ -2,65 +2,90 @@
   (require (lib &quot;foreign.ss&quot;)) (unsafe!)
   (provide for-each-erlang-packet
            read-next-packet 
-           bind-ports
            fd-&gt;input-port
            fd-&gt;output-port)
 
-;  We'll start with the standard ports
-  (define erlang-input-port (current-input-port))
-  (define erlang-output-port (current-output-port))
- 
-  (define (bind-ports)
-    (set! erlang-input-port  (fd-&gt;input-port 3 'erlang-in))
-    (set! erlang-output-port (fd-&gt;output-port 4 'erlang-out)))
-  
+
+
 ; The all-important fd-&gt;input port code thanks to Matthew Flatt
-  (define (fd-&gt;input-port fd name)
-    (scheme_make_fd_input_port fd name 0 0))
+(define (fd-&gt;input-port fd name)
+  (scheme_make_fd_input_port fd name 0 0))
+
+(define (fd-&gt;output-port fd name)
+  (scheme_make_fd_output_port fd name 0 0 0))
 
-  (define (fd-&gt;output-port fd name)
-    (scheme_make_fd_output_port fd name 0 0 0))
+(define scheme_make_fd_input_port
+  (get-ffi-obj &quot;scheme_make_fd_input_port&quot; #f
+               (_fun _int _scheme _int _int -&gt; _scheme)))
 
-  (define scheme_make_fd_input_port
-    (get-ffi-obj &quot;scheme_make_fd_input_port&quot; #f
-                 (_fun _int _scheme _int _int -&gt; _scheme)))
+(define scheme_make_fd_output_port
+  (get-ffi-obj &quot;scheme_make_fd_output_port&quot;
+                #f
+                (_fun _int _scheme _int _int _int -&gt; _scheme)))
+
+;  We'll start with the standard ports
+(define erlang-input-port (fd-&gt;input-port 3 'erlang-in))
+(define erlang-output-port (fd-&gt;output-port 4 'erlang-out))
 
-  (define scheme_make_fd_output_port
-    (get-ffi-obj &quot;scheme_make_fd_output_port&quot;
-                  #f
-                  (_fun _int _scheme _int _int _int -&gt; _scheme)))
-  
 ; Data conversion functions
-  (define ERL_MAGIC_NUMBER  #&quot;\203&quot;)
-  (define ERL_VERSION       #&quot;\141&quot;)
-  (define ERL_SMALL_INT     97)
-  (define ERL_INT           98)
-  (define ERL_SMALL_BIGNUM  110)
-  (define ERL_LARGE_BIGNUM  111)
-  (define ERL_FLOAT         99)
-  (define ERL_ATOM          100)
-  (define ERL_REF           101)
-  (define ERL_NEW_REF       114)
-  (define ERL_PORT          102)
-  (define ERL_PID           103)
-  (define ERL_SMALL_TUPLE   104)
-  (define ERL_LARGE_TUPLE   105)
-  (define ERL_NIL           106)
-  (define ERL_STRING        107)
-  (define ERL_LIST          108)
-  (define ERL_BIN           109)
-  (define ERL_FUN           117)
-  (define ERL_NEW_FUN       112)
-
-; May return #eof or data
+(define ERL_MAGIC_NUMBER  #&quot;\203&quot;)
+(define ERL_SMALL_INT     97)
+(define ERL_INT           98)
+(define ERL_SMALL_BIGNUM  110)
+(define ERL_LARGE_BIGNUM  111)
+(define ERL_FLOAT         99)
+(define ERL_ATOM          100)
+(define ERL_REF           101)
+(define ERL_NEW_REF       114)
+(define ERL_PORT          102)
+(define ERL_PID           103)
+(define ERL_SMALL_TUPLE   104)
+(define ERL_LARGE_TUPLE   105)
+(define ERL_NIL           106)
+(define ERL_STRING        107)
+(define ERL_LIST          108)
+(define ERL_BIN           109)
+(define ERL_FUN           117)
+(define ERL_NEW_FUN       112)
+
+; Reading primitives
+(define (peek-1 data) (peek-bytes 1 0 data))
+(define (peek-2 data) (peek-bytes 2 0 data))
+(define (read-1 data) (read-bytes 1 data))
+(define (read-4 data) (read-bytes 4 data))
+
 (define (read-stream n) (read-bytes n erlang-input-port))
-; Must return data or throws 'unexpected-eof
 (define (read-stream-i n) 
   (let ([data (read-bytes n erlang-input-port)])
     (cond
       ([eof-object? data] (raise 'unexpected-eof))
       (else data))))
 
+(define-syntax define-binary-parser
+  (syntax-rules ()
+    [(_ name (byte-value processor) ...)
+     (define name 
+       (lambda (bytes)
+         (let ([identifier (bytes-ref bytes 0)])
+          (fprintf (current-error-port) &quot;In term parser! Bytes: ~s~n&quot; bytes)
+          (cond 
+            [(equal? identifier byte-value) 
+              (fprintf (current-error-port) &quot;Matched ~s to ~s~n&quot; identifier byte-value)
+              (processor (subbytes bytes 1))] ...
+            [else (raise `(unknown-data-type ,identifier ,bytes))]))))
+	  ]
+	)
+)
+
+; Data mappers
+
+(define-binary-parser erlang-term-parser
+  [ERL_SMALL_INT (lambda (bytes) (integer-bytes-&gt;integer (bytes-append #&quot;\0&quot; bytes) #f #t))]
+  [ERL_INT (lambda (bytes) (integer-bytes-&gt;integer bytes #t #t))]
+  [ERL_ATOM (lambda (bytes) (string-&gt;symbol (bytes-&gt;string/utf-8 (subbytes bytes 2))))]
+  [ERL_STRING (lambda (bytes) (bytes-&gt;string/utf-8 (subbytes bytes 2)))]
+)
+
 (define (read-size-field)
   (let ([size-bytes (read-stream 4)])
     (cond 
@@ -77,7 +102,7 @@
   (let* ([mnum       (read-magic-number)]
          [data-bytes (read-stream-i (sub1 size))])
      (fprintf (current-error-port) &quot;RECORD (~s): ~s~n&quot; mnum data-bytes)
-     data-bytes))
+     (erlang-term-parser data-bytes)))
 
 (define (read-next-packet)
   (let ([size-record (read-size-field)])
@@ -88,8 +113,10 @@
 (define (for-each-erlang-packet lam)
   (display &quot;Waiting on packet to read.\n&quot;)
   (let ([packet (read-next-packet)])
-    (case packet
-      [(eof) eof]
+    (cond 
+      [(eof-object? packet) packet]
       [else (lam packet) (for-each-erlang-packet lam)])))
-  
+
+
+
 ) ; End module
\ No newline at end of file</diff>
      <filename>src/erlenmeyer.scm</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>c9ccdaf4ae2c55f68e62a39aef50cc7a981e525c</id>
    </parent>
  </parents>
  <author>
    <name>David Fayram</name>
    <email>dfayram@gmail.com</email>
  </author>
  <url>http://github.com/KirinDave/erlenmeyer/commit/f6b40664057931bfbbff32c2a3e6d501e097e691</url>
  <id>f6b40664057931bfbbff32c2a3e6d501e097e691</id>
  <committed-date>2008-03-04T23:36:49-08:00</committed-date>
  <authored-date>2008-03-04T23:36:49-08:00</authored-date>
  <message>New fancypants parsing method, but not useful for recursives.</message>
  <tree>df8b28ed00ad53d242b2698abad30cd3bb573520</tree>
  <committer>
    <name>David Fayram</name>
    <email>dfayram@gmail.com</email>
  </committer>
</commit>
