Annotation of 43BSDReno/pgrm/gprof/printgprof.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1983 Regents of the University of California.
        !             3:  * All rights reserved.
        !             4:  *
        !             5:  * Redistribution and use in source and binary forms are permitted
        !             6:  * provided that: (1) source distributions retain this entire copyright
        !             7:  * notice and comment, and (2) distributions including binaries display
        !             8:  * the following acknowledgement:  ``This product includes software
        !             9:  * developed by the University of California, Berkeley and its contributors''
        !            10:  * in the documentation or other materials provided with the distribution
        !            11:  * and in all advertising materials mentioning features or use of this
        !            12:  * software. Neither the name of the University nor the names of its
        !            13:  * contributors may be used to endorse or promote products derived
        !            14:  * from this software without specific prior written permission.
        !            15:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !            16:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !            17:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            18:  */
        !            19: 
        !            20: #ifndef lint
        !            21: static char sccsid[] = "@(#)printgprof.c       5.7 (Berkeley) 6/1/90";
        !            22: #endif /* not lint */
        !            23: 
        !            24: #include "gprof.h"
        !            25: #include "pathnames.h"
        !            26: 
        !            27: printprof()
        !            28: {
        !            29:     register nltype    *np;
        !            30:     nltype             **sortednlp;
        !            31:     int                        index, timecmp();
        !            32: 
        !            33:     actime = 0.0;
        !            34:     printf( "\f\n" );
        !            35:     flatprofheader();
        !            36:        /*
        !            37:         *      Sort the symbol table in by time
        !            38:         */
        !            39:     sortednlp = (nltype **) calloc( nname , sizeof(nltype *) );
        !            40:     if ( sortednlp == (nltype **) 0 ) {
        !            41:        fprintf( stderr , "[printprof] ran out of memory for time sorting\n" );
        !            42:     }
        !            43:     for ( index = 0 ; index < nname ; index += 1 ) {
        !            44:        sortednlp[ index ] = &nl[ index ];
        !            45:     }
        !            46:     qsort( sortednlp , nname , sizeof(nltype *) , timecmp );
        !            47:     for ( index = 0 ; index < nname ; index += 1 ) {
        !            48:        np = sortednlp[ index ];
        !            49:        flatprofline( np );
        !            50:     }
        !            51:     actime = 0.0;
        !            52:     cfree( sortednlp );
        !            53: }
        !            54: 
        !            55: timecmp( npp1 , npp2 )
        !            56:     nltype **npp1, **npp2;
        !            57: {
        !            58:     double     timediff;
        !            59:     long       calldiff;
        !            60: 
        !            61:     timediff = (*npp2) -> time - (*npp1) -> time;
        !            62:     if ( timediff > 0.0 )
        !            63:        return 1 ;
        !            64:     if ( timediff < 0.0 )
        !            65:        return -1;
        !            66:     calldiff = (*npp2) -> ncall - (*npp1) -> ncall;
        !            67:     if ( calldiff > 0 )
        !            68:        return 1;
        !            69:     if ( calldiff < 0 )
        !            70:        return -1;
        !            71:     return( strcmp( (*npp1) -> name , (*npp2) -> name ) );
        !            72: }
        !            73: 
        !            74:     /*
        !            75:      * header for flatprofline
        !            76:      */
        !            77: flatprofheader()
        !            78: {
        !            79:     
        !            80:     if ( bflag ) {
        !            81:        printblurb( _PATH_FLAT_BLURB );
        !            82:     }
        !            83:     printf( "\ngranularity: each sample hit covers %d byte(s)" ,
        !            84:            (long) scale * sizeof(UNIT) );
        !            85:     if ( totime > 0.0 ) {
        !            86:        printf( " for %.2f%% of %.2f seconds\n\n" ,
        !            87:                100.0/totime , totime / hz );
        !            88:     } else {
        !            89:        printf( " no time accumulated\n\n" );
        !            90:            /*
        !            91:             *  this doesn't hurt sinc eall the numerators will be zero.
        !            92:             */
        !            93:        totime = 1.0;
        !            94:     }
        !            95:     printf( "%5.5s %10.10s %8.8s %8.8s %8.8s %8.8s  %-8.8s\n" ,
        !            96:            "%  " , "cumulative" , "self  " , "" , "self  " , "total " , "" );
        !            97:     printf( "%5.5s %10.10s %8.8s %8.8s %8.8s %8.8s  %-8.8s\n" ,
        !            98:            "time" , "seconds " , "seconds" , "calls" ,
        !            99:            "ms/call" , "ms/call" , "name" );
        !           100: }
        !           101: 
        !           102: flatprofline( np )
        !           103:     register nltype    *np;
        !           104: {
        !           105: 
        !           106:     if ( zflag == 0 && np -> ncall == 0 && np -> time == 0 ) {
        !           107:        return;
        !           108:     }
        !           109:     actime += np -> time;
        !           110:     printf( "%5.1f %10.2f %8.2f" ,
        !           111:        100 * np -> time / totime , actime / hz , np -> time / hz );
        !           112:     if ( np -> ncall != 0 ) {
        !           113:        printf( " %8d %8.2f %8.2f  " , np -> ncall ,
        !           114:            1000 * np -> time / hz / np -> ncall ,
        !           115:            1000 * ( np -> time + np -> childtime ) / hz / np -> ncall );
        !           116:     } else {
        !           117:        printf( " %8.8s %8.8s %8.8s  " , "" , "" , "" );
        !           118:     }
        !           119:     printname( np );
        !           120:     printf( "\n" );
        !           121: }
        !           122: 
        !           123: gprofheader()
        !           124: {
        !           125: 
        !           126:     if ( bflag ) {
        !           127:        printblurb( _PATH_CALLG_BLURB );
        !           128:     }
        !           129:     printf( "\ngranularity: each sample hit covers %d byte(s)" ,
        !           130:            (long) scale * sizeof(UNIT) );
        !           131:     if ( printtime > 0.0 ) {
        !           132:        printf( " for %.2f%% of %.2f seconds\n\n" ,
        !           133:                100.0/printtime , printtime / hz );
        !           134:     } else {
        !           135:        printf( " no time propagated\n\n" );
        !           136:            /*
        !           137:             *  this doesn't hurt, since all the numerators will be 0.0
        !           138:             */
        !           139:        printtime = 1.0;
        !           140:     }
        !           141:     printf( "%6.6s %5.5s %7.7s %11.11s %7.7s/%-7.7s     %-8.8s\n" ,
        !           142:        "" , "" , "" , "" , "called" , "total" , "parents");
        !           143:     printf( "%-6.6s %5.5s %7.7s %11.11s %7.7s+%-7.7s %-8.8s\t%5.5s\n" ,
        !           144:        "index" , "%time" , "self" , "descendents" ,
        !           145:        "called" , "self" , "name" , "index" );
        !           146:     printf( "%6.6s %5.5s %7.7s %11.11s %7.7s/%-7.7s     %-8.8s\n" ,
        !           147:        "" , "" , "" , "" , "called" , "total" , "children");
        !           148:     printf( "\n" );
        !           149: }
        !           150: 
        !           151: gprofline( np )
        !           152:     register nltype    *np;
        !           153: {
        !           154:     char       kirkbuffer[ BUFSIZ ];
        !           155: 
        !           156:     sprintf( kirkbuffer , "[%d]" , np -> index );
        !           157:     printf( "%-6.6s %5.1f %7.2f %11.2f" ,
        !           158:            kirkbuffer ,
        !           159:            100 * ( np -> propself + np -> propchild ) / printtime ,
        !           160:            np -> propself / hz ,
        !           161:            np -> propchild / hz );
        !           162:     if ( ( np -> ncall + np -> selfcalls ) != 0 ) {
        !           163:        printf( " %7d" , np -> ncall );
        !           164:        if ( np -> selfcalls != 0 ) {
        !           165:            printf( "+%-7d " , np -> selfcalls );
        !           166:        } else {
        !           167:            printf( " %7.7s " , "" );
        !           168:        }
        !           169:     } else {
        !           170:        printf( " %7.7s %7.7s " , "" , "" );
        !           171:     }
        !           172:     printname( np );
        !           173:     printf( "\n" );
        !           174: }
        !           175: 
        !           176: printgprof(timesortnlp)
        !           177:     nltype     **timesortnlp;
        !           178: {
        !           179:     int                index;
        !           180:     nltype     *parentp;
        !           181: 
        !           182:        /*
        !           183:         *      Print out the structured profiling list
        !           184:         */
        !           185:     gprofheader();
        !           186:     for ( index = 0 ; index < nname + ncycle ; index ++ ) {
        !           187:        parentp = timesortnlp[ index ];
        !           188:        if ( zflag == 0 &&
        !           189:             parentp -> ncall == 0 &&
        !           190:             parentp -> selfcalls == 0 &&
        !           191:             parentp -> propself == 0 &&
        !           192:             parentp -> propchild == 0 ) {
        !           193:            continue;
        !           194:        }
        !           195:        if ( ! parentp -> printflag ) {
        !           196:            continue;
        !           197:        }
        !           198:        if ( parentp -> name == 0 && parentp -> cycleno != 0 ) {
        !           199:                /*
        !           200:                 *      cycle header
        !           201:                 */
        !           202:            printcycle( parentp );
        !           203:            printmembers( parentp );
        !           204:        } else {
        !           205:            printparents( parentp );
        !           206:            gprofline( parentp );
        !           207:            printchildren( parentp );
        !           208:        }
        !           209:        printf( "\n" );
        !           210:        printf( "-----------------------------------------------\n" );
        !           211:        printf( "\n" );
        !           212:     }
        !           213:     cfree( timesortnlp );
        !           214: }
        !           215: 
        !           216:     /*
        !           217:      * sort by decreasing propagated time
        !           218:      * if times are equal, but one is a cycle header,
        !           219:      *         say that's first (e.g. less, i.e. -1).
        !           220:      * if one's name doesn't have an underscore and the other does,
        !           221:      *         say the one is first.
        !           222:      * all else being equal, sort by names.
        !           223:      */
        !           224: int
        !           225: totalcmp( npp1 , npp2 )
        !           226:     nltype     **npp1;
        !           227:     nltype     **npp2;
        !           228: {
        !           229:     register nltype    *np1 = *npp1;
        !           230:     register nltype    *np2 = *npp2;
        !           231:     double             diff;
        !           232: 
        !           233:     diff =    ( np1 -> propself + np1 -> propchild )
        !           234:            - ( np2 -> propself + np2 -> propchild );
        !           235:     if ( diff < 0.0 )
        !           236:            return 1;
        !           237:     if ( diff > 0.0 )
        !           238:            return -1;
        !           239:     if ( np1 -> name == 0 && np1 -> cycleno != 0 ) 
        !           240:        return -1;
        !           241:     if ( np2 -> name == 0 && np2 -> cycleno != 0 )
        !           242:        return 1;
        !           243:     if ( np1 -> name == 0 )
        !           244:        return -1;
        !           245:     if ( np2 -> name == 0 )
        !           246:        return 1;
        !           247:     if ( *(np1 -> name) != '_' && *(np2 -> name) == '_' )
        !           248:        return -1;
        !           249:     if ( *(np1 -> name) == '_' && *(np2 -> name) != '_' )
        !           250:        return 1;
        !           251:     if ( np1 -> ncall > np2 -> ncall )
        !           252:        return -1;
        !           253:     if ( np1 -> ncall < np2 -> ncall ) 
        !           254:        return 1;
        !           255:     return strcmp( np1 -> name , np2 -> name );
        !           256: }
        !           257: 
        !           258: printparents( childp )
        !           259:     nltype     *childp;
        !           260: {
        !           261:     nltype     *parentp;
        !           262:     arctype    *arcp;
        !           263:     nltype     *cycleheadp;
        !           264: 
        !           265:     if ( childp -> cyclehead != 0 ) {
        !           266:        cycleheadp = childp -> cyclehead;
        !           267:     } else {
        !           268:        cycleheadp = childp;
        !           269:     }
        !           270:     if ( childp -> parents == 0 ) {
        !           271:        printf( "%6.6s %5.5s %7.7s %11.11s %7.7s %7.7s     <spontaneous>\n" ,
        !           272:                "" , "" , "" , "" , "" , "" );
        !           273:        return;
        !           274:     }
        !           275:     sortparents( childp );
        !           276:     for ( arcp = childp -> parents ; arcp ; arcp = arcp -> arc_parentlist ) {
        !           277:        parentp = arcp -> arc_parentp;
        !           278:        if ( childp == parentp ||
        !           279:             ( childp->cycleno != 0 && parentp->cycleno == childp->cycleno ) ) {
        !           280:                /*
        !           281:                 *      selfcall or call among siblings
        !           282:                 */
        !           283:            printf( "%6.6s %5.5s %7.7s %11.11s %7d %7.7s     " ,
        !           284:                    "" , "" , "" , "" ,
        !           285:                    arcp -> arc_count , "" );
        !           286:            printname( parentp );
        !           287:            printf( "\n" );
        !           288:        } else {
        !           289:                /*
        !           290:                 *      regular parent of child
        !           291:                 */
        !           292:            printf( "%6.6s %5.5s %7.2f %11.2f %7d/%-7d     " ,
        !           293:                    "" , "" ,
        !           294:                    arcp -> arc_time / hz , arcp -> arc_childtime / hz ,
        !           295:                    arcp -> arc_count , cycleheadp -> ncall );
        !           296:            printname( parentp );
        !           297:            printf( "\n" );
        !           298:        }
        !           299:     }
        !           300: }
        !           301: 
        !           302: printchildren( parentp )
        !           303:     nltype     *parentp;
        !           304: {
        !           305:     nltype     *childp;
        !           306:     arctype    *arcp;
        !           307: 
        !           308:     sortchildren( parentp );
        !           309:     arcp = parentp -> children;
        !           310:     for ( arcp = parentp -> children ; arcp ; arcp = arcp -> arc_childlist ) {
        !           311:        childp = arcp -> arc_childp;
        !           312:        if ( childp == parentp ||
        !           313:            ( childp->cycleno != 0 && childp->cycleno == parentp->cycleno ) ) {
        !           314:                /*
        !           315:                 *      self call or call to sibling
        !           316:                 */
        !           317:            printf( "%6.6s %5.5s %7.7s %11.11s %7d %7.7s     " ,
        !           318:                    "" , "" , "" , "" , arcp -> arc_count , "" );
        !           319:            printname( childp );
        !           320:            printf( "\n" );
        !           321:        } else {
        !           322:                /*
        !           323:                 *      regular child of parent
        !           324:                 */
        !           325:            printf( "%6.6s %5.5s %7.2f %11.2f %7d/%-7d     " ,
        !           326:                    "" , "" ,
        !           327:                    arcp -> arc_time / hz , arcp -> arc_childtime / hz ,
        !           328:                    arcp -> arc_count , childp -> cyclehead -> ncall );
        !           329:            printname( childp );
        !           330:            printf( "\n" );
        !           331:        }
        !           332:     }
        !           333: }
        !           334: 
        !           335: printname( selfp )
        !           336:     nltype     *selfp;
        !           337: {
        !           338: 
        !           339:     if ( selfp -> name != 0 ) {
        !           340:        printf( "%s" , selfp -> name );
        !           341: #      ifdef DEBUG
        !           342:            if ( debug & DFNDEBUG ) {
        !           343:                printf( "{%d} " , selfp -> toporder );
        !           344:            }
        !           345:            if ( debug & PROPDEBUG ) {
        !           346:                printf( "%5.2f%% " , selfp -> propfraction );
        !           347:            }
        !           348: #      endif DEBUG
        !           349:     }
        !           350:     if ( selfp -> cycleno != 0 ) {
        !           351:        printf( " <cycle %d>" , selfp -> cycleno );
        !           352:     }
        !           353:     if ( selfp -> index != 0 ) {
        !           354:        if ( selfp -> printflag ) {
        !           355:            printf( " [%d]" , selfp -> index );
        !           356:        } else {
        !           357:            printf( " (%d)" , selfp -> index );
        !           358:        }
        !           359:     }
        !           360: }
        !           361: 
        !           362: sortchildren( parentp )
        !           363:     nltype     *parentp;
        !           364: {
        !           365:     arctype    *arcp;
        !           366:     arctype    *detachedp;
        !           367:     arctype    sorted;
        !           368:     arctype    *prevp;
        !           369: 
        !           370:        /*
        !           371:         *      unlink children from parent,
        !           372:         *      then insertion sort back on to sorted's children.
        !           373:         *          *arcp       the arc you have detached and are inserting.
        !           374:         *          *detachedp  the rest of the arcs to be sorted.
        !           375:         *          sorted      arc list onto which you insertion sort.
        !           376:         *          *prevp      arc before the arc you are comparing.
        !           377:         */
        !           378:     sorted.arc_childlist = 0;
        !           379:     for (  (arcp = parentp -> children)&&(detachedp = arcp -> arc_childlist);
        !           380:            arcp ;
        !           381:           (arcp = detachedp)&&(detachedp = detachedp -> arc_childlist)) {
        !           382:            /*
        !           383:             *  consider *arcp as disconnected
        !           384:             *  insert it into sorted
        !           385:             */
        !           386:        for (   prevp = &sorted ;
        !           387:                prevp -> arc_childlist ;
        !           388:                prevp = prevp -> arc_childlist ) {
        !           389:            if ( arccmp( arcp , prevp -> arc_childlist ) != LESSTHAN ) {
        !           390:                break;
        !           391:            }
        !           392:        }
        !           393:        arcp -> arc_childlist = prevp -> arc_childlist;
        !           394:        prevp -> arc_childlist = arcp;
        !           395:     }
        !           396:        /*
        !           397:         *      reattach sorted children to parent
        !           398:         */
        !           399:     parentp -> children = sorted.arc_childlist;
        !           400: }
        !           401: 
        !           402: sortparents( childp )
        !           403:     nltype     *childp;
        !           404: {
        !           405:     arctype    *arcp;
        !           406:     arctype    *detachedp;
        !           407:     arctype    sorted;
        !           408:     arctype    *prevp;
        !           409: 
        !           410:        /*
        !           411:         *      unlink parents from child,
        !           412:         *      then insertion sort back on to sorted's parents.
        !           413:         *          *arcp       the arc you have detached and are inserting.
        !           414:         *          *detachedp  the rest of the arcs to be sorted.
        !           415:         *          sorted      arc list onto which you insertion sort.
        !           416:         *          *prevp      arc before the arc you are comparing.
        !           417:         */
        !           418:     sorted.arc_parentlist = 0;
        !           419:     for (  (arcp = childp -> parents)&&(detachedp = arcp -> arc_parentlist);
        !           420:            arcp ;
        !           421:           (arcp = detachedp)&&(detachedp = detachedp -> arc_parentlist)) {
        !           422:            /*
        !           423:             *  consider *arcp as disconnected
        !           424:             *  insert it into sorted
        !           425:             */
        !           426:        for (   prevp = &sorted ;
        !           427:                prevp -> arc_parentlist ;
        !           428:                prevp = prevp -> arc_parentlist ) {
        !           429:            if ( arccmp( arcp , prevp -> arc_parentlist ) != GREATERTHAN ) {
        !           430:                break;
        !           431:            }
        !           432:        }
        !           433:        arcp -> arc_parentlist = prevp -> arc_parentlist;
        !           434:        prevp -> arc_parentlist = arcp;
        !           435:     }
        !           436:        /*
        !           437:         *      reattach sorted arcs to child
        !           438:         */
        !           439:     childp -> parents = sorted.arc_parentlist;
        !           440: }
        !           441: 
        !           442:     /*
        !           443:      * print a cycle header
        !           444:      */
        !           445: printcycle( cyclep )
        !           446:     nltype     *cyclep;
        !           447: {
        !           448:     char       kirkbuffer[ BUFSIZ ];
        !           449: 
        !           450:     sprintf( kirkbuffer , "[%d]" , cyclep -> index );
        !           451:     printf( "%-6.6s %5.1f %7.2f %11.2f %7d" ,
        !           452:            kirkbuffer ,
        !           453:            100 * ( cyclep -> propself + cyclep -> propchild ) / printtime ,
        !           454:            cyclep -> propself / hz ,
        !           455:            cyclep -> propchild / hz ,
        !           456:            cyclep -> ncall );
        !           457:     if ( cyclep -> selfcalls != 0 ) {
        !           458:        printf( "+%-7d" , cyclep -> selfcalls );
        !           459:     } else {
        !           460:        printf( " %7.7s" , "" );
        !           461:     }
        !           462:     printf( " <cycle %d as a whole>\t[%d]\n" ,
        !           463:            cyclep -> cycleno , cyclep -> index );
        !           464: }
        !           465: 
        !           466:     /*
        !           467:      * print the members of a cycle
        !           468:      */
        !           469: printmembers( cyclep )
        !           470:     nltype     *cyclep;
        !           471: {
        !           472:     nltype     *memberp;
        !           473: 
        !           474:     sortmembers( cyclep );
        !           475:     for ( memberp = cyclep -> cnext ; memberp ; memberp = memberp -> cnext ) {
        !           476:        printf( "%6.6s %5.5s %7.2f %11.2f %7d" , 
        !           477:                "" , "" , memberp -> propself / hz , memberp -> propchild / hz ,
        !           478:                memberp -> ncall );
        !           479:        if ( memberp -> selfcalls != 0 ) {
        !           480:            printf( "+%-7d" , memberp -> selfcalls );
        !           481:        } else {
        !           482:            printf( " %7.7s" , "" );
        !           483:        }
        !           484:        printf( "     " );
        !           485:        printname( memberp );
        !           486:        printf( "\n" );
        !           487:     }
        !           488: }
        !           489: 
        !           490:     /*
        !           491:      * sort members of a cycle
        !           492:      */
        !           493: sortmembers( cyclep )
        !           494:     nltype     *cyclep;
        !           495: {
        !           496:     nltype     *todo;
        !           497:     nltype     *doing;
        !           498:     nltype     *prev;
        !           499: 
        !           500:        /*
        !           501:         *      detach cycle members from cyclehead,
        !           502:         *      and insertion sort them back on.
        !           503:         */
        !           504:     todo = cyclep -> cnext;
        !           505:     cyclep -> cnext = 0;
        !           506:     for (  (doing = todo)&&(todo = doing -> cnext);
        !           507:            doing ;
        !           508:           (doing = todo )&&(todo = doing -> cnext )){
        !           509:        for ( prev = cyclep ; prev -> cnext ; prev = prev -> cnext ) {
        !           510:            if ( membercmp( doing , prev -> cnext ) == GREATERTHAN ) {
        !           511:                break;
        !           512:            }
        !           513:        }
        !           514:        doing -> cnext = prev -> cnext;
        !           515:        prev -> cnext = doing;
        !           516:     }
        !           517: }
        !           518: 
        !           519:     /*
        !           520:      * major sort is on propself + propchild,
        !           521:      * next is sort on ncalls + selfcalls.
        !           522:      */
        !           523: int
        !           524: membercmp( this , that )
        !           525:     nltype     *this;
        !           526:     nltype     *that;
        !           527: {
        !           528:     double     thistime = this -> propself + this -> propchild;
        !           529:     double     thattime = that -> propself + that -> propchild;
        !           530:     long       thiscalls = this -> ncall + this -> selfcalls;
        !           531:     long       thatcalls = that -> ncall + that -> selfcalls;
        !           532: 
        !           533:     if ( thistime > thattime ) {
        !           534:        return GREATERTHAN;
        !           535:     }
        !           536:     if ( thistime < thattime ) {
        !           537:        return LESSTHAN;
        !           538:     }
        !           539:     if ( thiscalls > thatcalls ) {
        !           540:        return GREATERTHAN;
        !           541:     }
        !           542:     if ( thiscalls < thatcalls ) {
        !           543:        return LESSTHAN;
        !           544:     }
        !           545:     return EQUALTO;
        !           546: }
        !           547:     /*
        !           548:      * compare two arcs to/from the same child/parent.
        !           549:      * - if one arc is a self arc, it's least.
        !           550:      * - if one arc is within a cycle, it's less than.
        !           551:      * - if both arcs are within a cycle, compare arc counts.
        !           552:      * - if neither arc is within a cycle, compare with
        !           553:      *         arc_time + arc_childtime as major key
        !           554:      *         arc count as minor key
        !           555:      */
        !           556: int
        !           557: arccmp( thisp , thatp )
        !           558:     arctype    *thisp;
        !           559:     arctype    *thatp;
        !           560: {
        !           561:     nltype     *thisparentp = thisp -> arc_parentp;
        !           562:     nltype     *thischildp = thisp -> arc_childp;
        !           563:     nltype     *thatparentp = thatp -> arc_parentp;
        !           564:     nltype     *thatchildp = thatp -> arc_childp;
        !           565:     double     thistime;
        !           566:     double     thattime;
        !           567: 
        !           568: #   ifdef DEBUG
        !           569:        if ( debug & TIMEDEBUG ) {
        !           570:            printf( "[arccmp] " );
        !           571:            printname( thisparentp );
        !           572:            printf( " calls " );
        !           573:            printname ( thischildp );
        !           574:            printf( " %f + %f %d/%d\n" ,
        !           575:                    thisp -> arc_time , thisp -> arc_childtime ,
        !           576:                    thisp -> arc_count , thischildp -> ncall );
        !           577:            printf( "[arccmp] " );
        !           578:            printname( thatparentp );
        !           579:            printf( " calls " );
        !           580:            printname( thatchildp );
        !           581:            printf( " %f + %f %d/%d\n" ,
        !           582:                    thatp -> arc_time , thatp -> arc_childtime ,
        !           583:                    thatp -> arc_count , thatchildp -> ncall );
        !           584:            printf( "\n" );
        !           585:        }
        !           586: #   endif DEBUG
        !           587:     if ( thisparentp == thischildp ) {
        !           588:            /* this is a self call */
        !           589:        return LESSTHAN;
        !           590:     }
        !           591:     if ( thatparentp == thatchildp ) {
        !           592:            /* that is a self call */
        !           593:        return GREATERTHAN;
        !           594:     }
        !           595:     if ( thisparentp -> cycleno != 0 && thischildp -> cycleno != 0 &&
        !           596:        thisparentp -> cycleno == thischildp -> cycleno ) {
        !           597:            /* this is a call within a cycle */
        !           598:        if ( thatparentp -> cycleno != 0 && thatchildp -> cycleno != 0 &&
        !           599:            thatparentp -> cycleno == thatchildp -> cycleno ) {
        !           600:                /* that is a call within the cycle, too */
        !           601:            if ( thisp -> arc_count < thatp -> arc_count ) {
        !           602:                return LESSTHAN;
        !           603:            }
        !           604:            if ( thisp -> arc_count > thatp -> arc_count ) {
        !           605:                return GREATERTHAN;
        !           606:            }
        !           607:            return EQUALTO;
        !           608:        } else {
        !           609:                /* that isn't a call within the cycle */
        !           610:            return LESSTHAN;
        !           611:        }
        !           612:     } else {
        !           613:            /* this isn't a call within a cycle */
        !           614:        if ( thatparentp -> cycleno != 0 && thatchildp -> cycleno != 0 &&
        !           615:            thatparentp -> cycleno == thatchildp -> cycleno ) {
        !           616:                /* that is a call within a cycle */
        !           617:            return GREATERTHAN;
        !           618:        } else {
        !           619:                /* neither is a call within a cycle */
        !           620:            thistime = thisp -> arc_time + thisp -> arc_childtime;
        !           621:            thattime = thatp -> arc_time + thatp -> arc_childtime;
        !           622:            if ( thistime < thattime )
        !           623:                return LESSTHAN;
        !           624:            if ( thistime > thattime )
        !           625:                return GREATERTHAN;
        !           626:            if ( thisp -> arc_count < thatp -> arc_count )
        !           627:                return LESSTHAN;
        !           628:            if ( thisp -> arc_count > thatp -> arc_count )
        !           629:                return GREATERTHAN;
        !           630:            return EQUALTO;
        !           631:        }
        !           632:     }
        !           633: }
        !           634: 
        !           635: printblurb( blurbname )
        !           636:     char       *blurbname;
        !           637: {
        !           638:     FILE       *blurbfile;
        !           639:     int                input;
        !           640: 
        !           641:     blurbfile = fopen( blurbname , "r" );
        !           642:     if ( blurbfile == NULL ) {
        !           643:        perror( blurbname );
        !           644:        return;
        !           645:     }
        !           646:     while ( ( input = getc( blurbfile ) ) != EOF ) {
        !           647:        putchar( input );
        !           648:     }
        !           649:     fclose( blurbfile );
        !           650: }
        !           651: 
        !           652: int
        !           653: namecmp( npp1 , npp2 )
        !           654:     nltype **npp1, **npp2;
        !           655: {
        !           656:     return( strcmp( (*npp1) -> name , (*npp2) -> name ) );
        !           657: }
        !           658: 
        !           659: printindex()
        !           660: {
        !           661:     nltype             **namesortnlp;
        !           662:     register nltype    *nlp;
        !           663:     int                        index, nnames, todo, i, j;
        !           664:     char               peterbuffer[ BUFSIZ ];
        !           665: 
        !           666:        /*
        !           667:         *      Now, sort regular function name alphbetically
        !           668:         *      to create an index.
        !           669:         */
        !           670:     namesortnlp = (nltype **) calloc( nname + ncycle , sizeof(nltype *) );
        !           671:     if ( namesortnlp == (nltype **) 0 ) {
        !           672:        fprintf( stderr , "%s: ran out of memory for sorting\n" , whoami );
        !           673:     }
        !           674:     for ( index = 0 , nnames = 0 ; index < nname ; index++ ) {
        !           675:        if ( zflag == 0 && nl[index].ncall == 0 && nl[index].time == 0 )
        !           676:                continue;
        !           677:        namesortnlp[nnames++] = &nl[index];
        !           678:     }
        !           679:     qsort( namesortnlp , nnames , sizeof(nltype *) , namecmp );
        !           680:     for ( index = 1 , todo = nnames ; index <= ncycle ; index++ ) {
        !           681:        namesortnlp[todo++] = &cyclenl[index];
        !           682:     }
        !           683:     printf( "\f\nIndex by function name\n\n" );
        !           684:     index = ( todo + 2 ) / 3;
        !           685:     for ( i = 0; i < index ; i++ ) {
        !           686:        for ( j = i; j < todo ; j += index ) {
        !           687:            nlp = namesortnlp[ j ];
        !           688:            if ( nlp -> printflag ) {
        !           689:                sprintf( peterbuffer , "[%d]" , nlp -> index );
        !           690:            } else {
        !           691:                sprintf( peterbuffer , "(%d)" , nlp -> index );
        !           692:            }
        !           693:            if ( j < nnames ) {
        !           694:                printf( "%6.6s %-19.19s" , peterbuffer , nlp -> name );
        !           695:            } else {
        !           696:                printf( "%6.6s " , peterbuffer );
        !           697:                sprintf( peterbuffer , "<cycle %d>" , nlp -> cycleno );
        !           698:                printf( "%-19.19s" , peterbuffer );
        !           699:            }
        !           700:        }
        !           701:        printf( "\n" );
        !           702:     }
        !           703:     cfree( namesortnlp );
        !           704: }

unix.superglobalmegacorp.com

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