summaryrefslogtreecommitdiffhomepage
path: root/src/load.c
diff options
context:
space:
mode:
authorAkira Yumiyama <[email protected]>2012-10-27 17:12:32 +0900
committerAkira Yumiyama <[email protected]>2012-10-30 08:30:18 +0900
commit94d16805a53487a45e30cb275a9f55f9f8054669 (patch)
treea5236eeeeba39ae964e2ace3da93a4f91cf4787f /src/load.c
parent509dbf9be8d65e855d0de304442be27b8b60d36b (diff)
downloadmruby-94d16805a53487a45e30cb275a9f55f9f8054669.tar.gz
mruby-94d16805a53487a45e30cb275a9f55f9f8054669.zip
fixes *.mrb dump/load format with escaped character.
- hex-style string support - mrb format changes like: - "\n" (before: \n -> after: \n) - '\n' (before: \n -> after: \\n)
Diffstat (limited to 'src/load.c')
-rw-r--r--src/load.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/load.c b/src/load.c
index 4d26b02ca..61fdeed8a 100644
--- a/src/load.c
+++ b/src/load.c
@@ -611,8 +611,8 @@ hex_to_uint32(unsigned char *hex)
static char*
hex_to_str(char *hex, char *str, uint16_t *str_len)
{
- char *src, *dst;
- int escape = 0;
+ char *src, *dst, buf[4];
+ int escape = 0, base = 0;
*str_len = 0;
for (src = hex, dst = str; *src != '\0'; src++) {
@@ -629,7 +629,20 @@ hex_to_str(char *hex, char *str, uint16_t *str_len)
case '\'': /* fall through */
case '\?': /* fall through */
case '\\': *dst++ = *src; break;
- default:break;
+ default:
+ if (*src >= '0' && *src <= '7') {
+ base = 8;
+ strncpy(buf, src, 3);
+ } else if (*src == 'x' || *src == 'X') {
+ base = 16;
+ src++;
+ strncpy(buf, src, 2);
+ }
+
+ char *err_ptr;
+ *dst++ = (unsigned char) strtol(buf, &err_ptr, base) & 0xff;
+ src += (err_ptr - buf - 1);
+ break;
}
escape = 0;
} else {