Annotation of cci/usr/src/bin/cdb/format.c, revision 1.1.1.1

1.1       root        1: static char sccsid[] = "@(#)format.c   2.12";
                      2: 
                      3: #include <ctype.h>
                      4: #include "macdefs.h"
                      5: #include "cdb.h"
                      6: 
                      7: export int     vcNest; /* nesting level for printg structures and unions */
                      8: export char vsbFmt[20]; /* format spec for addresses */
                      9: static char vsbAdr[20]; /* where we stick last address formatted - SbFAdr */
                     10: 
                     11: char *vmpBtSb[] = {    /* map basic types into the type names */
                     12:        "undefined",
                     13:        "Function Argument",
                     14:        "char",
                     15:        "short",
                     16:        "int",
                     17:        "long",
                     18:        "float",
                     19:        "double",
                     20:        "struct",
                     21:        "union",
                     22:        "enum",
                     23:        "member of enum",
                     24:        "unsigned char",
                     25:        "unsigned short",
                     26:        "unsigned int",
                     27:        "unsigned long"
                     28: };
                     29: 
                     30: 
                     31: /* S B   F   A D R */
                     32: 
                     33: export char * SbFAdr(adrLong, fMask)
                     34: long    adrLong;
                     35: FLAGT   fMask;
                     36: {
                     37:        if (vsbFmt[0] == chNull)
                     38:                strcpy(vsbFmt, "%lx");
                     39: #if (CBINT == CBSHORT)
                     40:        if (fMask)
                     41:                adrLong &= 0x0000ffffL;
                     42: #endif
                     43:        sprintf(vsbAdr, vsbFmt, adrLong);
                     44:        return(vsbAdr);
                     45: } /* SbFAdr */
                     46: 
                     47: 
                     48: /* D F   F   T Y */
                     49: 
                     50: export DFE DfFTy(ty, fAlternate)
                     51: pTYR   ty;
                     52: FLAGT  fAlternate;
                     53: {
                     54:        int             tq;
                     55: 
                     56:        tq = TqFTy(ty, 1);
                     57:        if ((tq == tqPtr) OR (tq == tqArray)) {
                     58:                if ( fAlternate
                     59:                    AND (ty->td.bt == btChar)
                     60:                    AND ((tq == tqArray AND TqFTy(ty, 2) == tqNil)
                     61:                    OR (ty->td.tq1 == tqPtr)) ) {
                     62:                        return((tq == tqPtr) ? dfPStr : dfStr); /* so it looks pretty */
                     63:                } /* if */
                     64:                return(dfAddr); /* use address display mode */
                     65:        } /* if */
                     66: 
                     67:        if (ty->td.st == stReg)
                     68:                return(dfAddr); /* a hackers delight */
                     69: 
                     70:        switch (ty->td.bt) {
                     71:        case btNil:     
                     72:                return(dfNil);
                     73:        case btUnion:
                     74:        case btStruct:
                     75:                if (fAlternate)
                     76: #ifdef BSD42
                     77:                        return(dfStruct);
                     78: #else
                     79:                return(dfAddr);
                     80: #endif
                     81:                else
                     82:                        return(dfAddr);
                     83:        case btUChar:
                     84:        case btUInt:
                     85:        case btULong:   
                     86:                return(dfUnsigned);
                     87:        case btShort:
                     88:        case btInt:
                     89:        case btLong:    
                     90:                return(dfDecimal);
                     91:        case btFloat:
                     92:        case btDouble:  
                     93:                return(dfGFloat);
                     94:        case btEType:   
                     95:                return(dfEnum);
                     96:        case btChar:    
                     97:                if (tq == tqArray AND fAlternate)
                     98:                        return(dfStr);
                     99:                else
                    100:                        return(dfChar);
                    101:        } /* switch */
                    102:        return(dfDecimal);
                    103: } /* DfFTy */
                    104: 
                    105: 
                    106: /* C B   F   C H */
                    107: 
                    108: export int CbFCh(ch)
                    109: char    ch;
                    110: {
                    111:        switch (ch) {
                    112:        case 'b':
                    113:        case 'c':       
                    114:                return(1);
                    115:        case 'e':
                    116:        case 'f':
                    117:        case 'g':       
                    118:                return(CBFLOAT);
                    119:        case 'E':
                    120:        case 'F':
                    121:        case 'G':       
                    122:                return(CBDOUBLE);
                    123:        case 'D':
                    124:        case 'O':
                    125:        case 'U':
                    126:        case 'X':       
                    127:                return(CBLONG);
                    128:        case 'd':
                    129:        case 'o':
                    130:        case 'u':
                    131:        case 'x':
                    132:        case 'a':
                    133:        case 'n':
                    134:        case 'p':
                    135:        case 's':
                    136:        case 'B':
                    137:        case 'C':
                    138:        case 'S':       
                    139:                return(-1);     /* says to use `current' size */
                    140:        } /* switch */
                    141:        return(-1);
                    142: } /* CbFCh */
                    143: 
                    144: 
                    145: /* D F   F   C H */
                    146: 
                    147: export DFE DfFCh(ch)
                    148: char    ch;
                    149: {
                    150:        switch (ch) {
                    151:        case 'a':       
                    152:                return(dfStr);
                    153:        case 'C':
                    154:        case 'c':       
                    155:                return(dfChar);
                    156:        case 'b':
                    157:        case 'D':
                    158:        case 'd':       
                    159:                return(dfDecimal);
                    160:        case 'E':
                    161:        case 'e':       
                    162:                return(dfEFloat);
                    163:        case 'F':
                    164:        case 'f':       
                    165:                return(dfFFloat);
                    166:        case 'G':
                    167:        case 'g':       
                    168:                return(dfGFloat);
                    169:        case 'n':       
                    170:                return(dfNil);
                    171:        case 'O':
                    172:        case 'o':       
                    173:                return(dfOctal);
                    174:        case 'p':       
                    175:                return(dfProc);
                    176:        case 'S':       
                    177:                return(dfStruct);
                    178:        case 's':       
                    179:                return(dfPStr);
                    180:        case 'U':
                    181:        case 'u':       
                    182:                return(dfUnsigned);
                    183:        case 't':       
                    184:                return(dfType);
                    185:        case 'X':
                    186:        case 'x':       
                    187:                return(dfHex);
                    188:        } /* switch */
                    189:        return(dfNil);
                    190: } /* DfFCh */
                    191: 
                    192: 
                    193: /* G E T   M O D E */
                    194: 
                    195: export void GetMode(mode)
                    196: pMODER  mode;
                    197: {
                    198:        char        ch;
                    199:        TKE         tk;
                    200: 
                    201:        /* consider the next few tokens as variable formatting info */
                    202:        /* NOTE: we assume WE get next token!! */
                    203:        tk = TkNext();
                    204:        mode->imap = 0;
                    205:        if (tk == tkStar) {
                    206:                mode->imap = 1;
                    207:                tk = TkNext();
                    208:        } /* if */
                    209:        if (tk == tkNil) {
                    210:                return;
                    211:        } 
                    212:        else if (tk == tkNumber) {
                    213:                mode->cnt = atoi(vsbTok);
                    214:                tk = TkNext();
                    215:        } 
                    216:        else {
                    217:                mode->cnt = 1;
                    218:        } /* if */
                    219: 
                    220:        if (tk == tkStr) {
                    221:                ch = vsbTok[0];
                    222:                /* determine # of bytes based on format */
                    223:                mode->len = CbFCh(ch);
                    224:                mode->df = DfFCh(ch);
                    225:                if (vsbTok[1] != chNull)
                    226:                        mode->len = (vsbTok[1] == 'b') ? 1 : 
                    227:                        (vsbTok[1] == 's') ? 2 :
                    228:                        (vsbTok[1] == 'l') ? 4 : atoi(&vsbTok[1]);
                    229:                tk = TkNext();
                    230:        } /* if */
                    231: } /* GetMode */
                    232: 
                    233: 
                    234: /* I N C   F   T Y   M O D E */
                    235: 
                    236: export int IncFTyMode(ty, mode)
                    237: pTYR    ty;
                    238: pMODER  mode;
                    239: {
                    240:        int             i;
                    241: 
                    242:        if ((ty->td.st == stSpc)        /* we do NOT allow inc's of specials */
                    243:            OR (mode->df == dfType))
                    244:                return(0);
                    245: 
                    246: #ifdef BSD41
                    247:        ty->sbVar = -1;      /* because this name is no longer correct */
                    248: #else
                    249:        ty->sbVar[0] = chNull;      /* because this name is no longer correct */
                    250: #endif
                    251:        if (ty->td.st == stReg) {
                    252:                return(1);
                    253:        } 
                    254:        else {
                    255:                if (mode->df == dfStr) {
                    256:                        if (mode->len < 0) {
                    257:                                i = -mode->len;
                    258:                                mode->len = -1;
                    259:                                return(i);
                    260:                        } 
                    261:                        else {
                    262:                                return(mode->cnt * mode->len);
                    263:                        } /* if */
                    264:                } 
                    265:                else if (mode->df == dfPStr) {
                    266:                        return(mode->cnt * CBPOINT);
                    267:                } 
                    268:                else {
                    269:                        return(mode->cnt * mode->len);
                    270:                } /* if */
                    271:        } /* if */
                    272: } /* IncFTyMode */
                    273: 
                    274: 
                    275: /* D I S P   V A L */
                    276: 
                    277: export void DispVal(adrLong, tyIn, mode, fShowAdr, fIndirect, fAlternate)
                    278: long    adrLong;
                    279: pTYR    tyIn;
                    280: pMODER  mode;
                    281: FLAGT   fShowAdr, fIndirect, fAlternate;
                    282: {
                    283:        int             modval, width, cPrint, cb;
                    284:        int             len, cnt, i;
                    285:        FLAGT       fConstant, fCheckNull, fRandomLength;
                    286:        char        ch, *sbVar;
                    287:        long        mask, val, *pKludge;
                    288:        double      valDouble;
                    289:        DFE         df;
                    290:        STUFFU      stuff;
                    291:        MODER   amodeTemp;
                    292:        ADRT    adrWorking;
                    293: #if (CBINT == CBSHORT)
                    294:        short   valMasked;
                    295: #else
                    296:        long    valMasked;
                    297: #endif
                    298: 
                    299:        modval = 1;
                    300:        /* if the mode is supplied, we ignore the TY, else we use it to build
                    301:             * a plausible display format.
                    302:             */
                    303:        if (mode == modeNil) {
                    304:                mode = &amodeTemp;
                    305:                cnt = 1;
                    306:                df = dfNil;
                    307:        } 
                    308:        else {
                    309:                df = mode->df;
                    310:                cnt = mode->cnt;
                    311:                len = mode->len;
                    312:                /* this may not be right, but we need to force the size of what we
                    313:                         * are looking at to be the size we requested in the format.
                    314:                         * this way, when we say `sbWord/c;<cr>;<cr>;.='H' ' we actually
                    315:                         * do the `correct' character assignment.
                    316:                         */
                    317:                if (len > 0) {
                    318:                        switch (len) {
                    319:                        case 1: 
                    320:                                CopyTy(tyIn, vtyChar);
                    321:                                if (df == dfUnsigned)
                    322:                                        tyIn->td.bt = btUChar;
                    323:                                break;
                    324:                        case 2: 
                    325:                                CopyTy(tyIn, vtyShort);
                    326:                                if (df == dfUnsigned)
                    327:                                        tyIn->td.bt = btUShort;
                    328:                                break;
                    329:                        case 4: 
                    330:                                CopyTy(tyIn, vtyLong);
                    331:                                if (df == dfUnsigned)
                    332:                                        tyIn->td.bt = btULong;
                    333:                                break;
                    334:                        } /* switch */
                    335:                } /* if */
                    336:        } /* if */
                    337: 
                    338:        if (df == dfNil) {
                    339:                /* they did not specify display format */
                    340:                df = DfFTy(tyIn, fAlternate);
                    341:                len = (df == dfStr OR df == dfPStr) ? -1 : CbFTy(tyIn);
                    342:                /* remember this stuff */
                    343:                mode->df = df;
                    344:                mode->cnt = cnt;
                    345:                mode->len = len;
                    346:        } /* if */
                    347:        fRandomLength = (len == -1);
                    348:        if ((len == -1)
                    349:            AND (df != dfStr)
                    350:            AND (df != dfPStr))
                    351:                mode->len = len = CbFTy(tyIn);
                    352: 
                    353: #ifdef ONYX
                    354:        /* we may want to do this for other than ONYX, too. */
                    355:        if (FOdd(adrLong))
                    356:                cb = 1; /* we assume it is actually a single byte */
                    357: #endif
                    358:        cb = len;
                    359:        mask = -1;
                    360:        if (df == dfPStr) {
                    361:                cb = CBPOINT;
                    362:        } 
                    363:        else if (df == dfStr) {
                    364:                cb = CBCHAR;
                    365:                if (fRandomLength)
                    366:                        mode->len = 0;  /* we will stuff final count in here for Inc */
                    367:        } 
                    368:        else if (df == dfProc) {
                    369:                fShowAdr = false;
                    370:                fIndirect = false;
                    371:        } 
                    372:        else {
                    373:                /* here we try to skull out a good width for this size */
                    374:                width = 7;
                    375:                modval = 8;
                    376:                if (len == 1)
                    377:                        mask = 0x00ff;
                    378:                else if (len == 2)
                    379:                        mask = 0xffff;
                    380:                else if (len == 4) {
                    381:                        mask = 0xffffffff;
                    382:                        width = 12;
                    383:                        modval = 4;
                    384:                } /* if */
                    385:        } /* if */
                    386: 
                    387:        if (cnt == 1)
                    388:                width = 0; /* we don't try to add anything if there's just one */
                    389: 
                    390:        if (df == dfType) {
                    391:                fIndirect = false;
                    392:                fShowAdr = false;
                    393:        } /* if */
                    394:        cPrint = 0;
                    395:        while (cnt--) {
                    396:                vimap = mode->imap;     /* sorta kludgey - sorry */
                    397:                /*
                    398:                        fConstant = tyIn->td.fConstant;
                    399:                        tyIn->td.fConstant = false;
                    400:                        */
                    401:                val = (fIndirect) ? ValFAdr(adrLong, tyIn) : adrLong;
                    402:                /*
                    403:                        tyIn->td.fConstant = fConstant;
                    404:                        */
                    405:                vimap = 0;
                    406:                valMasked = val & mask;
                    407:                if (cb < 4)
                    408:                        val = valMasked;
                    409:                adrWorking = adrLong;
                    410:                if (fShowAdr
                    411:                    AND fIndirect
                    412:                    AND (!tyIn->td.fConstant)
                    413:                    AND (cPrint % modval == 0)) {
                    414:                        if ((cPrint == 0)
                    415:                            AND (tyIn != tyNil)
                    416:                            AND (*(sbVar = SbInCore(tyIn[0].sbVar)) != chNull)
                    417:                            AND (*sbVar != '*'))
                    418: #ifdef BSD41
                    419:                                printf("%s = ", sbVar);
                    420: #else
                    421:                        printf("%.8s = ", sbVar);
                    422: #endif
                    423:                        else
                    424:                                printf("%s  ", SbFAdr(adrLong, true));
                    425:                } /* if */
                    426:                switch (df) {
                    427:                case dfType:
                    428:                        PxTy(tyIn);
                    429:                        break;
                    430:                case dfAddr:
                    431:                        printf("%*s", width, SbFAdr(val, true));
                    432:                        break;
                    433:                case dfDecimal:
                    434:                        printf("%*ld", width, val);
                    435:                        break;
                    436:                case dfUnsigned:
                    437:                        val &= mask;
                    438:                        printf("%*lu", width, val);
                    439:                        break;
                    440:                case dfOctal:
                    441:                        val &= mask;
                    442:                        printf("%*lo", width, val);
                    443:                        break;
                    444:                case dfHex:
                    445:                        val &= mask;
                    446:                        printf("%*lx", width, val);
                    447:                        break;
                    448:                case dfChar:
                    449:                        if (valMasked < ' ')
                    450:                                printf("^%c (%o)", valMasked+0100, valMasked);
                    451:                        else printf("%c", valMasked);
                    452:                        break;
                    453:                case dfFFloat:
                    454:                case dfEFloat:
                    455:                case dfGFloat:
                    456:                        /* the following tries to get the right
                    457:                                         * conversions to happen.
                    458:                                         */
                    459:                        if (cb == 4) {
                    460:                                stuff.lng = val;
                    461:                                valDouble = stuff.fl;
                    462:                        } 
                    463:                        else {  /* we assume double */
                    464:                                pKludge = (long *)&valDouble;
                    465:                                pKludge[0] = val;
                    466:                                pKludge[1] = ValFAdr(adrLong+4, vtyLong);
                    467:                        } /* if */
                    468:                        if (df == dfFFloat)
                    469:                                printf("%f", valDouble);
                    470:                        else if (df == dfEFloat)
                    471:                                printf("%e", valDouble);
                    472:                        else
                    473:                                printf("%g", valDouble);
                    474:                        break;
                    475:                case dfEnum:
                    476:                        PxEnum(val, tyIn);
                    477:                        break;
                    478:                case dfStruct:
                    479:                        IssFPxStruct(adrWorking, tyIn, true);
                    480:                        break;
                    481:                case dfProc:
                    482:                        PrintPos(valMasked, fmtFile+fmtProc+fmtLn+fmtPrint+fmtSave);
                    483:                        break;
                    484:                case dfPStr:
                    485:                        adrWorking = valMasked;    /* and fall through */
                    486:                case dfStr: 
                    487:                        fCheckNull = false;
                    488:                        if (fRandomLength) {
                    489:                                if (adrWorking == 0) {
                    490:                                        printf("<null pointer>");
                    491:                                        break;
                    492:                                } /* if */
                    493:                                len = 128;
                    494:                                fCheckNull = true;
                    495:                        } /* if */
                    496:                        printf("\"");
                    497:                        for (i=0; i != len; i++) {
                    498:                                ch = GetByte((ADRT)(adrWorking+i), spaceData);
                    499:                                if ((ch == chNull) AND fCheckNull)
                    500:                                        break;
                    501:                                if (ch < ' ')
                    502:                                        printf("^%c", ch+0100);
                    503:                                else printf("%c", ch);
                    504:                        } /* for */
                    505:                        printf("\"");
                    506:                        break;
                    507:                } /* switch */
                    508: 
                    509:                if (fRandomLength) {
                    510:                        i += 1; /* if we did /s or /a, this moves us past the chNull */
                    511:                        if (df == dfStr)
                    512:                                mode->len -= i; /* remember size for IncFTyMode */
                    513:                } /* if */
                    514: 
                    515:                /* advance */
                    516:                if (cnt) {
                    517: #ifdef BSD41
                    518:                        tyIn->sbVar = -1;      /* because this name is no longer correct */
                    519: #else
                    520:                        tyIn->sbVar[0] = chNull;/* because this name is no longer correct */
                    521: #endif
                    522: 
                    523:                        adrLong += (df == dfStr) ? i : CbFTy(tyIn);
                    524:                        if (((++cPrint % modval) == 0)
                    525:                            OR (df == dfPStr OR df == dfStr OR df == dfStruct)) {
                    526:                                printf("\n");
                    527:                        } /* if */
                    528:                } /* if */
                    529:        } /* while */
                    530: } /* DispVal */
                    531: 
                    532: 
                    533: /* P X   E N U M */
                    534: 
                    535: export void PxEnum(val, ty)
                    536: long   val;
                    537: pTYR   ty;
                    538: {
                    539: #ifndef BSD42
                    540:        printf("%ld", val);
                    541: #else
                    542:        int             i;
                    543:        char    *sb, *sbName, *sbType, sbLook[10];
                    544:        pXTYR   xty;
                    545: 
                    546:        xty = (pXTYR) (ty + 1);
                    547:        sbType = SbInCore(xty->issRef);
                    548:        sbName = SbInCore(SbSafe(sbType));
                    549:        sprintf(sbLook, ":%d,", val);   /* value we are looking for */
                    550:        i = IFSbSb(sbType, sbLook);
                    551:        if (i == -1) {
                    552:                printf("Value %d is not defined for 'enum %s'", val, sbName);
                    553:                return;
                    554:        }
                    555:        sb = sbType + i - 1;
                    556:        /* got it - now back up to before the name */
                    557:        while ((*sb != ',') AND (*sb != '='))
                    558:                sb--;
                    559:        if (*sb == '=')
                    560:                sb++; /* point past 'e' */
                    561:        sb++;   /* past the ',' or the '=' */
                    562:        printf("%s", SbInCore(SbSafe(sb)));
                    563: #endif
                    564: } /* PxEnum */
                    565: 
                    566: 
                    567: /* I S S   F   P X   S T R U C T */
                    568: 
                    569: export long IssFPxStruct(adr, tyStruct, fDoVal)
                    570: ADRT   adr;
                    571: pTYR   tyStruct;
                    572: FLAGT  fDoVal;
                    573: {
                    574: #ifndef BSD42
                    575:        UError("There is insufficient information to do a structure dump");
                    576: #else
                    577:        int             i;
                    578:        long    adrLong, iss;
                    579:        char    chType, *sb, *sbName, *sbEqual, *sbType, sbLook[10];
                    580:        char    sbStart[1000];  /* where we stash the type info */
                    581:        FLAGT   fDidit;
                    582:        TYR             tyField[cTyMax], tyT[cTyMax];
                    583:        pXTYR   xty;
                    584: 
                    585:        xty = (pXTYR) (tyStruct + 1);
                    586:        if (xty->st != stExtend) {
                    587:                adrLong = adr;
                    588:                printf("%s", SbFAdr(adrLong));
                    589:                return(-1);
                    590:        }
                    591:        iss = xty->issRef;
                    592:        strcpy(sbStart, SbInCore(iss));
                    593:        sbType = sbStart;
                    594:        sbName = SbInCore(SbSafe(sbType));
                    595:        i = IFSbSb(sbType, "=");
                    596:        sbType += i + 1;
                    597:        if ((i == -1)
                    598:            OR ((*sbType != 's') AND (*sbType != 'u')) )
                    599:                UError("This does not appear to be a stuct or union");
                    600:        chType = *sbType++;
                    601:        while (isdigit(*sbType))        /* get past size value */
                    602:                sbType++;
                    603:        printf("%s %s {\n", (chType == 's') ? "struct" : "union", sbName);
                    604:        vcNest++;       /* kick nesting level for indent printing */
                    605:        while (*sbType) {
                    606:                sbName = SbInCore(SbSafe(sbType));
                    607: #ifdef BSD41
                    608:                tyField[0].sbVar = bitHigh | (long)sbName;
                    609: #else
                    610:                strncpy(tyField[0].sbVar, sbName, cbVarMax);
                    611: #endif
                    612:                tyField[0].td.st = stStruct;
                    613:                adrLong = adr;
                    614:                adrLong = AdrFField(adrLong, tyStruct, tyField);
                    615:                sbEqual = strchr(sbType, '=');
                    616:                sb = sbType;    /* remember where we are in case of imbeded struct */
                    617:                sbType = strchr(sbType, ';') + 1;
                    618:                fDidit = false;
                    619:                if ((sbEqual != sbNil) AND (sbEqual < sbType)) {
                    620:                        if (*++sbEqual == 'a') {
                    621:                                /* this should get us through the array declaration */
                    622:                                sbType = strchr(sbEqual, ';') + 1;
                    623:                                sbType = strchr(sbType, ';') + 1;
                    624:                                sbType = strchr(sbType, ';') + 1;
                    625:                                sbType = strchr(sbType, ';') + 1; /* this should be next name */
                    626:                        } 
                    627:                        else if (*sbEqual == 's') {
                    628:                                /* we have a struct, recurse */
                    629:                                xty = (pXTYR) (tyField + 1);
                    630:                                xty->issRef = iss + (sb - sbStart);
                    631:                                for (i=0; i<vcNest; i++)
                    632:                                        printf("    ");
                    633:                                iss = IssFPxStruct(adrLong, tyField, fDoVal);
                    634:                                printf("\n");
                    635:                                strcpy(sbStart, SbInCore(iss));
                    636:                                sbType = sbStart;
                    637:                                sbType = strchr(sbType, ';') + 1; /* this should be next name */
                    638:                                fDidit = true;
                    639:                        }
                    640:                }
                    641:                if (!fDidit) {
                    642:                        for (i=0; i<vcNest; i++)
                    643:                                printf("    ");
                    644:                        if (fDoVal)
                    645:                                DispVal(adrLong, tyField, modeNil, true, true, true);
                    646:                        else
                    647:                                PxTy(tyField);
                    648:                        printf(";\n");
                    649:                }
                    650:                if (*sbType == ';')
                    651:                        break;  /* end of the line */
                    652:        } /* while */
                    653:        for (i=0; i<vcNest; i++)
                    654:                printf("    ");
                    655:        vcNest--;
                    656:        printf("};");
                    657:        return(iss+sbType-sbStart+1);   /* points 1 past ending ';;' */
                    658: #endif
                    659: } /* IssFPxStruct */
                    660: 
                    661: 
                    662: /* P X   T Y */
                    663: 
                    664: export void PxTy(ty)
                    665: pTYR   ty;
                    666: {
                    667:        int             ipd, i, j, tq, tqLast, st, bt;
                    668:        short   *rgDim;
                    669:        FLAGT   fDidName, fHaveExtension, fNeedRP;
                    670:        pXTYR   xty;
                    671: 
                    672:        tqLast = tqNil;
                    673:        fDidName = false;
                    674:        st = ty->td.st;
                    675:        bt = ty->td.bt;
                    676:        xty = (pXTYR)(ty+1);
                    677:        fHaveExtension = (xty->st == stExtend);
                    678:        rgDim = xty->rgDim;
                    679: 
                    680: #ifdef BSD41
                    681:        if (ty->td.st == stProc) {
                    682:                /* BSD 4.1 does not know return type for procedures */
                    683:                ipd = IpdFName(SbInCore(ty->sbVar));
                    684:                DispFrame(adrNil,ipd, adrNil, adrNil, -1, false, false);
                    685:                return;
                    686:        }
                    687: #ifdef BSD42
                    688:        tq = TqFTy(ty, 1);
                    689:        if ((tq == tqNil)
                    690:            AND ((bt == btStruct)
                    691:            OR (bt == btUnion))) {
                    692:                IssFPxStruct(0L, ty, false);
                    693:                fDidName = true;
                    694:        } 
                    695:        else {
                    696:                /* print type name */
                    697:                printf("%s ", vmpBtSb[bt]);
                    698:                if ((bt == btEType)
                    699:                    OR (bt == btStruct)
                    700:                    OR (bt == btUnion)) {
                    701:                        printf("%s ",SbInSafe(xty->issRef));
                    702:                }
                    703:        }
                    704: #else
                    705:        /* print type name */
                    706:        printf("%s ", vmpBtSb[bt]);
                    707: #endif
                    708: #else
                    709:        /* print type name */
                    710:        printf("%s ", vmpBtSb[bt]);
                    711: #endif
                    712:        fNeedRP = false;
                    713:        tqLast = tqNil;
                    714:        for (i=1; i<=6; i++) {
                    715:                if ((tq = TqFTy(ty, i)) == tqNil)
                    716:                        break;
                    717:                if ((tqLast != tqNil)
                    718:                    AND (tq != tqLast)) {
                    719:                        printf("(");
                    720:                        fNeedRP = true;
                    721:                } /* if */
                    722:                switch (tq) {
                    723:                case tqPtr:
                    724:                        printf("*");
                    725:                        break;
                    726:                case tqFunc:
                    727:                        ipd = IpdFName(SbInCore(ty->sbVar));
                    728:                        DispFrame(adrNil,ipd, adrNil, adrNil, -1, false, false);
                    729:                        fDidName = true; /* printed by DispFrame */
                    730:                        return;
                    731:                case tqArray:
                    732:                        if (!fDidName) {
                    733:                                printf("%s", SbInCore(ty->sbVar));
                    734:                                fDidName = true;
                    735:                        } /* if */
                    736:                        if (fHaveExtension) {
                    737:                                for (j=0; (j < 2) AND (rgDim[j] != 0); j++) {
                    738:                                        if (rgDim[j] < 0)
                    739:                                                printf("[]");
                    740:                                        else
                    741:                                                printf("[%d]", rgDim[j]+1);
                    742:                                }
                    743:                        } 
                    744:                        else {
                    745:                                printf("[]");
                    746:                        }
                    747:                        break;
                    748:                } /* switch */
                    749:                if (fNeedRP) {
                    750:                        fNeedRP = false;
                    751:                        printf(")");
                    752:                }
                    753:                tqLast = tq;
                    754:        } /* for */
                    755:        if (!fDidName)
                    756:                printf("%s", SbInCore(ty->sbVar));
                    757:        if (ty->td.width != 0)
                    758:                printf(" : %d", ty->td.width);
                    759: } /* PxTy */

unix.superglobalmegacorp.com

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