0.7.13.5
[sbcl/lichteblau.git] / src / runtime / search.c
blob48e9faf1cb3a7e3988b6fdffe034411182a0c6bb
1 /*
2 * This software is part of the SBCL system. See the README file for
3 * more information.
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.
12 #include <string.h>
14 #include "runtime.h"
15 #include "sbcl.h"
16 #include "os.h"
17 #include "search.h"
18 #include "primitive-objects.h"
20 boolean search_for_type(int type, lispobj **start, int *count)
22 lispobj obj, *addr;
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;
31 if (widetag_of(obj) == type)
32 return 1;
34 (*start) += 2;
36 return 0;
39 boolean search_for_symbol(char *name, lispobj **start, int *count)
41 struct symbol *symbol;
42 struct vector *symbol_name;
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;
53 (*start) += 2;
55 return 0;