File: search.c

package info (click to toggle)
yforth 0.1beta-7
  • links: PTS
  • area: main
  • in suites: hamm
  • size: 352 kB
  • ctags: 787
  • sloc: ansic: 4,414; makefile: 60
file content (105 lines) | stat: -rw-r--r-- 2,854 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/* yForth? - Written by Luca Padovani (C) 1996/97
 * ------------------------------------------------------------------------
 * This software is FreeWare as long as it comes with this header in each
 * source file, anyway you can use it or any part of it whatever
 * you want. It comes without any warranty, so use it at your own risk.
 * ------------------------------------------------------------------------
 * Module name: 
 * Abstract:
 */

#include <stdlib.h>
#include "core.h"
#include "search.h"

/**************************************************************************/
/* VARIABLES **************************************************************/
/**************************************************************************/

struct vocabulary *list[WORD_LISTS];
Cell top;		/* indice primo vocabolario sulla pila */
struct vocabulary *voc;	/* ptr al vocabolario usato per le definzioni */
struct vocabulary *forth_wid;

/**************************************************************************/
/* WORDS ******************************************************************/
/**************************************************************************/

void _definitions() {
	voc = list[top];
}

void _forth_wordlist() {
	*--sp = (Cell) forth_wid;
}

void _get_current() {
	*--sp = (Cell) voc;
}

void _get_order() {
	register Cell i;
	for (i = 0; i <= top; i++) *--sp = (Cell) list[i];
	*--sp = top;
}

void _search_wordlist() {
	register struct vocabulary *wid = (struct vocabulary *) *sp++;
	register Cell len = *sp++;
	register Char *addr = (Char *) *sp;
	register struct word_def *xt = search_wordlist(addr, len, wid);
	set_find_stack(addr, xt);
	if (!*sp) *++sp = 0;
}

void _set_current() {
	voc = (struct vocabulary *) *sp++;
}

void _set_order() {
	register Cell n = *sp++;
	register int i;
	for (i = 0; i < n; i++)
		if (i < WORD_LISTS) list[i] = (struct vocabulary *) *sp++;
		else sp++;
	top = n - 1;
}

void _wordlist() {
	register struct vocabulary *v;
	register int i;
	_align();
	v = (struct vocabulary *) _dp;
	_dp += sizeof(struct vocabulary);
	for (i = 0; i < VOC_HASH; i++) v->voc[i] = NULL;
	*--sp = (Cell) v;
}


/**************************************************************************/
/* AUXILIARY FUNCTIONS ****************************************************/
/**************************************************************************/

void save_vocabulary(struct voc_marker *vm) {
	register int i;
	for (i = 0; i < WORD_LISTS; i++) {
		vm->list[i] = list[i];
		if (list[i]) vm->v_list[i] = *list[i];
	}
	vm->top = top;
	vm->voc = voc;
	vm->_dp = _dp;
	vm->last = _last;
}

void load_vocabulary(struct voc_marker *vm) {
	register int i;
	for (i = 0; i < WORD_LISTS; i++) {
		list[i] = vm->list[i];
		if (list[i]) *list[i] = vm->v_list[i];
	}
	top = vm->top;
	voc = vm->voc;
	_dp = vm->_dp;
	_last = vm->last;
}