* Make-common.in (SIM_ENVIRONMENT): New variable.

(CONFIG_CFLAGS): Add it.
	* aclocal.m4 (SIM_AC_OPTION_ENVIRONMENT): Handle
	--enable-sim-environment option.
	* configure: Regenerated.
	* sim-config.h (environment support): Rewrite.
	* sim-config.c (current_environment): Define as enum, unconditionally.
	(current_alignment): Define unconditionally.
	(config_environment_to_a): Update.
	(config_alignment_to_a): Fix type of argument.  Define unconditionally.
	(sim_config): Handle environment and alignment determination
	unconditionally.  Delete sanity checks of current_environment,
	unnecessary.
	(print_sim_config): Update.
	* sim-options.c (STANDARD_OPTIONS enum): Add OPTION_ENVIRONMENT.
	(standard_options): Add --environment.
	(standard_option_handler): Likewise.
This commit is contained in:
Doug Evans
1997-12-04 02:04:42 +00:00
parent b65b4d8b06
commit 22469a10e8
5 changed files with 222 additions and 110 deletions

View File

@@ -1,3 +1,41 @@
Wed Dec 3 17:56:02 1997 Doug Evans <devans@canuck.cygnus.com>
* Make-common.in (SIM_ENVIRONMENT): New variable.
(CONFIG_CFLAGS): Add it.
* aclocal.m4 (SIM_AC_OPTION_ENVIRONMENT): Handle
--enable-sim-environment option.
* configure: Regenerated.
* sim-config.h (environment support): Rewrite.
* sim-config.c (current_environment): Define as enum, unconditionally.
(current_alignment): Define unconditionally.
(config_environment_to_a): Update.
(config_alignment_to_a): Fix type of argument. Define unconditionally.
(sim_config): Handle environment and alignment determination
unconditionally. Delete sanity checks of current_environment,
unnecessary.
(print_sim_config): Update.
* sim-options.c (STANDARD_OPTIONS enum): Add OPTION_ENVIRONMENT.
(standard_options): Add --environment.
(standard_option_handler): Likewise.
Fri Nov 28 12:21:25 1997 Andrew Cagney <cagney@b1.cygnus.com>
* sim-alu.h: Add notes on carry vs borrow for subtraction.
(ALU{,8,16,32,64}ADD): Redefine ADD macro as add overflowing.
(ALU{,8,16,32,64}ADDC): Define - add carrying.
(ALU{,8,16,32,64}SUB): Redefine SUB macro as subtract overflowing.
(ALU{,8,16,32,64}SUBB): Define - subtract borrowing.
(ALU{,8,16,32,64}SUBC): Define - tract carrying.
(ALU{,8,16,32,64}ADD_CA, ALU{,8,16,32,64}ADDC_C): Replace single
argument ADD_CA macro with two argument ADDC_C - add carrying with
carry in.
(ALU{,8,16,32,64}SUB_CA, ALU{,8,16,32,64}SUBC_X): Replace single
argument SUB_CA macro with two argument SUBC_X - subtract
carrying, extended.
(ALU{,8,16,32,64}SUBB_B): Define - subtract borrowing with
borrow-in.
(ALU{,8,16,32,64}NEGC, ALU{,8,16,32,64}NEGB): Define.
Sun Nov 30 17:40:57 1997 Michael Meissner <meissner@cygnus.com>
* sim-io.c (sim_io_{syscalls,getstring}): Delete. No longer used.

View File

