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 this notice is preserved and that due credit is given 7 * to the University of California at Berkeley. The name of the University 8 * may not be used to endorse or promote products derived from this 9 * software without specific prior written permission. This software 10 * is provided ``as is'' without express or implied warranty. 11 */ 12 13 #ifndef lint 14 static char sccsid[] = "@(#)lookup.c 5.2 (Berkeley) 05/05/88"; 15 #endif /* not lint */ 16 17 #include "gprof.h" 18 19 /* 20 * look up an address in a sorted-by-address namelist 21 * this deals with misses by mapping them to the next lower 22 * entry point. 23 */ 24 nltype * 25 nllookup( address ) 26 unsigned long address; 27 { 28 register long low; 29 register long middle; 30 register long high; 31 # ifdef DEBUG 32 register int probes; 33 34 probes = 0; 35 # endif DEBUG 36 for ( low = 0 , high = nname - 1 ; low != high ; ) { 37 # ifdef DEBUG 38 probes += 1; 39 # endif DEBUG 40 middle = ( high + low ) >> 1; 41 if ( nl[ middle ].value <= address && nl[ middle+1 ].value > address ) { 42 # ifdef DEBUG 43 if ( debug & LOOKUPDEBUG ) { 44 printf( "[nllookup] %d (%d) probes\n" , probes , nname-1 ); 45 } 46 # endif DEBUG 47 return &nl[ middle ]; 48 } 49 if ( nl[ middle ].value > address ) { 50 high = middle; 51 } else { 52 low = middle + 1; 53 } 54 } 55 fprintf( stderr , "[nllookup] binary search fails???\n" ); 56 return 0; 57 } 58 59 arctype * 60 arclookup( parentp , childp ) 61 nltype *parentp; 62 nltype *childp; 63 { 64 arctype *arcp; 65 66 if ( parentp == 0 || childp == 0 ) { 67 fprintf( "[arclookup] parentp == 0 || childp == 0\n" ); 68 return 0; 69 } 70 # ifdef DEBUG 71 if ( debug & LOOKUPDEBUG ) { 72 printf( "[arclookup] parent %s child %s\n" , 73 parentp -> name , childp -> name ); 74 } 75 # endif DEBUG 76 for ( arcp = parentp -> children ; arcp ; arcp = arcp -> arc_childlist ) { 77 # ifdef DEBUG 78 if ( debug & LOOKUPDEBUG ) { 79 printf( "[arclookup]\t arc_parent %s arc_child %s\n" , 80 arcp -> arc_parentp -> name , 81 arcp -> arc_childp -> name ); 82 } 83 # endif DEBUG 84 if ( arcp -> arc_childp == childp ) { 85 return arcp; 86 } 87 } 88 return 0; 89 } 90