void ficl_taskSpawn(ficlVm *vm) { int tNameLen; char *tName; int priority; int flags; int stackSize; unsigned command; char *taskName; FICL_STACK_CHECK(vm->dataStack,6,0); tNameLen = ficlStackPopInteger(vm->dataStack); tName = ficlStackPopPointer(vm->dataStack); priority = ficlStackPopInteger(vm->dataStack); flags = ficlStackPopInteger(vm->dataStack); stackSize = ficlStackPopInteger(vm->dataStack); command = ficlStackPopUnsigned(vm->dataStack); if (simon_system == NULL) simon_boot(NULL); taskName = malloc(strlen(tName)+1); strcpy(taskName,tName); taskSpawn(taskName,priority,flags,stackSize, spawn_helper,command,(int)taskName,0,0,0,0,0,0,0,0); }
static void ficl_sysDcrCr0Get(ficlVm *vm) { uint32_t val; FICL_STACK_CHECK(vm->dataStack,0,1); val = sysDcrCr0Get(); ficlStackPushInteger(vm->dataStack,val); }
static void ficl_sysDcrCr0Set(ficlVm *vm) { uint32_t val; FICL_STACK_CHECK(vm->dataStack, 1, 0); val = ficlStackPopInteger(vm->dataStack); sysDcrCr0Set(val); }
static void ficl_task_delay(ficlVm *vm) { int delay; FICL_STACK_CHECK(vm->dataStack,1,0); delay = ficlStackPopInteger(vm->dataStack); taskDelay(delay); }
static void ficl_sysDcrEbcGet(ficlVm *vm) { uint32_t addr, val; FICL_STACK_CHECK(vm->dataStack,1,1); addr = ficlStackPopInteger(vm->dataStack); val = sysDcrEbcGet(addr); ficlStackPushInteger(vm->dataStack,val); }
static void ficl_sysDcrEbcSet(ficlVm *vm) { uint32_t addr, val; FICL_STACK_CHECK(vm->dataStack,2,0); addr = ficlStackPopInteger(vm->dataStack); val = ficlStackPopInteger(vm->dataStack); sysDcrEbcSet(addr,val); }
void ficl_diagPrint(ficlVm *vm) { int len; char *buffer; FICL_STACK_CHECK(vm->dataStack,2,0); len = ficlStackPopUnsigned(vm->dataStack); buffer = (char *) ficlStackPopPointer(vm->dataStack); diagPrint(" ",buffer); }
/* * setParentWid * Ficl * setparentwid ( parent-wid wid -- ) * Set WID's link field to the parent-wid. search-wordlist will * iterate through all the links when finding words in the child wid. */ static void ficlPrimitiveSetParentWid(ficlVm *vm) { ficlHash *parent, *child; FICL_STACK_CHECK(vm->dataStack, 2, 0); child = (ficlHash *)ficlStackPopPointer(vm->dataStack); parent = (ficlHash *)ficlStackPopPointer(vm->dataStack); child->link = parent; }
/* * f i c l - w o r d l i s t * SEARCH ( -- wid ) * Create a new empty word list, returning its word list identifier wid. * The new word list may be returned from a pool of preallocated word * lists or may be dynamically allocated in data space. A system shall * allow the creation of at least 8 new word lists in addition to any * provided as part of the system. * Notes: * 1. Ficl creates a new single-list hash in the dictionary and returns * its address. * 2. ficl-wordlist takes an arg off the stack indicating the number of * hash entries in the wordlist. Ficl 2.02 and later define WORDLIST as * : wordlist 1 ficl-wordlist ; */ static void ficlPrimitiveFiclWordlist(ficlVm *vm) { ficlDictionary *dictionary = ficlVmGetDictionary(vm); ficlHash *hash; ficlUnsigned nBuckets; FICL_STACK_CHECK(vm->dataStack, 1, 1); nBuckets = ficlStackPopUnsigned(vm->dataStack); hash = ficlDictionaryCreateWordlist(dictionary, nBuckets); ficlStackPushPointer(vm->dataStack, hash); }
static void ficlIcatFileWrite(ficlVm *vm) { uint32_t len; char *buffer, md5[36]; char filename[FICL_COUNTED_STRING_MAX]; ficlCountedString *counted = (ficlCountedString *)filename; FICL_STACK_CHECK(vm->dataStack,2,0); len = ficlStackPopUnsigned(vm->dataStack); buffer = (char *) ficlStackPopPointer(vm->dataStack); calcMd5(buffer,len,md5); ficlVmGetString(vm, counted, '\n'); writeIsfFile(FICL_COUNTED_STRING_GET_POINTER(*counted),md5,len,buffer,1); }
static void ficlIcatPFileWrite(ficlVm *vm) { uint32_t len; char *buffer, md5[36]; uint32_t filename_len; char *filename; FICL_STACK_CHECK(vm->dataStack,2,0); filename_len = ficlStackPopUnsigned(vm->dataStack); filename = (char *) ficlStackPopPointer(vm->dataStack); len = ficlStackPopUnsigned(vm->dataStack); buffer = (char *) ficlStackPopPointer(vm->dataStack); calcMd5(buffer,len,md5); writeIsfFile(filename,md5,len,buffer,1); }
FICL_PLATFORM_EXTERN void vmCheckFStack(ficlVm *vm, int popCells, int pushCells) { FICL_IGNORE(vm); FICL_IGNORE(popCells); FICL_IGNORE(pushCells); FICL_STACK_CHECK(vm->floatStack, popCells, pushCells); }
static void ficl_fifo_return_status(ficlVm *vm) { FICL_STACK_CHECK(vm->dataStack,0,1); ficlStackPushInteger(vm->dataStack,fifo_status); }
static void ficl_switch(ficlVm *vm) { FICL_STACK_CHECK(vm->dataStack,0,1); FICL_STACK_CHECK(vm->floatStack,1,0); ficlStackPushUnsigned(vm->dataStack,dds2_switch(ficlStackPopFloat(vm->floatStack))); }
static void ficlPrimitiveLoad_(ficlVm *vm, int warn, int icat_special) { char filename[FICL_COUNTED_STRING_MAX]; ficlCountedString *counted = (ficlCountedString *)filename; char *file_data; unsigned size = 0; int line_num; char *line, *c, *end; ficlCell oldSourceId; ficlString s; int result = 0; char *context; int offset; if (icat_special) { int index; FICL_STACK_CHECK(vm->dataStack,1,0); index = ficlStackPopInteger(vm->dataStack); sprintf(filename,"%sicat_config%02d.tbl",ICAT_DEV_PREFIX,index); file_data = find_and_load(filename,&size,&offset); } else { ficlVmGetString(vm, counted, '\n'); if (FICL_COUNTED_STRING_GET_LENGTH(*counted) <= 0) { ficlVmTextOut(vm, "Warning (load): nothing happened\n"); return; } file_data = find_and_load(FICL_COUNTED_STRING_GET_POINTER(*counted),&size,&offset); } /* ** get the file's size and make sure it exists */ if (file_data == NULL) if (warn) { ficlVmTextOut(vm, "Unable to open file "); ficlVmTextOut(vm, FICL_COUNTED_STRING_GET_POINTER(*counted)); ficlVmTextOut(vm, "\n"); ficlVmThrow(vm, FICL_VM_STATUS_QUIT); } else return; oldSourceId = vm->sourceId; vm->sourceId.i = -1; /* feed each line to ficlExec */ for (end = file_data + size + offset, line = file_data + offset, line_num = 1; line < end; line = ++c, line_num++) { int length; for (c = line; *c != '\n' && c<end; c++); length = c-line; if (length > 0) { FICL_STRING_SET_POINTER(s, line); FICL_STRING_SET_LENGTH(s, length); result = ficlVmExecuteString(vm, s); /* handle "bye" in loaded files. --lch */ switch (result) { case FICL_VM_STATUS_OUT_OF_TEXT: case FICL_VM_STATUS_USER_EXIT: break; default: vm->sourceId = oldSourceId; free(file_data); file_data = NULL; ficlVmThrowError(vm, "Error loading file <%s> line %d", FICL_COUNTED_STRING_GET_POINTER(*counted), line_num); break; } } } if (file_data != NULL) free(file_data); vm->sourceId = oldSourceId; /* handle "bye" in loaded files. --lch */ if (result == FICL_VM_STATUS_USER_EXIT) ficlVmThrow(vm, FICL_VM_STATUS_USER_EXIT); return; }