@@ -77,6 +77,7 @@ SIM_ALIGNMENT = @sim_alignment@
SIM_BITSIZE = @sim_bitsize@
SIM_DEFAULT_MODEL = @sim_default_model@
SIM_ENDIAN = @sim_endian@
SIM_ENVIRONMENT = @sim_environment@
SIM_FLOAT = @sim_float@
SIM_HARDWARE = @sim_hardware@
SIM_HOSTENDIAN = @sim_hostendian@
@@ -168,6 +169,7 @@ CONFIG_CFLAGS = @DEFS@ \
$(SIM_ALIGNMENT) \
$(SIM_BITSIZE) \
$(SIM_ENDIAN) \
$(SIM_ENVIRONMENT) \
$(SIM_FLOAT) \
$(SIM_HARDWARE) \
$(SIM_HOSTENDIAN) \
@@ -202,7 +204,7 @@ EXTRA_LIBS = $(BFD_LIB) $(OPCODES_LIB) $(LIBIBERTY_LIB) \
LIB_OBJS = callback.o syscall.o targ-map.o $(SIM_OBJS)
all: $(SIM_EXTRA_ALL) libsim.a run
all: $(SIM_EXTRA_ALL) libsim.a run .gdbinit
libsim.a: $(LIB_OBJS)
rm -f libsim.a
@@ -214,7 +216,7 @@ run: $(SIM_RUN_OBJS) libsim.a $(LIBDEPS)
$(SIM_RUN_OBJS) libsim.a $(EXTRA_LIBS)
run.o: $(srccom)/run.c config.h tconfig.h \
$(srcroot)/include/callback.h
$(srcroot)/include/remote-sim.h $(srcroot)/include/callback.h
$(CC) -c $(srccom)/run.c $(ALL_CFLAGS)
# FIXME: Ideally, callback.o and friends live in a library outside of
@@ -321,10 +323,12 @@ sim-fpu.o: $(srccom)/sim-fpu.c $(sim-fpu_h) \
$(CC) -c $(srccom)/sim-fpu.c $(ALL_CFLAGS)
sim-hload.o: $(srccom)/sim-hload.c $(sim-assert_h) \
$(srcroot)/include/remote-sim.h \
$(SIM_EXTRA_DEPS)
$(CC) -c $(srccom)/sim-hload.c $(ALL_CFLAGS)
sim-hrw.o: $(srccom)/sim-hrw.c $(sim-assert_h) \
sim-hrw.o: $(srccom)/sim-hrw.c $(sim-assert_h) $(sim_core_h) \
$(srcroot)/include/remote-sim.h \
$(SIM_EXTRA_DEPS)
$(CC) -c $(srccom)/sim-hrw.c $(ALL_CFLAGS)
@@ -334,7 +338,8 @@ sim-inline.c: $(srccom)/sim-inline.c
cat $(srccom)/$@ >> tmp-$@
$(srcdir)/../../move-if-change tmp-$@ $@
sim-io.o: $(srccom)/sim-io.c $(sim_main_headers) $(sim-io_h)
sim-io.o: $(srccom)/sim-io.c $(sim_main_headers) $(sim-io_h) \
$(srcroot)/include/remote-sim.h
$(CC) -c $(srccom)/sim-io.c $(ALL_CFLAGS)
sim-memopt.o: $(srccom)/sim-memopt.c $(sim_main_headers) \
@@ -349,10 +354,12 @@ sim-options.o: $(srccom)/sim-options.c $(sim_main_headers) \
$(sim-options_h) $(sim-io_h)
$(CC) -c $(srccom)/sim-options.c $(ALL_CFLAGS)
sim-reason.o: $(srccom)/sim-reason.c $(sim_main_headers)
sim-reason.o: $(srccom)/sim-reason.c $(sim_main_headers) \
$(srcroot)/include/remote-sim.h
$(CC) -c $(srccom)/sim-reason.c $(ALL_CFLAGS)
sim-resume.o: $(srccom)/sim-resume.c $(sim_main_headers)
sim-resume.o: $(srccom)/sim-resume.c $(sim_main_headers) \
$(srcroot)/include/remote-sim.h
$(CC) -c $(srccom)/sim-resume.c $(ALL_CFLAGS)
sim-run.o: $(srccom)/sim-run.c $(sim_main_headers)
@@ -390,7 +397,8 @@ sim-break.o: $(srccom)/sim-break.c $(sim_main_headers) \
$(CC) -c $(srccom)/sim-break.c $(ALL_CFLAGS)
nrun.o: $(srccom)/nrun.c config.h tconfig.h \
$(srcroot)/include/callback.h $(sim_main_headers)
$(srcroot)/include/remote-sim.h $(srcroot)/include/callback.h \
$(sim_main_headers)
$(CC) -c $(srccom)/nrun.c $(ALL_CFLAGS)
# CGEN support.

View File

