public
Description: A binding between erlang and mzscheme.
Clone URL: git://github.com/KirinDave/erlenmeyer.git
New fancypants parsing method, but not useful for recursives.
KirinDave (author)
Tue Mar 04 23:36:49 -0800 2008
commit  f6b40664057931bfbbff32c2a3e6d501e097e691
tree    df8b28ed00ad53d242b2698abad30cd3bb573520
parent  c9ccdaf4ae2c55f68e62a39aef50cc7a981e525c
...
1
2
 
3
4
5
6
7
8
...
1
 
2
3
4
 
5
6
7
0
@@ -1,8 +1,7 @@
0
 #! /usr/bin/env mzscheme -rq
0
-(require (file "../src/erlen.scm"))
0
+(require (file "../src/erlenmeyer.scm"))
0
 
0
 (define (read-loop)
0
- (bind-ports)
0
   (for-each-erlang-packet (lambda (x) (fprintf (current-error-port) "got ~s~n" x))))
0
 
0
 (read-loop)
...
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
 
17
18
19
 
 
 
 
 
20
21
22
 
 
 
23
24
25
26
 
 
 
 
 
 
 
 
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
56
57
58
59
60
61
62
63
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
65
66
...
77
78
79
80
 
81
82
83
...
88
89
90
91
92
 
 
93
94
 
 
 
95
96
...
2
3
4
 
5
6
7
 
 
 
 
 
 
 
 
8
9
10
 
 
11
12
13
14
15
16
 
 
17
18
19
20
 
 
 
21
22
23
24
25
26
27
28
29
 
 
 
 
 
30
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
 
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
...
102
103
104
 
105
106
107
108
...
113
114
115
 
 
116
117
118
 
119
120
121
122
123
0
@@ -2,65 +2,90 @@
0
   (require (lib "foreign.ss")) (unsafe!)
0
   (provide for-each-erlang-packet
0
            read-next-packet
0
- bind-ports
0
            fd->input-port
0
            fd->output-port)
0
 
