--- mon/src/mon_cmd.cpp 2003/09/27 20:33:06 1.15 +++ mon/src/mon_cmd.cpp 2004/02/12 17:14:36 1.16 @@ -67,10 +67,12 @@ static bool range_args(uintptr *adr, uin * byte_string = (expression | STRING) {COMMA (expression | STRING)} END */ -static bool byte_string(uint8 *s, uintptr &len) +static bool byte_string(uint8 *&str, uintptr &len) { uintptr value; + static const int GRANULARITY = 16; // must be a power of 2 + str = NULL; len = 0; goto start; @@ -81,20 +83,27 @@ static bool byte_string(uint8 *s, uintpt start: if (mon_token == T_STRING) { uint8 *p = (uint8 *)mon_string; - while ((*s++ = *p++) != 0) ; - s--; - len += strlen(mon_string); + unsigned n = strlen(mon_string); + str = (uint8 *)realloc(str, (len + n - 1 + GRANULARITY) & ~(GRANULARITY - 1)); + memcpy(str + len, mon_string, n); + len += n; mon_get_token(); } else if (mon_expression(&value)) { - *s++ = value; + str = (uint8 *)realloc(str, (len + GRANULARITY) & ~(GRANULARITY - 1)); + str[len] = value; len++; - } else + } else { + if (str) + free(str); return false; + } - } else if (mon_token == T_END) + } else if (mon_token == T_END) { return true; - else { + } else { mon_error("',' expected"); + if (str) + free(str); return false; } } @@ -420,7 +429,7 @@ void disassemble_x86_64(void) void modify(void) { uintptr adr, len, src_adr = 0; - uint8 str[256]; + uint8 *str; if (!mon_expression(&adr)) return; @@ -429,8 +438,9 @@ void modify(void) while (src_adr < len) mon_write_byte(adr++, str[src_adr++]); - mon_dot_address = adr; + + free(str); } @@ -442,7 +452,7 @@ void modify(void) void fill(void) { uintptr adr, end_adr, len, src_adr = 0; - uint8 str[256]; + uint8 *str; if (!mon_expression(&adr)) return; @@ -453,6 +463,8 @@ void fill(void) while (adr <= end_adr) mon_write_byte(adr++, str[src_adr++ % len]); + + free(str); } @@ -535,7 +547,7 @@ void compare(void) void hunt(void) { uintptr adr, end_adr, len; - uint8 str[256]; + uint8 *str; int num = 0; if (!mon_expression(&adr)) @@ -563,6 +575,8 @@ void hunt(void) adr++; } + free(str); + if (num & 7) fputc('\n', monout); fprintf(monout, "Found %d occurrences\n", num);