Annotation of researchv10no/cmd/lcc/ph/util.c, revision 1.1.1.1

1.1       root        1: /* Suite++: The Plum Hall Validation Suite for C++
                      2:  * VERSION: 1
                      3:  * AND      The Plum Hall Validation Suite for C
                      4:  * VERSION: 4
                      5:  * Unpublished copyright (c) 1991, Plum Hall Inc (Editor)
                      6:  * DATE: 1993-01-01
                      7:  * As per your license agreement, your distribution is not to be moved or copied outside the Designated Site
                      8:  * without specific permission from Plum Hall Inc.
                      9:  */
                     10: 
                     11: /*
                     12:  * UTIL - various utility routines
                     13:  */
                     14: #include "defs.h"
                     15: #ifndef FREESTANDING
                     16: #include <stdio.h>
                     17: #endif
                     18: 
                     19: #define BUFSIZE 256
                     20: 
                     21: void setzero();
                     22: void setremark();
                     23: void trace PARMS((const char *msg, int line));
                     24: 
                     25: long Nerrs = 0;
                     26: long Nskips = 0;
                     27: long Nremarks = 0;
                     28: long Nsuccess = 0;
                     29: int Debug = FALSE;
                     30: char *Filename = 0;
                     31: char last_char_printed = 0;
                     32: static char details[BUFSIZE] = {0};
                     33: static int trace_msg_len = 0;
                     34: static char trace_routine[20] = "";
                     35: static char trace_filename[BUFSIZE] = "";
                     36: static int remarks = FALSE;
                     37: static int first = 1;
                     38: 
                     39: #include "clib.h"
                     40: 
                     41: /*
                     42:  * STR_REV - reverse a string
                     43:  */
                     44: char *str_rev FN_DEF1(s,
                     45:        char *s)
                     46:        {
                     47:        char c;
                     48:        char *p, *q;
                     49: 
                     50:        for (p = s, q = s + str_len(s) - 1; p < q; ++p, --q)
                     51:                {
                     52:                c = *p;
                     53:                *p = *q;
                     54:                *q = c;
                     55:                }
                     56:        return s;
                     57:        }
                     58: 
                     59: /*
                     60:  * IABS - absolute value of an integer
                     61:  */
                     62: int iabs FN_DEF1(i,
                     63:        int i)
                     64:        {
                     65:        return (i >= 0) ? i : -i;
                     66:        }
                     67: 
                     68: /*
                     69:  * DABS - absolute value of a double
                     70:  */
                     71: double dabs FN_DEF1(d,
                     72:        double d)
                     73:        {
                     74:        return (d >= 0.0) ? d : -d;
                     75:        }
                     76: 
                     77: /*
                     78:  * DPOWU - returns a double d raised to the power of unsigned u
                     79:  */
                     80: double dpowu FN_DEF2(d, u,
                     81:        double d,
                     82:        unsigned u)
                     83:        {
                     84:        double p = 1.0;
                     85: 
                     86:        while (u-- > 0)
                     87:                p *= d;
                     88:        return p;
                     89:        }
                     90: 
                     91: /*
                     92:  * ULTOSTR - convert unsigned long u to a string in base b, return the
                     93:  * address of the null terminator
                     94:  */
                     95: char *ultostr FN_DEF3(s, u, b,
                     96:        char *s,
                     97:        ULONG u,
                     98:        unsigned b)
                     99:        {
                    100:        char *p = s;
                    101: 
                    102:        do
                    103:                {
                    104:                if ((*p = u % b) < 10)
                    105:                        *p += '0';
                    106:                else
                    107:                        *p += 'A' - 10;
                    108:                ++p;
                    109:                }
                    110:        while ((u /= b) != 0);
                    111:        *p = '\0';
                    112:        str_rev(s);
                    113:        return p;
                    114:        }
                    115: 
                    116: /*
                    117:  * LTOSTR - convert long i to a string in base b
                    118:  */
                    119: char *ltostr FN_DEF3(s, i, b,
                    120:        char *s,
                    121:        long i,
                    122:        unsigned b)
                    123:        {
                    124:        if (i < 0)
                    125:                {
                    126:                *s++ = '-';
                    127:                i = -i;
                    128:                }
                    129:        return ultostr(s, i, b);
                    130:        }
                    131: 
                    132: #define utostr(s, u, b) ultostr((s), (ULONG)(u), (b))
                    133: 
                    134: #define itostr(s, i, b) ltostr((s), (long)(i), (b))
                    135: 
                    136: #define ULONG_DIG 64
                    137: 
                    138: /*
                    139:  * PR_UL - print unsigned long u as a string in base b
                    140:  */
                    141: void pr_ul FN_DEF2(lu, b,
                    142:        ULONG lu,
                    143:        unsigned b)
                    144:        {
                    145:        char buf[ULONG_DIG + 1];
                    146: 
                    147:        ultostr(buf, lu, b);
                    148:        pr_ok(buf);
                    149:        }
                    150: 
                    151: /*
                    152:  * PR_L - print long li as a string in base b
                    153:  */
                    154: void pr_l FN_DEF2(li, b,
                    155:        long li,
                    156:        unsigned b)
                    157:        {
                    158:        char buf[ULONG_DIG + 2];
                    159: 
                    160:        ltostr(buf, li, b);
                    161:        pr_ok(buf);
                    162:        }
                    163: 
                    164: #define pr_i(i, b) pr_l((long)(i), (b))
                    165: 
                    166: /*
                    167:  * ENTRY_FN - in Debug mode, record entry to a function
                    168:  */
                    169: void entry_fn FN_DEF1(s,
                    170:        const char *s)
                    171:        {
                    172:        if (Debug)
                    173:                {
                    174:                if (last_char_printed != '\n')
                    175:                        pr_ok("\n");
                    176:                pr_ok("ENTERING: ");
                    177:                pr_ok(s);
                    178:                pr_ok("\n");
                    179:                }
                    180:        }
                    181: 
                    182: /*
                    183:  * ERRMSG - print and tabulate each message
                    184:  */
                    185: static void errmsg FN_DEF2(msg, line,
                    186:        char *msg,
                    187:        int line)
                    188:        {
                    189:        if (first)
                    190:                {
                    191:                setzero();
                    192:                setremark();
                    193:                first = 0;
                    194:                }
                    195:        if (trace_msg_len != 0 )
                    196:                {
                    197:                if (last_char_printed != '\n')
                    198:                        pr_ok("\n");
                    199:                trace_msg_len = 0;
                    200:                str_cpye(trace_routine, "");
                    201:                }
                    202:        if (line > 0 || remarks)
                    203:                {
                    204:                pr_ok(line > 0 ? "ERROR" : "REMARK");
                    205:                pr_ok(" in ");
                    206:                pr_ok(Filename);
                    207:                pr_ok(" at line ");
                    208:                pr_i(iabs(line), 10);
                    209:                pr_ok(msg);
                    210:                pr_ok("\n");
                    211:                }
                    212:        if (line > 0)
                    213:                ++Nerrs;
                    214:        else
                    215:                ++Nremarks;
                    216:        }
                    217: 
                    218: /*
                    219:  * IEQUALS - 'int' equality check.  If val1 != val2, then report an error.
                    220:  */
                    221: int iequals FN_DEF3(line, val1, val2,
                    222:        int line,
                    223:        int val1,
                    224:        int val2)
                    225:        {
                    226:        char *p;
                    227: 
                    228:        if (val1 != val2)
                    229:                {
                    230:                p = str_cpye(details, ": (");
                    231:                p = itostr(p, val1, 10);
                    232:                p = str_cpye(p, ") != (");
                    233:                p = itostr(p, val2, 10);
                    234:                p = str_cpye(p, ")");
                    235:                errmsg(details, line);
                    236:                return 0;
                    237:                }
                    238:        else
                    239:                trace("iequals", line);
                    240:        return 1;
                    241:        }
                    242: 
                    243: /*
                    244:  * INOTEQUALS - 'int' non-equality check.  If val1 == val2, then
                    245:  * report an error.
                    246:  */
                    247: int inotequals FN_DEF3(line, val1, val2,
                    248:        int line,
                    249:        int val1,
                    250:        int val2)
                    251:        {
                    252:        char *p;
                    253: 
                    254:        if (val1 == val2)
                    255:                {
                    256:                p = str_cpye(details, ": (");
                    257:                p = itostr(p, val1, 10);
                    258:                p = str_cpye(p, ") == (");
                    259:                p = itostr(p, val2, 10);
                    260:                p = str_cpye(p, ")");
                    261:                errmsg(details, line);
                    262:                return 0;
                    263:                }
                    264:        else
                    265:                trace("inotequals", line);
                    266:        return 1;
                    267:        }
                    268: 
                    269: /*
                    270:  * LEQUALS - 'long' equality check.  If val1 != val2, then
                    271:  * report an error.
                    272:  */
                    273: int lequals FN_DEF3(line, val1, val2,
                    274:        int line,
                    275:        long val1,
                    276:        long val2)
                    277:        {
                    278:        char *p;
                    279: 
                    280:        if (val1 != val2)
                    281:                {
                    282:                p = str_cpye(details, ": (");
                    283:                p = ltostr(p, val1, 10);
                    284:                p = str_cpye(p, ") != (");
                    285:                p = ltostr(p, val2, 10);
                    286:                p = str_cpye(p, ")");
                    287:                errmsg(details, line);
                    288:                return 0;
                    289:                }
                    290:        else
                    291:                trace("lequals", line);
                    292:        return 1;
                    293:        }
                    294: 
                    295: /*
                    296:  * ULEQUALS - 'unsigned long' equality check.  If val1 != val2, then
                    297:  * report an error.
                    298:  */
                    299: int ulequals FN_DEF3(line, val1, val2,
                    300:        int line,
                    301:        ULONG val1,
                    302:        ULONG val2)
                    303:        {
                    304:        char *p;
                    305: 
                    306:        if (val1 != val2)
                    307:                {
                    308:                p = str_cpye(details, ": (");
                    309:                p = ultostr(p, val1, 10);
                    310:                p = str_cpye(p, ") != (");
                    311:                p = ultostr(p, val2, 10);
                    312:                p = str_cpye(p, ")");
                    313:                errmsg(details, line);
                    314:                return 0;
                    315:                }
                    316:        else
                    317:                trace("ulequals", line);
                    318:        return 1;
                    319:        }
                    320: 
                    321: /*
                    322:  * STEQUALS - string equality.
                    323:  */
                    324: int stequals FN_DEF3(line, val1, val2,
                    325:        int line,
                    326:        const char *val1,
                    327:        const char *val2)
                    328:        {
                    329:        char *p;
                    330: 
                    331:        if (str_cmp(val1, val2))
                    332:                {
                    333:                p = str_cpye(details, ": \"");
                    334:                p = str_cpye(p, val1);
                    335:                p = str_cpye(p, "\" != \"");
                    336:                p = str_cpye(p, val2);
                    337:                p = str_cpye(p, "\"");
                    338:                errmsg(details, line);
                    339:                return 0;
                    340:                }
                    341:        else
                    342:                trace("stequals", line);
                    343:        return 1;
                    344:        }
                    345: 
                    346: /*
                    347:  * COMPLAIN - unconditional failure.
                    348:  */
                    349: int complain FN_DEF1(line,
                    350:        int line)
                    351:        {
                    352:        errmsg("", line);
                    353:        return 0;
                    354:        }
                    355: 
                    356: /*
                    357:  * ARBHEX - convert an arbitrary byte-sequence into hex codes
                    358:  */
                    359: #ifndef CHAR_BIT
                    360: #define CHAR_BIT 8
                    361: #endif
                    362: #define NIBBLES_PER_BYTE ((CHAR_BIT + 3) / 4)
                    363: 
                    364: char *arbhex FN_DEF3(str, p, n,
                    365:        char *str,
                    366:        const char *p,
                    367:        int n)
                    368:        {
                    369:        int i, nib, hex_dig;
                    370:        static char codes[] = "0123456789ABCDEF";
                    371: 
                    372:        for (i = 0; i < n; ++i, ++p)
                    373:                for (nib = NIBBLES_PER_BYTE - 1; nib >= 0; --nib)
                    374:                        {
                    375:                        hex_dig = (*p & (unsigned)(0xF << (nib * 4))) >> (nib * 4);
                    376:                        *str++ = codes[hex_dig];
                    377:                        }
                    378:        *str = '\0';
                    379:        return str;
                    380:        }
                    381: 
                    382: /*
                    383:  * AEQUALS - 'address' equality check.  If val1 != val2, then
                    384:  * report an error.
                    385:  */
                    386: int aequals FN_DEF3(line, val1, val2,
                    387:        int line,
                    388:        const void *val1,
                    389:        const void *val2)
                    390:        {
                    391: #ifdef FREESTANDING
                    392:        char *p;
                    393: #endif
                    394: 
                    395:        if (val1 != val2)
                    396:                {
                    397: #ifdef FREESTANDING
                    398:                p = str_cpye(details, ": (");
                    399:                p = arbhex(p, (const char *)&val1, (int)sizeof(val1));
                    400:                p = str_cpye(p, ") != (");
                    401:                p = arbhex(p, (const char *)&val2, (int)sizeof(val2));
                    402:                p = str_cpye(p, ")");
                    403: #else
                    404:                sprintf(details, ": (%p) != (%p)",  val1, val2);
                    405: #endif
                    406:                errmsg(details, line);
                    407:                return 0;
                    408:                }
                    409:        else
                    410:                trace("aequals", line);
                    411:        return 1;
                    412:        }
                    413: 
                    414: /*
                    415:  * FAEQUALS - function address equality check.  If val1 != val2, then
                    416:  * report an error. The address of a function is not necessarily the same
                    417:  * size/type as the address of data.
                    418:  */
                    419: int faequals FN_DEF3(line, val1, val2,
                    420:        int line,
                    421:        int (*val1)(),
                    422:        int (*val2)())
                    423:        {
                    424:        char *p;
                    425: 
                    426:        if (val1 != val2)
                    427:                {
                    428:                p = str_cpye(details, ": (");
                    429:                p = arbhex(p, (char *)&val1, (int)sizeof(val1));
                    430:                p = str_cpye(p, ") != (");
                    431:                p = arbhex(p, (char *)&val2, (int)sizeof(val2));
                    432:                p = str_cpye(p, ")");
                    433:                errmsg(details, line);
                    434:                return 0;
                    435:                }
                    436:        else
                    437:                trace("faequals", line);
                    438:        return 1;
                    439:        }
                    440: 
                    441: /*
                    442:  * DEQUALS - 'double' equality check.  If val1 != val2, then
                    443:  * report an error. This is computed using an equality approximation
                    444:  * that verifies that the two numbers are equal to R digits whenever
                    445:  *
                    446:  *    |x - y|    1    1-R
                    447:  *    ------- <= - 10
                    448:  *      |x|      2
                    449:  *
                    450:  * DIGITS_MAX  is defined in defs.h
                    451:  */
                    452: double Delta = 0.0;
                    453: 
                    454: int dequals FN_DEF3(line, val1, val2,
                    455:        int line,
                    456:        double val1,
                    457:        double val2)
                    458:        {
                    459: #ifdef FREESTANDING
                    460:        char *p;
                    461: #endif
                    462:        double *pd;
                    463: 
                    464:        if (line < 0)   /* no "remarks" for floating point */
                    465:                return 0;
                    466:        if (Delta == 0.0)
                    467:                Delta = 0.5 / dpowu(10.0, DIGITS_MAX - 1); 
                    468:        if (val1 == val2)
                    469:                {
                    470:                trace("dequals", line);
                    471:                return 1;
                    472:                }
                    473:        pd = &val1;
                    474:        if (val1 == 0.0)
                    475:                pd = &val2;
                    476: 
                    477:        /* special cases to handle zero against very small numbers */
                    478:        if (dabs(val1) == 0.0 && dabs(val2) < Delta)
                    479:                ;
                    480:        else if (dabs(val2) == 0.0 && dabs(val1) < Delta)
                    481:                ;
                    482:        else if ((dabs(val1 - val2) / dabs(*pd)) > Delta)
                    483:                {
                    484: #ifdef FREESTANDING
                    485:                p = str_cpye(details, ": (");
                    486:                p = arbhex(p, (const char *)&val1, (int)sizeof(val1));
                    487:                p = str_cpye(p, ") != (");
                    488:                p = arbhex(p, (const char *)&val2, (int)sizeof(val2));
                    489:                p = str_cpye(p, ")");
                    490: #else
                    491:                sprintf(details, ": (%.*G) != (%.*G)",
                    492:                        DIGITS_MAX + 2, val1, DIGITS_MAX + 2, val2);
                    493: #endif
                    494:                errmsg(details, line);
                    495:                return 0;
                    496:                }
                    497:        trace("dequals", line);
                    498:        return 1;
                    499:        }
                    500: 
                    501: #if ANSI
                    502: /*
                    503:  * LDEQUALS - Long double equality ... more of the same.
                    504:  */
                    505: #define ldabs(ld) ((ld) < 0.0 ? -(ld) : (ld))
                    506: 
                    507: long double LDelta = 0.0;
                    508: 
                    509: int ldequals FN_DEF3(line, val1, val2,
                    510:        int line,
                    511:        long double val1,
                    512:        long double val2)
                    513:        {
                    514: #ifdef FREESTANDING
                    515:        char *p;
                    516: #endif
                    517:        long double *pd;
                    518: 
                    519:        if (line < 0)   /* no "remarks" for floating point */
                    520:                return 0;
                    521:        if (LDelta == 0.0)
                    522:                {
                    523:                LDelta = 0.5L / dpowu(10.0, LDIGITS_MAX - 1); 
                    524:                }
                    525:        if (val1 == val2)
                    526:                {
                    527:                trace("ldequals", line);
                    528:                return 1;
                    529:                }
                    530:        pd = &val1;
                    531:        if (val1 == 0.0)
                    532:                pd = &val2;
                    533: 
                    534:        /* special cases to handle zero against very small numbers */
                    535:        if (ldabs(val1) == 0.0 && ldabs(val2) < LDelta)
                    536:                ;
                    537:        else if (ldabs(val2) == 0.0 && ldabs(val1) < LDelta)
                    538:                ;
                    539:        else if ((ldabs(val1 - val2) / ldabs(*pd)) > LDelta)
                    540:                {
                    541: #ifdef FREESTANDING
                    542:                p = str_cpye(details, ": (");
                    543:                p = arbhex(p, (char *)&val1, (int)sizeof(val1));
                    544:                p = str_cpye(p, ") != (");
                    545:                p = arbhex(p, (char *)&val2, (int)sizeof(val2));
                    546:                p = str_cpye(p, ")");
                    547: #else
                    548:                sprintf(details, ": (%.*LE) != (%.*LE)",
                    549:                        LDIGITS_MAX + 2, val1, LDIGITS_MAX + 2, val2);
                    550: #endif
                    551:                errmsg(details, line);
                    552:                return 0;
                    553:                }
                    554:        trace("ldequals", line);
                    555:        return 1;
                    556:        }
                    557: #endif
                    558: 
                    559: /*
                    560:  * FEQUALS - same as DEQUALS, but to FDIGITS_MAX instead of DIGITS_MAX.
                    561:  */
                    562: double FDelta = 0.0;
                    563: 
                    564: int fequals FN_DEF3(line, in1, in2,
                    565:        int line,
                    566:        double in1,
                    567:        double in2)
                    568:        {
                    569: #ifdef FREESTANDING
                    570:        char *p;
                    571: #endif
                    572:        float *pf;
                    573:        float val1 = in1;
                    574:        float val2 = in2;
                    575: 
                    576:        if (line < 0)   /* no "remarks" for floating point */
                    577:                return 0;
                    578:        if (FDelta == 0.0)
                    579:                FDelta = 0.5 / dpowu(10.0, FDIGITS_MAX - 1); 
                    580:        if (val1 == val2)
                    581:                {
                    582:                trace("fequals", line);
                    583:                return 1;
                    584:                }
                    585:        pf = &val1;
                    586:        if (val1 == 0.0)
                    587:                pf = &val2;
                    588: 
                    589:        /* special cases to handle zero against very small numbers */
                    590:        if (dabs(val1) == 0.0 && dabs(val2) < FDelta)
                    591:                ;
                    592:        else if (dabs(val2) == 0.0 && dabs(val1) < FDelta)
                    593:                ;
                    594:        else if ((dabs(val1 - val2) / dabs(*pf)) > FDelta)
                    595:                {
                    596: #ifdef FREESTANDING
                    597:                p = str_cpye(details, ": (");
                    598:                p = arbhex(p, (char *)&val1, (int)sizeof(val1));
                    599:                p = str_cpye(p, ") != (");
                    600:                p = arbhex(p, (char *)&val2, (int)sizeof(val2));
                    601:                p = str_cpye(p, ")");
                    602: #else
                    603:                sprintf(details, ": (%.*G) != (%.*G)",
                    604:                        FDIGITS_MAX+2, val1, FDIGITS_MAX+2, val2);
                    605: #endif
                    606:                errmsg(details, line);
                    607:                return 0;
                    608:                }
                    609:        trace("fequals", line);
                    610:        return 1;
                    611:        }
                    612: 
                    613: /*
                    614:  * CHECKTHAT - simple condition check.  If val1 == 0, then
                    615:  * report an error.
                    616:  */
                    617: int checkthat FN_DEF2(line, cond,
                    618:        int line,
                    619:        int cond)
                    620:        {
                    621:        if (!cond)
                    622:                {
                    623:                errmsg("", line);
                    624:                return 0;
                    625:                }
                    626:        else
                    627:                trace("checkthat", line);
                    628:        return 1;
                    629:        }
                    630: 
                    631: /*
                    632:  * VALUE - the value routines are used to defeat value propagation in
                    633:  * optimizing compilers.  We want to make sure that we are testing what we
                    634:  * think we are testing, not what the compiler transformed it to.
                    635:  * 1988: Some compilers "open-code" all small functions.  Now we have to hide
                    636:  * the constants still further.
                    637:  */
                    638: static int Zero = 0;   /* See  setzero()  below */
                    639: 
                    640: int ivalue FN_DEF1(i,
                    641:        int i)
                    642:        {
                    643:        return i + Zero;
                    644:        }
                    645: 
                    646: long lvalue FN_DEF1(i,
                    647:        long i)
                    648:        {
                    649:        return i + Zero;
                    650:        }
                    651: 
                    652: double dvalue FN_DEF1(i,
                    653:        double i)
                    654:        {
                    655:        return i + Zero;
                    656:        }
                    657: 
                    658: float fvalue FN_DEF1(i,
                    659:        double i)
                    660:        {
                    661:        return (float)i + Zero;
                    662:        }
                    663: 
                    664: generic_ptr avalue FN_DEF1(i,
                    665:        generic_ptr i)
                    666:        {
                    667:        if (i == 0)
                    668:                return 0;
                    669:        else
                    670:                return (char *)i + Zero;
                    671:        }
                    672: 
                    673: /*
                    674:  * SCHECK - check both values and side effects.
                    675:  */
                    676: int Side = 0;
                    677: 
                    678: int scheck FN_DEF4(line, val1, se, val2,
                    679:        int line,
                    680:        int val1,
                    681:        int se,
                    682:        int val2)
                    683:        {
                    684:        int status = 1;
                    685: 
                    686:        if (Side != se)
                    687:                {
                    688:                errmsg(": incorrect side effect", line);
                    689:                status = 0;
                    690:                }
                    691:        else
                    692:                trace("scheck", line);
                    693:        Side = 0;
                    694:        return status == 1 && iequals(line, val1, val2);
                    695:        }
                    696: 
                    697: /*
                    698:  * DO_NOTHING - this is also intended to defeat optimizers by passing
                    699:  * the addresses of variables for which we want to stop any value propagation.
                    700:  */
                    701: int do_nothing FN_DEF1V(p,
                    702:        void *p)
                    703:        {
                    704:        *(char *)p = *((char *)p + Zero);
                    705:        return 0;
                    706:        }
                    707: 
                    708: /*
                    709:  * REPORT - summary report at end of testing.
                    710:  */
                    711: int report FN_DEF1(program,
                    712:        const char *program)
                    713:        {
                    714:        Nerrs += Nskips;
                    715:        return Nerrs > MAX_INT ? MAX_INT : (int)Nerrs;
                    716:        }
                    717: 
                    718: /*
                    719:  * DBPRINT - print the message if the Debug flag is on.
                    720:  */
                    721: void dbprint FN_DEF1(s,
                    722:        const char *s)
                    723:        {
                    724:        if (Debug)
                    725:                {
                    726:                pr_ok("***DEBUG***");
                    727:                pr_ok(s);
                    728:                }
                    729:        }
                    730: 
                    731: /*
                    732:  * TRACE - print a line-number trace for debugging
                    733:  * Also count successful tests.
                    734:  */
                    735: void trace FN_DEF2(routine, line,
                    736:        const char *routine,
                    737:        int line)
                    738:        {
                    739:        char buf[10];
                    740: 
                    741:        if (first)
                    742:                {
                    743:                setzero();
                    744:                setremark();
                    745:                first = 0;
                    746:                }
                    747:        if (Debug && line > 0)
                    748:                {
                    749:                if (str_cmp(trace_routine, routine) != 0 ||
                    750:                        str_cmp(trace_filename, Filename) != 0 ||
                    751:                        last_char_printed == '\n' ||
                    752:                        trace_msg_len > 60)
                    753:                        {
                    754:                        if (last_char_printed != '\n')
                    755:                                pr_ok("\n");
                    756:                        pr_ok("TRACE: ");
                    757:                        pr_ok(routine);
                    758:                        pr_ok(" at ");
                    759:                        pr_ok(Filename);
                    760:                        pr_ok(" ");
                    761:                        str_cpye(trace_routine, routine);
                    762:                        str_cpye(trace_filename, Filename);
                    763:                        trace_msg_len = 11 + str_len(routine) + str_len(Filename);
                    764:                        }
                    765:                str_cpye(itostr(buf, iabs(line), 10), " ");
                    766:                pr_ok(buf);
                    767:                trace_msg_len += str_len(buf);
                    768:                }
                    769:        if (line > 0)
                    770:                ++Nsuccess; /* don't count remarks in score */
                    771:        }
                    772: 
                    773: /*
                    774:  * PR_SKIP - printf a text line in SKIP situation 
                    775:  */
                    776: void pr_skip FN_DEF1(s,
                    777:        const char *s)
                    778:        {
                    779:        ++Nskips;
                    780:        if (last_char_printed != '\n')
                    781:                pr_ok("\n"); 
                    782:        pr_ok("SKIPPED: "); 
                    783:        pr_ok(s);
                    784:        pr_ok("\n");
                    785:        }
                    786: 
                    787: /*
                    788:  * PR_ERR - printf a text line in error situation 
                    789:  */
                    790: void pr_err FN_DEF1(s,
                    791:        const char *s)
                    792:        {
                    793:        ++Nerrs;
                    794:        pr_ok(s);
                    795:        }
                    796: /*
                    797:  * SETREMARK - determine whether "remark" messages should be printed
                    798:  */
                    799: void setremark()
                    800:        {
                    801: #ifdef SUITE_REMARK
                    802:        remarks = TRUE;
                    803: #else
                    804:        remarks = FALSE;
                    805: #endif
                    806:        }
                    807: 
                    808: /*
                    809:  * ignore - appear to use a value, but don't
                    810:  * (Purpose: shut up noisy "value not used" messages)
                    811:  */
                    812: void ignore FN_DEF1(addr,
                    813:        const void *addr)
                    814:        {
                    815:        if (Zero)
                    816:                pr_ok((char *)addr);
                    817:        }
                    818: 
                    819: #include "sdutil.h"

unix.superglobalmegacorp.com

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