xref: /original-bsd/usr.bin/gprof/lookup.c (revision 264c46cb)
1 #ifndef lint
2     static	char *sccsid = "@(#)lookup.c	1.3 (Berkeley) 11/02/81";
3 #endif lint
4 
5 #include "gprof.h"
6 
7     /*
8      *	look up an address in a sorted-by-address namelist
9      *	    this deals with misses by mapping them to the next lower
10      *	    entry point.
11      */
12 nltype *
13 nllookup( address )
14     unsigned long	address;
15 {
16     register long	low;
17     register long	middle;
18     register long	high;
19 #   ifdef DEBUG
20 	register int	probes;
21 
22 	probes = 0;
23 #   endif DEBUG
24     for ( low = 0 , high = nname - 1 ; low != high ; ) {
25 #	ifdef DEBUG
26 	    probes += 1;
27 #	endif DEBUG
28 	middle = ( high + low ) >> 1;
29 	if ( nl[ middle ].value <= address && nl[ middle+1 ].value > address ) {
30 #	    ifdef DEBUG
31 		if ( debug & LOOKUPDEBUG ) {
32 		    printf( "[nllookup] %d (%d) probes\n" , probes , nname-1 );
33 		}
34 #	    endif DEBUG
35 	    return &nl[ middle ];
36 	}
37 	if ( nl[ middle ].value > address ) {
38 	    high = middle;
39 	} else {
40 	    low = middle + 1;
41 	}
42     }
43     fprintf( stderr , "[nllookup] binary search fails???\n" );
44     return 0;
45 }
46 
47 arctype *
48 arclookup( parentp , childp )
49     nltype	*parentp;
50     nltype	*childp;
51 {
52     arctype	*arcp;
53 
54     if ( parentp == 0 || childp == 0 ) {
55 	fprintf( "[arclookup] parentp == 0 || childp == 0\n" );
56 	return 0;
57     }
58 #   ifdef DEBUG
59 	if ( debug & LOOKUPDEBUG ) {
60 	    printf( "[arclookup] parent %s child %s\n" ,
61 		    parentp -> name , childp -> name );
62 	}
63 #   endif DEBUG
64     for ( arcp = parentp -> children ; arcp ; arcp = arcp -> arc_childlist ) {
65 #	ifdef DEBUG
66 	    if ( debug & LOOKUPDEBUG ) {
67 		printf( "[arclookup]\t arc_parent %s arc_child %s\n" ,
68 			arcp -> arc_parentp -> name ,
69 			arcp -> arc_childp -> name );
70 	    }
71 #	endif DEBUG
72 	if ( arcp -> arc_childp == childp ) {
73 	    return arcp;
74 	}
75     }
76     return 0;
77 }
78