diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2012-10-29 23:30:59 -0700 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2012-10-29 23:30:59 -0700 |
| commit | b720156c99eb974b13492873579239697ebcaf96 (patch) | |
| tree | 0aa5e8726726e1fe0dee9cbfd082aa0feffdcb66 /src/load.c | |
| parent | 4c700eddb775b14d7ab4d16080200db7a237d71a (diff) | |
| parent | 94d16805a53487a45e30cb275a9f55f9f8054669 (diff) | |
| download | mruby-b720156c99eb974b13492873579239697ebcaf96.tar.gz mruby-b720156c99eb974b13492873579239697ebcaf96.zip | |
Merge pull request #515 from iij/pr-fix-mrb-format
fixes *.mrb dump/load format with escaped character.
Diffstat (limited to 'src/load.c')
| -rw-r--r-- | src/load.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/src/load.c b/src/load.c index a31ef98a8..65b6004d3 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 { |
