[functional tests] more work on the binary-format macro
This commit is contained in:
		| @@ -1,7 +1,14 @@ | ||||
| (library | ||||
|   (binary-format) | ||||
|   (export binary-format) | ||||
|   (import (rnrs)) | ||||
|   (export size-type binary-format le32 le64 bytes) | ||||
|   (import (rnrs) | ||||
|           (list-utils)) | ||||
|  | ||||
|   (define-syntax size-type | ||||
|     (syntax-rules (le32 le64 bytes) | ||||
|       ((_ le32) 4) | ||||
|       ((_ le64) 8) | ||||
|       ((_ (bytes count)) count))) | ||||
|  | ||||
|   (define-syntax unpack-type | ||||
|     (syntax-rules (le32 le64 bytes) | ||||
| @@ -16,26 +23,34 @@ | ||||
|         (bytevector-copy! bv offset copy 0 count) | ||||
|         copy)))) | ||||
|  | ||||
|   (define (size-type t) | ||||
|     (syntax-case t (le32 le64 bytes) | ||||
|                  (le32 #'4) | ||||
|                  (le64 #'8) | ||||
|                  ((bytes count) #'count))) | ||||
|  | ||||
|   ;;; FIXME: (bytes <count>) has to use a literal rather than a symbol. | ||||
|   (define-syntax binary-format | ||||
|     (lambda (x) | ||||
|       (syntax-case x () | ||||
|                    ((_ (name pack-name unpack-name) (field type) ...) | ||||
|                     (with-syntax ((((t o) ...) | ||||
|                                    (let f ((acc 0) (types #'(type ...))) | ||||
|                                     (if (null? types) | ||||
|                                         '() | ||||
|                                         (cons (list (car types) acc) | ||||
|                                               (f (+ (syntax->datum (size-type (car types))) acc) (cdr types))))))) | ||||
|                                  #`(begin | ||||
|                                      (define-record-type name (fields field ...)) | ||||
|     (syntax-rules () | ||||
|       ((_ (name pack-name unpack-name) (field type) ...) | ||||
|        (begin | ||||
|          (define-record-type name (fields field ...)) | ||||
|  | ||||
|        (define (unpack-name bv offset) | ||||
|          (let ((offset offset)) | ||||
|  | ||||
|           (define (inc-offset n v) | ||||
|             (set! offset (+ offset n)) | ||||
|             v) | ||||
|  | ||||
|           ((record-constructor (record-constructor-descriptor name)) | ||||
|            (inc-offset (size-type type) (unpack-type bv offset type)) ...))))))) | ||||
|  | ||||
|   ;;; since le32, le64 and bytes are used as auxiliary keywords, we must export | ||||
|   ;;; definitions of them as well. | ||||
|   ;;; FIXME: use a macro to remove duplication | ||||
|   (define-syntax le32 | ||||
|     (lambda (x) | ||||
|       (syntax-violation 'le32 "misplaced auxiliary keyword" x))) | ||||
|  | ||||
|   (define-syntax le64 | ||||
|     (lambda (x) | ||||
|       (syntax-violation 'le64 "misplaced auxiliary keyword" x))) | ||||
|  | ||||
|   (define-syntax bytes | ||||
|     (lambda (x) | ||||
|       (syntax-violation 'bytes "misplaced auxiliary keyword" x)))) | ||||
|  | ||||
|                                      (define (unpack-name bv offset) | ||||
|                                        ((record-constructor (record-type-descriptor name)) | ||||
|                                         (unpack-type bv (+ offset o) t) ...))))))))) | ||||
|   | ||||
| @@ -3,7 +3,8 @@ | ||||
|  | ||||
|   (export btree-open | ||||
|           btree-lookup | ||||
|           btree-each) | ||||
|           btree-each | ||||
|           le64-type) | ||||
|  | ||||
|   (import (block-io) | ||||
|           (chezscheme) | ||||
| @@ -68,16 +69,15 @@ | ||||
|   ;;; Performs a binary search looking for the key and returns the index of the | ||||
|   ;;; lower bound. | ||||
|   (define (lower-bound node header key) | ||||
|     (let ((nr-entries (node-header-nr-entries header))) | ||||
|      (let loop ((lo 0) (hi nr-entries)) | ||||
|       (if (= 1 (- hi lo)) | ||||
|     (let loop ((lo 0) (hi (node-header-nr-entries header))) | ||||
|       (if (<= (- hi lo) 1) | ||||
|           lo | ||||
|           (let* ((mid (+ lo (/ (- hi lo) 2))) | ||||
|                  (k (key-at mid))) | ||||
|                  (k (key-at node mid))) | ||||
|             (cond | ||||
|               ((= key k) mid) | ||||
|               ((< k key) (loop mid hi)) | ||||
|               (else (loop lo mid)))))))) | ||||
|               (else (loop lo mid))))))) | ||||
|  | ||||
|   ;;;;---------------------------------------------- | ||||
|   ;;;; Lookup | ||||
|   | ||||
| @@ -1,20 +1,21 @@ | ||||
| (import | ||||
|   (binary-format) | ||||
|   (block-io) | ||||
|   (fmt fmt) | ||||
|   (matchable)) | ||||
|   (matchable) | ||||
|   (rnrs)) | ||||
|  | ||||
| ;;;;--------------------------------------------------- | ||||
| ;;;; Constants | ||||
| ;;;;--------------------------------------------------- | ||||
|  | ||||
| ;; FIXME: duplicate with main.scm | ||||
| (define (current-metadata) | ||||
|   "./metadata.bin") | ||||
| (define (current-metadata) "./metadata.bin") | ||||
|  | ||||
| (define superblock-magic 27022010) | ||||
| (define superblock-salt 160774) | ||||
| (define uuid-size 16) | ||||
| (define space-map-root-size 128) | ||||
| (define $superblock-magic 27022010) | ||||
| (define $superblock-salt 160774) | ||||
| (define $uuid-size 16) | ||||
| (define $space-map-root-size 128) | ||||
|  | ||||
| (binary-format (superblock pack-superblock unpack-superblock) | ||||
|   (csum le32) | ||||
| @@ -54,5 +55,5 @@ | ||||
|   (with-metadata (md (current-metadata)) | ||||
|                  (let ((superblock (read-block md 0))) | ||||
|                   (fmt #t (dsp "checksum on disk: ") (dsp (bytevector-u32-ref superblock 0 (endianness little))) nl) | ||||
|                   (fmt #t (dsp "calculated checksum: ") (dsp (crc32-region superblock-salt superblock 4 4092)) nl) | ||||
|                   ;(fmt #t (dsp "calculated checksum: ") (dsp (crc32-region $superblock-salt superblock 4 4092)) nl) | ||||
|                   (check-magic superblock)))) | ||||
|   | ||||
| @@ -1,8 +1,13 @@ | ||||
| (library | ||||
|   (list-utils) | ||||
|   (export intersperse iterate accumulate) | ||||
|   (export tails intersperse iterate accumulate) | ||||
|   (import (rnrs)) | ||||
|  | ||||
|   (define (tails xs) | ||||
|     (if (null? xs) | ||||
|         '() | ||||
|         (cons xs (tails (cdr xs))))) | ||||
|  | ||||
|   (define (intersperse sep xs) | ||||
|     (cond | ||||
|       ((null? xs) '()) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user