Annotation of nono/exp/optestm88k/optestm88k_main.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * nono
        !             3:  * Copyright (C) 2021 nono project
        !             4:  * Licensed under nono-license.txt
        !             5:  */
        !             6: 
        !             7: #include "optestm88k_main.h"
        !             8: #include <setjmp.h>
        !             9: #include <signal.h>
        !            10: #include <stdlib.h>
        !            11: #include <sys/siginfo.h>
        !            12: 
        !            13: // グローバルワーク (r2 でアセンブラに渡される)
        !            14: int global_work[2];
        !            15: 
        !            16: // オーバーフロー例外なら 1、除算例外なら 2 をセットする。
        !            17: // テスト前に 0 で初期化しておくこと。
        !            18: #define exception_occurred (global_work[0])
        !            19: // 例外を期待するなら 1 か 2、期待しないなら 0 (テスト側が書く)
        !            20: #define exception_expected (global_work[1])
        !            21: 
        !            22: static void
        !            23: sigfpe(int signo, siginfo_t *si, void *ctx)
        !            24: {
        !            25:        if (si->si_signo == SIGFPE) {
        !            26:                if (si->si_code == FPE_INTOVF) {
        !            27:                        exception_occurred = 1;
        !            28:                        return;
        !            29:                } else if (si->si_code == FPE_INTDIV) {
        !            30:                        exception_occurred = 2;
        !            31:                        return;
        !            32:                }
        !            33:        }
        !            34:        // XXX
        !            35:        exception_occurred = -1;
        !            36: }
        !            37: 
        !            38: int
        !            39: main(int ac, char *av[])
        !            40: {
        !            41:        char cause[64];
        !            42:        struct testentry *t;
        !            43:        func_t func;
        !            44:        const char *arg_name = "";
        !            45:        int i;
        !            46:        int j;
        !            47:        int num;
        !            48:        int res;
        !            49: 
        !            50:        if (ac >= 2) {
        !            51:                arg_name = av[1];
        !            52:        }
        !            53: 
        !            54:        struct sigaction act;
        !            55:        memset(&act, 0, sizeof(act));
        !            56:        act.sa_sigaction = sigfpe;
        !            57:        act.sa_flags = SA_SIGINFO;
        !            58:        sigaction(SIGFPE, &act, NULL);
        !            59: 
        !            60:        for (i = j = 0; test_table[i].code != NULL; i++, j = 0) {
        !            61:                t = &test_table[i];
        !            62: 
        !            63:                if (strncasecmp(t->testname, arg_name, strlen(arg_name)) != 0) {
        !            64:                        break;
        !            65:                }
        !            66: 
        !            67:                if (j == 0) {
        !            68:                        // テスト数を数える
        !            69:                        for (num = 0; t->testdata[num] != NULL; num++)
        !            70:                                ;
        !            71: 
        !            72:                        printf("%s (%d) ... ", t->testname, num);
        !            73:                        fflush(stdout);
        !            74:                }
        !            75: 
        !            76:                for (; j < num; j++) {
        !            77:                        exception_occurred = 0;
        !            78: 
        !            79:                        res = (t->code)(global_work, t->testdata[j]);
        !            80:                        // 失敗なら非 0 を返す
        !            81:                        // bit3 は演算結果が期待と異なる
        !            82:                        // bit0 は例外有無が期待と異なる
        !            83:                        if (res != 0) {
        !            84:                                cause[0] = '\0';
        !            85:                                if ((res & 8)) {
        !            86:                                        strlcpy(cause, "incorrect result", sizeof(cause));
        !            87:                                }
        !            88:                                if ((res & 1)) {
        !            89:                                        if (cause[0]) {
        !            90:                                                strlcat(cause, ", ", sizeof(cause));
        !            91:                                        }
        !            92:                                        if (exception_expected) {
        !            93:                                                // 例外を期待したが、例外が起きなかった。
        !            94:                                                strlcat(cause, "exception not occurred", sizeof(cause));
        !            95:                                        } else {
        !            96:                                                // 例外が起きないことを期待したのに例外が起きた。
        !            97:                                                strlcat(cause, "exception occurred", sizeof(cause));
        !            98:                                        }
        !            99:                                }
        !           100:                                printf("FAILED (%s) at test_%s_%d\n",
        !           101:                                        cause, t->testname, j);
        !           102:                                exit(1);
        !           103:                        }
        !           104:                }
        !           105: 
        !           106:                printf("ok\n");
        !           107:        }
        !           108: 
        !           109:        return 0;
        !           110: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.