summaryrefslogtreecommitdiff
path: root/sim/ppc
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2006-02-02 06:45:49 +0000
committerMark Mitchell <mark@codesourcery.com>2006-02-02 06:45:49 +0000
commitb1da2477ff65e8bf3bc1fd15d3787557418a047d (patch)
treefebe76d23cb8f2b766fe0e236b17af21ce71b198 /sim/ppc
parent5634ae16af33fe4af8f21d1b07cf40696d439dcd (diff)
downloadgdb-b1da2477ff65e8bf3bc1fd15d3787557418a047d.tar.gz
* emul_netbsd.c (emul_netbsd_create): Quote file-name property.
* emul_unix.c (emul_unix_create): Likewise. * tree.c (libiberty.h): Include it. (tree_quote_property): New function. * tree.h (tree_quote_property): Declare.
Diffstat (limited to 'sim/ppc')
-rw-r--r--sim/ppc/ChangeLog8
-rw-r--r--sim/ppc/emul_netbsd.c5
-rw-r--r--sim/ppc/emul_unix.c5
-rw-r--r--sim/ppc/tree.c45
-rw-r--r--sim/ppc/tree.h4
5 files changed, 65 insertions, 2 deletions
diff --git a/sim/ppc/ChangeLog b/sim/ppc/ChangeLog
index a285c7a05f3..4268294a410 100644
--- a/sim/ppc/ChangeLog
+++ b/sim/ppc/ChangeLog
@@ -1,3 +1,11 @@
+2006-02-01 Mark Mitchell <mark@codesourcery.com>
+
+ * emul_netbsd.c (emul_netbsd_create): Quote file-name property.
+ * emul_unix.c (emul_unix_create): Likewise.
+ * tree.c (libiberty.h): Include it.
+ (tree_quote_property): New function.
+ * tree.h (tree_quote_property): Declare.
+
2006-01-25 Mark Mitchell <mark@codesourcery.com>
* words.h (natural32): Define as "int".
diff --git a/sim/ppc/emul_netbsd.c b/sim/ppc/emul_netbsd.c
index 0069064d33f..f81c9cb2503 100644
--- a/sim/ppc/emul_netbsd.c
+++ b/sim/ppc/emul_netbsd.c
@@ -1383,6 +1383,7 @@ emul_netbsd_create(device *root,
int elf_binary;
os_emul_data *bsd_data;
device *vm;
+ char *filename;
/* check that this emulation is really for us */
if (name != NULL && strcmp(name, "netbsd") != 0)
@@ -1417,8 +1418,10 @@ emul_netbsd_create(device *root,
(unsigned long)(top_of_stack - stack_size));
tree_parse(vm, "./nr-bytes 0x%x", stack_size);
+ filename = tree_quote_property (bfd_get_filename(image));
tree_parse(root, "/openprom/vm/map-binary/file-name %s",
- bfd_get_filename(image));
+ filename);
+ free (filename);
/* finish the init */
tree_parse(root, "/openprom/init/register/pc 0x%lx",
diff --git a/sim/ppc/emul_unix.c b/sim/ppc/emul_unix.c
index 1f634350e2e..0fa5d3f7e3d 100644
--- a/sim/ppc/emul_unix.c
+++ b/sim/ppc/emul_unix.c
@@ -951,6 +951,7 @@ emul_unix_create(device *root,
int elf_binary;
os_emul_data *data;
device *vm;
+ char *filename;
/* merge any emulation specific entries into the device tree */
@@ -979,8 +980,10 @@ emul_unix_create(device *root,
(unsigned long)(top_of_stack - stack_size));
tree_parse(vm, "./nr-bytes 0x%x", stack_size);
+ filename = tree_quote_property (bfd_get_filename(image));
tree_parse(root, "/openprom/vm/map-binary/file-name %s",
- bfd_get_filename(image));
+ filename);
+ free (filename);
/* finish the init */
tree_parse(root, "/openprom/init/register/pc 0x%lx",
diff --git a/sim/ppc/tree.c b/sim/ppc/tree.c
index d4cfb71f0ed..4338cb0b4f6 100644
--- a/sim/ppc/tree.c
+++ b/sim/ppc/tree.c
@@ -45,6 +45,7 @@
#include <ctype.h>
+#include "libiberty.h"
/* manipulate/lookup device names */
@@ -625,6 +626,50 @@ parse_integer_property(device *current,
}
}
+/* PROPERTY_VALUE is a raw property value. Quote it as required by
+ parse_string_property. It is the caller's responsibility to free
+ the memory returned. */
+
+EXTERN_TREE\
+(char *)
+tree_quote_property(const char *property_value)
+{
+ char *p;
+ char *ret;
+ const char *chp;
+ int quotees;
+
+ /* Count characters needing quotes in PROPERTY_VALUE. */
+ quotees = 0;
+ for (chp = property_value; *chp; ++chp)
+ if (*chp == '\\' || *chp == '"')
+ ++quotees;
+
+ ret = (char *) xmalloc (strlen (property_value)
+ + 2 /* quotes */
+ + quotees
+ + 1 /* terminator */);
+
+ p = ret;
+ /* Add the opening quote. */
+ *p++ = '"';
+ /* Copy the value. */
+ for (chp = property_value; *chp; ++chp)
+ if (*chp == '\\' || *chp == '"')
+ {
+ /* Quote this character. */
+ *p++ = '\\';
+ *p++ = *chp;
+ }
+ else
+ *p++ = *chp;
+ /* Add the closing quote. */
+ *p++ = '"';
+ /* Terminate the string. */
+ *p++ = '\0';
+
+ return ret;
+}
/* <string> ... */
diff --git a/sim/ppc/tree.h b/sim/ppc/tree.h
index 46590cb6266..2ed7fd0bbf5 100644
--- a/sim/ppc/tree.h
+++ b/sim/ppc/tree.h
@@ -42,6 +42,10 @@
*/
EXTERN_TREE\
+(char*) tree_quote_property
+(const char *property_value);
+
+EXTERN_TREE\
(device *) tree_parse
(device *root,
const char *fmt,