diff --git a/crossfire/codegen.template b/crossfire/codegen.template index 3b36478..79831fd 100644 --- a/crossfire/codegen.template +++ b/crossfire/codegen.template @@ -34,13 +34,18 @@ typedef struct { int main() { char buf [ @(* 20 (vector-length pattern)) ]; + @(for/list ([num (in-naturals)] [cset (in-vector pattern)]) + @list{size_t @(format "i~a" num) ; + vartype @(format "v~a" num) ; + + }) @(for/list ([num (in-naturals)] [cset (in-vector pattern)]) (define iter (format "i~a" num)) (define viter (format "v~a" num)) (define iset (format "iset~a" num)) @list{ - for (size_t @iter = 0; @iter < @iset @".length" ; @iter ++) @"{" - for (vartype @viter = @iset .values[ @iter ].start; @viter < @iset .values[ @iter ].end; @viter ++) @"{" + for (@iter = 0; @iter < @iset @".length" ; @iter ++) @"{" + for (@viter = @iset .values[ @iter ].start; @viter < @iset .values[ @iter ].end; @viter ++) @"{" }) @@ -48,9 +53,12 @@ int main() { (string-join (for/list ([i (in-range (vector-length pattern))]) (format "v~a" i)) ",")) @(define fmt (string-join (for/list ([i (in-range (vector-length pattern))]) c-type-fmt) " ")) +l_inner: ssize_t res = snprintf(buf, sizeof(buf), @(format "\"~a\\n\"" fmt), @vs ); fwrite(buf, res, 1, stdout); @(for/list ([cset (in-vector pattern)]) "}}") +l_end: + return 0; } diff --git a/crossfire/main.rkt b/crossfire/main.rkt index 3fd434c..cf1c9fe 100644 --- a/crossfire/main.rkt +++ b/crossfire/main.rkt @@ -67,6 +67,23 @@ (iset-merge (iset-insert iset start end))) +(define (iset-count iset) + (for/sum ([ival (in-list iset)]) + (- (cdr ival) (car ival)))) + +;; converts a position of [0, iset-count) to 2 values +;; - iset interval number +;; - actual value within the interval +(define (pos->iset-pos iset pos) + (when (empty? iset) + (error "iset-pos out of range")) + (match-define (cons (cons fs fe) r) iset) + (define delta (- fe fs)) + (if (< pos delta) + (values 0 (+ fs pos)) + (let-values ([(inum val) (pos->iset-pos r (- pos delta))]) + (values (add1 inum) val)))) + (define (char->iset ch) (define cp (char->integer ch)) (iset-add (make-iset) cp (add1 cp))) @@ -128,10 +145,6 @@ ;; pattern processing -(define (iset-count iset) - (for/sum ([ival (in-list iset)]) - (- (cdr ival) (car ival)))) - (define (pattern-count pattern) (for/fold ([sum 1]) ([p (in-vector pattern)]) (* sum (iset-count p)))) @@ -139,19 +152,19 @@ ;; design recipe violations follow ;; (sorry) ;; (i wanted this to be fast so i try to avoid spamming the heap) -(define (pattern-generate pattern out-port) - (define len (vector-length pattern)) - (define gen (make-bytes len)) - (define (output gen) - (write-bytes gen out-port) - (printf "\n")) - (define (permute i gen) - (cond [(= i len) (output gen)] - [else - (for ([chr (in-set (vector-ref pattern i))]) - (bytes-set! gen i chr) - (permute (add1 i) gen))])) - (permute 0 gen)) +; (define (pattern-generate pattern out-port) +; (define len (vector-length pattern)) +; (define gen (make-bytes len)) +; (define (output gen) +; (write-bytes gen out-port) +; (printf "\n")) +; (define (permute i gen) +; (cond [(= i len) (output gen)] +; [else +; (for ([chr (in-set (vector-ref pattern i))]) +; (bytes-set! gen i chr) +; (permute (add1 i) gen))])) +; (permute 0 gen)) ;; ok gamer move time (define-runtime-path codegen-template "codegen.template")