/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file Copyright.txt or https://cmake.org/licensing#kwsys for details.  */
#ifndef @KWSYS_NAMESPACE@_Process_h
#define @KWSYS_NAMESPACE@_Process_h

#include <@KWSYS_NAMESPACE@/Configure.h>

/* Redefine all public interface symbol names to be in the proper
   namespace.  These macros are used internally to kwsys only, and are
   not visible to user code.  Use kwsysHeaderDump.pl to reproduce
   these macros after making changes to the interface.  */
#if !defined(KWSYS_NAMESPACE)
#  define kwsys_ns(x) @KWSYS_NAMESPACE@##x
#  define kwsysEXPORT @KWSYS_NAMESPACE@_EXPORT
#endif
#if !@KWSYS_NAMESPACE@_NAME_IS_KWSYS
#  define kwsysProcess kwsys_ns(Process)
#  define kwsysProcess_s kwsys_ns(Process_s)
#  define kwsysProcess_New kwsys_ns(Process_New)
#  define kwsysProcess_Delete kwsys_ns(Process_Delete)
#  define kwsysProcess_SetCommand kwsys_ns(Process_SetCommand)
#  define kwsysProcess_AddCommand kwsys_ns(Process_AddCommand)
#  define kwsysProcess_SetTimeout kwsys_ns(Process_SetTimeout)
#  define kwsysProcess_SetWorkingDirectory                                    \
    kwsys_ns(Process_SetWorkingDirectory)
#  define kwsysProcess_SetPipeFile kwsys_ns(Process_SetPipeFile)
#  define kwsysProcess_SetPipeNative kwsys_ns(Process_SetPipeNative)
#  define kwsysProcess_SetPipeShared kwsys_ns(Process_SetPipeShared)
#  define kwsysProcess_Option_Detach kwsys_ns(Process_Option_Detach)
#  define kwsysProcess_Option_HideWindow kwsys_ns(Process_Option_HideWindow)
#  define kwsysProcess_Option_MergeOutput kwsys_ns(Process_Option_MergeOutput)
#  define kwsysProcess_Option_Verbatim kwsys_ns(Process_Option_Verbatim)
#  define kwsysProcess_Option_CreateProcessGroup                              \
    kwsys_ns(Process_Option_CreateProcessGroup)
#  define kwsysProcess_GetOption kwsys_ns(Process_GetOption)
#  define kwsysProcess_SetOption kwsys_ns(Process_SetOption)
#  define kwsysProcess_Option_e kwsys_ns(Process_Option_e)
#  define kwsysProcess_State_Starting kwsys_ns(Process_State_Starting)
#  define kwsysProcess_State_Error kwsys_ns(Process_State_Error)
#  define kwsysProcess_State_Exception kwsys_ns(Process_State_Exception)
#  define kwsysProcess_State_Executing kwsys_ns(Process_State_Executing)
#  define kwsysProcess_State_Exited kwsys_ns(Process_State_Exited)
#  define kwsysProcess_State_Expired kwsys_ns(Process_State_Expired)
#  define kwsysProcess_State_Killed kwsys_ns(Process_State_Killed)
#  define kwsysProcess_State_Disowned kwsys_ns(Process_State_Disowned)
#  define kwsysProcess_State_e kwsys_ns(Process_State_e)
#  define kwsysProcess_Exception_None kwsys_ns(Process_Exception_None)
#  define kwsysProcess_Exception_Fault kwsys_ns(Process_Exception_Fault)
#  define kwsysProcess_Exception_Illegal kwsys_ns(Process_Exception_Illegal)
#  define kwsysProcess_Exception_Interrupt                                    \
    kwsys_ns(Process_Exception_Interrupt)
#  define kwsysProcess_Exception_Numerical                                    \
    kwsys_ns(Process_Exception_Numerical)
