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