611c77ad169a2a38e536b4e9090808b83200c81d
[sbcl.git] / src / runtime / search.c
1 /*
2  * This software is part of the SBCL system. See the README file for
3  * more information.
4  *
5  * This software is derived from the CMU CL system, which was
6  * written at Carnegie Mellon University and released into the
7  * public domain. The software is in the public domain and is
8  * provided with absolutely no warranty. See the COPYING and CREDITS
9  * files for more information.
10  */
11
12 #include <string.h>
13
14 #include "runtime.h"
15 #include "sbcl.h"
16 #include "os.h"
17 #include "search.h"
18 #include "genesis/primitive-objects.h"
19
20 boolean search_for_type(int type, lispobj **start, int *count)
21 {
22     lispobj obj, *addr;
23
24     while ((*count == -1 || (*count > 0)) &&
25            is_valid_lisp_addr((os_vm_address_t)*start)) {
26         obj = **start;
27         addr = *start;
28         if (*count != -1)
29             *count -= 2;
30
31         if (widetag_of(obj) == type)
32             return 1;
33
34         (*start) += 2;
35     }
36     return 0;
37 }
38
39 boolean search_for_symbol(char *name, lispobj **start, int *count)
40 {
41     struct symbol *symbol;
42     struct vector *symbol_name;
43
44     while (search_for_type(SYMBOL_HEADER_WIDETAG, start, count)) {
45         symbol = (struct symbol *)native_pointer((lispobj)*start);
46         if (lowtag_of(symbol->name) == OTHER_POINTER_LOWTAG) {
47             symbol_name = (struct vector *)native_pointer(symbol->name);
48             if (is_valid_lisp_addr((os_vm_address_t)symbol_name) &&
49                 widetag_of(symbol_name->header) == SIMPLE_STRING_WIDETAG &&
50                 strcmp((char *)symbol_name->data, name) == 0)
51                 return 1;
52         }
53         (*start) += 2;
54     }
55     return 0;
56 }