@@ -28,13 +28,14 @@ int current_host_byte_order;
int current_target_byte_order;
int current_stdio;
#if defined (WITH_ENVIRONMENT)
int current_environment;
#endif
/* The currently selected environment.
This isn't used unless the choice is runtime selectable.
The proper way to determine the currently selected environment
is with the CURRENT_ENVIRONMENT macro.
This is set to ALL_ENVIRONMENT to indicate none has been selected yet. */
enum sim_environment current_environment = ALL_ENVIRONMENT;
#if defined (WITH_ALIGNMENT)
enum sim_alignments current_alignment;
#endif
#if defined (WITH_FLOATING_POINT)
int current_floating_point;
@@ -76,28 +77,26 @@ config_stdio_to_a (int stdio)
}
#if defined (WITH_ENVIRONMENT)
static const char *
config_environment_to_a (int environment)
config_environment_to_a (enum sim_environment environment)
{
switch (environment)
{
case ALL_ENVIRONMENT:
return "ALL_ENVIRONMENT";
case USER_ENVIRONMENT:
return "USER_ENVIRONMENT";
case VIRTUAL_ENVIRONMENT:
return "VIRTUAL_ENVIRONMENT";
case OPERATING_ENVIRONMENT:
return "OPERATING_ENVIRONMENT";
case 0:
return "0";
}
return "UNKNOWN";
}
#endif
static const char *
config_alignment_to_a (int alignment)
config_alignment_to_a (enum sim_alignments alignment)
{
switch (alignment)
{
@@ -227,11 +226,9 @@ sim_config (SIM_DESC sd)
}
#if defined (WITH_ENVIRONMENT)
/* set the environment */
#if (WITH_DEVICES)
if (current_environment == 0)
if (current_environment == ALL_ENVIRONMENT)
{
const char *env =
tree_find_string_property(root, "/openprom/options/env");
@@ -244,29 +241,12 @@ sim_config (SIM_DESC sd)
: (strcmp(env, "operating") == 0
|| strcmp(env, "oea") == 0)
? OPERATING_ENVIRONMENT
: 0);
: ALL_ENVIRONMENT);
}
#endif
if (current_environment == 0)
current_environment = WITH_ENVIRONMENT;
if (current_environment == ALL_ENVIRONMENT)
current_environment = DEFAULT_ENVIRONMENT;
/* verify the environment */
if (CURRENT_ENVIRONMENT == 0)
{
sim_io_eprintf (sd, "Target environment unspecified\n");
return SIM_RC_FAIL;
}
if (CURRENT_ENVIRONMENT != current_environment)
{
sim_io_eprintf (sd, "Target (%s) and configured (%s) environment in conflict\n",
config_environment_to_a (CURRENT_ENVIRONMENT),
config_environment_to_a (current_environment));
return SIM_RC_FAIL;
}
#endif
#if defined (WITH_ALIGNMENT)
/* set the alignment */
#if defined (WITH_DEVICES)
@@ -278,6 +258,8 @@ sim_config (SIM_DESC sd)
#endif
if (current_alignment == 0)
current_alignment = WITH_ALIGNMENT;
if (current_alignment == 0)
current_alignment = WITH_DEFAULT_ALIGNMENT;
/* verify the alignment */
if (CURRENT_ALIGNMENT == 0)
@@ -292,10 +274,8 @@ sim_config (SIM_DESC sd)
config_alignment_to_a (current_alignment));
return SIM_RC_FAIL;
}
#endif
#if defined (WITH_FLOAING_POINT)
#if defined (WITH_FLOATING_POINT)
/* set the floating point */
if (current_floating_point == 0)
@@ -348,18 +328,19 @@ print_sim_config (SIM_DESC sd)
sim_io_printf (sd, "WITH_TARGET_WORD_MSB = %d\n",
WITH_TARGET_WORD_MSB);
#if defined (WITH_XOR_ENDIAN)
sim_io_printf (sd, "WITH_XOR_ENDIAN = %d\n", WITH_XOR_ENDIAN);
#endif
#if defined (WITH_ENVIRONMENT)
sim_io_printf (sd, "WITH_ENVIRONMENT = %s\n",
config_environment_to_a (WITH_ENVIRONMENT));
#endif
#if defined (WITH_ALIGNMENT)
sim_io_printf (sd, "WITH_ALIGNMENT = %s\n",
config_alignment_to_a (WITH_ALIGNMENT));
#if defined (WITH_DEFAULT_ALIGNMENT)
sim_io_printf (sd, "WITH_DEFAULT_ALIGNMENT = %s\n",
config_alignment_to_a (WITH_DEFAULT_ALIGNMENT));
#endif
#if defined (WITH_XOR_ENDIAN)
sim_io_printf (sd, "WITH_XOR_ENDIAN = %d\n", WITH_XOR_ENDIAN);
#endif
#if defined (WITH_FLOATING_POINT)
@@ -375,4 +356,8 @@ print_sim_config (SIM_DESC sd)
sim_io_printf (sd, "WITH_RESERVED_BITS = %d\n", WITH_RESERVED_BITS);
#endif
#if defined (WITH_PROFILE)
sim_io_printf (sd, "WITH_PROFILE = %d\n", WITH_PROFILE);
#endif
}

