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; } }
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(); }
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; } }
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); } }