xref: /freebsd/stand/ficl/loader.c (revision ca987d4641cdcd7f27e153db17c5bf064934faf5)
1*ca987d46SWarner Losh /*-
2*ca987d46SWarner Losh  * Copyright (c) 2000 Daniel Capo Sobral
3*ca987d46SWarner Losh  * All rights reserved.
4*ca987d46SWarner Losh  *
5*ca987d46SWarner Losh  * Redistribution and use in source and binary forms, with or without
6*ca987d46SWarner Losh  * modification, are permitted provided that the following conditions
7*ca987d46SWarner Losh  * are met:
8*ca987d46SWarner Losh  * 1. Redistributions of source code must retain the above copyright
9*ca987d46SWarner Losh  *    notice, this list of conditions and the following disclaimer.
10*ca987d46SWarner Losh  * 2. Redistributions in binary form must reproduce the above copyright
11*ca987d46SWarner Losh  *    notice, this list of conditions and the following disclaimer in the
12*ca987d46SWarner Losh  *    documentation and/or other materials provided with the distribution.
13*ca987d46SWarner Losh  *
14*ca987d46SWarner Losh  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15*ca987d46SWarner Losh  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16*ca987d46SWarner Losh  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*ca987d46SWarner Losh  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18*ca987d46SWarner Losh  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*ca987d46SWarner Losh  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20*ca987d46SWarner Losh  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21*ca987d46SWarner Losh  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22*ca987d46SWarner Losh  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23*ca987d46SWarner Losh  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24*ca987d46SWarner Losh  * SUCH DAMAGE.
25*ca987d46SWarner Losh  *
26*ca987d46SWarner Losh  *	$FreeBSD$
27*ca987d46SWarner Losh  */
28*ca987d46SWarner Losh 
29*ca987d46SWarner Losh /*******************************************************************
30*ca987d46SWarner Losh ** l o a d e r . c
31*ca987d46SWarner Losh ** Additional FICL words designed for FreeBSD's loader
32*ca987d46SWarner Losh **
33*ca987d46SWarner Losh *******************************************************************/
34*ca987d46SWarner Losh 
35*ca987d46SWarner Losh #ifdef TESTMAIN
36*ca987d46SWarner Losh #include <sys/types.h>
37*ca987d46SWarner Losh #include <sys/stat.h>
38*ca987d46SWarner Losh #include <dirent.h>
39*ca987d46SWarner Losh #include <fcntl.h>
40*ca987d46SWarner Losh #include <stdio.h>
41*ca987d46SWarner Losh #include <stdlib.h>
42*ca987d46SWarner Losh #include <unistd.h>
43*ca987d46SWarner Losh #else
44*ca987d46SWarner Losh #include <stand.h>
45*ca987d46SWarner Losh #endif
46*ca987d46SWarner Losh #include "bootstrap.h"
47*ca987d46SWarner Losh #include <string.h>
48*ca987d46SWarner Losh #include <uuid.h>
49*ca987d46SWarner Losh #include "ficl.h"
50*ca987d46SWarner Losh 
51*ca987d46SWarner Losh /*		FreeBSD's loader interaction words and extras
52*ca987d46SWarner Losh  *
53*ca987d46SWarner Losh  * 		setenv      ( value n name n' -- )
54*ca987d46SWarner Losh  * 		setenv?     ( value n name n' flag -- )
55*ca987d46SWarner Losh  * 		getenv      ( addr n -- addr' n' | -1 )
56*ca987d46SWarner Losh  * 		unsetenv    ( addr n -- )
57*ca987d46SWarner Losh  * 		copyin      ( addr addr' len -- )
58*ca987d46SWarner Losh  * 		copyout     ( addr addr' len -- )
59*ca987d46SWarner Losh  * 		findfile    ( name len type len' -- addr )
60*ca987d46SWarner Losh  * 		pnpdevices  ( -- addr )
61*ca987d46SWarner Losh  * 		pnphandlers ( -- addr )
62*ca987d46SWarner Losh  * 		ccall       ( [[...[p10] p9] ... p1] n addr -- result )
63*ca987d46SWarner Losh  *		uuid-from-string ( addr n -- addr' )
64*ca987d46SWarner Losh  *		uuid-to-string ( addr' -- addr n )
65*ca987d46SWarner Losh  * 		.#	    ( value -- )
66*ca987d46SWarner Losh  */
67*ca987d46SWarner Losh 
68*ca987d46SWarner Losh void
69*ca987d46SWarner Losh ficlSetenv(FICL_VM *pVM)
70*ca987d46SWarner Losh {
71*ca987d46SWarner Losh #ifndef TESTMAIN
72*ca987d46SWarner Losh 	char	*name, *value;
73*ca987d46SWarner Losh #endif
74*ca987d46SWarner Losh 	char	*namep, *valuep;
75*ca987d46SWarner Losh 	int	names, values;
76*ca987d46SWarner Losh 
77*ca987d46SWarner Losh #if FICL_ROBUST > 1
78*ca987d46SWarner Losh 	vmCheckStack(pVM, 4, 0);
79*ca987d46SWarner Losh #endif
80*ca987d46SWarner Losh 	names = stackPopINT(pVM->pStack);
81*ca987d46SWarner Losh 	namep = (char*) stackPopPtr(pVM->pStack);
82*ca987d46SWarner Losh 	values = stackPopINT(pVM->pStack);
83*ca987d46SWarner Losh 	valuep = (char*) stackPopPtr(pVM->pStack);
84*ca987d46SWarner Losh 
85*ca987d46SWarner Losh #ifndef TESTMAIN
86*ca987d46SWarner Losh 	name = (char*) ficlMalloc(names+1);
87*ca987d46SWarner Losh 	if (!name)
88*ca987d46SWarner Losh 		vmThrowErr(pVM, "Error: out of memory");
89*ca987d46SWarner Losh 	strncpy(name, namep, names);
90*ca987d46SWarner Losh 	name[names] = '\0';
91*ca987d46SWarner Losh 	value = (char*) ficlMalloc(values+1);
92*ca987d46SWarner Losh 	if (!value)
93*ca987d46SWarner Losh 		vmThrowErr(pVM, "Error: out of memory");
94*ca987d46SWarner Losh 	strncpy(value, valuep, values);
95*ca987d46SWarner Losh 	value[values] = '\0';
96*ca987d46SWarner Losh 
97*ca987d46SWarner Losh 	setenv(name, value, 1);
98*ca987d46SWarner Losh 	ficlFree(name);
99*ca987d46SWarner Losh 	ficlFree(value);
100*ca987d46SWarner Losh #endif
101*ca987d46SWarner Losh 
102*ca987d46SWarner Losh 	return;
103*ca987d46SWarner Losh }
104*ca987d46SWarner Losh 
105*ca987d46SWarner Losh void
106*ca987d46SWarner Losh ficlSetenvq(FICL_VM *pVM)
107*ca987d46SWarner Losh {
108*ca987d46SWarner Losh #ifndef TESTMAIN
109*ca987d46SWarner Losh 	char	*name, *value;
110*ca987d46SWarner Losh #endif
111*ca987d46SWarner Losh 	char	*namep, *valuep;
112*ca987d46SWarner Losh 	int	names, values, overwrite;
113*ca987d46SWarner Losh 
114*ca987d46SWarner Losh #if FICL_ROBUST > 1
115*ca987d46SWarner Losh 	vmCheckStack(pVM, 5, 0);
116*ca987d46SWarner Losh #endif
117*ca987d46SWarner Losh 	overwrite = stackPopINT(pVM->pStack);
118*ca987d46SWarner Losh 	names = stackPopINT(pVM->pStack);
119*ca987d46SWarner Losh 	namep = (char*) stackPopPtr(pVM->pStack);
120*ca987d46SWarner Losh 	values = stackPopINT(pVM->pStack);
121*ca987d46SWarner Losh 	valuep = (char*) stackPopPtr(pVM->pStack);
122*ca987d46SWarner Losh 
123*ca987d46SWarner Losh #ifndef TESTMAIN
124*ca987d46SWarner Losh 	name = (char*) ficlMalloc(names+1);
125*ca987d46SWarner Losh 	if (!name)
126*ca987d46SWarner Losh 		vmThrowErr(pVM, "Error: out of memory");
127*ca987d46SWarner Losh 	strncpy(name, namep, names);
128*ca987d46SWarner Losh 	name[names] = '\0';
129*ca987d46SWarner Losh 	value = (char*) ficlMalloc(values+1);
130*ca987d46SWarner Losh 	if (!value)
131*ca987d46SWarner Losh 		vmThrowErr(pVM, "Error: out of memory");
132*ca987d46SWarner Losh 	strncpy(value, valuep, values);
133*ca987d46SWarner Losh 	value[values] = '\0';
134*ca987d46SWarner Losh 
135*ca987d46SWarner Losh 	setenv(name, value, overwrite);
136*ca987d46SWarner Losh 	ficlFree(name);
137*ca987d46SWarner Losh 	ficlFree(value);
138*ca987d46SWarner Losh #endif
139*ca987d46SWarner Losh 
140*ca987d46SWarner Losh 	return;
141*ca987d46SWarner Losh }
142*ca987d46SWarner Losh 
143*ca987d46SWarner Losh void
144*ca987d46SWarner Losh ficlGetenv(FICL_VM *pVM)
145*ca987d46SWarner Losh {
146*ca987d46SWarner Losh #ifndef TESTMAIN
147*ca987d46SWarner Losh 	char	*name, *value;
148*ca987d46SWarner Losh #endif
149*ca987d46SWarner Losh 	char	*namep;
150*ca987d46SWarner Losh 	int	names;
151*ca987d46SWarner Losh 
152*ca987d46SWarner Losh #if FICL_ROBUST > 1
153*ca987d46SWarner Losh 	vmCheckStack(pVM, 2, 2);
154*ca987d46SWarner Losh #endif
155*ca987d46SWarner Losh 	names = stackPopINT(pVM->pStack);
156*ca987d46SWarner Losh 	namep = (char*) stackPopPtr(pVM->pStack);
157*ca987d46SWarner Losh 
158*ca987d46SWarner Losh #ifndef TESTMAIN
159*ca987d46SWarner Losh 	name = (char*) ficlMalloc(names+1);
160*ca987d46SWarner Losh 	if (!name)
161*ca987d46SWarner Losh 		vmThrowErr(pVM, "Error: out of memory");
162*ca987d46SWarner Losh 	strncpy(name, namep, names);
163*ca987d46SWarner Losh 	name[names] = '\0';
164*ca987d46SWarner Losh 
165*ca987d46SWarner Losh 	value = getenv(name);
166*ca987d46SWarner Losh 	ficlFree(name);
167*ca987d46SWarner Losh 
168*ca987d46SWarner Losh 	if(value != NULL) {
169*ca987d46SWarner Losh 		stackPushPtr(pVM->pStack, value);
170*ca987d46SWarner Losh 		stackPushINT(pVM->pStack, strlen(value));
171*ca987d46SWarner Losh 	} else
172*ca987d46SWarner Losh #endif
173*ca987d46SWarner Losh 		stackPushINT(pVM->pStack, -1);
174*ca987d46SWarner Losh 
175*ca987d46SWarner Losh 	return;
176*ca987d46SWarner Losh }
177*ca987d46SWarner Losh 
178*ca987d46SWarner Losh void
179*ca987d46SWarner Losh ficlUnsetenv(FICL_VM *pVM)
180*ca987d46SWarner Losh {
181*ca987d46SWarner Losh #ifndef TESTMAIN
182*ca987d46SWarner Losh 	char	*name;
183*ca987d46SWarner Losh #endif
184*ca987d46SWarner Losh 	char	*namep;
185*ca987d46SWarner Losh 	int	names;
186*ca987d46SWarner Losh 
187*ca987d46SWarner Losh #if FICL_ROBUST > 1
188*ca987d46SWarner Losh 	vmCheckStack(pVM, 2, 0);
189*ca987d46SWarner Losh #endif
190*ca987d46SWarner Losh 	names = stackPopINT(pVM->pStack);
191*ca987d46SWarner Losh 	namep = (char*) stackPopPtr(pVM->pStack);
192*ca987d46SWarner Losh 
193*ca987d46SWarner Losh #ifndef TESTMAIN
194*ca987d46SWarner Losh 	name = (char*) ficlMalloc(names+1);
195*ca987d46SWarner Losh 	if (!name)
196*ca987d46SWarner Losh 		vmThrowErr(pVM, "Error: out of memory");
197*ca987d46SWarner Losh 	strncpy(name, namep, names);
198*ca987d46SWarner Losh 	name[names] = '\0';
199*ca987d46SWarner Losh 
200*ca987d46SWarner Losh 	unsetenv(name);
201*ca987d46SWarner Losh 	ficlFree(name);
202*ca987d46SWarner Losh #endif
203*ca987d46SWarner Losh 
204*ca987d46SWarner Losh 	return;
205*ca987d46SWarner Losh }
206*ca987d46SWarner Losh 
207*ca987d46SWarner Losh void
208*ca987d46SWarner Losh ficlCopyin(FICL_VM *pVM)
209*ca987d46SWarner Losh {
210*ca987d46SWarner Losh 	void*		src;
211*ca987d46SWarner Losh 	vm_offset_t	dest;
212*ca987d46SWarner Losh 	size_t		len;
213*ca987d46SWarner Losh 
214*ca987d46SWarner Losh #if FICL_ROBUST > 1
215*ca987d46SWarner Losh 	vmCheckStack(pVM, 3, 0);
216*ca987d46SWarner Losh #endif
217*ca987d46SWarner Losh 
218*ca987d46SWarner Losh 	len = stackPopINT(pVM->pStack);
219*ca987d46SWarner Losh 	dest = stackPopINT(pVM->pStack);
220*ca987d46SWarner Losh 	src = stackPopPtr(pVM->pStack);
221*ca987d46SWarner Losh 
222*ca987d46SWarner Losh #ifndef TESTMAIN
223*ca987d46SWarner Losh 	archsw.arch_copyin(src, dest, len);
224*ca987d46SWarner Losh #endif
225*ca987d46SWarner Losh 
226*ca987d46SWarner Losh 	return;
227*ca987d46SWarner Losh }
228*ca987d46SWarner Losh 
229*ca987d46SWarner Losh void
230*ca987d46SWarner Losh ficlCopyout(FICL_VM *pVM)
231*ca987d46SWarner Losh {
232*ca987d46SWarner Losh 	void*		dest;
233*ca987d46SWarner Losh 	vm_offset_t	src;
234*ca987d46SWarner Losh 	size_t		len;
235*ca987d46SWarner Losh 
236*ca987d46SWarner Losh #if FICL_ROBUST > 1
237*ca987d46SWarner Losh 	vmCheckStack(pVM, 3, 0);
238*ca987d46SWarner Losh #endif
239*ca987d46SWarner Losh 
240*ca987d46SWarner Losh 	len = stackPopINT(pVM->pStack);
241*ca987d46SWarner Losh 	dest = stackPopPtr(pVM->pStack);
242*ca987d46SWarner Losh 	src = stackPopINT(pVM->pStack);
243*ca987d46SWarner Losh 
244*ca987d46SWarner Losh #ifndef TESTMAIN
245*ca987d46SWarner Losh 	archsw.arch_copyout(src, dest, len);
246*ca987d46SWarner Losh #endif
247*ca987d46SWarner Losh 
248*ca987d46SWarner Losh 	return;
249*ca987d46SWarner Losh }
250*ca987d46SWarner Losh 
251*ca987d46SWarner Losh void
252*ca987d46SWarner Losh ficlFindfile(FICL_VM *pVM)
253*ca987d46SWarner Losh {
254*ca987d46SWarner Losh #ifndef TESTMAIN
255*ca987d46SWarner Losh 	char	*name, *type;
256*ca987d46SWarner Losh #endif
257*ca987d46SWarner Losh 	char	*namep, *typep;
258*ca987d46SWarner Losh 	struct	preloaded_file* fp;
259*ca987d46SWarner Losh 	int	names, types;
260*ca987d46SWarner Losh 
261*ca987d46SWarner Losh #if FICL_ROBUST > 1
262*ca987d46SWarner Losh 	vmCheckStack(pVM, 4, 1);
263*ca987d46SWarner Losh #endif
264*ca987d46SWarner Losh 
265*ca987d46SWarner Losh 	types = stackPopINT(pVM->pStack);
266*ca987d46SWarner Losh 	typep = (char*) stackPopPtr(pVM->pStack);
267*ca987d46SWarner Losh 	names = stackPopINT(pVM->pStack);
268*ca987d46SWarner Losh 	namep = (char*) stackPopPtr(pVM->pStack);
269*ca987d46SWarner Losh #ifndef TESTMAIN
270*ca987d46SWarner Losh 	name = (char*) ficlMalloc(names+1);
271*ca987d46SWarner Losh 	if (!name)
272*ca987d46SWarner Losh 		vmThrowErr(pVM, "Error: out of memory");
273*ca987d46SWarner Losh 	strncpy(name, namep, names);
274*ca987d46SWarner Losh 	name[names] = '\0';
275*ca987d46SWarner Losh 	type = (char*) ficlMalloc(types+1);
276*ca987d46SWarner Losh 	if (!type)
277*ca987d46SWarner Losh 		vmThrowErr(pVM, "Error: out of memory");
278*ca987d46SWarner Losh 	strncpy(type, typep, types);
279*ca987d46SWarner Losh 	type[types] = '\0';
280*ca987d46SWarner Losh 
281*ca987d46SWarner Losh 	fp = file_findfile(name, type);
282*ca987d46SWarner Losh #else
283*ca987d46SWarner Losh 	fp = NULL;
284*ca987d46SWarner Losh #endif
285*ca987d46SWarner Losh 	stackPushPtr(pVM->pStack, fp);
286*ca987d46SWarner Losh 
287*ca987d46SWarner Losh 	return;
288*ca987d46SWarner Losh }
289*ca987d46SWarner Losh 
290*ca987d46SWarner Losh void
291*ca987d46SWarner Losh ficlCcall(FICL_VM *pVM)
292*ca987d46SWarner Losh {
293*ca987d46SWarner Losh 	int (*func)(int, ...);
294*ca987d46SWarner Losh 	int result, p[10];
295*ca987d46SWarner Losh 	int nparam, i;
296*ca987d46SWarner Losh 
297*ca987d46SWarner Losh #if FICL_ROBUST > 1
298*ca987d46SWarner Losh 	vmCheckStack(pVM, 2, 0);
299*ca987d46SWarner Losh #endif
300*ca987d46SWarner Losh 
301*ca987d46SWarner Losh 	func = stackPopPtr(pVM->pStack);
302*ca987d46SWarner Losh 	nparam = stackPopINT(pVM->pStack);
303*ca987d46SWarner Losh 
304*ca987d46SWarner Losh #if FICL_ROBUST > 1
305*ca987d46SWarner Losh 	vmCheckStack(pVM, nparam, 1);
306*ca987d46SWarner Losh #endif
307*ca987d46SWarner Losh 
308*ca987d46SWarner Losh 	for (i = 0; i < nparam; i++)
309*ca987d46SWarner Losh 		p[i] = stackPopINT(pVM->pStack);
310*ca987d46SWarner Losh 
311*ca987d46SWarner Losh 	result = func(p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8],
312*ca987d46SWarner Losh 	    p[9]);
313*ca987d46SWarner Losh 
314*ca987d46SWarner Losh 	stackPushINT(pVM->pStack, result);
315*ca987d46SWarner Losh 
316*ca987d46SWarner Losh 	return;
317*ca987d46SWarner Losh }
318*ca987d46SWarner Losh 
319*ca987d46SWarner Losh void
320*ca987d46SWarner Losh ficlUuidFromString(FICL_VM *pVM)
321*ca987d46SWarner Losh {
322*ca987d46SWarner Losh #ifndef	TESTMAIN
323*ca987d46SWarner Losh 	char	*uuid;
324*ca987d46SWarner Losh 	uint32_t status;
325*ca987d46SWarner Losh #endif
326*ca987d46SWarner Losh 	char	*uuidp;
327*ca987d46SWarner Losh 	int	uuids;
328*ca987d46SWarner Losh 	uuid_t	*u;
329*ca987d46SWarner Losh 
330*ca987d46SWarner Losh #if FICL_ROBUST > 1
331*ca987d46SWarner Losh 	vmCheckStack(pVM, 2, 0);
332*ca987d46SWarner Losh #endif
333*ca987d46SWarner Losh 
334*ca987d46SWarner Losh 	uuids = stackPopINT(pVM->pStack);
335*ca987d46SWarner Losh 	uuidp = (char *) stackPopPtr(pVM->pStack);
336*ca987d46SWarner Losh 
337*ca987d46SWarner Losh #ifndef	TESTMAIN
338*ca987d46SWarner Losh 	uuid = (char *)ficlMalloc(uuids + 1);
339*ca987d46SWarner Losh 	if (!uuid)
340*ca987d46SWarner Losh 		vmThrowErr(pVM, "Error: out of memory");
341*ca987d46SWarner Losh 	strncpy(uuid, uuidp, uuids);
342*ca987d46SWarner Losh 	uuid[uuids] = '\0';
343*ca987d46SWarner Losh 
344*ca987d46SWarner Losh 	u = (uuid_t *)ficlMalloc(sizeof (*u));
345*ca987d46SWarner Losh 
346*ca987d46SWarner Losh 	uuid_from_string(uuid, u, &status);
347*ca987d46SWarner Losh 	ficlFree(uuid);
348*ca987d46SWarner Losh 	if (status != uuid_s_ok) {
349*ca987d46SWarner Losh 		ficlFree(u);
350*ca987d46SWarner Losh 		u = NULL;
351*ca987d46SWarner Losh 	}
352*ca987d46SWarner Losh #else
353*ca987d46SWarner Losh 	u = NULL;
354*ca987d46SWarner Losh #endif
355*ca987d46SWarner Losh 	stackPushPtr(pVM->pStack, u);
356*ca987d46SWarner Losh 
357*ca987d46SWarner Losh 
358*ca987d46SWarner Losh 	return;
359*ca987d46SWarner Losh }
360*ca987d46SWarner Losh 
361*ca987d46SWarner Losh void
362*ca987d46SWarner Losh ficlUuidToString(FICL_VM *pVM)
363*ca987d46SWarner Losh {
364*ca987d46SWarner Losh #ifndef	TESTMAIN
365*ca987d46SWarner Losh 	char	*uuid;
366*ca987d46SWarner Losh 	uint32_t status;
367*ca987d46SWarner Losh #endif
368*ca987d46SWarner Losh 	uuid_t	*u;
369*ca987d46SWarner Losh 
370*ca987d46SWarner Losh #if FICL_ROBUST > 1
371*ca987d46SWarner Losh 	vmCheckStack(pVM, 1, 0);
372*ca987d46SWarner Losh #endif
373*ca987d46SWarner Losh 
374*ca987d46SWarner Losh 	u = (uuid_t *)stackPopPtr(pVM->pStack);
375*ca987d46SWarner Losh 
376*ca987d46SWarner Losh #ifndef	TESTMAIN
377*ca987d46SWarner Losh 	uuid_to_string(u, &uuid, &status);
378*ca987d46SWarner Losh 	if (status != uuid_s_ok) {
379*ca987d46SWarner Losh 		stackPushPtr(pVM->pStack, uuid);
380*ca987d46SWarner Losh 		stackPushINT(pVM->pStack, strlen(uuid));
381*ca987d46SWarner Losh 	} else
382*ca987d46SWarner Losh #endif
383*ca987d46SWarner Losh 		stackPushINT(pVM->pStack, -1);
384*ca987d46SWarner Losh 
385*ca987d46SWarner Losh 	return;
386*ca987d46SWarner Losh }
387*ca987d46SWarner Losh 
388*ca987d46SWarner Losh /**************************************************************************
389*ca987d46SWarner Losh                         f i c l E x e c F D
390*ca987d46SWarner Losh ** reads in text from file fd and passes it to ficlExec()
391*ca987d46SWarner Losh  * returns VM_OUTOFTEXT on success or the ficlExec() error code on
392*ca987d46SWarner Losh  * failure.
393*ca987d46SWarner Losh  */
394*ca987d46SWarner Losh #define nLINEBUF 256
395*ca987d46SWarner Losh int ficlExecFD(FICL_VM *pVM, int fd)
396*ca987d46SWarner Losh {
397*ca987d46SWarner Losh     char    cp[nLINEBUF];
398*ca987d46SWarner Losh     int     nLine = 0, rval = VM_OUTOFTEXT;
399*ca987d46SWarner Losh     char    ch;
400*ca987d46SWarner Losh     CELL    id;
401*ca987d46SWarner Losh 
402*ca987d46SWarner Losh     id = pVM->sourceID;
403*ca987d46SWarner Losh     pVM->sourceID.i = fd;
404*ca987d46SWarner Losh 
405*ca987d46SWarner Losh     /* feed each line to ficlExec */
406*ca987d46SWarner Losh     while (1) {
407*ca987d46SWarner Losh 	int status, i;
408*ca987d46SWarner Losh 
409*ca987d46SWarner Losh 	i = 0;
410*ca987d46SWarner Losh 	while ((status = read(fd, &ch, 1)) > 0 && ch != '\n')
411*ca987d46SWarner Losh 	    cp[i++] = ch;
412*ca987d46SWarner Losh         nLine++;
413*ca987d46SWarner Losh 	if (!i) {
414*ca987d46SWarner Losh 	    if (status < 1)
415*ca987d46SWarner Losh 		break;
416*ca987d46SWarner Losh 	    continue;
417*ca987d46SWarner Losh 	}
418*ca987d46SWarner Losh         rval = ficlExecC(pVM, cp, i);
419*ca987d46SWarner Losh 	if(rval != VM_QUIT && rval != VM_USEREXIT && rval != VM_OUTOFTEXT)
420*ca987d46SWarner Losh         {
421*ca987d46SWarner Losh             pVM->sourceID = id;
422*ca987d46SWarner Losh             return rval;
423*ca987d46SWarner Losh         }
424*ca987d46SWarner Losh     }
425*ca987d46SWarner Losh     /*
426*ca987d46SWarner Losh     ** Pass an empty line with SOURCE-ID == -1 to flush
427*ca987d46SWarner Losh     ** any pending REFILLs (as required by FILE wordset)
428*ca987d46SWarner Losh     */
429*ca987d46SWarner Losh     pVM->sourceID.i = -1;
430*ca987d46SWarner Losh     ficlExec(pVM, "");
431*ca987d46SWarner Losh 
432*ca987d46SWarner Losh     pVM->sourceID = id;
433*ca987d46SWarner Losh     return rval;
434*ca987d46SWarner Losh }
435*ca987d46SWarner Losh 
436*ca987d46SWarner Losh static void displayCellNoPad(FICL_VM *pVM)
437*ca987d46SWarner Losh {
438*ca987d46SWarner Losh     CELL c;
439*ca987d46SWarner Losh #if FICL_ROBUST > 1
440*ca987d46SWarner Losh     vmCheckStack(pVM, 1, 0);
441*ca987d46SWarner Losh #endif
442*ca987d46SWarner Losh     c = stackPop(pVM->pStack);
443*ca987d46SWarner Losh     ltoa((c).i, pVM->pad, pVM->base);
444*ca987d46SWarner Losh     vmTextOut(pVM, pVM->pad, 0);
445*ca987d46SWarner Losh     return;
446*ca987d46SWarner Losh }
447*ca987d46SWarner Losh 
448*ca987d46SWarner Losh /*      isdir? - Return whether an fd corresponds to a directory.
449*ca987d46SWarner Losh  *
450*ca987d46SWarner Losh  * isdir? ( fd -- bool )
451*ca987d46SWarner Losh  */
452*ca987d46SWarner Losh static void isdirQuestion(FICL_VM *pVM)
453*ca987d46SWarner Losh {
454*ca987d46SWarner Losh     struct stat sb;
455*ca987d46SWarner Losh     FICL_INT flag;
456*ca987d46SWarner Losh     int fd;
457*ca987d46SWarner Losh 
458*ca987d46SWarner Losh #if FICL_ROBUST > 1
459*ca987d46SWarner Losh     vmCheckStack(pVM, 1, 1);
460*ca987d46SWarner Losh #endif
461*ca987d46SWarner Losh 
462*ca987d46SWarner Losh     fd = stackPopINT(pVM->pStack);
463*ca987d46SWarner Losh     flag = FICL_FALSE;
464*ca987d46SWarner Losh     do {
465*ca987d46SWarner Losh         if (fd < 0)
466*ca987d46SWarner Losh             break;
467*ca987d46SWarner Losh         if (fstat(fd, &sb) < 0)
468*ca987d46SWarner Losh             break;
469*ca987d46SWarner Losh         if (!S_ISDIR(sb.st_mode))
470*ca987d46SWarner Losh             break;
471*ca987d46SWarner Losh         flag = FICL_TRUE;
472*ca987d46SWarner Losh     } while (0);
473*ca987d46SWarner Losh     stackPushINT(pVM->pStack, flag);
474*ca987d46SWarner Losh }
475*ca987d46SWarner Losh 
476*ca987d46SWarner Losh /*          fopen - open a file and return new fd on stack.
477*ca987d46SWarner Losh  *
478*ca987d46SWarner Losh  * fopen ( ptr count mode -- fd )
479*ca987d46SWarner Losh  */
480*ca987d46SWarner Losh static void pfopen(FICL_VM *pVM)
481*ca987d46SWarner Losh {
482*ca987d46SWarner Losh     int     mode, fd, count;
483*ca987d46SWarner Losh     char    *ptr, *name;
484*ca987d46SWarner Losh 
485*ca987d46SWarner Losh #if FICL_ROBUST > 1
486*ca987d46SWarner Losh     vmCheckStack(pVM, 3, 1);
487*ca987d46SWarner Losh #endif
488*ca987d46SWarner Losh 
489*ca987d46SWarner Losh     mode = stackPopINT(pVM->pStack);    /* get mode */
490*ca987d46SWarner Losh     count = stackPopINT(pVM->pStack);   /* get count */
491*ca987d46SWarner Losh     ptr = stackPopPtr(pVM->pStack);     /* get ptr */
492*ca987d46SWarner Losh 
493*ca987d46SWarner Losh     if ((count < 0) || (ptr == NULL)) {
494*ca987d46SWarner Losh         stackPushINT(pVM->pStack, -1);
495*ca987d46SWarner Losh         return;
496*ca987d46SWarner Losh     }
497*ca987d46SWarner Losh 
498*ca987d46SWarner Losh     /* ensure that the string is null terminated */
499*ca987d46SWarner Losh     name = (char *)malloc(count+1);
500*ca987d46SWarner Losh     bcopy(ptr,name,count);
501*ca987d46SWarner Losh     name[count] = 0;
502*ca987d46SWarner Losh 
503*ca987d46SWarner Losh     /* open the file */
504*ca987d46SWarner Losh     fd = open(name, mode);
505*ca987d46SWarner Losh     free(name);
506*ca987d46SWarner Losh     stackPushINT(pVM->pStack, fd);
507*ca987d46SWarner Losh     return;
508*ca987d46SWarner Losh }
509*ca987d46SWarner Losh 
510*ca987d46SWarner Losh /*          fclose - close a file who's fd is on stack.
511*ca987d46SWarner Losh  *
512*ca987d46SWarner Losh  * fclose ( fd -- )
513*ca987d46SWarner Losh  */
514*ca987d46SWarner Losh static void pfclose(FICL_VM *pVM)
515*ca987d46SWarner Losh {
516*ca987d46SWarner Losh     int fd;
517*ca987d46SWarner Losh 
518*ca987d46SWarner Losh #if FICL_ROBUST > 1
519*ca987d46SWarner Losh     vmCheckStack(pVM, 1, 0);
520*ca987d46SWarner Losh #endif
521*ca987d46SWarner Losh     fd = stackPopINT(pVM->pStack); /* get fd */
522*ca987d46SWarner Losh     if (fd != -1)
523*ca987d46SWarner Losh 	close(fd);
524*ca987d46SWarner Losh     return;
525*ca987d46SWarner Losh }
526*ca987d46SWarner Losh 
527*ca987d46SWarner Losh /*          fread - read file contents
528*ca987d46SWarner Losh  *
529*ca987d46SWarner Losh  * fread  ( fd buf nbytes  -- nread )
530*ca987d46SWarner Losh  */
531*ca987d46SWarner Losh static void pfread(FICL_VM *pVM)
532*ca987d46SWarner Losh {
533*ca987d46SWarner Losh     int     fd, len;
534*ca987d46SWarner Losh     char *buf;
535*ca987d46SWarner Losh 
536*ca987d46SWarner Losh #if FICL_ROBUST > 1
537*ca987d46SWarner Losh     vmCheckStack(pVM, 3, 1);
538*ca987d46SWarner Losh #endif
539*ca987d46SWarner Losh     len = stackPopINT(pVM->pStack); /* get number of bytes to read */
540*ca987d46SWarner Losh     buf = stackPopPtr(pVM->pStack); /* get buffer */
541*ca987d46SWarner Losh     fd = stackPopINT(pVM->pStack); /* get fd */
542*ca987d46SWarner Losh     if (len > 0 && buf && fd != -1)
543*ca987d46SWarner Losh 	stackPushINT(pVM->pStack, read(fd, buf, len));
544*ca987d46SWarner Losh     else
545*ca987d46SWarner Losh 	stackPushINT(pVM->pStack, -1);
546*ca987d46SWarner Losh     return;
547*ca987d46SWarner Losh }
548*ca987d46SWarner Losh 
549*ca987d46SWarner Losh /*      freaddir - read directory contents
550*ca987d46SWarner Losh  *
551*ca987d46SWarner Losh  * freaddir ( fd -- ptr len TRUE | FALSE )
552*ca987d46SWarner Losh  */
553*ca987d46SWarner Losh static void pfreaddir(FICL_VM *pVM)
554*ca987d46SWarner Losh {
555*ca987d46SWarner Losh #ifdef TESTMAIN
556*ca987d46SWarner Losh     static struct dirent dirent;
557*ca987d46SWarner Losh     struct stat sb;
558*ca987d46SWarner Losh     char *buf;
559*ca987d46SWarner Losh     off_t off, ptr;
560*ca987d46SWarner Losh     u_int blksz;
561*ca987d46SWarner Losh     int bufsz;
562*ca987d46SWarner Losh #endif
563*ca987d46SWarner Losh     struct dirent *d;
564*ca987d46SWarner Losh     int fd;
565*ca987d46SWarner Losh 
566*ca987d46SWarner Losh #if FICL_ROBUST > 1
567*ca987d46SWarner Losh     vmCheckStack(pVM, 1, 3);
568*ca987d46SWarner Losh #endif
569*ca987d46SWarner Losh 
570*ca987d46SWarner Losh     fd = stackPopINT(pVM->pStack);
571*ca987d46SWarner Losh #if TESTMAIN
572*ca987d46SWarner Losh     /*
573*ca987d46SWarner Losh      * The readdirfd() function is specific to the loader environment.
574*ca987d46SWarner Losh      * We do the best we can to make freaddir work, but it's not at
575*ca987d46SWarner Losh      * all guaranteed.
576*ca987d46SWarner Losh      */
577*ca987d46SWarner Losh     d = NULL;
578*ca987d46SWarner Losh     buf = NULL;
579*ca987d46SWarner Losh     do {
580*ca987d46SWarner Losh 	if (fd == -1)
581*ca987d46SWarner Losh 	    break;
582*ca987d46SWarner Losh 	if (fstat(fd, &sb) == -1)
583*ca987d46SWarner Losh 	    break;
584*ca987d46SWarner Losh 	blksz = (sb.st_blksize) ? sb.st_blksize : getpagesize();
585*ca987d46SWarner Losh 	if ((blksz & (blksz - 1)) != 0)
586*ca987d46SWarner Losh 	    break;
587*ca987d46SWarner Losh 	buf = malloc(blksz);
588*ca987d46SWarner Losh 	if (buf == NULL)
589*ca987d46SWarner Losh 	    break;
590*ca987d46SWarner Losh 	off = lseek(fd, 0LL, SEEK_CUR);
591*ca987d46SWarner Losh 	if (off == -1)
592*ca987d46SWarner Losh 	    break;
593*ca987d46SWarner Losh 	ptr = off;
594*ca987d46SWarner Losh 	if (lseek(fd, 0, SEEK_SET) == -1)
595*ca987d46SWarner Losh 	    break;
596*ca987d46SWarner Losh 	bufsz = getdents(fd, buf, blksz);
597*ca987d46SWarner Losh 	while (bufsz > 0 && bufsz <= ptr) {
598*ca987d46SWarner Losh 	    ptr -= bufsz;
599*ca987d46SWarner Losh 	    bufsz = getdents(fd, buf, blksz);
600*ca987d46SWarner Losh 	}
601*ca987d46SWarner Losh 	if (bufsz <= 0)
602*ca987d46SWarner Losh 	    break;
603*ca987d46SWarner Losh 	d = (void *)(buf + ptr);
604*ca987d46SWarner Losh 	dirent = *d;
605*ca987d46SWarner Losh 	off += d->d_reclen;
606*ca987d46SWarner Losh 	d = (lseek(fd, off, SEEK_SET) != off) ? NULL : &dirent;
607*ca987d46SWarner Losh     } while (0);
608*ca987d46SWarner Losh     if (buf != NULL)
609*ca987d46SWarner Losh 	free(buf);
610*ca987d46SWarner Losh #else
611*ca987d46SWarner Losh     d = readdirfd(fd);
612*ca987d46SWarner Losh #endif
613*ca987d46SWarner Losh     if (d != NULL) {
614*ca987d46SWarner Losh         stackPushPtr(pVM->pStack, d->d_name);
615*ca987d46SWarner Losh         stackPushINT(pVM->pStack, strlen(d->d_name));
616*ca987d46SWarner Losh         stackPushINT(pVM->pStack, FICL_TRUE);
617*ca987d46SWarner Losh     } else {
618*ca987d46SWarner Losh         stackPushINT(pVM->pStack, FICL_FALSE);
619*ca987d46SWarner Losh     }
620*ca987d46SWarner Losh }
621*ca987d46SWarner Losh 
622*ca987d46SWarner Losh /*          fload - interpret file contents
623*ca987d46SWarner Losh  *
624*ca987d46SWarner Losh  * fload  ( fd -- )
625*ca987d46SWarner Losh  */
626*ca987d46SWarner Losh static void pfload(FICL_VM *pVM)
627*ca987d46SWarner Losh {
628*ca987d46SWarner Losh     int     fd;
629*ca987d46SWarner Losh 
630*ca987d46SWarner Losh #if FICL_ROBUST > 1
631*ca987d46SWarner Losh     vmCheckStack(pVM, 1, 0);
632*ca987d46SWarner Losh #endif
633*ca987d46SWarner Losh     fd = stackPopINT(pVM->pStack); /* get fd */
634*ca987d46SWarner Losh     if (fd != -1)
635*ca987d46SWarner Losh 	ficlExecFD(pVM, fd);
636*ca987d46SWarner Losh     return;
637*ca987d46SWarner Losh }
638*ca987d46SWarner Losh 
639*ca987d46SWarner Losh /*          fwrite - write file contents
640*ca987d46SWarner Losh  *
641*ca987d46SWarner Losh  * fwrite  ( fd buf nbytes  -- nwritten )
642*ca987d46SWarner Losh  */
643*ca987d46SWarner Losh static void pfwrite(FICL_VM *pVM)
644*ca987d46SWarner Losh {
645*ca987d46SWarner Losh     int     fd, len;
646*ca987d46SWarner Losh     char *buf;
647*ca987d46SWarner Losh 
648*ca987d46SWarner Losh #if FICL_ROBUST > 1
649*ca987d46SWarner Losh     vmCheckStack(pVM, 3, 1);
650*ca987d46SWarner Losh #endif
651*ca987d46SWarner Losh     len = stackPopINT(pVM->pStack); /* get number of bytes to read */
652*ca987d46SWarner Losh     buf = stackPopPtr(pVM->pStack); /* get buffer */
653*ca987d46SWarner Losh     fd = stackPopINT(pVM->pStack); /* get fd */
654*ca987d46SWarner Losh     if (len > 0 && buf && fd != -1)
655*ca987d46SWarner Losh 	stackPushINT(pVM->pStack, write(fd, buf, len));
656*ca987d46SWarner Losh     else
657*ca987d46SWarner Losh 	stackPushINT(pVM->pStack, -1);
658*ca987d46SWarner Losh     return;
659*ca987d46SWarner Losh }
660*ca987d46SWarner Losh 
661*ca987d46SWarner Losh /*          fseek - seek to a new position in a file
662*ca987d46SWarner Losh  *
663*ca987d46SWarner Losh  * fseek  ( fd ofs whence  -- pos )
664*ca987d46SWarner Losh  */
665*ca987d46SWarner Losh static void pfseek(FICL_VM *pVM)
666*ca987d46SWarner Losh {
667*ca987d46SWarner Losh     int     fd, pos, whence;
668*ca987d46SWarner Losh 
669*ca987d46SWarner Losh #if FICL_ROBUST > 1
670*ca987d46SWarner Losh     vmCheckStack(pVM, 3, 1);
671*ca987d46SWarner Losh #endif
672*ca987d46SWarner Losh     whence = stackPopINT(pVM->pStack);
673*ca987d46SWarner Losh     pos = stackPopINT(pVM->pStack);
674*ca987d46SWarner Losh     fd = stackPopINT(pVM->pStack);
675*ca987d46SWarner Losh     stackPushINT(pVM->pStack, lseek(fd, pos, whence));
676*ca987d46SWarner Losh     return;
677*ca987d46SWarner Losh }
678*ca987d46SWarner Losh 
679*ca987d46SWarner Losh /*           key - get a character from stdin
680*ca987d46SWarner Losh  *
681*ca987d46SWarner Losh  * key ( -- char )
682*ca987d46SWarner Losh  */
683*ca987d46SWarner Losh static void key(FICL_VM *pVM)
684*ca987d46SWarner Losh {
685*ca987d46SWarner Losh #if FICL_ROBUST > 1
686*ca987d46SWarner Losh     vmCheckStack(pVM, 0, 1);
687*ca987d46SWarner Losh #endif
688*ca987d46SWarner Losh     stackPushINT(pVM->pStack, getchar());
689*ca987d46SWarner Losh     return;
690*ca987d46SWarner Losh }
691*ca987d46SWarner Losh 
692*ca987d46SWarner Losh /*           key? - check for a character from stdin (FACILITY)
693*ca987d46SWarner Losh  *
694*ca987d46SWarner Losh  * key? ( -- flag )
695*ca987d46SWarner Losh  */
696*ca987d46SWarner Losh static void keyQuestion(FICL_VM *pVM)
697*ca987d46SWarner Losh {
698*ca987d46SWarner Losh #if FICL_ROBUST > 1
699*ca987d46SWarner Losh     vmCheckStack(pVM, 0, 1);
700*ca987d46SWarner Losh #endif
701*ca987d46SWarner Losh #ifdef TESTMAIN
702*ca987d46SWarner Losh     /* XXX Since we don't fiddle with termios, let it always succeed... */
703*ca987d46SWarner Losh     stackPushINT(pVM->pStack, FICL_TRUE);
704*ca987d46SWarner Losh #else
705*ca987d46SWarner Losh     /* But here do the right thing. */
706*ca987d46SWarner Losh     stackPushINT(pVM->pStack, ischar()? FICL_TRUE : FICL_FALSE);
707*ca987d46SWarner Losh #endif
708*ca987d46SWarner Losh     return;
709*ca987d46SWarner Losh }
710*ca987d46SWarner Losh 
711*ca987d46SWarner Losh /* seconds - gives number of seconds since beginning of time
712*ca987d46SWarner Losh  *
713*ca987d46SWarner Losh  * beginning of time is defined as:
714*ca987d46SWarner Losh  *
715*ca987d46SWarner Losh  *	BTX	- number of seconds since midnight
716*ca987d46SWarner Losh  *	FreeBSD	- number of seconds since Jan 1 1970
717*ca987d46SWarner Losh  *
718*ca987d46SWarner Losh  * seconds ( -- u )
719*ca987d46SWarner Losh  */
720*ca987d46SWarner Losh static void pseconds(FICL_VM *pVM)
721*ca987d46SWarner Losh {
722*ca987d46SWarner Losh #if FICL_ROBUST > 1
723*ca987d46SWarner Losh     vmCheckStack(pVM,0,1);
724*ca987d46SWarner Losh #endif
725*ca987d46SWarner Losh     stackPushUNS(pVM->pStack, (FICL_UNS) time(NULL));
726*ca987d46SWarner Losh     return;
727*ca987d46SWarner Losh }
728*ca987d46SWarner Losh 
729*ca987d46SWarner Losh /* ms - wait at least that many milliseconds (FACILITY)
730*ca987d46SWarner Losh  *
731*ca987d46SWarner Losh  * ms ( u -- )
732*ca987d46SWarner Losh  *
733*ca987d46SWarner Losh  */
734*ca987d46SWarner Losh static void ms(FICL_VM *pVM)
735*ca987d46SWarner Losh {
736*ca987d46SWarner Losh #if FICL_ROBUST > 1
737*ca987d46SWarner Losh     vmCheckStack(pVM,1,0);
738*ca987d46SWarner Losh #endif
739*ca987d46SWarner Losh #ifdef TESTMAIN
740*ca987d46SWarner Losh     usleep(stackPopUNS(pVM->pStack)*1000);
741*ca987d46SWarner Losh #else
742*ca987d46SWarner Losh     delay(stackPopUNS(pVM->pStack)*1000);
743*ca987d46SWarner Losh #endif
744*ca987d46SWarner Losh     return;
745*ca987d46SWarner Losh }
746*ca987d46SWarner Losh 
747*ca987d46SWarner Losh /*           fkey - get a character from a file
748*ca987d46SWarner Losh  *
749*ca987d46SWarner Losh  * fkey ( file -- char )
750*ca987d46SWarner Losh  */
751*ca987d46SWarner Losh static void fkey(FICL_VM *pVM)
752*ca987d46SWarner Losh {
753*ca987d46SWarner Losh     int i, fd;
754*ca987d46SWarner Losh     char ch;
755*ca987d46SWarner Losh 
756*ca987d46SWarner Losh #if FICL_ROBUST > 1
757*ca987d46SWarner Losh     vmCheckStack(pVM, 1, 1);
758*ca987d46SWarner Losh #endif
759*ca987d46SWarner Losh     fd = stackPopINT(pVM->pStack);
760*ca987d46SWarner Losh     i = read(fd, &ch, 1);
761*ca987d46SWarner Losh     stackPushINT(pVM->pStack, i > 0 ? ch : -1);
762*ca987d46SWarner Losh     return;
763*ca987d46SWarner Losh }
764*ca987d46SWarner Losh 
765*ca987d46SWarner Losh 
766*ca987d46SWarner Losh /*
767*ca987d46SWarner Losh ** Retrieves free space remaining on the dictionary
768*ca987d46SWarner Losh */
769*ca987d46SWarner Losh 
770*ca987d46SWarner Losh static void freeHeap(FICL_VM *pVM)
771*ca987d46SWarner Losh {
772*ca987d46SWarner Losh     stackPushINT(pVM->pStack, dictCellsAvail(ficlGetDict(pVM->pSys)));
773*ca987d46SWarner Losh }
774*ca987d46SWarner Losh 
775*ca987d46SWarner Losh 
776*ca987d46SWarner Losh /******************* Increase dictionary size on-demand ******************/
777*ca987d46SWarner Losh 
778*ca987d46SWarner Losh static void ficlDictThreshold(FICL_VM *pVM)
779*ca987d46SWarner Losh {
780*ca987d46SWarner Losh     stackPushPtr(pVM->pStack, &dictThreshold);
781*ca987d46SWarner Losh }
782*ca987d46SWarner Losh 
783*ca987d46SWarner Losh static void ficlDictIncrease(FICL_VM *pVM)
784*ca987d46SWarner Losh {
785*ca987d46SWarner Losh     stackPushPtr(pVM->pStack, &dictIncrease);
786*ca987d46SWarner Losh }
787*ca987d46SWarner Losh 
788*ca987d46SWarner Losh /**************************************************************************
789*ca987d46SWarner Losh                         f i c l C o m p i l e P l a t f o r m
790*ca987d46SWarner Losh ** Build FreeBSD platform extensions into the system dictionary
791*ca987d46SWarner Losh **************************************************************************/
792*ca987d46SWarner Losh void ficlCompilePlatform(FICL_SYSTEM *pSys)
793*ca987d46SWarner Losh {
794*ca987d46SWarner Losh     ficlCompileFcn **fnpp;
795*ca987d46SWarner Losh     FICL_DICT *dp = pSys->dp;
796*ca987d46SWarner Losh     assert (dp);
797*ca987d46SWarner Losh 
798*ca987d46SWarner Losh     dictAppendWord(dp, ".#",        displayCellNoPad,    FW_DEFAULT);
799*ca987d46SWarner Losh     dictAppendWord(dp, "isdir?",    isdirQuestion,  FW_DEFAULT);
800*ca987d46SWarner Losh     dictAppendWord(dp, "fopen",	    pfopen,	    FW_DEFAULT);
801*ca987d46SWarner Losh     dictAppendWord(dp, "fclose",    pfclose,	    FW_DEFAULT);
802*ca987d46SWarner Losh     dictAppendWord(dp, "fread",	    pfread,	    FW_DEFAULT);
803*ca987d46SWarner Losh     dictAppendWord(dp, "freaddir",  pfreaddir,	    FW_DEFAULT);
804*ca987d46SWarner Losh     dictAppendWord(dp, "fload",	    pfload,	    FW_DEFAULT);
805*ca987d46SWarner Losh     dictAppendWord(dp, "fkey",	    fkey,	    FW_DEFAULT);
806*ca987d46SWarner Losh     dictAppendWord(dp, "fseek",     pfseek,	    FW_DEFAULT);
807*ca987d46SWarner Losh     dictAppendWord(dp, "fwrite",    pfwrite,	    FW_DEFAULT);
808*ca987d46SWarner Losh     dictAppendWord(dp, "key",	    key,	    FW_DEFAULT);
809*ca987d46SWarner Losh     dictAppendWord(dp, "key?",	    keyQuestion,    FW_DEFAULT);
810*ca987d46SWarner Losh     dictAppendWord(dp, "ms",        ms,             FW_DEFAULT);
811*ca987d46SWarner Losh     dictAppendWord(dp, "seconds",   pseconds,       FW_DEFAULT);
812*ca987d46SWarner Losh     dictAppendWord(dp, "heap?",     freeHeap,       FW_DEFAULT);
813*ca987d46SWarner Losh     dictAppendWord(dp, "dictthreshold", ficlDictThreshold, FW_DEFAULT);
814*ca987d46SWarner Losh     dictAppendWord(dp, "dictincrease", ficlDictIncrease, FW_DEFAULT);
815*ca987d46SWarner Losh 
816*ca987d46SWarner Losh     dictAppendWord(dp, "setenv",    ficlSetenv,	    FW_DEFAULT);
817*ca987d46SWarner Losh     dictAppendWord(dp, "setenv?",   ficlSetenvq,    FW_DEFAULT);
818*ca987d46SWarner Losh     dictAppendWord(dp, "getenv",    ficlGetenv,	    FW_DEFAULT);
819*ca987d46SWarner Losh     dictAppendWord(dp, "unsetenv",  ficlUnsetenv,   FW_DEFAULT);
820*ca987d46SWarner Losh     dictAppendWord(dp, "copyin",    ficlCopyin,	    FW_DEFAULT);
821*ca987d46SWarner Losh     dictAppendWord(dp, "copyout",   ficlCopyout,    FW_DEFAULT);
822*ca987d46SWarner Losh     dictAppendWord(dp, "findfile",  ficlFindfile,   FW_DEFAULT);
823*ca987d46SWarner Losh     dictAppendWord(dp, "ccall",	    ficlCcall,	    FW_DEFAULT);
824*ca987d46SWarner Losh     dictAppendWord(dp, "uuid-from-string", ficlUuidFromString, FW_DEFAULT);
825*ca987d46SWarner Losh     dictAppendWord(dp, "uuid-to-string", ficlUuidToString, FW_DEFAULT);
826*ca987d46SWarner Losh 
827*ca987d46SWarner Losh     SET_FOREACH(fnpp, Xficl_compile_set)
828*ca987d46SWarner Losh 	(*fnpp)(pSys);
829*ca987d46SWarner Losh 
830*ca987d46SWarner Losh #if defined(__i386__)
831*ca987d46SWarner Losh     ficlSetEnv(pSys, "arch-i386",         FICL_TRUE);
832*ca987d46SWarner Losh     ficlSetEnv(pSys, "arch-powerpc",      FICL_FALSE);
833*ca987d46SWarner Losh #elif defined(__powerpc__)
834*ca987d46SWarner Losh     ficlSetEnv(pSys, "arch-i386",         FICL_FALSE);
835*ca987d46SWarner Losh     ficlSetEnv(pSys, "arch-powerpc",      FICL_TRUE);
836*ca987d46SWarner Losh #endif
837*ca987d46SWarner Losh 
838*ca987d46SWarner Losh     return;
839*ca987d46SWarner Losh }
840