View File

@@ -319,24 +319,45 @@ extern int current_target_byte_order;
expect to see (VEA includes things like coherency and the time
base) while OEA is what an operating system expects to see. By
setting these to specific values, the build process is able to
eliminate non relevent environment code
eliminate non relevent environment code.
CURRENT_ENVIRONMENT specifies which of vea or oea is required for
the current runtime. */
the current runtime.
#if defined (WITH_ENVIRONMENT)
ALL_ENVIRONMENT is used during configuration as a value for
WITH_ENVIRONMENT to indicate the choice is runtime selectable.
The default is then USER_ENVIRONMENT [since allowing the user to choose
the default at configure time seems like featuritis and since people using
OPERATING_ENVIRONMENT have more to worry about than selecting the default].
ALL_ENVIRONMENT is also used to set `current_environment' to the
"unknown" state. */
#define USER_ENVIRONMENT 1
#define VIRTUAL_ENVIRONMENT 2
#define OPERATING_ENVIRONMENT 3
extern int current_environment;
#define CURRENT_ENVIRONMENT (WITH_ENVIRONMENT \
? WITH_ENVIRONMENT \
: current_environment)
enum sim_environment {
ALL_ENVIRONMENT,
USER_ENVIRONMENT,
VIRTUAL_ENVIRONMENT,
OPERATING_ENVIRONMENT
};
/* If the simulator specified SIM_AC_OPTION_ENVIRONMENT, indicate so. */
#ifdef WITH_ENVIRONMENT
#define SIM_HAVE_ENVIRONMENT
#endif
/* If the simulator doesn't specify SIM_AC_OPTION_ENVIRONMENT in its
configure.in, the only supported environment is the user environment. */
#ifndef WITH_ENVIRONMENT
#define WITH_ENVIRONMENT USER_ENVIRONMENT
#endif
#define DEFAULT_ENVIRONMENT (WITH_ENVIRONMENT != ALL_ENVIRONMENT \
? WITH_ENVIRONMENT \
: USER_ENVIRONMENT)
extern enum sim_environment current_environment;
#define CURRENT_ENVIRONMENT (WITH_ENVIRONMENT != ALL_ENVIRONMENT \
? WITH_ENVIRONMENT \
: current_environment)
/* Callback & Modulo Memory.
@@ -394,7 +415,7 @@ enum sim_alignments {
extern enum sim_alignments current_alignment;
#if !defined (WITH_ALIGNMENT)
#define WITH_ALIGNMENT NONSTRICT_ALIGNMENT
#define WITH_ALIGNMENT 0
#endif
#if !defined (WITH_DEFAULT_ALIGNMENT)

View File

@@ -31,7 +31,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#endif
#include <ctype.h>
#include "libiberty.h"
#include "../libiberty/alloca-conf.h"
#include "sim-options.h"
#include "sim-io.h"
#include "sim-assert.h"
@@ -83,31 +82,55 @@ static DECLARE_OPTION_HANDLER (standard_option_handler);
If you decide to conditionally compile them out as well, delete this
comment and add a comment saying that that is the rule. */
#define OPTION_DEBUG_INSN (OPTION_START + 0)
#define OPTION_DEBUG_FILE (OPTION_START + 1)
#define OPTION_DO_COMMAND (OPTION_START + 2)
#define OPTION_ARCHITECTURE (OPTION_START + 3)
#define OPTION_TARGET (OPTION_START + 4)
#define OPTION_ARCHITECTURE_INFO (OPTION_START + 5)
#define OPTION_ALIGNMENT (OPTION_START + 6)
typedef enum {
OPTION_DEBUG_INSN = OPTION_START,
OPTION_DEBUG_FILE,
OPTION_DO_COMMAND,
OPTION_ARCHITECTURE,
OPTION_TARGET,
OPTION_ARCHITECTURE_INFO,
OPTION_ENVIRONMENT,
OPTION_ALIGNMENT,
OPTION_VERBOSE,
#if defined (SIM_HAVE_BIENDIAN)
OPTION_ENDIAN,
#endif
OPTION_DEBUG,
#ifdef SIM_HAVE_FLATMEM
OPTION_MEM_SIZE,
#endif
OPTION_HELP,
#ifdef SIM_H8300 /* FIXME: Should be movable to h8300 dir. */
OPTION_H8300,
#endif
} STANDARD_OPTIONS;
static const OPTION standard_options[] =
{
{ {"verbose", no_argument, NULL, 'v'},
{ {"verbose", no_argument, NULL, OPTION_VERBOSE},
'v', NULL, "Verbose output",
standard_option_handler },
#if defined (SIM_HAVE_BIENDIAN) /* ??? && WITH_TARGET_BYTE_ORDER == 0 */
{ {"endian", required_argument, NULL, 'E'},
{ {"endian", required_argument, NULL, OPTION_ENDIAN},
'E', "big|little", "Set endianness",
standard_option_handler },
#endif
#ifdef SIM_HAVE_ENVIRONMENT
/* This option isn't supported unless all choices are supported in keeping
with the goal of not printing in --help output things the simulator can't
do [as opposed to things that just haven't been configured in]. */
{ {"environment", required_argument, NULL, OPTION_ENVIRONMENT},
'\0', "user|virtual|operating", "Set running environment",
standard_option_handler },
#endif
{ {"alignment", required_argument, NULL, OPTION_ALIGNMENT},
'\0', "strict|nonstrict|forced", "Set memory access alignment",
standard_option_handler },
{ {"debug", no_argument, NULL, 'D'},
{ {"debug", no_argument, NULL, OPTION_DEBUG},
'D', NULL, "Print debugging messages",
standard_option_handler },
{ {"debug-insn", no_argument, NULL, OPTION_DEBUG_INSN},
@@ -118,13 +141,13 @@ static const OPTION standard_options[] =
standard_option_handler },
#ifdef SIM_H8300 /* FIXME: Should be movable to h8300 dir. */
{ {"h8300h", no_argument, NULL, 'h'},
{ {"h8300h", no_argument, NULL, OPTION_H8300},
'h', NULL, "Indicate the CPU is h8/300h or h8/300s",
standard_option_handler },
#endif
#ifdef SIM_HAVE_FLATMEM
{ {"mem-size", required_argument, NULL, 'm'},
{ {"mem-size", required_argument, NULL, OPTION_MEM_SIZE},
'm', "MEMORY SIZE", "Specify memory size",
standard_option_handler },
#endif
@@ -133,7 +156,7 @@ static const OPTION standard_options[] =
'\0', "COMMAND", ""/*undocumented*/,
standard_option_handler },
{ {"help", no_argument, NULL, 'H'},
{ {"help", no_argument, NULL, OPTION_HELP},
'H', NULL, "Print help information",
standard_option_handler },
@@ -163,14 +186,14 @@ standard_option_handler (sd, opt, arg, is_command)
{
int i,n;
switch (opt)
switch ((STANDARD_OPTIONS) opt)
{
case 'v' :
case OPTION_VERBOSE:
STATE_VERBOSE_P (sd) = 1;
break;
#ifdef SIM_HAVE_BIENDIAN
case 'E' :
case OPTION_ENDIAN:
if (strcmp (arg, "big") == 0)
{
if (WITH_TARGET_BYTE_ORDER == LITTLE_ENDIAN)
@@ -199,6 +222,34 @@ standard_option_handler (sd, opt, arg, is_command)
break;
#endif
case OPTION_ENVIRONMENT:
if (strcmp (arg, "user") == 0)
current_environment = USER_ENVIRONMENT;
else if (strcmp (arg, "virtual") == 0)
current_environment = VIRTUAL_ENVIRONMENT;
else if (strcmp (arg, "operating") == 0)
current_environment = OPERATING_ENVIRONMENT;
else
{
sim_io_eprintf (sd, "Invalid environment specification `%s'\n", arg);
return SIM_RC_FAIL;
}
if (WITH_ENVIRONMENT != ALL_ENVIRONMENT
&& WITH_ENVIRONMENT != current_environment)
{
char *type;
switch (WITH_ENVIRONMENT)
{
case USER_ENVIRONMENT: type = "user"; break;
case VIRTUAL_ENVIRONMENT: type = "virtual"; break;
case OPERATING_ENVIRONMENT: type = "operating"; break;
}
sim_io_eprintf (sd, "Simulator compiled for the %s environment only.\n",
type);
return SIM_RC_FAIL;
}
break;
case OPTION_ALIGNMENT:
if (strcmp (arg, "strict") == 0)
{
@@ -235,7 +286,7 @@ standard_option_handler (sd, opt, arg, is_command)
sim_io_eprintf (sd, "Simulator compiled for strict alignment only.\n");
break;
case NONSTRICT_ALIGNMENT:
sim_io_eprintf (sd, "Simulator compiled for nonsitrct alignment only.\n");
sim_io_eprintf (sd, "Simulator compiled for nonstrict alignment only.\n");
break;
case FORCED_ALIGNMENT:
sim_io_eprintf (sd, "Simulator compiled for forced alignment only.\n");
@@ -243,7 +294,7 @@ standard_option_handler (sd, opt, arg, is_command)
}
return SIM_RC_FAIL;
case 'D' :
case OPTION_DEBUG:
if (! WITH_DEBUG)
sim_io_eprintf (sd, "Debugging not compiled in, `-D' ignored\n");
else
@@ -282,13 +333,13 @@ standard_option_handler (sd, opt, arg, is_command)
break;
#ifdef SIM_H8300 /* FIXME: Can be moved to h8300 dir. */
case 'h' :
case OPTION_H8300:
set_h8300h (1);
break;
#endif
#ifdef SIM_HAVE_FLATMEM
case 'm':
case OPTION_MEM_SIZE:
{
unsigned long ul = strtol (arg, NULL, 0);
/* 16384: some minimal amount */
@@ -338,7 +389,7 @@ standard_option_handler (sd, opt, arg, is_command)
break;
}
case 'H':
case OPTION_HELP:
sim_print_help (sd, is_command);
if (STATE_OPEN_KIND (sd) == SIM_OPEN_STANDALONE)
exit (0);
@@ -407,7 +458,7 @@ sim_parse_args (sd, argv)
/* The `val' option struct entry is dynamically assigned for options that
only come in the long form. ORIG_VAL is used to get the original value
back. */
unsigned char *orig_val;
int *orig_val;
struct option *lp, *long_options;
const struct option_list *ol;
const OPTION *opt;
@@ -420,28 +471,26 @@ sim_parse_args (sd, argv)
/* Count the number of options. */
num_opts = 0;
for (ol = STATE_OPTIONS (sd); ol != NULL; ol = ol->next)
for (opt = ol->options; opt->opt.name != NULL; ++opt)
for (opt = ol->options; OPTION_VALID_P (opt); ++opt)
++num_opts;
/* Initialize duplicate argument checker. */
(void) dup_arg_p (NULL);
/* Build the option table for getopt. */
long_options = (struct option *) alloca ((num_opts + 1) * sizeof (struct option));
long_options = NZALLOC (struct option, num_opts + 1);
lp = long_options;
short_options = (char *) alloca (num_opts * 3 + 1);
short_options = NZALLOC (char, num_opts * 3 + 1);
p = short_options;
#if 0 /* ??? necessary anymore? */
/* Set '+' as first char so argument permutation isn't done. This is done
to workaround a problem with invoking getopt_long in run.c.: optind gets
decremented when the program name is reached. */
handlers = NZALLOC (OPTION_HANDLER *, OPTION_START + num_opts);
orig_val = NZALLOC (int, OPTION_START + num_opts);
/* Set '+' as first char so argument permutation isn't done. This
is done to stop getopt_long returning options that appear after
the target program. Such options should be passed unchanged into
the program image. */
*p++ = '+';
#endif
handlers = (OPTION_HANDLER **) alloca (256 * sizeof (OPTION_HANDLER *));
memset (handlers, 0, 256 * sizeof (OPTION_HANDLER *));
orig_val = (unsigned char *) alloca (256);
for (i = OPTION_START, ol = STATE_OPTIONS (sd); ol != NULL; ol = ol->next)
for (opt = ol->options; opt->opt.name != NULL; ++opt)
for (opt = ol->options; OPTION_VALID_P (opt); ++opt)
{
if (dup_arg_p (opt->opt.name))
continue;
@@ -452,15 +501,21 @@ sim_parse_args (sd, argv)
*p++ = ':';
else if (opt->opt.has_arg == optional_argument)
{ *p++ = ':'; *p++ = ':'; }
handlers[(unsigned char) opt->shortopt] = opt->handler;
if (opt->opt.val != 0)
orig_val[(unsigned char) opt->shortopt] = opt->opt.val;
else
orig_val[(unsigned char) opt->shortopt] = opt->shortopt;
}
if (opt->opt.name != NULL)
{
*lp = opt->opt;
/* Dynamically assign `val' numbers for long options. */
lp->val = i++;
handlers[lp->val] = opt->handler;
orig_val[lp->val] = opt->opt.val;
++lp;
}
*lp = opt->opt;
/* Dynamically assign `val' numbers for long options that don't have
a short option equivalent. */
if (OPTION_LONG_ONLY_P (opt->opt.val))
lp->val = i++;
handlers[(unsigned char) lp->val] = opt->handler;
orig_val[(unsigned char) lp->val] = opt->opt.val;
++lp;
}
*p = 0;
lp->name = NULL;
@@ -511,7 +566,7 @@ sim_print_help (sd, is_command)
sim_io_printf (sd, "Commands:\n");
for (ol = STATE_OPTIONS (sd); ol != NULL; ol = ol->next)
for (opt = ol->options; opt->opt.name != NULL; ++opt)
for (opt = ol->options; OPTION_VALID_P (opt); ++opt)
{
const int indent = 30;
int comma, len;
@@ -531,6 +586,7 @@ sim_print_help (sd, is_command)
comma = 0;
len = 2;
/* list any short options (aliases) for the current OPT */
if (!is_command)
{
o = opt;
@@ -557,9 +613,10 @@ sim_print_help (sd, is_command)
}
++o;
}
while (o->opt.name != NULL && o->doc == NULL);
while (OPTION_VALID_P (o) && o->doc == NULL);
}
/* list any long options (aliases) for the current OPT */
o = opt;
do
{
@@ -594,7 +651,7 @@ sim_print_help (sd, is_command)
}
++o;
}
while (o->opt.name != NULL && o->doc == NULL);
while (OPTION_VALID_P (o) && o->doc == NULL);
if (len >= indent)
{
@@ -603,6 +660,7 @@ sim_print_help (sd, is_command)
else
sim_io_printf (sd, "%*s", indent - len, "");
/* print the description, word wrap long lines */
{
const char *chp = opt->doc;
unsigned doc_width = 80 - indent;
@@ -666,10 +724,12 @@ sim_args_command (sd, cmd)
int matching_argi = -1;
if (argv [0] != NULL)
for (ol = STATE_OPTIONS (sd); ol != NULL; ol = ol->next)
for (opt = ol->options; opt->opt.name != NULL; ++opt)
for (opt = ol->options; OPTION_VALID_P (opt); ++opt)
{
int argi = 0;
const char *name = opt->opt.name;
if (name == NULL)
continue;
while (strncmp (name, argv [argi], strlen (argv [argi])) == 0)
{
name = &name [strlen (argv[argi])];