(include stdio.h) (include unistd.h) (include string.h) (var COMP (* const char) ":compilation") (var STDIN (* const char) ":stdin") (var STDOUT (* const char) ":stdout") (var RET (* const char) ":return") (var test-file-path (* const char) NULL) (var prelude-comp [const char 1024]) (var prelude-stdin [const char 1024]) (var prelude-stdout [const char 1024]) (var prelude-ret [const char 1024]) (fn print-usage () void (printf "Usage: sextest ./path/to/test-file.sex\n")) (fn read-file ((file-path (* const char))) void (var f (* FILE) (fopen file-path "r")) (if (== f NULL) (begin (printf "Failed to read file %s\n" file-path) (return))) ;; should be more than enough (var buffer [const char 1024]) (var i int 0) (var c char) (var section (* const char)) (while (!= EOF (= c (getc f))) (switch c (case (#\space #\newline #\tab #\return) (= [buffer i] #\null) (if (!= NULL section) (begin (memcpy i section buffer))) (if (== 0 (strncmp buffer COMP 8ul))) (= i 0)) (default (if (== i (sizeof buffer)) (printf "Blast! The section is longer than %d, not going to work with this" (++/post i))) (if (< i (sizeof buffer)) (= [buffer (++/post i)] c)))))) (fn get-section ((section-name (* const char))) (* const char) ;; Get section from test file by name. ;; Name must be one of: :compilation, :stdin, :stdout, :return (if (== 0 (strncmp section-name COMP 8ul)) (return prelude-comp)) (if (== 0 (strncmp section-name STDIN 6ul)) (return prelude-stdin)) (if (== 0 (strncmp section-name STDOUT 7ul)) (return prelude-stdout)) (if (== 0 (strncmp section-name RET 7ul)) (return prelude-ret)) (printf "Expected section name, got %s\n" section-name) (return NULL)) (pub fn main ((argc int) (argv [* const char])) int (if (!= argc 2) (begin (print-usage) (return 1))) (var test-file-path (* const char) [argv 1]) (read-file test-file-path) (return 0))