mingw: make simavr compilable with MinGW
[simavr] / tests / tests.c
index 44d70c7..3b94cab 100644 (file)
@@ -14,17 +14,28 @@ avr_cycle_count_t tests_cycle_count = 0;
 int tests_disable_stdout = 1;
 
 static char *test_name = "(uninitialized test)";
-static FILE *orig_stderr = NULL;
 static int finished = 0;
 
+#ifdef __MINGW32__
+#define restore_stderr()       {}
+#define map_stderr()           {}
+#else
+static FILE *orig_stderr = NULL;
+#define restore_stderr()       { if (orig_stderr) stderr = orig_stderr; }
+#define map_stderr()           { if (tests_disable_stdout) { \
+                                                               orig_stderr = stderr;   \
+                                                               fclose(stdout);                 \
+                                                               stderr = stdout;                \
+                                                       } }
+#endif
+               
 static void atexit_handler(void) {
        if (!finished)
                _fail(NULL, 0, "Test exit without indicating success.");
 }
 
 void tests_success(void) {
-       if (orig_stderr)
-               stderr = orig_stderr;
+       restore_stderr();
        fprintf(stderr, "OK: %s\n", test_name);
        finished = 1;
 }
@@ -38,6 +49,7 @@ static avr_cycle_count_t
 cycle_timer_longjmp_cb(struct avr_t *avr, avr_cycle_count_t when, void *param) {
        jmp_buf *jmp = param;
        longjmp(*jmp, LJR_CYCLE_TIMER);
+       return 0;       // clear warning
 }
 
 static jmp_buf *special_deinit_jmpbuf = NULL;
@@ -60,7 +72,7 @@ static int my_avr_run(avr_t * avr)
        // if we just re-enabled the interrupts...
        // double buffer the I flag, to detect that edge
        if (avr->sreg[S_I] && !avr->i_shadow)
-               avr->pending_wait++;
+               avr->interrupts.pending_wait++;
        avr->i_shadow = avr->sreg[S_I];
 
        // run the cycle timers, get the suggested sleep time
@@ -95,11 +107,8 @@ static int my_avr_run(avr_t * avr)
 
 avr_t *tests_init_avr(const char *elfname) {
        tests_cycle_count = 0;
-       if (tests_disable_stdout) {
-               orig_stderr = stderr;
-               fclose(stdout);
-               stderr = stdout;
-       }
+       map_stderr();
+       
        elf_firmware_t fw;
        if (elf_read_firmware(elfname, &fw))
                fail("Failed to read ELF firmware \"%s\"", elfname);
@@ -176,11 +185,10 @@ static void init_output_buffer(struct output_buffer *buf) {
        buf->maxlen = 4096;
 }
 
-void tests_assert_uart_receive(const char *elfname,
+void tests_assert_uart_receive_avr(avr_t *avr,
                               unsigned long run_usec,
                               const char *expected,
                               char uart) {
-       avr_t *avr = tests_init_avr(elfname);
        struct output_buffer buf;
        init_output_buffer(&buf);
 
@@ -199,6 +207,18 @@ void tests_assert_uart_receive(const char *elfname,
                _fail(NULL, 0, "UART outputs differ: expected \"%s\", got \"%s\"", expected, buf.str);
 }
 
+void tests_assert_uart_receive(const char *elfname,
+                              unsigned long run_usec,
+                              const char *expected,
+                              char uart) {
+       avr_t *avr = tests_init_avr(elfname);
+
+       tests_assert_uart_receive_avr(avr,
+                              run_usec,
+                              expected,
+                              uart);
+}
+
 void tests_assert_cycles_at_least(unsigned long n) {
        if (tests_cycle_count < n)
                _fail(NULL, 0, "Program ran for too few cycles (%"
@@ -217,8 +237,7 @@ void tests_assert_cycles_between(unsigned long min, unsigned long max) {
 }
 
 void _fail(const char *filename, int linenum, const char *fmt, ...) {
-       if (orig_stderr)
-               stderr = orig_stderr;
+       restore_stderr();
 
        if (filename)
                fprintf(stderr, "%s:%d: ", filename, linenum);