#lang scheme/base (require (prefix-in make: (planet synx/maker:1)) scheme/runtime-path scheme/system) (define attrs '(dev ino mode nlink uid gid rdev size blksize blocks atime mtime ctime)) (define lookup (make-immutable-hash (map (λ (attr i) (cons attr i)) attrs (build-list (length attrs) values)))) (define-runtime-path info "generated-choose.i") (define (make-info) (with-output-to-file info #:exists 'replace (λ () (define started? #f) (display "inline unsigned int choose(short index) {")(newline) (for ((index (in-naturals)) (attr attrs)) (display "\t") (if started? (display "else ") (set! started? #t)) (display "if (index==")(display index)(display ") return buf.st_")(display attr)(display ";\n")) (display "\tscheme_signal_error(\"Bad index %d\",index);\n") (display "}\n")))) (define-runtime-path includer "lookup.ss") (define (make-includer) (with-output-to-file includer #:exists 'replace (λ () (display "#lang scheme/base\n\n(provide (all-defined-out))\n\n") (for-each (λ (attr i) (write `(define ,attr ,i))(newline)) attrs (build-list (length attrs) values))))) (define-runtime-path source "ext.c") (define-runtime-path extension "ext.so") (make-info) (make:library extension source info) (define (access) (load-extension extension)) (define (attr->index i) (hash-ref lookup i)) (provide access)