示例#1
0
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);
}
示例#2
0
static void ficl_sysDcrCr0Get(ficlVm *vm)
{
  uint32_t val;
  FICL_STACK_CHECK(vm->dataStack,0,1);
  val = sysDcrCr0Get();
  ficlStackPushInteger(vm->dataStack,val);
}
示例#3
0
static void ficl_sysDcrCr0Set(ficlVm *vm)
{
   uint32_t val;
   FICL_STACK_CHECK(vm->dataStack, 1, 0);
   val = ficlStackPopInteger(vm->dataStack);
   sysDcrCr0Set(val);
}
示例#4
0
static void ficl_task_delay(ficlVm *vm)
{
  int delay;
  FICL_STACK_CHECK(vm->dataStack,1,0);
  delay = ficlStackPopInteger(vm->dataStack);
  taskDelay(delay);
}
示例#5
0
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);
}
示例#6
0
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);
}
示例#7
0
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);
}
示例#8
0
/*
 * 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;
}
示例#9
0
/*
 * 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);
}
示例#10
0
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);
}
示例#11
0
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);
}
示例#12
0
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); }
示例#13
0
static void ficl_fifo_return_status(ficlVm *vm)
{
  FICL_STACK_CHECK(vm->dataStack,0,1);
  ficlStackPushInteger(vm->dataStack,fifo_status);
}
示例#14
0
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)));
}
示例#15
0
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;
}