* device/lib/Makefile.in, device/lib/gbz80/Makefile.in,
[fw/sdcc] / support / regression / fwk / lib / testfwk.c
index 8259f53e4d85954e66dc0d2fb2bd16291a9a307f..eed8c6f2744627c3aaac22a4021f19d63a945ea6 100644 (file)
@@ -1,18 +1,37 @@
 /** Test framework support functions.
  */
 #include <testfwk.h>
+#ifndef NO_VARARGS
 #include <stdarg.h>
+#endif
+
+#ifdef SDCC_ds390
+#include <tinibios.h> /* main() must see the ISR declarations */
+#endif
+
+#ifdef SDCC_mcs51
+/* until changed, isr's must have a prototype in the module containing main */
+void T2_isr (void) interrupt 5;
+#define MEMSPACE_BUF idata
+#else
+#define MEMSPACE_BUF
+#endif
 
 /** Define this if the port's div or mod functions are broken.
     A slow loop based method will be substituded.
 */
-#define BROKEN_DIV_MOD         1
+//#define BROKEN_DIV_MOD               1
+
+extern void _putchar(char c);
+extern void _initEmu(void);
+extern void _exitEmu(void);
 
-void _putchar(char c);
-void _exitEmu(void);
+int __numTests = 0;
+static int __numFailures = 0;
 
 #if BROKEN_DIV_MOD
-int __div(int num, int denom)
+static int
+__div(int num, int denom)
 {
     int q = 0;
     while (num >= denom) {
@@ -22,7 +41,8 @@ int __div(int num, int denom)
     return q;
 }
 
-int __mod(int num, int denom)
+static int
+__mod(int num, int denom)
 {
     while (num >= denom) {
         num -= denom;
@@ -30,101 +50,155 @@ int __mod(int num, int denom)
     return num;
 }
 #else
-int __div(int num, int denom)
-{
-    return num/denom;
-}
+#define __div(num, denom) ((num) / (denom))
+#define __mod(num, denom) ((num) % (denom))
+#endif
 
-int __mod(int num, int denom)
+void
+__prints(const char *s)
 {
-    return num%denom;
+  char c;
+
+  while ('\0' != (c = *s)) {
+    _putchar(c);
+    ++s;
+  }
 }
-#endif
 
-static void _printn(int n) 
+void
+__printn(int n)
 {
-    int rem;
-
-    if (n < 0) {
-        _putchar('-');
-        n = -n;
+  if (0 == n) {
+    _putchar('0');
+  }
+  else {
+    static char MEMSPACE_BUF buf[6];
+    char MEMSPACE_BUF *p = &buf[sizeof(buf) - 1];
+    char neg = 0;
+
+    buf[sizeof(buf) - 1] = '\0';
+
+    if (0 > n) {
+      n = -n;
+      neg = 1;
     }
-
-    rem = __mod(n, 10);
-    if (rem != n) {
-        _printn(__div(n, 10));
+  
+    while (0 != n) {
+      *--p = '0' + __mod(n, 10);
+      n = __div(n, 10);
     }
-    _putchar('0' + rem);
+
+    if (neg)
+      _putchar('-');
+
+    __prints(p);
+  }
 }
 
-void __printf(const char *szFormat, ...) REENTRANT
+#ifndef NO_VARARGS
+void
+__printf(const char *szFormat, ...)
 {
-    va_list ap;
-    va_start(ap, szFormat);
-
-    while (*szFormat) {
-        if (*szFormat == '%') {
-            switch (*++szFormat) {
-            case 's': {
-                char *sz = va_arg(ap, char *);
-                while (*sz) {
-                    _putchar(*sz++);
-                }
-                break;
-            }
-            case 'u': {
-                int i = va_arg(ap, int);
-                _printn(i);
-                break;
-            }
-            case '%':
-                _putchar('%');
-                break;
-            default:
-                break;
-            }
-        }
-        else {
-            _putchar(*szFormat);
-        }
-        szFormat++;
+  va_list ap;
+  va_start(ap, szFormat);
+
+  while (*szFormat) {
+    if (*szFormat == '%') {
+      switch (*++szFormat) {
+      case 's': {
+        char *sz = va_arg(ap, char *);
+        __prints(sz);
+        break;
+      }
+      case 'u': {
+        int i = va_arg(ap, int);
+        __printn(i);
+        break;
+      }
+      case '%':
+        _putchar('%');
+        break;
+      default:
+        break;
+      }
     }
-    va_end(ap);
+    else {
+      _putchar(*szFormat);
+    }
+    szFormat++;
+  }
+  va_end(ap);
 }
 
-int __numTests;
-int __numFailures;
-
-void 
-__fail(const char *szMsg, const char *szCond, const char *szFile, int line)
+void
+__fail(code const char *szMsg, code const char *szCond, code const char *szFile, int line)
 {
-    __printf("--- FAIL: \"%s\" on %s at %s:%u\n", szMsg, szCond, szFile, line);
-    __numFailures++;
+  __printf("--- FAIL: \"%s\" on %s at %s:%u\n", szMsg, szCond, szFile, line);
+  __numFailures++;
 }
 
-int 
+int
 main(void)
 {
-    TESTFUNP *cases;
-    int numCases = 0;
+  _initEmu();
 
-    __printf("--- Running: %s\n", getSuiteName());
+  __printf("--- Running: %s\n", __getSuiteName());
 
-    cases = suite();
+  __runSuite();
 
-    while (*cases) {
-        __printf("Running %u\n", numCases);
-        (*cases)();
-        cases++;
-        numCases++;
-    }
-    
-    __printf("--- Summary: %u/%u/%u: %u failed of %u tests in %u cases.\n", 
-           __numFailures, __numTests, numCases,
-           __numFailures, __numTests, numCases
-           );
+  __printf("--- Summary: %u/%u/%u: %u failed of %u tests in %u cases.\n",
+     __numFailures, __numTests, __numCases,
+     __numFailures, __numTests, __numCases
+     );
 
-    _exitEmu();
+  _exitEmu();
 
-    return 0;
+  return 0;
 }
+#else
+void
+__fail(code const char *szMsg, code const char *szCond, code const char *szFile, int line)
+{
+  __prints("--- FAIL: \"");
+  __prints(szMsg);
+  __prints("\" on ");
+  __prints(szCond);
+  __prints(" at ");
+  __prints(szFile);
+  _putchar(':');
+  __printn(line);
+  _putchar('\n');
+
+  __numFailures++;
+}
+
+int
+main(void)
+{
+  _initEmu();
+
+  __prints("--- Running: ");
+  __prints(__getSuiteName());
+  _putchar('\n');
+
+  __runSuite();
+
+  __prints("--- Summary: ");
+  __printn(__numFailures);
+  _putchar('/');
+  __printn(__numTests);
+  _putchar('/');
+  __printn(__numCases);
+  __prints(": ");
+  __printn(__numFailures);
+  __prints(" failed of ");
+  __printn(__numTests);
+  __prints(" tests in ");
+  __printn(__numCases);
+  __prints(" cases.\n");
+
+  _exitEmu();
+
+  return 0;
+}
+#endif