Annotation of researchv10dc/cmd/lcc/ph/d410.c, revision 1.1.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: #ifndef SKIP410
                     13: #define LIB_TEST 1
                     14: #include "defs.h"
                     15: 
                     16: /*
                     17:  * 4.10 - General Utilities <stdlib.h>
                     18:  */
                     19: 
                     20: #if ANSI
                     21: #include <stdlib.h> 
                     22: #if ANSI8703
                     23: #include <errno.h>
                     24: #endif /* ANSI8703 */
                     25: #else  /* if !ANSI */
                     26: #include <stdio.h>     /* for NULL, at least */
                     27: extern int errno;
                     28: double atof();
                     29: int atoi();
                     30: long atol();
                     31: char *calloc(), *malloc(), *realloc();
                     32: void free();
                     33: void abort();
                     34: void exit();
                     35: char *getenv();
                     36: int system();
                     37: #endif         /* ANSI */
                     38: 
                     39: int strcmp();
                     40: size_t strlen();
                     41: 
                     42: #include <math.h>
                     43: static void d4_10_1();
                     44: static void d4_10_2();
                     45: static void d4_10_3();
                     46: static void d4_10_4();
                     47: static void d4_10_4x();
                     48: static void d4_10_5();
                     49: static void d4_10_6();
                     50: static void d4_10_7();
                     51: static void d4_10_8();
                     52: 
                     53: 
                     54: #ifndef SKIP4_101
                     55: static char *string1 = "1.234 2.3e99999999999999999999";
                     56: static char *string2 = "         123 10";
                     57: static char *string3 = "999999999999999999999999999999999999999999999999999999";
                     58: static char *string4 = "-99999999999999999999999999999999999999999999999999999";
                     59: static char *string5 = "   XXX";
                     60: #endif /* SKIP4_101 */
                     61: 
                     62: void d4_10()
                     63:        {
                     64: 
                     65:        Filename = "d410.c";
                     66: #if ANSI
                     67:        {
                     68:        /* check existence of types */
                     69:        div_t dummy1;
                     70:        ldiv_t dummy2;
                     71: #if WIDE_CHARS
                     72:        wchar_t wc;
                     73: #endif /* WIDE_CHARS */
                     74:        size_t si;
                     75:        int i;
                     76: 
                     77:        /* check definition of required macros */
                     78:        #if !defined(EXIT_FAILURE)
                     79:                complain(__LINE__);
                     80:        #elif !defined(EXIT_SUCCESS)
                     81:                complain(__LINE__);
                     82:        #elif !defined(RAND_MAX)
                     83:                complain(__LINE__);
                     84:        #elif !defined(MB_CUR_MAX)
                     85:                complain(__LINE__);
                     86:        #endif
                     87: 
                     88:        checkthat(__LINE__, sizeof(div_t) >= 2*sizeof(int));
                     89:        checkthat(__LINE__, sizeof(ldiv_t) >= 2*sizeof(long));
                     90: #if WIDE_CHARS
                     91:        checkthat(__LINE__, MB_CUR_MAX >= 1);
                     92: #endif /* WIDE_CHARS */
                     93: 
                     94:        /* make sure that these expand to integral expressions (compile
                     95:         * fails if not).
                     96:         */
                     97:        i = ivalue(-99); if (i == EXIT_FAILURE) do_nothing(&si);
                     98:        i = ivalue(-99); if (i == EXIT_SUCCESS) do_nothing(&si);
                     99:        i = ivalue(-99); switch (i) { case RAND_MAX: do_nothing(&si); }
                    100:        }
                    101: #endif /* ANSI */
                    102:        d4_10_1();
                    103:        d4_10_2();
                    104:        d4_10_3();
                    105:        d4_10_4();
                    106:        d4_10_5();
                    107:        d4_10_6();
                    108:        d4_10_7();
                    109:        d4_10_8();
                    110:        }
                    111: 
                    112: #if ANSI
                    113: #include <limits.h>
                    114: #include <float.h>
                    115: #endif /* ANSI */
                    116: /*
                    117:  * 4.10.1 String conversion functions
                    118:  */
                    119: static void d4_10_1()
                    120:        {
                    121: #ifndef SKIP4_101
                    122:        char *p;
                    123:        int i;
                    124:        long l;
                    125:        double d;
                    126:        
                    127:        /* atof, atoi, atol do not affect errno */
                    128:        errno = 99;
                    129: 
                    130:        /* 4.10.1.1 atof
                    131:         * text to float
                    132:         */
                    133:        dequals(__LINE__, atof("XXX"), 0.0);
                    134:        dequals(__LINE__, atof("\f\t\n\r\v1.234"), 1.234);
                    135:        dequals(__LINE__, atof("1.234"), 1.234);
                    136:        dequals(__LINE__, atof("         +1.234"), 1.234);
                    137:        dequals(__LINE__, atof("         +1.234"), 1.234);
                    138:        dequals(__LINE__, atof("         -1.234"), -1.234);
                    139:        dequals(__LINE__, atof("         +1.234e1"), 1.234e1);
                    140:        dequals(__LINE__, atof("         +1.234E1"), 1.234E1);
                    141:        dequals(__LINE__, atof("         +1.234E-1"), 1.234E-1);
                    142:        dequals(__LINE__, atof("         +1.234XE-1"), 1.234);
                    143: 
                    144:        /* 4.10.1.2 atoi
                    145:         * text to int
                    146:         */
                    147:        iequals(__LINE__, atoi("XXX"), 0);
                    148:        iequals(__LINE__, atoi("123"), 123);
                    149:        iequals(__LINE__, atoi("+123"), 123);
                    150:        iequals(__LINE__, atoi("-123"), -123);
                    151:        iequals(__LINE__, atoi("        +123"), 123);
                    152:        iequals(__LINE__, atoi("        0123"), 123);
                    153:        iequals(__LINE__, atoi("        0x123"), 0);
                    154:        iequals(__LINE__, atoi("        12a3"), 12);
                    155: 
                    156:        /* 4.10.1.3 atol
                    157:         * text to long
                    158:         */
                    159:        lequals(__LINE__, atol("XXX"), 0L);
                    160:        lequals(__LINE__, atol("123456"), 123456);
                    161:        lequals(__LINE__, atol("+123456"), 123456);
                    162:        lequals(__LINE__, atol("-123456"), -123456);
                    163:        lequals(__LINE__, atol("        +123456"), 123456);
                    164:        lequals(__LINE__, atol("        0123456"), 123456);     /* not octal !! */
                    165:        lequals(__LINE__, atol("        0x123456"), 0L);
                    166:        lequals(__LINE__, atol("        12a3"), 12L);
                    167: 
                    168:        errno = 0;
                    169: 
                    170: #if ANSI
                    171:        /* 4.10.1.4 strtod
                    172:         * Same as atof, but gets pointer to end character and error checking
                    173:         */
                    174:        dequals(__LINE__, strtod("XXX", &p), 0.0);
                    175:        dequals(__LINE__, strtod("\f\t\n\r\v1.1", &p), 1.1);
                    176:        dequals(__LINE__, strtod("1.234", &p), 1.234);
                    177:        dequals(__LINE__, strtod("       +1.234", &p), 1.234);
                    178:        dequals(__LINE__, strtod("       +1.234", &p), 1.234);
                    179:        dequals(__LINE__, strtod("       -1.234", &p), -1.234);
                    180:        dequals(__LINE__, strtod("       +1.234e1", &p), 1.234e1);
                    181:        dequals(__LINE__, strtod("       +1.234E1", &p), 1.234E1);
                    182:        dequals(__LINE__, strtod("       +1.234E-1", &p), 1.234E-1);
                    183:        dequals(__LINE__, strtod("       +1.234XE-1", &p), 1.234);
                    184: 
                    185:        /* on no conversion, end pointer doesn't move */
                    186:        d = strtod(string5+3, &p);
                    187:        aequals(__LINE__, p, string5+3);
                    188:        d = strtod(string5, &p);
                    189:        aequals(__LINE__, p, string5);
                    190: 
                    191:        /* endptr gets pointer to remaining string */
                    192:        dequals(__LINE__, strtod(string1, &p), 1.234);
                    193:        aequals(__LINE__, p++, string1+5);
                    194: 
                    195:        /* overflow returns +/- HUGE_VAL */
                    196:        errno = 0;
                    197:        dequals(__LINE__, strtod(p, NULL), HUGE_VAL);
                    198:        iequals(__LINE__, errno, ERANGE);
                    199:        errno = 0;
                    200:        dequals(__LINE__, strtod("-1e99999999999999999999", NULL), -HUGE_VAL);
                    201:        iequals(__LINE__, errno, ERANGE);
                    202: 
                    203:        /* underflow returns 0 */
                    204:        errno = 0;
                    205:        dequals(__LINE__, strtod("1e-9999999999999999", NULL), 0.0);
                    206:        iequals(__LINE__, errno, ERANGE);
                    207: 
                    208:        /* 4.10.1.5 strtol
                    209:         * same as atol but with pointer, base, and error checking
                    210:         */
                    211:        lequals(__LINE__, strtol("XXX", &p, 0), 0L);
                    212:        lequals(__LINE__, strtol(string2, &p, 8), 0123L);
                    213:        aequals(__LINE__, p++, string2+12);
                    214: 
                    215:        /* check out bases */
                    216:        for (i = 2; i <= 36; ++i)
                    217:                lequals(__LINE__, strtol("11", NULL, i), (long)(i+1));
                    218:        lequals(__LINE__, strtol("zzz", NULL, 36), (((35L*36L)+35L)*36L)+35L);
                    219:                
                    220:        /* 0 base uses default C parsing rules */
                    221:        lequals(__LINE__, strtol("0x12345", NULL, 0), 0x12345L);
                    222:        lequals(__LINE__, strtol("0123", NULL, 0), 0123L);
                    223:        lequals(__LINE__, strtol("               -123", NULL, 0), -123L);
                    224:        lequals(__LINE__, strtol("               +123", NULL, 0), 123L);
                    225: 
                    226:        /* otherwise, same as atol */
                    227:        lequals(__LINE__, strtol("\f\t\n\r\v7", &p, 10), 7L);
                    228:        lequals(__LINE__, strtol("123456", &p, 10), 123456L);
                    229:        lequals(__LINE__, strtol("+123456", &p, 10), 123456L);
                    230:        lequals(__LINE__, strtol("-123456", &p, 10), -123456L);
                    231:        lequals(__LINE__, strtol("      +123456", &p, 10), 123456L);
                    232:        lequals(__LINE__, strtol("      0123456", &p, 10), 123456L);
                    233:        lequals(__LINE__, strtol("      0x123456", &p, 10), 0L);
                    234:        lequals(__LINE__, strtol("      0x123456", &p, 16), 0x123456L);
                    235:        lequals(__LINE__, strtol("      -0X123456", &p, 16), -0x123456L);
                    236:        lequals(__LINE__, strtol("      12a3", &p, 10), 12L);
                    237: 
                    238:        /* on no conversion, end pointer doesn't move */
                    239:        d = strtol(string5+3, &p, 10);
                    240:        aequals(__LINE__, p, string5+3);
                    241:        d = strtol(string5, &p, 10);
                    242:        aequals(__LINE__, p, string5);
                    243: 
                    244:        /* error checking */
                    245:        errno = 0;
                    246:        lequals(__LINE__, strtol(string3, NULL, 0), LONG_MAX);
                    247:        iequals(__LINE__, errno, ERANGE);
                    248:        errno = 0;
                    249:        lequals(__LINE__, strtol(string4, NULL, 0), LONG_MIN);
                    250:        iequals(__LINE__, errno, ERANGE);
                    251: 
                    252: 
                    253: 
                    254:        /* 4.10.1.6 strtoul
                    255:         * same conversions as strtol, but to unsigned long
                    256:         */
                    257:        lequals(__LINE__, strtoul("XXX", &p, 0), 0L);
                    258:        lequals(__LINE__, strtoul(string2, &p, 8), 0123L);
                    259:        aequals(__LINE__, p++, string2+12);
                    260: 
                    261:        /* check out bases */
                    262:        for (i = 2; i <= 36; ++i)
                    263:                lequals(__LINE__, strtoul("11", NULL, i), (long)(i+1));
                    264:        lequals(__LINE__, strtoul("zzz", NULL, 36), (((35L*36L)+35L)*36L)+35L);
                    265:                
                    266:        /* 0 base uses default C parsing rules */
                    267:        lequals(__LINE__, strtoul("0x12345", NULL, 0), 0x12345L);
                    268:        lequals(__LINE__, strtoul("0123", NULL, 0), 0123L);
                    269: 
                    270:        lequals(__LINE__, strtoul("\f\t\n\r\v7", &p, 10), 7L);
                    271:        lequals(__LINE__, strtoul("123456", &p, 10), 123456L);
                    272:        lequals(__LINE__, strtoul("     0123456", &p, 10), 123456L);
                    273:        lequals(__LINE__, strtoul("     0x123456", &p, 10), 0L);
                    274:        lequals(__LINE__, strtoul("     0x123456", &p, 16), 0x123456L);
                    275:        lequals(__LINE__, strtoul("     0X123456", &p, 16), 0x123456L);
                    276:        lequals(__LINE__, strtoul("     12a3", &p, 10), 12L);
                    277: #if ANSI8712
                    278:        lequals(__LINE__, strtoul("     +12", &p, 10), 12L);
                    279: #endif /* ANSI8712 */
                    280: 
                    281:        /* on no conversion, end pointer doesn't move */
                    282:        d = strtoul(string5+3, &p, 10);
                    283:        aequals(__LINE__, p, string5+3);
                    284:        d = strtoul(string5, &p, 10);
                    285:        aequals(__LINE__, p, string5);
                    286: 
                    287:        /* error checking */
                    288:        errno = 0;
                    289:        lequals(__LINE__, strtoul(string3, NULL, 0), ULONG_MAX);
                    290:        iequals(__LINE__, errno, ERANGE);
                    291: #endif /* ANSI */
                    292: #endif /* SKIP4_101 */
                    293:        }
                    294: 
                    295: /*
                    296:  * 4.10.2 - Random number generation functions.
                    297:  */
                    298: static void d4_10_2()
                    299:        {
                    300: #ifndef SKIP4_102
                    301:        int i1, i2, i3, j1, j2, j3;
                    302: 
                    303:        /* 4.10.2.1 rand
                    304:         * before ansi, all we can count on is that the sequence exists
                    305:         */
                    306:        i1 = rand();
                    307:        i2 = rand();
                    308:        i3 = rand();
                    309: 
                    310:        /* 4.10.2.2 srand
                    311:         * that it can be reset to the default
                    312:         */
                    313:        srand(1);
                    314:        j1 = rand();
                    315:        j2 = rand();
                    316:        j3 = rand();
                    317:        iequals(__LINE__, i1, j1);
                    318:        iequals(__LINE__, i2, j2);
                    319:        iequals(__LINE__, i3, j3);
                    320: 
                    321:        /* and reset arbitrarily */
                    322:        srand(11);
                    323:        i1 = rand();
                    324:        i2 = rand();
                    325:        i3 = rand();
                    326:        srand(11);
                    327:        j1 = rand();
                    328:        j2 = rand();
                    329:        j3 = rand();
                    330:        iequals(__LINE__, i1, j1);
                    331:        iequals(__LINE__, i2, j2);
                    332:        iequals(__LINE__, i3, j3);
                    333: 
                    334: #if ANSI
                    335:        /* now the range is specified */
                    336:        for (i1 = 0; i1 < 30; ++i1)
                    337:                {
                    338:                j1 = rand();
                    339:                checkthat(__LINE__, 0 <= j1 && j1 <= RAND_MAX);
                    340:                }
                    341: #endif /* ANSI */
                    342: #endif /* SKIP4_102 */
                    343:        }
                    344: 
                    345: 
                    346: 
                    347: /*
                    348:  * 4.10.3 - Memory management functions
                    349:  */
                    350: static void d4_10_3()
                    351:        {
                    352: #ifndef SKIP4_103
                    353:        int i;
                    354:        char *pc;
                    355:        long *pl;
                    356:        double d = 9.87;
                    357:        union all
                    358:                {
                    359:                char c;
                    360:                short s;
                    361:                int i;
                    362:                long l;
                    363:                double d;
                    364: #if ANSI
                    365:                long double ld;
                    366: #endif /* ANSI */
                    367:                char *pc;
                    368:                long *pl;
                    369:                double *pd;
                    370:                } *pu;
                    371:        int is_all_zero;
                    372: 
                    373:        /* 4.10.3.1 calloc
                    374:         * Can't do much more than check for existence and see if
                    375:         * using them doesn't crash the program. Calloc zeros out
                    376:         * the space.
                    377:         */
                    378:        pc = calloc(100, sizeof(long));
                    379:        is_all_zero = 1;  /* See update item #534, Review Board 8/92 */
                    380:        for (i = 0; i < 100*sizeof(long); ++i)
                    381:                {
                    382:                if (pc[i] != 0)
                    383:                        is_all_zero = 0;
                    384:                }
                    385:        iequals(__LINE__, is_all_zero, 1);
                    386: 
                    387:        pl = (long *)pc;
                    388:        for (i = 0; i < 100; ++i)
                    389:                lequals(__LINE__, pl[i], 0L);
                    390: 
                    391:        free((char *)pl);
                    392: 
                    393:        /* Check alignment properties ... presumably the program
                    394:         * could crash if there is an alignment error. Here is a case
                    395:         * where it is important to try to defeat optimizers, so ivalue, etc.
                    396:         * are used for the assignments..
                    397:         */
                    398:        pu = (union all *)calloc(100, sizeof(*pu));
                    399:        pu->c = ivalue('a');
                    400:        iequals(__LINE__, pu->c, 'a');
                    401:        pu->s = ivalue(SHRT_MAX);
                    402:        iequals(__LINE__, pu->s, SHRT_MAX);
                    403:        pu->i = ivalue(INT_MAX);
                    404:        iequals(__LINE__, pu->i, INT_MAX);
                    405:        pu->l = lvalue(LONG_MAX);
                    406:        lequals(__LINE__, pu->l, LONG_MAX);
                    407:        pu->d = dvalue(2.34);
                    408:        dequals(__LINE__, pu->d, 2.34);
                    409: #if ANSI
                    410:        pu->ld = 3.45L;
                    411:        ldequals(__LINE__, pu->ld, 3.45L);
                    412: #endif /* ANSI */
                    413:        /* pointer to integral types already checked */
                    414:        pu->pd = (double *)avalue(&d);
                    415:        dequals(__LINE__, *(pu->pd), 9.87);
                    416: 
                    417:        /* check for 0 as arguments */
                    418:        aequals(- __LINE__, calloc(0, 100), NULL);      /* ANSI8612: behavior is implem-def; see 4.10.3 P1s1 */
                    419:        aequals(- __LINE__, calloc(100, 0), NULL);      /* ANSI8612: behavior is implem-def; see 4.10.3 P1s1 */
                    420: 
                    421:        /* 4.10.3.2 free used throughout.  ANSI requires free to accept a NULL argument.  */
                    422: #if ANSI
                    423:        free(NULL);
                    424: #endif /* ANSI */
                    425:        
                    426:        /* 4.10.3.3 malloc
                    427:         */
                    428:        pc = malloc(100 * sizeof(long));
                    429:        for (i = 0; i < 100*sizeof(long); ++i)
                    430:                pc[i] = i%128;
                    431:        for (i = 0; i < 100*sizeof(long); ++i)
                    432:                iequals(__LINE__, pc[i], i%128);
                    433:        pl = (long *)pc;
                    434:        for (i = 0; i < 100; ++i)
                    435:                pl[i] = i;
                    436:        for (i = 0; i < 100; ++i)
                    437:                lequals(__LINE__, pl[i], (long)i);
                    438: 
                    439: 
                    440:        /* check for 0 as arguments */
                    441:        aequals(- __LINE__, malloc(0), NULL);   /* ANSI8612: behavior is implem-def; see 4.10.3 P1s1 */
                    442: 
                    443:        /* 4.10.3.4 realloc
                    444:         * contents should be the same up to the lesser size
                    445:         */
                    446:        pc = realloc((char *)pl, 200*sizeof(long));
                    447:        pl = (long *)pc;
                    448:        for (i = 0; i < 100; ++i)
                    449:                lequals(__LINE__, pl[i], (long)i);
                    450:        pc = realloc((char *)pl, 50*sizeof(long));
                    451:        pl = (long *)pc;
                    452:        for (i = 0; i < 50; ++i)
                    453:                lequals(__LINE__, pl[i], (long)i);
                    454:        free(pc);
                    455: #if ANSI
                    456:        /* ANSI requires that NULL and 0 are acceptable as arguments */
                    457:        pc = realloc(NULL, 400);
                    458:        for (i = 0; i < 400; ++i)
                    459:                pc[i] = i%128;
                    460:        for (i = 0; i < 400; ++i)
                    461:                iequals(__LINE__, pc[i], i%128);
                    462:        aequals(- __LINE__, realloc(pc, 0), NULL);      /* ANSI8612: behavior is implem-def; see 4.10.3 P1s1 */
                    463: #endif /* ANSI */
                    464: #endif /* SKIP4_103 */
                    465:        }
                    466: 
                    467: /*
                    468:  * 4.10.4 - Communication with the environment.
                    469:  */
                    470: typedef int (*PIF)();
                    471: #ifndef SKIP4_104
                    472: static void d4_10_4y();
                    473: static void d4_10_4z();
                    474: #endif /* SKIP4_104 */
                    475: static void d4_10_4()
                    476:        {
                    477: #ifndef SKIP4_104
                    478:        PIF p;
                    479:        int i;
                    480:        void d4_10_4x();
                    481: 
                    482:        /* Existence of these functions has been checked in 4.1.
                    483:         * Most of these we can't call without terminating the program,
                    484:         * in which case no real testing is done.
                    485:         */
                    486: 
                    487: #if ANSI
                    488:        /* 4.10.4.1 abort
                    489:         * terminates the program, so don't call it.
                    490:         */
                    491:        p = (PIF)abort;
                    492: 
                    493:        /* 4.10.4.2 atexit
                    494:         * register functions to be called at exit. At least
                    495:         * 32 must be allowed. As of ANSI8712 it is required that
                    496:         * they be called in reverse order of registry.
                    497:         */
                    498: #if ANSI8712
                    499:        iequals(__LINE__, atexit(d4_10_4x), 0);
                    500:        for (i = 0; i < 30; ++i)
                    501:                iequals(__LINE__, atexit(d4_10_4y), 0);
                    502:        iequals(__LINE__, atexit(d4_10_4z), 0);
                    503: #else
                    504:        for (i = 0; i < 32; ++i)
                    505:                iequals(__LINE__, atexit(d4_10_4x), 0);
                    506: #endif /* ANSI8712 */
                    507: #endif /* ANSI */
                    508: 
                    509:        /* 4.10.4.3 exit
                    510:         * will be tested at the end of main
                    511:         */
                    512: #if ANSI8612
                    513:        checkthat(__LINE__, EXIT_SUCCESS != EXIT_FAILURE);
                    514: #endif /* ANSI8612 */
                    515:        p = (PIF)exit;
                    516: 
                    517:        /* 4.10.4.4 getenv
                    518:         * returns an implementation dependant pointer
                    519:         */
                    520:        aequals(- __LINE__, getenv("this is probably a NULL pointer"), NULL);
                    521: 
                    522:        /* 4.10.4.4 system
                    523:         * is very implementation dependent. Does a command processor 
                    524:         * exist? Return of 0 says not.
                    525:         */
                    526:        checkthat(- __LINE__, system(NULL) != 0);
                    527: #endif /* SKIP4_104 */
                    528:        }
                    529: 
                    530: static int i = 0;
                    531: #ifndef SKIP4_104
                    532: static void d4_10_4z()
                    533:        {
                    534:        Filename = "d410.c";
                    535:        /* this function was registered last, so it should be called first */
                    536:        if (++i != 1)
                    537:                complain(__LINE__);
                    538:        }
                    539: static void d4_10_4y()
                    540:        {
                    541:        Filename = "d410.c";
                    542:        /* there should be exactly 30 invocations of this function */
                    543:        if (i < 1 || i > 30) 
                    544:                complain(__LINE__);
                    545:        ++i;
                    546:        }
                    547: #if ANSI8712
                    548: static void d4_10_4x()
                    549:        {
                    550:        Filename = "d410.c";
                    551:        /* this function was registered first, so it should be called last */
                    552:        if (++i != 32)
                    553:                complain(__LINE__);
                    554:        }
                    555: #else  /* if !ANSI8712 */
                    556: static void d4_10_4x()
                    557:        {
                    558:        if (++i == 32)
                    559:                printf("ATEXIT successfully registered 32 functions\n");
                    560:        Filename = "d410.c";
                    561:        checkthat(__LINE__, i <= 32);
                    562:        }
                    563: #endif /* ANSI8712 */
                    564: #endif /* SKIP4_104 */
                    565: 
                    566: /*
                    567:  * 4.10.5 - Searching and sorting.
                    568:  */
                    569: 
                    570: #if !ANSI
                    571: static void d4_10_5() { }
                    572: #else  /* if ANSI */
                    573: int mycmpfn PARMS((const void *, const void *));
                    574: int mycmpfn(s1, s2)
                    575:        const void *s1, *s2;
                    576:        {
                    577:        return (strcmp((const char *)s1, (const char *)s2));
                    578:        }
                    579: 
                    580: static void d4_10_5()
                    581:        {
                    582: #ifndef SKIP4_105
                    583: /*     generic_ptr bsearch(); depend upon declaration in <stdlib.h> */
                    584:        char *p;
                    585:        static char names[][4] = {"abc", "jkl", "yzz", "def", "stu", "mno", "vwx", "pqr", "ghi"};
                    586:                                                        /* Since we are in a "C" locale, these strings can be expected */
                    587:                                                        /* to collate as abc, def, ghi, jkl, mno, pqr, stu, vwx, yzz. */
                    588:        /* 4.10.5.1 qsort
                    589:         * sort using user comparison routine.
                    590:         */
                    591:        qsort(names, 9, 4, mycmpfn);
                    592:        stequals(__LINE__, names[0], "abc");
                    593:        stequals(__LINE__, names[1], "def");
                    594:        stequals(__LINE__, names[2], "ghi");
                    595:        stequals(__LINE__, names[3], "jkl");
                    596:        stequals(__LINE__, names[4], "mno");
                    597:        stequals(__LINE__, names[5], "pqr");
                    598:        stequals(__LINE__, names[6], "stu");
                    599:        stequals(__LINE__, names[7], "vwx");
                    600:        stequals(__LINE__, names[8], "yzz");
                    601:        /* 4.10.5.2 bsearch
                    602:         * find the entries in the array
                    603:         */
                    604:        checkthat(__LINE__, bsearch("abc", names, 9, 4, mycmpfn) == names[0]);  
                    605:        aequals(__LINE__, bsearch("def", names, 9, 4, mycmpfn), names[1]);      
                    606:        aequals(__LINE__, bsearch("ghi", names, 9, 4, mycmpfn), names[2]);      
                    607:        aequals(__LINE__, bsearch("jkl", names, 9, 4, mycmpfn), names[3]);      
                    608:        aequals(__LINE__, bsearch("mno", names, 9, 4, mycmpfn), names[4]);      
                    609:        aequals(__LINE__, bsearch("pqr", names, 9, 4, mycmpfn), names[5]);      
                    610:        aequals(__LINE__, bsearch("stu", names, 9, 4, mycmpfn), names[6]);      
                    611:        aequals(__LINE__, bsearch("vwx", names, 9, 4, mycmpfn), names[7]);      
                    612:        /* no match returns NULL */
                    613:        aequals(__LINE__, bsearch("123", (char*)names, 9, 4, mycmpfn), NULL);   
                    614: #endif /* SKIP4_105 */
                    615:        }
                    616: #endif /* !ANSI */
                    617: 
                    618: /*
                    619:  * 4.10.6 - Integer arithmetic functions.
                    620:  */
                    621: static void d4_10_6()
                    622:        {
                    623: #ifndef SKIP4_106
                    624:        /* 4.10.6.1 abs
                    625:         * absolute value
                    626:         */
                    627:        iequals(__LINE__, abs(10), 10);
                    628:        iequals(__LINE__, abs(-10), 10);
                    629: 
                    630: #if ANSI
                    631:        {
                    632:        div_t d;
                    633:        ldiv_t ld;
                    634: 
                    635:        /* 4.10.6.2 div
                    636:         * get dividend and remainder.
                    637:         */
                    638:        d = div(-5, 2);
                    639:        iequals(__LINE__, d.quot, -2);
                    640:        iequals(__LINE__, d.rem, -1);
                    641:        d = div(5, 2);
                    642:        iequals(__LINE__, d.quot, 2);
                    643:        iequals(__LINE__, d.rem, 1);
                    644: 
                    645:        /* 4.10.6.3 labs
                    646:         * same as abs, but for longs
                    647:         */
                    648:        lequals(__LINE__, labs(2147483647), 2147483647);
                    649:        lequals(__LINE__, labs(-2147483647), 2147483647);
                    650: 
                    651:        /* 4.10.6.4 ldiv
                    652:         * get long dividend and remainder.
                    653:         */
                    654:        ld = ldiv(-5L, 2L);
                    655:        lequals(__LINE__, ld.quot, -2L);
                    656:        lequals(__LINE__, ld.rem, -1L);
                    657:        ld = ldiv(5L, 2L);
                    658:        lequals(__LINE__, ld.quot, 2L);
                    659:        lequals(__LINE__, ld.rem, 1L);
                    660:        }
                    661: #endif /* ANSI */
                    662: #endif /* SKIP4_106 */
                    663:        }
                    664: 
                    665: /*
                    666:  * 4.10.7 - Multibyte character functions
                    667:  */
                    668: #if !ANSI
                    669: static void d4_10_7(){}
                    670: #else  /* if ANSI */
                    671: static void d4_10_7()
                    672:        {
                    673: #ifndef SKIP4_107
                    674:        const char *s = "Test string";
                    675:        int len = strlen(s);
                    676:        const char *ps = s + len;                                       /* points to 0 */
                    677: #if WIDE_CHARS
                    678:        wchar_t wc;
                    679: #endif /* WIDE_CHARS */
                    680:        char buff[10];
                    681: 
                    682:        /* Only the "C" locale can be tested here, which has no
                    683:         * specific requirements.  Vendor specific tests can be added to
                    684:         * test actual multibyte encodings.
                    685:         */
                    686: #if WIDE_CHARS
                    687:        /* 4.10.7.1 The mblen function */
                    688:        iequals( - __LINE__, mblen(NULL, 1000), 0);             /* no multibytes */
                    689:        iequals( - __LINE__, mblen(NULL, 0), 0);                        /* no multibytes */
                    690:        iequals(__LINE__, mblen(ps, 1), 0);                             /* pointer to 0 */
                    691:        iequals(__LINE__, mblen(s, len), 1);                    /* 1 byte per char */
                    692: 
                    693:        /* 4.10.7.2 The mbtowc function */
                    694:        iequals(__LINE__, mbtowc(&wc, NULL, 0), 0);             /* no multibytes */
                    695:        iequals(__LINE__, mbtowc(&wc, ps, 1), 0);               /* pointer to 0 */
                    696:        lequals(__LINE__, (long)wc, 0L);                                /* big enough for wchar_t */
                    697:        iequals(__LINE__, mbtowc(&wc, s, len), 1);              /* pointer to 0 */
                    698:        lequals(__LINE__, (long)wc, (long)'T');                 /* big enough for wchar_t */
                    699:        checkthat(__LINE__, MB_CUR_MAX >= 1);
                    700: 
                    701:        /* 4.10.7.3 The wctomb function */
                    702:        iequals(__LINE__, wctomb(NULL, wc), 0);                 /* no multibytes */
                    703:        iequals(__LINE__, wctomb(NULL, 0), 0);                  /* no multibytes */
                    704:        iequals(__LINE__, wctomb(buff, wc), 1);                 /* 1 byte per char */
                    705:        iequals(__LINE__, buff[0], 'T');                                
                    706:        wc = 0;
                    707:        iequals(__LINE__, wctomb(buff, wc), 1); 
                    708:        iequals(__LINE__, buff[0], 0);                          
                    709: #endif /* WIDE_CHARS */
                    710: #endif /* SKIP4_107 */
                    711:        }
                    712: #endif /* ANSI */
                    713: 
                    714: /*
                    715:  * 4.10.8 - Multibyte string functions
                    716:  * The size_t checks are done as long because sizeof(long) >= sizeof(size_t).
                    717:  * Also, it is assumed that sizeof(long) >= sizeof(wchar_t);
                    718:  */
                    719: #if !ANSI || !WIDE_CHARS
                    720: static void d4_10_8()
                    721:                {}
                    722: #else  /* if ANSI && WIDE_CHARS */
                    723: static void d4_10_8()
                    724:        {
                    725: #ifndef SKIP4_108
                    726:        int i;
                    727:        const char *s = "A test string";
                    728:        long len = (long)strlen(s);
                    729:        #define WLEN 20
                    730:        wchar_t warray[WLEN];
                    731:        char buf[WLEN];
                    732: 
                    733:        /* if wchar_t is bigger than a long, these tests will not work */
                    734:        if (sizeof(long) < sizeof(wchar_t))
                    735:                {
                    736:                complain(- __LINE__);
                    737:                return;
                    738:                }
                    739:        
                    740:        /* initialize warray and buf to all 1 */
                    741:        for (i = 0; i < WLEN; ++i)
                    742:                {
                    743:                warray[i] = 1;
                    744:                buf[i] = 1;
                    745:                }
                    746: 
                    747:        /* in the "C" locale it is assumed that the MB representation
                    748:         * is the same as the wchar_t representation for printable
                    749:         * characters.
                    750:         */
                    751: 
                    752:        /* 4.10.8.1 the mbstowcs function */
                    753:        lequals(__LINE__, (long) mbstowcs(warray, s, 1), 1L);
                    754:        lequals(__LINE__, (long) warray[0], (long)'A');
                    755:        lequals(__LINE__, (long) warray[1], 1L);                        /* no terminating 0 */
                    756:        lequals(__LINE__, (long) mbstowcs(warray, s, WLEN), len);
                    757:        lequals(__LINE__, (long) warray[len-1], (long)'g');
                    758:        lequals(__LINE__, (long) warray[len], 0L);                      /* terminating 0 */
                    759: 
                    760:        /* 4.10.8.2 the wcstombs function */
                    761:        lequals(__LINE__, (long) wcstombs(buf, warray, 1), 1L);
                    762:        lequals(__LINE__, (long) buf[0], (long)'A');
                    763:        lequals(__LINE__, (long) buf[1], 1L);                           /* no terminating 0 */
                    764:        lequals(__LINE__, (long) wcstombs(buf, warray, WLEN), len);
                    765:        lequals(__LINE__, (long) buf[len-1], (long)'g');
                    766:        lequals(__LINE__, (long) buf[len], 0L);                         /* terminating 0 */
                    767: #endif /* SKIP4_108 */
                    768:        }
                    769: #endif /* ANSI  && WIDE_CHARS */
                    770: 
                    771: #else /* if SKIP410 */
                    772: void d4_10() { pr_skip("d4_10: SKIPPED ENTIRELY\n"); }
                    773: #endif /* SKIP410 */
                    774: 

unix.superglobalmegacorp.com

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