#  define kwsysProcess_Exception_Other kwsys_ns(Process_Exception_Other)
#  define kwsysProcess_Exception_e kwsys_ns(Process_Exception_e)
#  define kwsysProcess_GetState kwsys_ns(Process_GetState)
#  define kwsysProcess_GetExitException kwsys_ns(Process_GetExitException)
#  define kwsysProcess_GetExitCode kwsys_ns(Process_GetExitCode)
#  define kwsysProcess_GetExitValue kwsys_ns(Process_GetExitValue)
#  define kwsysProcess_GetErrorString kwsys_ns(Process_GetErrorString)
#  define kwsysProcess_GetExceptionString kwsys_ns(Process_GetExceptionString)
#  define kwsysProcess_GetStateByIndex kwsys_ns(Process_GetStateByIndex)
#  define kwsysProcess_GetExitExceptionByIndex                                \
    kwsys_ns(Process_GetExitExceptionByIndex)
#  define kwsysProcess_GetExitCodeByIndex kwsys_ns(Process_GetExitCodeByIndex)
#  define kwsysProcess_GetExitValueByIndex                                    \
    kwsys_ns(Process_GetExitValueByIndex)
#  define kwsysProcess_GetExceptionStringByIndex                              \
    kwsys_ns(Process_GetExceptionStringByIndex)
#  define kwsysProcess_GetExitCodeByIndex kwsys_ns(Process_GetExitCodeByIndex)
#  define kwsysProcess_Execute kwsys_ns(Process_Execute)
#  define kwsysProcess_Disown kwsys_ns(Process_Disown)
#  define kwsysProcess_WaitForData kwsys_ns(Process_WaitForData)
#  define kwsysProcess_Pipes_e kwsys_ns(Process_Pipes_e)
#  define kwsysProcess_Pipe_None kwsys_ns(Process_Pipe_None)
#  define kwsysProcess_Pipe_STDIN kwsys_ns(Process_Pipe_STDIN)
#  define kwsysProcess_Pipe_STDOUT kwsys_ns(Process_Pipe_STDOUT)
#  define kwsysProcess_Pipe_STDERR kwsys_ns(Process_Pipe_STDERR)
#  define kwsysProcess_Pipe_Timeout kwsys_ns(Process_Pipe_Timeout)
#  define kwsysProcess_Pipe_Handle kwsys_ns(Process_Pipe_Handle)
#  define kwsysProcess_WaitForExit kwsys_ns(Process_WaitForExit)
#  define kwsysProcess_Interrupt kwsys_ns(Process_Interrupt)
#  define kwsysProcess_Kill kwsys_ns(Process_Kill)
#  define kwsysProcess_KillPID kwsys_ns(Process_KillPID)
#  define kwsysProcess_ResetStartTime kwsys_ns(Process_ResetStartTime)
#endif

