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