Passing Control and Data to ECLiPSe from C

## C.8 Passing Control and Data to ECLiPSe from C

These are the functions needed to embed ECLiPSe into C code.

void ec_post_goal(const pword)
  post a goal (constraint) that will be executed when ECLiPSe is resumed.
void ec_post_string(const char *)
  same as ec_post_goal(), but the goal is given in ECLiPSe syntax in a string. This should only be used if speed is not critical and if the goal does not contain variables whose values may be needed later. This function is part of the simplified interface.
void ec_post_exdr(int len, const char *exdr)
  same as ec_post_goal(), but the goal is given in EXDR format (see chapter 9). This function is part of the simplified interface.
int ec_resume()
  resume execution of the ECLiPSe engine: All posted goals will be executed and all posted events will be handled. The return value will be PSUCCEED if the goals succeed PFAIL is returned if the goals fail, and PYIELD if control was yielded because of a yield/2 predicate call in the ECLiPSe code. If a writable queue stream with yield-option (see open/4) was flushed, the return value is PFLUSHIO. If there was an attempt to read from an empty queue stream with yield-option, the return value is PWAITIO. If an asynchronous ECLiPSe thread is already running, PRUNNING is returned. No parameters can be passed. This function is part of the simplified interface.
int ec_resume1(ec_ref ToC)
  Similar to ec_resume(), but if the return value is PSUCCED, the ToC argument returns a cut value that can be used to discard alternative solutions by passing it to ec_cut_to_chp(). If the return value is PYIELD, control was yielded because of a yield/2 predicate call in the ECLiPSe code, and ToC contains the data passed by the first argument of yield/2. If the return value is PFLUSHIO or PWAITIO, ToC contains the associated stream number.
int ec_resume2(const pword FromC,ec_ref ToC)
  Similar to ec_resume1(), but it allows to pass an argument to the resumed execution. This is only useful if the execution had yielded due to a yield/2 predicate call. The term FromC is passed as input into the second argument of yield/2.
int ec_resume_long(long *ToC)
  Similar to ec_resume1(), but allows only integer values to be passed from ECLiPSe to C (otherwise TYPE_ERROR is returned). This function is part of the simplified interface.
int ec_resume_async()
  Similar to ec_resume(), but ECLiPSe is resumed in a separate thread in case this is supported by the operating system. The return value is PSUCCED if the thread started successfully, SYS_ERROR if there was a problem creating the thread, and PRUNNING if there was already an ECLiPSe thread running (only one ECLiPSe thread is allowed to run at any time). If threads are not supported, the call does nothing and return PSUCCED. Use ec_resume_status() to wait for termination and to retrieve the results of the execution.
int ec_resume_status()
  This function is supposed to be called after a call to ec_resume_async(). It returns PRUNNING as long as the ECLiPSe thread is still running. If the thread has stopped, the return values are the same as for ec_resume(). If threads are not supported, the pair of ec_resume_async() and ec_resume_status() is equivalent to an ec_resume().
int ec_resume_status_long(long *ToC)
  Similar to ec_resume_status(), but allows an integer to be returned to the caller, as done by ec_resume_long().
int ec_wait_resume_status_long(long *ToC, int timeout)
  Similar to ec_resume_status_long(), but waits for the ECLiPSe thread to finish execution. The function returns as soon as the ECLiPSe thread is finished, or after timeout milliseconds, whatever is earlier. In case of timeout, the return value will be PRUNNING. If timeout is zero, the function is equivalent to ec_resume_status_long(). If timeout is negative, there will be no timeout and the function will only return when the ECLiPSe thread is finished.
int ec_handle_events(long *ToC)
  Similar to ec_resume_long(), but posted goals are not executed, only events are handled.
void ec_cut_to_chp(ec_ref)
  Cut all choicepoints created by the batch of goals whose execution succeeded. The argument should have been obtained by a call to ec_resume2().
int ec_post_event(pword Name)
  Post an event to the ECLiPSe engine. This will lead to the execution of the corresponding event handler once the ECLiPSe execution is resumed. See also event/1 and the User Manual chapter on event handling for more information. Name should be an ECLiPSe atom.
int ec_post_event_string(const char *)
  Post an event to the ECLiPSe engine. This will lead to the execution of the corresponding event handler once the ECLiPSe execution is resumed. See also event/1 and the User Manual chapter on event handling for more information. The event name is given as a string. This function is part of the simplified interface.