Annotation of researchv10no/cmd/lcc/ph/d47.c, revision 1.1

1.1     ! root        1: /* The Plum Hall Validation Suite for C
        !             2:  * Unpublished copyright (c) 1986-1991, Chiron Systems Inc and Plum Hall Inc.
        !             3:  * VERSION: 4
        !             4:  * DATE: 1993-01-01
        !             5:  * The "ANSI" mode of this suite corresponds to official ANSI C, X3.159-1989.
        !             6:  * As per your license agreement, your distribution is not to be moved or copied outside the Designated Site
        !             7:  * without specific permission from Plum Hall Inc.
        !             8:  */
        !             9: 
        !            10: 
        !            11: #include "flags.h"
        !            12: #define LIB_TEST 1
        !            13: #include "defs.h"  /* 92/05/04 moved here from line 18 */
        !            14: #ifndef SKIP47
        !            15: /*
        !            16:  * 4.7 - Signal handling. Both signal() and raise() are tested here.
        !            17:  * This file is not relevant for pre ANSI C.
        !            18:  */
        !            19: 
        !            20: #if !ANSI
        !            21: void d4_7() { }
        !            22: #else
        !            23: 
        !            24: #include <signal.h>
        !            25: void d4_7x(int);
        !            26: void d4_7y(void);
        !            27: static volatile sig_atomic_t flag = 0;
        !            28: volatile sig_atomic_t flag_sig = 0;
        !            29: void (*prev_fn)(int) = SIG_DFL;
        !            30: static int num_sig[] = {SIGABRT, SIGFPE, SIGILL, SIGINT, SIGSEGV, SIGTERM};
        !            31: typedef void (*PIF)(int);
        !            32: PIF d4_7b(int);
        !            33: void d4_7b_2(int);
        !            34: 
        !            35: void d4_7()
        !            36:        {
        !            37:        int i, j;
        !            38: 
        !            39:        Filename = "d47.c";
        !            40: 
        !            41:        /* make sure that these are actually macros */
        !            42:        #if !defined(SIG_DFL) || !defined(SIG_ERR) || !defined(SIG_IGN)
        !            43:                complain(__LINE__);
        !            44:        #elif !defined(SIGABRT) || !defined(SIGFPE) || !defined(SIGILL)
        !            45:                complain(__LINE__);
        !            46:        #elif !defined(SIGINT) || !defined(SIGSEGV) || !defined(SIGTERM)
        !            47:                complain(__LINE__);
        !            48:        #endif
        !            49: 
        !            50: 
        !            51: 
        !            52: 
        !            53:        /* test that SIG modes are distinct and of type void (*)(int) */
        !            54:        checkthat(__LINE__, SIG_DFL != SIG_ERR && SIG_DFL != SIG_IGN && SIG_ERR != SIG_IGN);
        !            55:        {void (*p)(int) = SIG_DFL; checkthat(__LINE__, sizeof(void (*)(int)) == sizeof(SIG_DFL));}
        !            56:        {void (*p)(int) = SIG_ERR; checkthat(__LINE__, sizeof(void (*)(int)) == sizeof(SIG_ERR));}
        !            57:        {void (*p)(int) = SIG_IGN; checkthat(__LINE__, sizeof(void (*)(int)) == sizeof(SIG_IGN));}
        !            58: 
        !            59:        /* test that SIG numbers are positive and distinct */
        !            60:        for (i = 0; i < 6; ++i)
        !            61:                {
        !            62:                checkthat(__LINE__, num_sig[i] > 0);
        !            63:                for (j = 0; j < i; ++j)
        !            64:                        inotequals(__LINE__, num_sig[i], num_sig[j]);
        !            65:                }
        !            66: 
        !            67: 
        !            68: 
        !            69:        /* 4.7.1.1 signal
        !            70:         * it can be set to a user function ... raise should change the flag
        !            71:         */
        !            72:        signal(SIGINT, d4_7x);
        !            73:        /* 4.7.2.1 raise
        !            74:         */
        !            75:        iequals(__LINE__, raise(SIGINT), 0);
        !            76:        iequals(__LINE__, flag, 2);
        !            77: 
        !            78:        /* after the raise, the signal handler MAY have set SIG_DFL */
        !            79:        checkthat( - __LINE__, signal(SIGINT, d4_7x) == SIG_DFL);
        !            80: 
        !            81:        /* the signal can be set to ignore the raise */
        !            82:        flag = 0;
        !            83:        signal(SIGINT, SIG_IGN);
        !            84:        iequals(__LINE__, raise(SIGINT), 0);
        !            85:        iequals(__LINE__, flag, 0);
        !            86:        
        !            87:        /* the return from signal should be the "previous" value */
        !            88:        signal(SIGINT, d4_7x);
        !            89:        checkthat(__LINE__, d4_7x == signal(SIGINT, SIG_DFL));
        !            90: 
        !            91:        /* more extensive raise tests, with externally-linked subfunctions */
        !            92:        checkthat(__LINE__, d4_7b(SIGABRT) != SIG_ERR);
        !            93:        flag_sig = 0;
        !            94:        raise(SIGABRT);
        !            95:        checkthat(__LINE__, flag_sig == (sig_atomic_t)SIGABRT);
        !            96:        prev_fn = signal(SIGABRT, SIG_DFL);
        !            97:        checkthat( - __LINE__, prev_fn == SIG_DFL);
        !            98: 
        !            99: 
        !           100: 
        !           101: 
        !           102: 
        !           103:        checkthat(__LINE__, d4_7b(SIGTERM) != SIG_ERR);
        !           104:        flag_sig = 0;
        !           105:        raise(SIGTERM);
        !           106:        checkthat(__LINE__, flag_sig == (sig_atomic_t)SIGTERM);
        !           107:        prev_fn = signal(SIGTERM, SIG_DFL);
        !           108:        checkthat( - __LINE__, prev_fn == SIG_DFL);
        !           109: 
        !           110:        /* test that signal returns the previous handler */
        !           111:        prev_fn = signal(SIGTERM, SIG_IGN);
        !           112:        prev_fn = signal(SIGTERM, SIG_DFL);
        !           113:        checkthat(__LINE__, prev_fn == SIG_IGN);
        !           114: 
        !           115:        /* test that we can longjmp out of the signal handler */
        !           116:        d4_7y();
        !           117: 
        !           118:        /* test that bad SIG numbers are diagnosed */
        !           119:        /* (But test is only a warning, because signal numbers are implem-def'ed.) */
        !           120:        checkthat( - __LINE__, SIG_ERR == signal(100+SIGABRT+SIGFPE+SIGILL+SIGINT+SIGSEGV+SIGTERM, SIG_IGN));
        !           121:        }
        !           122: 
        !           123: 
        !           124: 
        !           125: 
        !           126: void d4_7x(signo)
        !           127:        int signo;
        !           128:        {
        !           129:        iequals(__LINE__, signo, SIGINT);
        !           130:        flag = 2;
        !           131:        }
        !           132: 
        !           133: /* make sure that a signal handler can do a longjmp */
        !           134: #include <setjmp.h>
        !           135: jmp_buf d7jbuf = {0};
        !           136: void d4_7y()
        !           137:        {
        !           138:        signal(SIGINT, d4_7b_2);
        !           139:        if (setjmp(d7jbuf) == 0)
        !           140:                {
        !           141:                raise(SIGINT);
        !           142:                /* this line should never be reached */
        !           143:                complain(__LINE__);
        !           144:                }
        !           145:        }
        !           146:                
        !           147: #endif
        !           148: 
        !           149: #else /* if SKIP47 */
        !           150: void d4_7() { pr_skip("d4_7: SKIPPED ENTIRELY\n"); }
        !           151: #endif

unix.superglobalmegacorp.com

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