/*************************************************** NAME : Send DESCRIPTION : C Interface for sending messages to instances INPUTS : 1) The data object of the instance 2) The message name-string 3) The message arguments string (Constants only) 4) Caller's buffer for result RETURNS : Nothing useful SIDE EFFECTS : Executes message and stores result caller's buffer NOTES : None ***************************************************/ globle void Send( DATA_OBJECT *idata, char *msg, char *args, DATA_OBJECT *result) { int error; EXPRESSION *iexp; SYMBOL_HN *msym; SetEvaluationError(FALSE); result->type = SYMBOL; result->value = FalseSymbol; msym = FindSymbol(msg); if (msym == NULL) { PrintNoHandlerError(msg); SetEvaluationError(TRUE); return; } iexp = GenConstant(idata->type,idata->value); iexp->nextArg = ParseConstantArguments(args,&error); if (error == TRUE) { ReturnExpression(iexp); SetEvaluationError(TRUE); return; } PerformMessage(result,iexp,msym); ReturnExpression(iexp); if ((CurrentEvaluationDepth == 0) && (! EvaluatingTopLevelCommand) && (CurrentExpression == NULL)) { PeriodicCleanup(TRUE,FALSE); } }
globle int FunctionCall2( FUNCTION_REFERENCE *theReference, char *args, DATA_OBJECT *result) { EXPRESSION *argexps; int error = FALSE; /*=============================================*/ /* Force periodic cleanup if the function call */ /* was executed from an embedded application. */ /*=============================================*/ if ((CurrentEvaluationDepth == 0) && (! EvaluatingTopLevelCommand) && (CurrentExpression == NULL)) { PeriodicCleanup(TRUE,FALSE); } /*========================*/ /* Reset the error state. */ /*========================*/ if (CurrentEvaluationDepth == 0) SetHaltExecution(FALSE); EvaluationError = FALSE; /*======================================*/ /* Initialize the default return value. */ /*======================================*/ result->type = SYMBOL; result->value = FalseSymbol; /*============================*/ /* Parse the argument string. */ /*============================*/ argexps = ParseConstantArguments(args,&error); if (error == TRUE) return(TRUE); /*====================*/ /* Call the function. */ /*====================*/ theReference->argList = argexps; error = EvaluateExpression(theReference,result); /*========================*/ /* Return the expression. */ /*========================*/ ReturnExpression(argexps); theReference->argList = NULL; /*==========================*/ /* Return the error status. */ /*==========================*/ return(error); }
globle int FunctionCall2( void *theEnv, FUNCTION_REFERENCE *theReference, char *args, DATA_OBJECT *result) { EXPRESSION *argexps; int error = FALSE; /*=============================================*/ /* Force periodic cleanup if the function call */ /* was executed from an embedded application. */ /*=============================================*/ if ((UtilityData(theEnv)->CurrentGarbageFrame->topLevel) && (! CommandLineData(theEnv)->EvaluatingTopLevelCommand) && (EvaluationData(theEnv)->CurrentExpression == NULL)) { CleanCurrentGarbageFrame(theEnv,NULL); CallPeriodicTasks(theEnv); } /*========================*/ /* Reset the error state. */ /*========================*/ if (UtilityData(theEnv)->CurrentGarbageFrame->topLevel) SetHaltExecution(theEnv,FALSE); EvaluationData(theEnv)->EvaluationError = FALSE; /*======================================*/ /* Initialize the default return value. */ /*======================================*/ result->type = SYMBOL; result->value = EnvFalseSymbol(theEnv); /*============================*/ /* Parse the argument string. */ /*============================*/ argexps = ParseConstantArguments(theEnv,args,&error); if (error == TRUE) return(TRUE); /*====================*/ /* Call the function. */ /*====================*/ theReference->argList = argexps; error = EvaluateExpression(theEnv,theReference,result); /*========================*/ /* Return the expression. */ /*========================*/ ReturnExpression(theEnv,argexps); theReference->argList = NULL; /*==========================*/ /* Return the error status. */ /*==========================*/ return(error); }