#if defined(__cplusplus)
extern "C" {
#endif

/**
 * Process control data structure.
 */
typedef struct kwsysProcess_s kwsysProcess;

/* Platform-specific pipe handle type.  */
#if defined(_WIN32) && !defined(__CYGWIN__)
typedef void* kwsysProcess_Pipe_Handle;
#else
typedef int kwsysProcess_Pipe_Handle;
#endif

/**
 * Create a new Process instance.
 */
kwsysEXPORT kwsysProcess* kwsysProcess_New(void);

/**
 * Delete an existing Process instance.  If the instance is currently
 * executing a process, this blocks until the process terminates.
 */
kwsysEXPORT void kwsysProcess_Delete(kwsysProcess* cp);

/**
 * Set the command line to be executed.  Argument is an array of
 * pointers to the command and each argument.  The array must end with
 * a NULL pointer.  Any previous command lines are removed.  Returns
 * 1 for success and 0 otherwise.
 */
kwsysEXPORT int kwsysProcess_SetCommand(kwsysProcess* cp,
                                        char const* const* command);

/**
 * Add a command line to be executed.  Argument is an array of
 * pointers to the command and each argument.  The array must end with
 * a NULL pointer.  If this is not the first command added, its
 * standard input will be connected to the standard output of the
 * previous command.  Returns 1 for success and 0 otherwise.
 */
kwsysEXPORT int kwsysProcess_AddCommand(kwsysProcess* cp,
                                        char const* const* command);

/**
 * Set the timeout in seconds for the child process.  The timeout
 * period begins when the child is executed.  If the child has not
 * terminated when the timeout expires, it will be killed.  A
 * non-positive (<= 0) value will disable the timeout.
 */
kwsysEXPORT void kwsysProcess_SetTimeout(kwsysProcess* cp, double timeout);

/**
 * Set the working directory for the child process.  The working
 * directory can be absolute or relative to the current directory.
 * Returns 1 for success and 0 for failure.
 */
kwsysEXPORT int kwsysProcess_SetWorkingDirectory(kwsysProcess* cp,
                                                 const char* dir);

/**
 * Set the name of a file to be attached to the given pipe.  Returns 1
 * for success and 0 for failure.
 */
kwsysEXPORT int kwsysProcess_SetPipeFile(kwsysProcess* cp, int pipe,
                                         const char* file);

/**
 * Set whether the given pipe in the child is shared with the parent
 * process.  The default is no for Pipe_STDOUT and Pipe_STDERR and yes
 * for Pipe_STDIN.
 */
kwsysEXPORT void kwsysProcess_SetPipeShared(kwsysProcess* cp, int pipe,
                                            int shared);

/**
 * Specify a platform-specific native pipe for use as one of the child
 * interface pipes.  The native pipe is specified by an array of two
 * descriptors or handles.  The first entry in the array (index 0)
 * should be the read end of the pipe.  The second entry in the array
 * (index 1) should be the write end of the pipe.  If a null pointer
 * is given the option will be disabled.
 *
 * For Pipe_STDIN the native pipe is connected to the first child in
 * the pipeline as its stdin.  After the children are created the
 * write end of the pipe will be closed in the child process and the
 * read end will be closed in the parent process.
 *
 * For Pipe_STDOUT and Pipe_STDERR the pipe is connected to the last
 * child as its stdout or stderr.  After the children are created the
 * write end of the pipe will be closed in the parent process and the
 * read end will be closed in the child process.
 */
kwsysEXPORT void kwsysProcess_SetPipeNative(
  kwsysProcess* cp, int pipe, const kwsysProcess_Pipe_Handle p[2]);

/**
 * Get/Set a possibly platform-specific option.  Possible options are:
 *
 *  kwsysProcess_Option_Detach = Whether to detach the process.
 *         0 = No (default)
 *         1 = Yes
 *
 *  kwsysProcess_Option_HideWindow = Whether to hide window on Windows.
 *         0 = No (default)
 *         1 = Yes
 *
 *  kwsysProcess_Option_MergeOutput = Whether to merge stdout/stderr.
 *                                    No content will be returned as stderr.
 *                                    Any actual stderr will be on stdout.
 *         0 = No (default)
 *         1 = Yes
 *
 *  kwsysProcess_Option_Verbatim = Whether SetCommand and AddCommand
 *                                 should treat the first argument
 *                                 as a verbatim command line
 *                                 and ignore the rest of the arguments.
 *         0 = No (default)
 *         1 = Yes
 *
 *  kwsysProcess_Option_CreateProcessGroup = Whether to place the process in a
 *                                           new process group.  This is
 *                                           useful if you want to send Ctrl+C
 *                                           to the process.  On UNIX, also
 *                                           places the process in a new
 *                                           session.
 *         0 = No (default)
 *         1 = Yes
 */
kwsysEXPORT int kwsysProcess_GetOption(kwsysProcess* cp, int optionId);
kwsysEXPORT void kwsysProcess_SetOption(kwsysProcess* cp, int optionId,
                                        int value);
enum kwsysProcess_Option_e
{
  kwsysProcess_Option_HideWindow,
  kwsysProcess_Option_Detach,
  kwsysProcess_Option_MergeOutput,
  kwsysProcess_Option_Verbatim,
  kwsysProcess_Option_CreateProcessGroup
};

/**
 * Get the current state of the Process instance.  Possible states are:
 *
 *  kwsysProcess_State_Starting  = Execute has not yet been called.
 *  kwsysProcess_State_Error     = Error administrating the child process.
 *  kwsysProcess_State_Exception = Child process exited abnormally.
 *  kwsysProcess_State_Executing = Child process is currently running.
 *  kwsysProcess_State_Exited    = Child process exited normally.
 *  kwsysProcess_State_Expired   = Child process's timeout expired.
 *  kwsysProcess_State_Killed    = Child process terminated by Kill method.
 *  kwsysProcess_State_Disowned  = Child is no longer managed by this object.
 */
kwsysEXPORT int kwsysProcess_GetState(kwsysProcess* cp);
enum kwsysProcess_State_e
{
  kwsysProcess_State_Starting,
  kwsysProcess_State_Error,
  kwsysProcess_State_Exception,
  kwsysProcess_State_Executing,
  kwsysProcess_State_Exited,
  kwsysProcess_State_Expired,
  kwsysProcess_State_Killed,
  kwsysProcess_State_Disowned
};

/**
 * When GetState returns "Exception", this method returns a
 * platform-independent description of the exceptional behavior that
 * caused the child to terminate abnormally.  Possible exceptions are:
 *
 *  kwsysProcess_Exception_None      = No exceptional behavior occurred.
 *  kwsysProcess_Exception_Fault     = Child crashed with a memory fault.
 *  kwsysProcess_Exception_Illegal   = Child crashed with an illegal
 * instruction.
 *  kwsysProcess_Exception_Interrupt = Child was interrupted by user
 * (Cntl-C/Break).
 *  kwsysProcess_Exception_Numerical = Child crashed with a numerical
 * exception.
 *  kwsysProcess_Exception_Other     = Child terminated for another reason.
 */
kwsysEXPORT int kwsysProcess_GetExitException(kwsysProcess* cp);
enum kwsysProcess_Exception_e
{
  kwsysProcess_Exception_None,
  kwsysProcess_Exception_Fault,
  kwsysProcess_Exception_Illegal,
  kwsysProcess_Exception_Interrupt,
  kwsysProcess_Exception_Numerical,
  kwsysProcess_Exception_Other
};

/**
 * When GetState returns "Exited" or "Exception", this method returns
 * the platform-specific raw exit code of the process.  UNIX platforms
 * should use WIFEXITED/WEXITSTATUS and WIFSIGNALED/WTERMSIG to access
 * this value.  Windows users should compare the value to the various
 * EXCEPTION_* values.
 *
 * If GetState returns "Exited", use GetExitValue to get the
 * platform-independent child return value.
 */
kwsysEXPORT int kwsysProcess_GetExitCode(kwsysProcess* cp);

/**
 * When GetState returns "Exited", this method returns the child's
 * platform-independent exit code (such as the value returned by the
 * child's main).
 */
kwsysEXPORT int kwsysProcess_GetExitValue(kwsysProcess* cp);

/**
 * When GetState returns "Error", this method returns a string
 * describing the problem.  Otherwise, it returns NULL.
 */
kwsysEXPORT const char* kwsysProcess_GetErrorString(kwsysProcess* cp);

/**
 * When GetState returns "Exception", this method returns a string
 * describing the problem.  Otherwise, it returns NULL.
 */
kwsysEXPORT const char* kwsysProcess_GetExceptionString(kwsysProcess* cp);

/**
 * Get the current state of the Process instance.  Possible states are:
 *
 *  kwsysProcess_StateByIndex_Starting  = Execute has not yet been called.
 *  kwsysProcess_StateByIndex_Exception = Child process exited abnormally.
 *  kwsysProcess_StateByIndex_Exited    = Child process exited normally.
 *  kwsysProcess_StateByIndex_Error     = Error getting the child return code.
 */
kwsysEXPORT int kwsysProcess_GetStateByIndex(kwsysProcess* cp, int idx);
enum kwsysProcess_StateByIndex_e
{
  kwsysProcess_StateByIndex_Starting = kwsysProcess_State_Starting,
  kwsysProcess_StateByIndex_Exception = kwsysProcess_State_Exception,
  kwsysProcess_StateByIndex_Exited = kwsysProcess_State_Exited,
  kwsysProcess_StateByIndex_Error = kwsysProcess_State_Error
};

/**
 * When GetState returns "Exception", this method returns a
 * platform-independent description of the exceptional behavior that
 * caused the child to terminate abnormally.  Possible exceptions are:
 *
 *  kwsysProcess_Exception_None      = No exceptional behavior occurred.
 *  kwsysProcess_Exception_Fault     = Child crashed with a memory fault.
 *  kwsysProcess_Exception_Illegal   = Child crashed with an illegal
 *                                     instruction.
 *  kwsysProcess_Exception_Interrupt = Child was interrupted by user
 *                                     (Cntl-C/Break).
 *  kwsysProcess_Exception_Numerical = Child crashed with a numerical
 *                                     exception.
 *  kwsysProcess_Exception_Other     = Child terminated for another reason.
 */
kwsysEXPORT int kwsysProcess_GetExitExceptionByIndex(kwsysProcess* cp,
                                                     int idx);

/**
 * When GetState returns "Exited" or "Exception", this method returns
 * the platform-specific raw exit code of the process.  UNIX platforms
 * should use WIFEXITED/WEXITSTATUS and WIFSIGNALED/WTERMSIG to access
 * this value.  Windows users should compare the value to the various
 * EXCEPTION_* values.
 *
 * If GetState returns "Exited", use GetExitValue to get the
 * platform-independent child return value.
 */
kwsysEXPORT int kwsysProcess_GetExitCodeByIndex(kwsysProcess* cp, int idx);

/**
 * When GetState returns "Exited", this method returns the child's
 * platform-independent exit code (such as the value returned by the
 * child's main).
 */
kwsysEXPORT int kwsysProcess_GetExitValueByIndex(kwsysProcess* cp, int idx);

/**
 * When GetState returns "Exception", this method returns a string
 * describing the problem.  Otherwise, it returns NULL.
 */
kwsysEXPORT const char* kwsysProcess_GetExceptionStringByIndex(
  kwsysProcess* cp, int idx);

/**
 * Start executing the child process.
 */
kwsysEXPORT void kwsysProcess_Execute(kwsysProcess* cp);

/**
 * Stop management of a detached child process.  This closes any pipes
 * being read.  If the child was not created with the
 * kwsysProcess_Option_Detach option, this method does nothing.  This
 * is because disowning a non-detached process will cause the child
 * exit signal to be left unhandled until this process exits.
 */
kwsysEXPORT void kwsysProcess_Disown(kwsysProcess* cp);

/**
 * Block until data are available on a pipe, a timeout expires, or the
 * child process terminates.  Arguments are as follows:
 *
 *  data    = If data are read, the pointer to which this points is
 *            set to point to the data.
 *  length  = If data are read, the integer to which this points is
 *            set to the length of the data read.
 *  timeout = Specifies the maximum time this call may block.  Upon
 *            return after reading data, the time elapsed is subtracted
 *            from the timeout value.  If this timeout expires, the
 *            value is set to 0.  A NULL pointer passed for this argument
 *            indicates no timeout for the call.  A negative or zero
 *            value passed for this argument may be used for polling
 *            and will always return immediately.
 *
 * Return value will be one of:
 *
 *   Pipe_None    = No more data will be available from the child process,
 *    ( == 0)       or no process has been executed.  WaitForExit should
 *                  be called to wait for the process to terminate.
 *   Pipe_STDOUT  = Data have been read from the child's stdout pipe.
 *   Pipe_STDERR  = Data have been read from the child's stderr pipe.
 *   Pipe_Timeout = No data available within timeout specified for the
 *                  call.  Time elapsed has been subtracted from timeout
 *                  argument.
 */
kwsysEXPORT int kwsysProcess_WaitForData(kwsysProcess* cp, char** data,
                                         int* length, double* timeout);
enum kwsysProcess_Pipes_e
{
  kwsysProcess_Pipe_None,
  kwsysProcess_Pipe_STDIN,
  kwsysProcess_Pipe_STDOUT,
  kwsysProcess_Pipe_STDERR,
  kwsysProcess_Pipe_Timeout = 255
};

/**
 * Block until the child process terminates or the given timeout
 * expires.  If no process is running, returns immediately.  The
 * argument is:
 *
 *  timeout = Specifies the maximum time this call may block.  Upon
 *            returning due to child termination, the elapsed time
 *            is subtracted from the given value.  A NULL pointer
 *            passed for this argument indicates no timeout for the
 *            call.
 *
 * Return value will be one of:
 *
 *    0 = Child did not terminate within timeout specified for
 *        the call.  Time elapsed has been subtracted from timeout
 *        argument.
 *    1 = Child has terminated or was not running.
 */
kwsysEXPORT int kwsysProcess_WaitForExit(kwsysProcess* cp, double* timeout);

/**
 * Interrupt the process group for the child process that is currently
 * running by sending it the appropriate operating-system specific signal.
 * The caller should call WaitForExit after this returns to wait for the
 * child to terminate.
 *
 * WARNING:  If you didn't specify kwsysProcess_Option_CreateProcessGroup,
 * you will interrupt your own process group.
 */
kwsysEXPORT void kwsysProcess_Interrupt(kwsysProcess* cp);

/**
 * Forcefully terminate the child process that is currently running.
 * The caller should call WaitForExit after this returns to wait for
 * the child to terminate.
 */
kwsysEXPORT void kwsysProcess_Kill(kwsysProcess* cp);

/**
 * Same as kwsysProcess_Kill using process ID to locate process to
 * terminate.
 * @see kwsysProcess_Kill(kwsysProcess* cp)
 */
kwsysEXPORT void kwsysProcess_KillPID(unsigned long);

/**
 * Reset the start time of the child process to the current time.
 */
kwsysEXPORT void kwsysProcess_ResetStartTime(kwsysProcess* cp);

#if defined(__cplusplus)
} /* extern "C" */
#endif

