/* -*-c-*-
 *
 * Options parsing, similar to GNU getopt_long
 *
 * (c) 1999 Darren Salt
 * Uses mdwopt
 */

#ifndef MDWOPT_MOD_H
#define MDWOPT_MOD_H

#include <kernel.h>
#include "mdwopt.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef struct {
  char *argv[256];
  char args[1024];
} argbuf;

/* mdwopt_init_args
 * Calls:
 *	MDWOpt_InitArgs
 * In:	R0 = state
 *	R1 = program_name
 *	R2 = gFlags
 * Returns:
 *	Non-X: void
 *	X:     0 or error
 */
extern void
mdwopt_init_args (mdwopt_data *state, const char *program_name, int gFlags);

extern _kernel_oserror *
xmdwopt_init_args (mdwopt_data *state, const char *program_name, int gFlags);

/* mdwopt_read_args
 * Calls:
 *	MDWOpt_ReadArgs
 * In:	R0 = argc
 *	R1 = argv
 *	R2 = short_opts
 *	R3 = long_opts
 *	R4 = state
 *	R5 = gFlags
 * Out: R1 -> fn result (X form)
 *	R2 -> longopt_index
 *	R3 -> number
 *	R4 -> parameter
 *	R5 -> nextarg_index
 * Returns:
 *	Non-X: R1
 *	X:     0 or error
 */
extern int
mdwopt_read_args (int argc, const *const argv[], const char *short_opts,
		  const option long_opts[], mdwopt_data *state, int gFlags,
		  int *longopt_index, int *number, const char **parameter,
		  int *nextarg_index);

extern _kernel_oserror *
xmdwopt_read_args (int argc, const *const argv[], const char *short_opts,
		   const option long_opts[], mdwopt_data *state, int gFlags,
		   int *optword, int *longopt_index, int *number,
		   const char **parameter, int *nextarg_index);

/* mdwopt_parse_command_string
 * Calls:
 *	MDWOpt_ParseCommandString
 * In:	R0 = command
 *	R1 = argbuffer
 * Out: R0 -> argc (X form)
 * Returns:
 *	Non-X: R0
 *	X:     0 or error
 */
extern int
mdwopt_parse_command_string (const char *command, argbuf *argbuffer);

extern _kernel_oserror *
xmdwopt_parse_command_string (const char *command, argbuf *argbuffer,
			      int *argc);

/* mdwopt_add_long_option
 * Calls:
 *	MDWOpt_AddLongOption
 * In:	R0 = options_buf
 *	R1 = *strings_buf
 *	R2 = *strings_free
 *	R3 = name
 *	R4 = flags
 *	R5 = flagword
 *	R6 = value
 * Out:	*strings_buf, *strings_free updated
 * Returns:
 *	Non-X: void
 *	X:     0 or error
 */
extern void
mdwopt_add_long_option (option options_buf[], char **strings_buf,
			int *strings_free, const char name[], int flags,
			int *flagword, int value);

extern _kernel_oserror *
xmdwopt_add_long_option (option options_buf[], char **strings_buf,
			 int *strings_free, const char name[], int flags,
			 int *flagword, int value);

/* mdwopt_reconstitute_string
 * Calls:
 *	MDWOpt_ReconstituteString
 * In:	R0 = argbuffer
 *	R1 = command_buffer
 *	R2 = command_size
 *	R3 = quote_style
 * Out:	R0 -> command_end (X form)
 * Returns:
 *	Non-X: R0
 *	X:     0 or error
 */
extern char *
mdwopt_reconstitute_string (const char *const argbuffer[],
			    char *command_buffer, int command_size,
			    int quote_style);

extern _kernel_oserror *
xmdwopt_reconstitute_string (const char *const argbuffer[],
			    char *command_buffer, int command_size,
			    int quote_style, char **command_end);

#ifdef __cplusplus
}
#endif
