public
Description: A binding between erlang and mzscheme.
Clone URL: git://github.com/KirinDave/erlenmeyer.git
Some minor cleanups. Really I'm just trying to avoid watching Hard Candy.
KirinDave (author)
Mon Mar 10 23:59:03 -0700 2008
commit  f9ecb20fb6f4b6aad1d221fae0cefce329855b42
tree    2f08f7d113e5436b2c29e42148aa1cd1aec7ce47
parent  499c38977636cb6919f98214f48b82e967badbf3
...
56
57
58
59
60
 
 
 
 
61
62
63
...
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
...
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
 
 
 
 
 
124
125
126
...
128
129
130
 
 
 
 
 
 
 
 
 
 
131
132
133
...
56
57
58
 
 
59
60
61
62
63
64
65
...
82
83
84
 
 
 
 
 
 
 
 
 
 
 
85
86
87
...
94
95
96
 
97
 
98
99
100
101
102
103
 
 
 
 
 
 
 
 
 
104
105
106
107
108
109
110
111
...
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
0
@@ -56,8 +56,10 @@
0
       (else data))))
0
 
0
 ; Frequently used functions in erlang binary takes a single unsigned byte and maps it to an int.
0
-(define (byte->uint byte) (integer-bytes->integer (bytes-append #"\0" bytes) #f #t))
0
-(define (bytes->int bytes) (integer-bytes->integer bytes #t #t))
0
+(define (byte->uint byte)
0
+ (integer-bytes->integer (bytes-append #"\0" byte) #f #t))
0
+(define (bytes->int bytes)
0
+ (integer-bytes->integer bytes #t #t))
0
 
0
 ; Specification language macro
0
 (define-syntax define-binary-parser
0
@@ -80,17 +82,6 @@
0
    (xform processor-spec)] ...
0
    [else (raise `(unknown-data-type ,identifier ,bytes))])))))]))
0
 
0
-; Parser helpers
0
-(define (parse-raw-entity bytes size processor)
0
- (let [(rem-bytes (subbytes bytes size))
0
- (data-bytes (subbytes bytes 0 size))]
0
- (cons (processor data-bytes) rem-bytes)))
0
-
0
-(define (parse-sized-entity bytes size-field-length processor)
0
- (let* [(sizebytes (subbytes bytes 0 size-field-length))
0
- (size (integer-bytes->integer sizebytes #f #t))]
0
- (parse-raw-entity (subbytes bytes size-field-length) size processor)))
0
-
0
 ; Data mappers
0
 
0
 (define-binary-parser erlang-term-parser
0
@@ -103,24 +94,18 @@
0
   [ERL_LIST (custom list-parser)]
0
   [ERL_SMALL_TUPLE (custom small-tuple-parser)]
0
 )
0
-;
0
 ; Recursive datatype parsers
0
-;
0
 
0
 ; Tuples
0
 (define (repeat-parser dbytes size-field-size size-field-converter finalizer)
0
   (let* [(sbytes (subbytes dbytes 0 size-field-size))
0
    (ebytes (subbytes dbytes size-field-size))
0
    (nelems (size-field-converter sbytes))]
0
- ; input is: bytes, countdown, accumulated elements
0
- (letrec [(loop (lambda (b c accum)
0
- (fprintf (current-error-port) "Inner loop (~s) with ~s~n" c accum)
0
- (cond ((equal? c 0) (cons (finalizer (reverse accum)) b))
0
- (else
0
- (match-let [((val . rbytes) (erlang-term-parser b))]
0
- (loop rbytes (sub1 c) (cons val accum)))))
0
- ))]
0
- (loop ebytes nelems (list)))))
0
+ (let loop ([b ebytes] [c nelems] [accum (list)])
0
+ (cond ((equal? c 0) (cons (finalizer (reverse accum)) b))
0
+ (else
0
+ (match-let [((val . rbytes) (erlang-term-parser b))]
0
+ (loop rbytes (sub1 c) (cons val accum))))))))
0
 
0
 (define (small-tuple-parser dbytes) (repeat-parser dbytes 1 byte->uint (lambda (x) (list->vector x))))
0
 (define (large-tuple-parser dbytes) (repeat-parser dbytes 4 bytes->int (lambda (x) (list->vector x))))
0
@@ -128,6 +113,16 @@
0
   (match-let [((val . rbytes) (repeat-parser dbytes 4 bytes->int (lambda (x) x)))]
0
    (cons val (subbytes rbytes 1)))) ; Skip the trailing nil in lists.
0
 
0
+; Parser helpers
0
+(define (parse-raw-entity bytes size processor)
0
+ (let [(rem-bytes (subbytes bytes size))
0
+ (data-bytes (subbytes bytes 0 size))]
0
+ (cons (processor data-bytes) rem-bytes)))
0
+
0
+(define (parse-sized-entity bytes size-field-length processor)
0
+ (let* [(sizebytes (subbytes bytes 0 size-field-length))
0
+ (size (integer-bytes->integer sizebytes #f #t))]
0
+ (parse-raw-entity (subbytes bytes size-field-length) size processor)))
0
 
0
 (define (read-size-field)
0
   (let ([size-bytes (read-stream 4)])

Comments

    No one has commented yet.