0
-; We'll start with the standard ports
0
- (define erlang-input-port (current-input-port))
0
- (define erlang-output-port (current-output-port))
0
-
0
- (define (bind-ports)
0
- (set! erlang-input-port (fd->input-port 3 'erlang-in))
0
- (set! erlang-output-port (fd->output-port 4 'erlang-out)))
0
-
0
+
0
+
0
 ; The all-important fd->input port code thanks to Matthew Flatt
0
- (define (fd->input-port fd name)
0
- (scheme_make_fd_input_port fd name 0 0))
0
+(define (fd->input-port fd name)
0
+ (scheme_make_fd_input_port fd name 0 0))
0
+
0
+(define (fd->output-port fd name)
0
+ (scheme_make_fd_output_port fd name 0 0 0))
0
 
0
- (define (fd->output-port fd name)
0
- (scheme_make_fd_output_port fd name 0 0 0))
0
+(define scheme_make_fd_input_port
0
+ (get-ffi-obj "scheme_make_fd_input_port" #f
0
+ (_fun _int _scheme _int _int -> _scheme)))
0
 
0
- (define scheme_make_fd_input_port
0
- (get-ffi-obj "scheme_make_fd_input_port" #f
0
- (_fun _int _scheme _int _int -> _scheme)))
0
+(define scheme_make_fd_output_port
0
+ (get-ffi-obj "scheme_make_fd_output_port"
0
+ #f
0
+ (_fun _int _scheme _int _int _int -> _scheme)))
0
+
0
+; We'll start with the standard ports
0
+(define erlang-input-port (fd->input-port 3 'erlang-in))
0
+(define erlang-output-port (fd->output-port 4 'erlang-out))
0
 
0
- (define scheme_make_fd_output_port
0
- (get-ffi-obj "scheme_make_fd_output_port"
0
- #f
0
- (_fun _int _scheme _int _int _int -> _scheme)))
0
-
0
 ; Data conversion functions
0
- (define ERL_MAGIC_NUMBER #"\203")
0
- (define ERL_VERSION #"\141")
0
- (define ERL_SMALL_INT 97)
0
- (define ERL_INT 98)
0
- (define ERL_SMALL_BIGNUM 110)
0
- (define ERL_LARGE_BIGNUM 111)
0
- (define ERL_FLOAT 99)
0
- (define ERL_ATOM 100)
0
- (define ERL_REF 101)
0
- (define ERL_NEW_REF 114)
0
- (define ERL_PORT 102)
0
- (define ERL_PID 103)
0
- (define ERL_SMALL_TUPLE 104)
0
- (define ERL_LARGE_TUPLE 105)
0
- (define ERL_NIL 106)
0
- (define ERL_STRING 107)
0
- (define ERL_LIST 108)
0
- (define ERL_BIN 109)
0
- (define ERL_FUN 117)
0
- (define ERL_NEW_FUN 112)
0
-
0
-; May return #eof or data
0
+(define ERL_MAGIC_NUMBER #"\203")
0
+(define ERL_SMALL_INT 97)
0
+(define ERL_INT 98)
0
+(define ERL_SMALL_BIGNUM 110)
0
+(define ERL_LARGE_BIGNUM 111)
0
+(define ERL_FLOAT 99)
0
+(define ERL_ATOM 100)
0
+(define ERL_REF 101)
0
+(define ERL_NEW_REF 114)
0
+(define ERL_PORT 102)
0
+(define ERL_PID 103)
0
+(define ERL_SMALL_TUPLE 104)
0
+(define ERL_LARGE_TUPLE 105)
0
+(define ERL_NIL 106)
0
+(define ERL_STRING 107)
0
+(define ERL_LIST 108)
0
+(define ERL_BIN 109)
0
+(define ERL_FUN 117)
0
+(define ERL_NEW_FUN 112)
0
+
0
+; Reading primitives
0
+(define (peek-1 data) (peek-bytes 1 0 data))
0
+(define (peek-2 data) (peek-bytes 2 0 data))
0
+(define (read-1 data) (read-bytes 1 data))
0
+(define (read-4 data) (read-bytes 4 data))
0
+
0
 (define (read-stream n) (read-bytes n erlang-input-port))
0
-; Must return data or throws 'unexpected-eof
0
 (define (read-stream-i n)
0
   (let ([data (read-bytes n erlang-input-port)])
0
     (cond
0
       ([eof-object? data] (raise 'unexpected-eof))
0
       (else data))))
0
 
0
+(define-syntax define-binary-parser
0
+ (syntax-rules ()
0
+ [(_ name (byte-value processor) ...)
0
+ (define name
0
+ (lambda (bytes)
0
+ (let ([identifier (bytes-ref bytes 0)])
0
+ (fprintf (current-error-port) "In term parser! Bytes: ~s~n" bytes)
0
+ (cond
0
+ [(equal? identifier byte-value)
0
+ (fprintf (current-error-port) "Matched ~s to ~s~n" identifier byte-value)
0
+ (processor (subbytes bytes 1))] ...
0
+ [else (raise `(unknown-data-type ,identifier ,bytes))]))))
0
+ ]
0
+ )
0
+)
0
+
0
+; Data mappers
0
+
0
+(define-binary-parser erlang-term-parser
0
+ [ERL_SMALL_INT (lambda (bytes) (integer-bytes->integer (bytes-append #"\0" bytes) #f #t))]
0
+ [ERL_INT (lambda (bytes) (integer-bytes->integer bytes #t #t))]
0
+ [ERL_ATOM (lambda (bytes) (string->symbol (bytes->string/utf-8 (subbytes bytes 2))))]
0
+ [ERL_STRING (lambda (bytes) (bytes->string/utf-8 (subbytes bytes 2)))]
0
+)
0
+
0
 (define (read-size-field)
0
   (let ([size-bytes (read-stream 4)])
0
     (cond
0
@@ -77,7 +102,7 @@
0
   (let* ([mnum (read-magic-number)]
0
          [data-bytes (read-stream-i (sub1 size))])
0
      (fprintf (current-error-port) "RECORD (~s): ~s~n" mnum data-bytes)
0
- data-bytes))
0
+ (erlang-term-parser data-bytes)))
0
 
0
 (define (read-next-packet)
0
   (let ([size-record (read-size-field)])
0
@@ -88,8 +113,10 @@
0
 (define (for-each-erlang-packet lam)
0
   (display "Waiting on packet to read.\n")
0
   (let ([packet (read-next-packet)])
0
- (case packet
0
- [(eof) eof]
0
+ (cond
0
+ [(eof-object? packet) packet]
0
       [else (lam packet) (for-each-erlang-packet lam)])))
0
-
0
+
0
+
0
+
0
 ) ; End module
0
\ No newline at end of file

Comments

    No one has commented yet.