xref: /openbsd-src/usr.bin/gprof/lookup.c (revision 2b0358df1d88d06ef4139321dd05bd5e05d91eaf)
1 /*	$OpenBSD: lookup.c,v 1.7 2006/03/25 19:06:36 espie Exp $	*/
2 /*	$NetBSD: lookup.c,v 1.5 1995/04/19 07:16:06 cgd Exp $	*/
3 
4 /*
5  * Copyright (c) 1983, 1993
6  *	The Regents of the University of California.  All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. Neither the name of the University nor the names of its contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  */
32 
33 #ifndef lint
34 #if 0
35 static char sccsid[] = "@(#)lookup.c	8.1 (Berkeley) 6/6/93";
36 #else
37 static char rcsid[] = "$OpenBSD: lookup.c,v 1.7 2006/03/25 19:06:36 espie Exp $";
38 #endif
39 #endif /* not lint */
40 
41 #include "gprof.h"
42 
43     /*
44      *	look up an address in a sorted-by-address namelist
45      *	    this deals with misses by mapping them to the next lower
46      *	    entry point.
47      */
48 nltype *
49 nllookup(unsigned long address)
50 {
51     long	low;
52     long	middle;
53     long	high;
54 #   ifdef DEBUG
55 	int	probes;
56 
57 	probes = 0;
58 #   endif /* DEBUG */
59     for ( low = 0 , high = nname - 1 ; low != high ; ) {
60 #	ifdef DEBUG
61 	    probes += 1;
62 #	endif /* DEBUG */
63 	middle = ( high + low ) >> 1;
64 	if ( nl[ middle ].value <= address && nl[ middle+1 ].value > address ) {
65 #	    ifdef DEBUG
66 		if ( debug & LOOKUPDEBUG ) {
67 		    printf( "[nllookup] %d (%d) probes\n" , probes , nname-1 );
68 		}
69 #	    endif /* DEBUG */
70 	    return &nl[ middle ];
71 	}
72 	if ( nl[ middle ].value > address ) {
73 	    high = middle;
74 	} else {
75 	    low = middle + 1;
76 	}
77     }
78 #   ifdef DEBUG
79 	if ( debug & LOOKUPDEBUG )
80 	    warnx("[nllookup] (%d) binary search fails", nname - 1);
81 #   endif /* DEBUG */
82     return 0;
83 }
84 
85 arctype *
86 arclookup(nltype *parentp, nltype *childp)
87 {
88     arctype	*arcp;
89 
90     if ( parentp == 0 || childp == 0 ) {
91 	warnx("[arclookup] parentp == 0 || childp == 0");
92 	return 0;
93     }
94 #   ifdef DEBUG
95 	if ( debug & LOOKUPDEBUG ) {
96 	    printf( "[arclookup] parent %s child %s\n" ,
97 		    parentp -> name , childp -> name );
98 	}
99 #   endif /* DEBUG */
100     for ( arcp = parentp -> children ; arcp ; arcp = arcp -> arc_childlist ) {
101 #	ifdef DEBUG
102 	    if ( debug & LOOKUPDEBUG ) {
103 		printf( "[arclookup]\t arc_parent %s arc_child %s\n" ,
104 			arcp -> arc_parentp -> name ,
105 			arcp -> arc_childp -> name );
106 	    }
107 #	endif /* DEBUG */
108 	if ( arcp -> arc_childp == childp ) {
109 	    return arcp;
110 	}
111     }
112     return 0;
113 }
114