예제 #1
0
bool CallRemote(int handle, char s[])
{
  if(handle < 0 || handle >= ObjectCount || stack[handle]->tag != LIST) return False;
  if(seterror() == 0)
  {
    Cell *res, *params, *list = stack[handle];
    list->left = template_nil;
    push(list->right->right->left);
    push(template_nil);
    for(params=list->right; params->left->tag==LIST; params->left=params->left->right)
    {
      push(params->left->left);
      make(LIST);
    }
    buildstring(s);
    push(list->right->right->right->left);
    make(APPLY);
    make(APPLY);
    make(APPLY);
    eval();
    res = pop();
    list->right->right->left = res->left;
    list->left = res->right->left;
    return True;
  }
  else
  {
    setstackheight(ObjectCount);
    stack[handle] = template_nil;
    interrupted = False;
    return False;
  }
}
예제 #2
0
void PutRemote(int handle, char s[])
{
  Cell *list;
  if(handle < 0 || handle >= ObjectCount || stack[handle]->tag != LIST) return;
  list = stack[handle]->right;
  push(list->left);
  buildstring(s);
  make(LIST);
  list->left = pop();
}
예제 #3
0
int CreateRemote(char s[])
{
  if(!RemoteOk) return -1;
  if(seterror() == 0)
  {
    Cell *pair;
    int k;
    buildstring(s);
    push(gettemplate("object"));
    make(APPLY);
    eval();
    pair = pop();
    push(template_nil);
    push(template_nil);
    push(pair->left);
    push(pair->right->left);
    push(template_nil);
    makeinverse(LIST);
    makeinverse(LIST);
    makeinverse(LIST);
    makeinverse(LIST);
    for(k=0; k < ObjectCount; k++)
      if(stack[k]->tag != LIST)
      {
        stack[k]= pop();
        return k;
      }
    return ObjectCount++;
  }
  else
  {
    setstackheight(ObjectCount);
    interrupted = False;
    return -1;
  }
}
예제 #4
0
static void parseterm(void)
{
  int count;
  switch(tokentype)
  {
    case NUMBER:
      if(strchr(tokenval, '.') == NULL)
        makeINT(atol(tokenval));
      else
        makeREAL(atof(tokenval));
      gettoken();
      break;
    case IDENTIFIER:
      parsename();
      break;
    case TYPEID:
      push(gettemplate(tokenval));
      makecompound(STRUCT, 1);
      gettoken();
      break;
    case CHARACTER:
      makeconstant(CHAR, tokenval[0]);
      gettoken();
      break;
    case STRING:
      buildstring(tokenval);
      gettoken();
      break;
    case LPAR:
      gettoken();
      if(tokentype == OPERATOR && strcmp(tokenval, "-") != 0)
      {
        parsename();
        if(tokentype != RPAR)
        {
          parseexpression(MAXPRIO);
          rotatestack();
          push(gettemplate("_section"));
          make(APPLY);
          make(APPLY);
        }
      }
      else if(tokentype == RPAR)
        makeconstant(NULLTUPLE, 0);
      else
      {
        parseexpression(MAXPRIO);
        if(tokentype == COMMA)
        {
          count = 1;
          while(tokentype == COMMA)
          {
            gettoken();
            parseexpression(MAXPRIO);
            count++;
          }
          makecompound(PAIR, count);
        }
      }
      if(tokentype != RPAR) parseerror(2);
      gettoken();
      break;
    case LBRACK:
      parselist();
      break;
    case LACC:
      count = 0;
      do
      {
        gettoken();
        if(tokentype != IDENTIFIER) parseerror(25);
        push(gettemplate(tokenval));
        gettoken();
        if(strcmp(tokenval, "=") != 0) parseerror(5);
        gettoken();
        parseexpression(MAXPRIO);
        makeinverse(ALIAS);
        count++;
      }
      while(tokentype == COMMA);
      makecompound(RECORD, count);
      if(tokentype != RACC) parseerror(33);
      gettoken();
      break;
    default:
      parseerror(3);
  }
}