/* If we are building a kwsys .c or .cxx file, let it use these macros.
   Otherwise, undefine them to keep the namespace clean.  */
#if !defined(KWSYS_NAMESPACE)
#  undef kwsys_ns
#  undef kwsysEXPORT
#  if !@KWSYS_NAMESPACE@_NAME_IS_KWSYS
#    undef kwsysProcess
#    undef kwsysProcess_s
#    undef kwsysProcess_New
#    undef kwsysProcess_Delete
#    undef kwsysProcess_SetCommand
#    undef kwsysProcess_AddCommand
#    undef kwsysProcess_SetTimeout
#    undef kwsysProcess_SetWorkingDirectory
#    undef kwsysProcess_SetPipeFile
#    undef kwsysProcess_SetPipeNative
#    undef kwsysProcess_SetPipeShared
#    undef kwsysProcess_Option_Detach
#    undef kwsysProcess_Option_HideWindow
#    undef kwsysProcess_Option_MergeOutput
#    undef kwsysProcess_Option_Verbatim
#    undef kwsysProcess_Option_CreateProcessGroup
#    undef kwsysProcess_GetOption
#    undef kwsysProcess_SetOption
#    undef kwsysProcess_Option_e
#    undef kwsysProcess_State_Starting
#    undef kwsysProcess_State_Error
#    undef kwsysProcess_State_Exception
#    undef kwsysProcess_State_Executing
#    undef kwsysProcess_State_Exited
#    undef kwsysProcess_State_Expired
#    undef kwsysProcess_State_Killed
#    undef kwsysProcess_State_Disowned
#    undef kwsysProcess_GetState
#    undef kwsysProcess_State_e
#    undef kwsysProcess_Exception_None
#    undef kwsysProcess_Exception_Fault
#    undef kwsysProcess_Exception_Illegal
#    undef kwsysProcess_Exception_Interrupt
#    undef kwsysProcess_Exception_Numerical
#    undef kwsysProcess_Exception_Other
#    undef kwsysProcess_GetExitException
#    undef kwsysProcess_Exception_e
#    undef kwsysProcess_GetExitCode
#    undef kwsysProcess_GetExitValue
#    undef kwsysProcess_GetErrorString
#    undef kwsysProcess_GetExceptionString
#    undef kwsysProcess_Execute
#    undef kwsysProcess_Disown
#    undef kwsysProcess_WaitForData
#    undef kwsysProcess_Pipes_e
#    undef kwsysProcess_Pipe_None
#    undef kwsysProcess_Pipe_STDIN
#    undef kwsysProcess_Pipe_STDOUT
#    undef kwsysProcess_Pipe_STDERR
#    undef kwsysProcess_Pipe_Timeout
#    undef kwsysProcess_Pipe_Handle
#    undef kwsysProcess_WaitForExit
#    undef kwsysProcess_Interrupt
#    undef kwsysProcess_Kill
#    undef kwsysProcess_ResetStartTime
#  endif
#endif

#endif
