/* 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,
                                            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
