1/*- 2 * Copyright (c) 2000 Daniel Capo Sobral 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 *
|
27 */ 28 29/******************************************************************* 30** l o a d e r . c 31** Additional FICL words designed for FreeBSD's loader 32** 33*******************************************************************/ 34 35#include <stand.h> 36#include "bootstrap.h" 37#include <string.h> 38#include "ficl.h" 39 40/* FreeBSD's loader interaction words 41 * 42 * setenv ( value n name n' -- ) 43 * setenv? ( value n name n' flag -- ) 44 * getenv ( addr n -- addr' n' | -1 ) 45 * unsetenv ( addr n -- ) 46 * copyin ( addr addr' len -- ) 47 * copyout ( addr addr' len -- ) 48 * findfile ( name len type len' -- addr ) 49 * pnpdevices ( -- addr ) 50 * pnphandlers ( -- addr ) 51 * ccall ( [[...[p10] p9] ... p1] n addr -- result ) 52 */ 53 54void 55ficlSetenv(FICL_VM *pVM) 56{ 57 char *namep, *valuep, *name, *value; 58 int names, values; 59 60#if FICL_ROBUST > 1 61 vmCheckStack(pVM, 4, 0); 62#endif 63 names = stackPopINT(pVM->pStack); 64 namep = (char*) stackPopPtr(pVM->pStack); 65 values = stackPopINT(pVM->pStack); 66 valuep = (char*) stackPopPtr(pVM->pStack); 67 68 name = (char*) ficlMalloc(names+1); 69 if (!name) 70 vmThrowErr(pVM, "Error: out of memory"); 71 strncpy(name, namep, names); 72 name[names] = '\0'; 73 value = (char*) ficlMalloc(values+1); 74 if (!value) 75 vmThrowErr(pVM, "Error: out of memory"); 76 strncpy(value, valuep, values); 77 value[values] = '\0'; 78 79 setenv(name, value, 1); 80 ficlFree(name); 81 ficlFree(value); 82 83 return; 84} 85 86void 87ficlSetenvq(FICL_VM *pVM) 88{ 89 char *namep, *valuep, *name, *value; 90 int names, values, overwrite; 91 92#if FICL_ROBUST > 1 93 vmCheckStack(pVM, 5, 0); 94#endif 95 overwrite = stackPopINT(pVM->pStack); 96 names = stackPopINT(pVM->pStack); 97 namep = (char*) stackPopPtr(pVM->pStack); 98 values = stackPopINT(pVM->pStack); 99 valuep = (char*) stackPopPtr(pVM->pStack); 100 101 name = (char*) ficlMalloc(names+1); 102 if (!name) 103 vmThrowErr(pVM, "Error: out of memory"); 104 strncpy(name, namep, names); 105 name[names] = '\0'; 106 value = (char*) ficlMalloc(values+1); 107 if (!value) 108 vmThrowErr(pVM, "Error: out of memory"); 109 strncpy(value, valuep, values); 110 value[values] = '\0'; 111 112 setenv(name, value, overwrite); 113 ficlFree(name); 114 ficlFree(value); 115 116 return; 117} 118 119void 120ficlGetenv(FICL_VM *pVM) 121{ 122 char *namep, *name, *value; 123 int names; 124 125#if FICL_ROBUST > 1 126 vmCheckStack(pVM, 2, 2); 127#endif 128 names = stackPopINT(pVM->pStack); 129 namep = (char*) stackPopPtr(pVM->pStack); 130 131 name = (char*) ficlMalloc(names+1); 132 if (!name) 133 vmThrowErr(pVM, "Error: out of memory"); 134 strncpy(name, namep, names); 135 name[names] = '\0'; 136 137 value = getenv(name); 138 ficlFree(name); 139 140 if(value != NULL) { 141 stackPushPtr(pVM->pStack, value); 142 stackPushINT(pVM->pStack, strlen(value)); 143 } else 144 stackPushINT(pVM->pStack, -1); 145 146 return; 147} 148 149void 150ficlUnsetenv(FICL_VM *pVM) 151{ 152 char *namep, *name; 153 int names; 154 155#if FICL_ROBUST > 1 156 vmCheckStack(pVM, 2, 0); 157#endif 158 names = stackPopINT(pVM->pStack); 159 namep = (char*) stackPopPtr(pVM->pStack); 160 161 name = (char*) ficlMalloc(names+1); 162 if (!name) 163 vmThrowErr(pVM, "Error: out of memory"); 164 strncpy(name, namep, names); 165 name[names] = '\0'; 166 167 unsetenv(name); 168 ficlFree(name); 169 170 return; 171} 172 173void 174ficlCopyin(FICL_VM *pVM) 175{ 176 void* src; 177 vm_offset_t dest; 178 size_t len; 179 180#if FICL_ROBUST > 1 181 vmCheckStack(pVM, 3, 0); 182#endif 183 184 len = stackPopINT(pVM->pStack); 185 dest = stackPopINT(pVM->pStack); 186 src = stackPopPtr(pVM->pStack); 187 188 archsw.arch_copyin(src, dest, len); 189 190 return; 191} 192 193void 194ficlCopyout(FICL_VM *pVM) 195{ 196 void* dest; 197 vm_offset_t src; 198 size_t len; 199 200#if FICL_ROBUST > 1 201 vmCheckStack(pVM, 3, 0); 202#endif 203 204 len = stackPopINT(pVM->pStack); 205 dest = stackPopPtr(pVM->pStack); 206 src = stackPopINT(pVM->pStack); 207 208 archsw.arch_copyout(src, dest, len); 209 210 return; 211} 212 213void 214ficlFindfile(FICL_VM *pVM) 215{ 216 char *name, *type, *namep, *typep; 217 struct preloaded_file* fp; 218 int names, types; 219 220#if FICL_ROBUST > 1 221 vmCheckStack(pVM, 4, 1); 222#endif 223 224 types = stackPopINT(pVM->pStack); 225 typep = (char*) stackPopPtr(pVM->pStack); 226 names = stackPopINT(pVM->pStack); 227 namep = (char*) stackPopPtr(pVM->pStack); 228 name = (char*) ficlMalloc(names+1); 229 if (!name) 230 vmThrowErr(pVM, "Error: out of memory"); 231 strncpy(name, namep, names); 232 name[names] = '\0'; 233 type = (char*) ficlMalloc(types+1); 234 if (!type) 235 vmThrowErr(pVM, "Error: out of memory"); 236 strncpy(type, typep, types); 237 type[types] = '\0'; 238 239 fp = file_findfile(name, type); 240 stackPushPtr(pVM->pStack, fp); 241 242 return; 243} 244
|
279void 280ficlCcall(FICL_VM *pVM) 281{ 282 int (*func)(int, ...); 283 int result, p[10]; 284 int nparam, i; 285 286#if FICL_ROBUST > 1 287 vmCheckStack(pVM, 2, 0); 288#endif 289 290 func = stackPopPtr(pVM->pStack); 291 nparam = stackPopINT(pVM->pStack); 292 293#if FICL_ROBUST > 1 294 vmCheckStack(pVM, nparam, 1); 295#endif 296 297 for (i = 0; i < nparam; i++) 298 p[i] = stackPopINT(pVM->pStack); 299 300 result = func(p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], 301 p[9]); 302 303 stackPushINT(pVM->pStack, result); 304 305 return; 306} 307
|