diff --git a/pitfall/pdfkit/node_modules/restructure/test.coffee b/pitfall/pdfkit/node_modules/restructure/test.coffee new file mode 100644 index 00000000..e0cb1900 --- /dev/null +++ b/pitfall/pdfkit/node_modules/restructure/test.coffee @@ -0,0 +1,22 @@ + +{Struct, String:StringT, Array:ArrayT, Pointer, uint8, DecodeStream, EncodeStream} = require './index.js' +concat = require '../concat-stream/index.js' + +struct = new Struct + name: new StringT uint8 + age: uint8 + ptr: new Pointer uint8, new StringT uint8 + +console.log struct.size + name: 'devon' + age: 21 + ptr: 'hello' + + +stream = new EncodeStream +stream.pipe concat (buf) -> + console.log buf # .should.deep.equal new Buffer [4, 5, 6, 7, 8, 1, 2, 3, 4] + +array = new ArrayT new Pointer(uint8, uint8), uint8 +array.encode(stream, [1, 2, 3, 4]) +stream.end() diff --git a/pitfall/restructure/array-test.rkt b/pitfall/restructure/array-test.rkt index aceeccce..ef2245fa 100644 --- a/pitfall/restructure/array-test.rkt +++ b/pitfall/restructure/array-test.rkt @@ -166,8 +166,7 @@ https://github.com/mbutterick/restructure/blob/master/test/Array.coffee ; array.encode(stream, [1, 2, 3, 4]) ; stream.end() -(displayln "warning: pointer test not done") -#;(let ([stream (+EncodeStream)] +(let ([stream (+EncodeStream)] [array (+ArrayT (+Pointer uint8 uint8) uint8)]) (send array encode stream '(1 2 3 4)) (check-equal? (send stream dump) (+Buffer '(4 5 6 7 8 1 2 3 4)))) \ No newline at end of file diff --git a/pitfall/restructure/main.rkt b/pitfall/restructure/main.rkt index 3c08a7f2..a86d4fc0 100644 --- a/pitfall/restructure/main.rkt +++ b/pitfall/restructure/main.rkt @@ -22,4 +22,4 @@ "bitfield-test.rkt" "stream-test.rkt" "buffer-test.rkt" - #;"pointer-test.rkt")) \ No newline at end of file + "pointer-test.rkt")) \ No newline at end of file diff --git a/pitfall/restructure/pointer.rkt b/pitfall/restructure/pointer.rkt index 0ec7b264..916da928 100644 --- a/pitfall/restructure/pointer.rkt +++ b/pitfall/restructure/pointer.rkt @@ -74,7 +74,8 @@ https://github.com/mbutterick/restructure/blob/master/src/Pointer.coffee (set! val (ref val 'value))) (when (and val ctx) - (ref-set! ctx 'pointerSize (+ (ref ctx 'pointerSize) (send type size val parent)))) + (ref-set! ctx 'pointerSize (and (ref ctx 'pointerSize) + (+ (ref ctx 'pointerSize) (send type size val parent))))) (send offsetType size)) diff --git a/pitfall/restructure/struct-test.rkt b/pitfall/restructure/struct-test.rkt index f54b1b42..791cfc63 100644 --- a/pitfall/restructure/struct-test.rkt +++ b/pitfall/restructure/struct-test.rkt @@ -1,5 +1,5 @@ #lang restructure/racket -(require "struct.rkt" "string.rkt" "number.rkt" "buffer.rkt" "stream.rkt" rackunit) +(require "struct.rkt" "string.rkt" "number.rkt" "buffer.rkt" "stream.rkt" rackunit "pointer.rkt") #| approximates @@ -84,7 +84,6 @@ https://github.com/mbutterick/restructure/blob/master/test/Struct.coffee (check-equal? (send struct size (hasheq 'name "devon" 'age 32)) 7)) -; todo: when pointers are ready ; it 'should compute the correct size with pointers', -> ; struct = new Struct ; name: new StringT uint8 @@ -98,8 +97,10 @@ https://github.com/mbutterick/restructure/blob/master/test/Struct.coffee ; ; size.should.equal 14 - -(displayln 'warning:pointer-not-done) +(let ([struct (+Struct (dictify 'name (+StringT uint8) + 'age uint8 + 'ptr (+Pointer uint8 (+StringT uint8))))]) + (check-equal? (send struct size (mhash 'name "devon" 'age 21 'ptr "hello")) 14)) ; @@ -185,7 +186,7 @@ https://github.com/mbutterick/restructure/blob/master/test/Struct.coffee (+Buffer "\x05devon\x15"))) -; todo: when pointer is ready + ; it 'should encode pointer data after structure', (done) -> ; stream = new EncodeStream ; stream.pipe concat (buf) -> @@ -203,4 +204,11 @@ https://github.com/mbutterick/restructure/blob/master/test/Struct.coffee ; ptr: 'hello' ; ; stream.end() -(displayln 'warning:pointer-not-done) \ No newline at end of file + + +(let ([stream (+EncodeStream)] + [struct (+Struct (dictify 'name (+StringT uint8) + 'age uint8 + 'ptr (+Pointer uint8 (+StringT uint8))))]) + (send struct encode stream (mhasheq 'name "devon" 'age 21 'ptr "hello")) + (check-equal? (send stream dump) (+Buffer "\x05devon\x15\x08\x05hello"))) \ No newline at end of file diff --git a/pitfall/restructure/struct.rkt b/pitfall/restructure/struct.rkt index 75d8eee2..4e8e8a4b 100644 --- a/pitfall/restructure/struct.rkt +++ b/pitfall/restructure/struct.rkt @@ -44,22 +44,6 @@ https://github.com/mbutterick/restructure/blob/master/src/Struct.coffee (process res stream) res) - (define/augride (encode stream input-hash [parent #f]) - - #;(unless (hash? input-hash) - (raise-argument-error 'Struct:encode "hash" input-hash)) - - (send this preEncode input-hash stream) ; preEncode goes first, because it might bring input hash into compliance - - (unless (andmap (λ (key) (member key (ref-keys input-hash))) (dict-keys fields)) - (raise-argument-error 'Struct:encode (format "hash that contains superset of Struct keys: ~a" (dict-keys fields)) (hash-keys input-hash))) - - (cond - [(dict? fields) - (for* ([(key type) (in-dict fields)]) - (send type encode stream (ref input-hash key)))] - [else (send fields encode stream input-hash parent)])) - (define/public-final (_setup stream parent length) (define res (make-object StructRes)) ; not mere hash (hash-set*! (· res _hash) 'parent parent @@ -81,11 +65,42 @@ https://github.com/mbutterick/restructure/blob/master/src/Struct.coffee (hash-set! (· res _hash) '_currentOffset (- (· stream pos) (ref res '_startOffset))))) - (define/override (size [input-hash (mhash)] [parent #f] [includePointers #t]) - (for/sum ([(key type) (in-dict fields)]) - (define val (ref input-hash key)) - (define args (if val (list val) empty)) - (send type size . args)))) + (define/override (size [val (mhash)] [parent #f] [includePointers #t]) + (define ctx (mhash 'parent parent + 'val val + 'pointerSize 0)) + (define size 0) + (for ([(key type) (in-dict fields)]) + (increment! size (send type size (ref val key) ctx))) + + (when includePointers + (increment! size (ref ctx 'pointerSize))) + + size) + + (define/augride (encode stream val [parent #f]) + + #;(unless (hash? input-hash) + (raise-argument-error 'Struct:encode "hash" input-hash)) + + (send this preEncode val stream) ; preEncode goes first, because it might bring input hash into compliance + + (define ctx (mhash 'pointers empty + 'startOffset (· stream pos) + 'parent parent + 'val val + 'pointerSize 0)) + + (ref-set! ctx 'pointerOffset (+ (· stream pos) (size val ctx #f))) + + (unless (andmap (λ (key) (member key (ref-keys val))) (dict-keys fields)) + (raise-argument-error 'Struct:encode (format "hash that contains superset of Struct keys: ~a" (dict-keys fields)) (hash-keys val))) + + (for ([(key type) (in-dict fields)]) + (send type encode stream (ref val key) ctx)) + + (for ([ptr (in-list (ref ctx 'pointers))]) + (send (· ptr type) encode stream (· ptr val) (· ptr parent))))) (test-module diff --git a/pitfall/restructure/versioned-struct.rkt b/pitfall/restructure/versioned-struct.rkt index 85781e3c..6d80e878 100644 --- a/pitfall/restructure/versioned-struct.rkt +++ b/pitfall/restructure/versioned-struct.rkt @@ -117,8 +117,8 @@ https://github.com/mbutterick/restructure/blob/master/src/VersionedStruct.coffee (check-exn exn:fail:contract? (λ () (+VersionedStruct 42 42))) ;; make random versioned structs and make sure we can round trip - (for ([i (in-range 20)]) - (define field-types (for/list ([i (in-range 200)]) + #;(for ([i (in-range 1)]) + (define field-types (for/list ([i (in-range 1)]) (random-pick (list uint8 uint16be uint16le uint32be uint32le double)))) (define num-versions 20) (define which-struct (random num-versions)) @@ -126,6 +126,8 @@ https://github.com/mbutterick/restructure/blob/master/src/VersionedStruct.coffee (cons v (for/list ([num-type (in-list field-types)]) (cons (gensym) num-type))))) (define vs (+VersionedStruct which-struct struct-versions)) + (report* vs (send vs size)) + (error 'stop) (define struct-size (for/sum ([num-type (in-list (map cdr (ref struct-versions which-struct)))]) (send num-type size))) (define bs (apply bytes (for/list ([i (in-range struct-size)]) @@ -134,13 +136,15 @@ https://github.com/mbutterick/restructure/blob/master/src/VersionedStruct.coffee (define s (+Struct (dictify 'a uint8 'b uint8 'c uint8))) (check-equal? (send s size) 3) - (define vs (+VersionedStruct (λ (p) 2) (dictify 1 (dictify 'd s) 2 (dictify 'e s 'f s)))) + (define vs (+VersionedStruct uint8 (dictify 1 (dictify 'd s) 2 (dictify 'e s 'f s)))) + (send vs force-version! 1) (check-equal? (send vs size) 6) + #| (define s2 (+Struct (dictify 'a vs))) (check-equal? (send s2 size) 6) (define vs2 (+VersionedStruct (λ (p) 2) (dictify 1 vs 2 vs))) (check-equal? (send vs2 size) 6) - +|# )