ChangeSet ID: 21304 CVSROOT: /opt/cvs-commit Module name: wine Changes by: julliard@winehq.org 2005/11/17 05:04:27
Modified files: programs/winedbg: debugger.h debug.l dbg.y
Log message: Eric Pouech eric.pouech@wanadoo.fr Simplification of lex's input reading.
Patch: http://cvs.winehq.org/patch.py?id=21304
Old revision New revision Changes Path 1.31 1.32 +1 -1 wine/programs/winedbg/debugger.h 1.16 1.17 +14 -11 wine/programs/winedbg/debug.l 1.28 1.29 +25 -55 wine/programs/winedbg/dbg.y
Index: wine/programs/winedbg/debugger.h diff -u -p wine/programs/winedbg/debugger.h:1.31 wine/programs/winedbg/debugger.h:1.32 --- wine/programs/winedbg/debugger.h:1.31 17 Nov 2005 11: 4:27 -0000 +++ wine/programs/winedbg/debugger.h 17 Nov 2005 11: 4:27 -0000 @@ -268,7 +268,7 @@ extern int break_add_condit extern void parser(const char*); extern void parser_handle(HANDLE); extern int input_read_line(const char* pfx, char* buffer, int size); -extern int input_fetch_entire_line(const char* pfx, char** line, size_t* alloc, BOOL check_nl); +extern int input_fetch_entire_line(const char* pfx, char** line);
/* debug.l */ extern void lexeme_flush(void); Index: wine/programs/winedbg/debug.l diff -u -p wine/programs/winedbg/debug.l:1.16 wine/programs/winedbg/debug.l:1.17 --- wine/programs/winedbg/debug.l:1.16 17 Nov 2005 11: 4:27 -0000 +++ wine/programs/winedbg/debug.l 17 Nov 2005 11: 4:27 -0000 @@ -33,24 +33,27 @@ static int read_input(const char* pfx, c { size_t len; static char* last_line = NULL; -static size_t last_line_size = 0; static size_t last_line_idx = 0;
- /* first alloc of our current buffer */ - if (!last_line) - { - last_line = HeapAlloc(GetProcessHeap(), 0, last_line_size = 2); - assert(last_line); - last_line[0] = '\n'; - last_line[1] = '\0'; - } - /* try first to fetch the remaining of an existing line */ if (last_line_idx == 0) { + char* tmp = NULL; /* no remaining chars to be read from last line, grab a brand new line up to '\n' */ lexeme_flush(); - input_fetch_entire_line(pfx, &last_line, &last_line_size, TRUE); + len = input_fetch_entire_line(pfx, &tmp); + /* FIXME: should have a pair of buffers, and switch between the two, instead of + * reallocating a new one for each line + */ + if (len == 0 || (len == 1 && tmp[0] == '\n') || (len == 2 && tmp[0] == '\r' && tmp[1] == '\n')) + { + HeapFree(GetProcessHeap(), 0, tmp); + } + else + { + HeapFree(GetProcessHeap(), 0, last_line); + last_line = tmp; + } }
len = min(strlen(last_line + last_line_idx), size - 1); Index: wine/programs/winedbg/dbg.y diff -u -p wine/programs/winedbg/dbg.y:1.28 wine/programs/winedbg/dbg.y:1.29 --- wine/programs/winedbg/dbg.y:1.28 17 Nov 2005 11: 4:27 -0000 +++ wine/programs/winedbg/dbg.y 17 Nov 2005 11: 4:27 -0000 @@ -428,70 +428,47 @@ static WINE_EXCEPTION_FILTER(wine_dbg_cm return EXCEPTION_EXECUTE_HANDLER; }
-#ifndef whitespace -#define whitespace(c) (((c) == ' ') || ((c) == '\t')) -#endif - -/* Strip whitespace from the start and end of STRING. */ -static void stripwhite(char *string) -{ - int i, last; - - for (i = 0; whitespace(string[i]); i++); - if (i) strcpy(string, string + i); - - last = i = strlen(string) - 1; - if (string[last] == '\n') i--; - - while (i > 0 && whitespace(string[i])) i--; - if (string[last] == '\n') - string[++i] = '\n'; - string[++i] = '\0'; -} - static HANDLE dbg_parser_input; static HANDLE dbg_parser_output;
-int input_fetch_entire_line(const char* pfx, char** line, size_t* alloc, BOOL check_nl) +int input_fetch_entire_line(const char* pfx, char** line) { - char buf_line[256]; - DWORD nread, nwritten; - size_t len; + char ch; + DWORD nread; + size_t len, alloc;
/* as of today, console handles can be file handles... so better use file APIs rather than * console's */ - WriteFile(dbg_parser_output, pfx, strlen(pfx), &nwritten, NULL); + WriteFile(dbg_parser_output, pfx, strlen(pfx), &nread, NULL); + + if (*line) + { + alloc = HeapSize(GetProcessHeap(), 0, *line); + assert(alloc); + } + else + { + *line = HeapAlloc(GetProcessHeap(), 0, alloc = 16); + assert(*line); + }
len = 0; do { - if (!ReadFile(dbg_parser_input, buf_line, sizeof(buf_line) - 1, &nread, NULL) || nread == 0) + if (!ReadFile(dbg_parser_input, &ch, 1, &nread, NULL) || nread == 0) break; - buf_line[nread] = '\0'; - - if (check_nl && len == 0 && nread == 1 && buf_line[0] == '\n') - return 0; - - /* store stuff at the end of last_line */ - if (len + nread + 1 > *alloc) + if (len + 2 > alloc) { - while (len + nread + 1 > *alloc) *alloc *= 2; - *line = dbg_heap_realloc(*line, *alloc); + while (len + 2 > alloc) alloc *= 2; + *line = dbg_heap_realloc(*line, alloc); } - strcpy(*line + len, buf_line); - len += nread; - } while (nread == 0 || buf_line[nread - 1] != '\n'); - - if (!len) - { - *line = HeapReAlloc(GetProcessHeap(), 0, *line, *alloc = 1); - **line = '\0'; + (*line)[len++] = ch; } + while (ch != '\n'); + (*line)[len] = '\0';
- /* Remove leading and trailing whitespace from the line */ - stripwhite(*line); - return 1; + return len; }
int input_read_line(const char* pfx, char* buf, int size) @@ -499,14 +476,7 @@ int input_read_line(const char* pfx, cha char* line = NULL; size_t len = 0;
- /* first alloc of our current buffer */ - line = HeapAlloc(GetProcessHeap(), 0, len = 2); - assert(line); - line[0] = '\n'; - line[1] = '\0'; - - input_fetch_entire_line(pfx, &line, &len, FALSE); - len = strlen(line); + len = input_fetch_entire_line(pfx, &line); /* remove trailing \n */ if (len > 0 && line[len - 1] == '\n') len--; len = min(size - 1, len);