#include <errno.h>
#include <limits.h>
#include <string.h>
-#include "targ-vals.h"
-
-#ifndef TARGET_O_BINARY
-#define TARGET_O_BINARY 0
-#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h> /* For SEEK_SET etc. */
return TRUE;
}
-static int translate_open_mode[] =
+/* These are libgloss defines, but seem to be common across all supported ARM
+ targets at the moment. These should get moved to the callback open_map. */
+#define TARGET_O_BINARY 0
+#define TARGET_O_APPEND 0x8
+#define TARGET_O_CREAT 0x200
+#define TARGET_O_RDONLY 0x0
+#define TARGET_O_RDWR 0x2
+#define TARGET_O_TRUNC 0x400
+#define TARGET_O_WRONLY 0x1
+
+static const int translate_open_mode[] =
{
TARGET_O_RDONLY, /* "r" */
TARGET_O_RDONLY + TARGET_O_BINARY, /* "rb" */
#include <sys/types.h>
#include <sys/stat.h>
#include "sim/callback.h"
-#include "targ-vals.h"
/* For xmalloc. */
#include "libiberty.h"
{
int host_val = 0;
CB_TARGET_DEFS_MAP *m;
+ int o_rdonly = 0;
+ int o_wronly = 0;
+ int o_rdwr = 0;
+ int o_binary = 0;
+ int o_rdwrmask;
+ /* O_RDONLY can be (and usually is) 0 which needs to be treated specially. */
for (m = &cb->open_map[0]; m->host_val != -1; ++m)
{
- switch (m->target_val)
+ if (!strcmp (m->name, "O_RDONLY"))
+ o_rdonly = m->target_val;
+ else if (!strcmp (m->name, "O_WRONLY"))
+ o_wronly = m->target_val;
+ else if (!strcmp (m->name, "O_RDWR"))
+ o_rdwr = m->target_val;
+ else if (!strcmp (m->name, "O_BINARY"))
+ o_binary = m->target_val;
+ }
+ o_rdwrmask = o_rdonly | o_wronly | o_rdwr;
+
+ for (m = &cb->open_map[0]; m->host_val != -1; ++m)
+ {
+ if (m->target_val == o_rdonly || m->target_val == o_wronly
+ || m->target_val == o_rdwr)
{
- /* O_RDONLY can be (and usually is) 0 which needs to be treated
- specially. */
- case TARGET_O_RDONLY :
- case TARGET_O_WRONLY :
- case TARGET_O_RDWR :
- if ((target_val & (TARGET_O_RDONLY | TARGET_O_WRONLY | TARGET_O_RDWR))
- == m->target_val)
+ if ((target_val & o_rdwrmask) == m->target_val)
host_val |= m->host_val;
/* Handle the host/target differentiating between binary and
text mode. Only one case is of importance */
-#if ! defined (TARGET_O_BINARY) && defined (O_BINARY)
- host_val |= O_BINARY;
+#ifdef O_BINARY
+ if (o_binary == 0)
+ host_val |= O_BINARY;
#endif
- break;
- default :
+ }
+ else
+ {
if ((m->target_val & target_val) == m->target_val)
host_val |= m->host_val;
- break;
}
}
printf ("#define TARGET_%s %d\n", t->symbol, t->value);
printf ("\n");
- printf ("/* open flag values */\n");
- for (t = &open_tdefs[0]; t->symbol; ++t)
- printf ("#define TARGET_%s 0x%x\n", t->symbol, t->value);
- printf ("\n");
-
printf ("#endif /* TARG_VALS_H */\n");
}
printf ("CB_TARGET_DEFS_MAP cb_init_open_map[] = {\n");
for (t = &open_tdefs[0]; t->symbol; ++t)
{
+ printf ("#define TARGET_%s 0x%x\n", t->symbol, t->value);
printf ("#ifdef %s\n", t->symbol);
printf (" { \"%s\", %s, TARGET_%s },\n", t->symbol, t->symbol, t->symbol);
printf ("#endif\n");