a97c756da1d8e38e81aa76c69c108001e5035e89
[projects/cmucl/cmucl.git] / src / lisp / search.c
1 /*
2
3  $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/search.c,v 1.4 2005/09/15 18:26:52 rtoy Rel $
4
5  This code was written as part of the CMU Common Lisp project at
6  Carnegie Mellon University, and has been placed in the public domain.
7
8 */
9
10 #include <string.h>
11 #include "lisp.h"
12 #include "internals.h"
13 #include "os.h"
14 #include "search.h"
15
16 boolean
17 search_for_type(int type, lispobj ** start, int *count)
18 {
19     lispobj obj, *addr;
20
21     while ((*count == -1 || (*count > 0)) &&
22            valid_addr((os_vm_address_t) * start)) {
23         obj = **start;
24         addr = *start;
25         if (*count != -1)
26             *count -= 2;
27
28         if (TypeOf(obj) == type)
29             return TRUE;
30
31         (*start) += 2;
32     }
33     return FALSE;
34 }
35
36
37 boolean
38 search_for_symbol(char *name, lispobj ** start, int *count)
39 {
40     struct symbol *symbol;
41     struct vector *symbol_name;
42
43     while (search_for_type(type_SymbolHeader, start, count)) {
44         symbol = (struct symbol *) PTR((lispobj) * start);
45         if (LowtagOf(symbol->name) == type_OtherPointer) {
46             symbol_name = (struct vector *) PTR(symbol->name);
47             if (valid_addr((os_vm_address_t) symbol_name) &&
48                 TypeOf(symbol_name->header) == type_SimpleString &&
49                 strcmp((char *) symbol_name->data, name) == 0)
50                 return TRUE;
51         }
52         (*start) += 2;
53     }
54     return FALSE;
55 }