Simplification of lex's input reading.
This commit is contained in:
parent
88dcf83495
commit
6cd44bc89d
@ -428,70 +428,47 @@ static WINE_EXCEPTION_FILTER(wine_dbg_cmd)
|
|||||||
return EXCEPTION_EXECUTE_HANDLER;
|
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_input;
|
||||||
static HANDLE dbg_parser_output;
|
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];
|
char ch;
|
||||||
DWORD nread, nwritten;
|
DWORD nread;
|
||||||
size_t len;
|
size_t len, alloc;
|
||||||
|
|
||||||
/* as of today, console handles can be file handles... so better use file APIs rather than
|
/* as of today, console handles can be file handles... so better use file APIs rather than
|
||||||
* console's
|
* 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;
|
len = 0;
|
||||||
do
|
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;
|
break;
|
||||||
buf_line[nread] = '\0';
|
if (len + 2 > alloc)
|
||||||
|
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
while (len + nread + 1 > *alloc) *alloc *= 2;
|
while (len + 2 > alloc) alloc *= 2;
|
||||||
*line = dbg_heap_realloc(*line, *alloc);
|
*line = dbg_heap_realloc(*line, alloc);
|
||||||
}
|
}
|
||||||
strcpy(*line + len, buf_line);
|
(*line)[len++] = ch;
|
||||||
len += nread;
|
|
||||||
} while (nread == 0 || buf_line[nread - 1] != '\n');
|
|
||||||
|
|
||||||
if (!len)
|
|
||||||
{
|
|
||||||
*line = HeapReAlloc(GetProcessHeap(), 0, *line, *alloc = 1);
|
|
||||||
**line = '\0';
|
|
||||||
}
|
}
|
||||||
|
while (ch != '\n');
|
||||||
|
(*line)[len] = '\0';
|
||||||
|
|
||||||
/* Remove leading and trailing whitespace from the line */
|
return len;
|
||||||
stripwhite(*line);
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int input_read_line(const char* pfx, char* buf, int size)
|
int input_read_line(const char* pfx, char* buf, int size)
|
||||||
@ -499,14 +476,7 @@ int input_read_line(const char* pfx, char* buf, int size)
|
|||||||
char* line = NULL;
|
char* line = NULL;
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
|
|
||||||
/* first alloc of our current buffer */
|
len = input_fetch_entire_line(pfx, &line);
|
||||||
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);
|
|
||||||
/* remove trailing \n */
|
/* remove trailing \n */
|
||||||
if (len > 0 && line[len - 1] == '\n') len--;
|
if (len > 0 && line[len - 1] == '\n') len--;
|
||||||
len = min(size - 1, len);
|
len = min(size - 1, len);
|
||||||
|
@ -33,24 +33,27 @@ static int read_input(const char* pfx, char* buf, int size)
|
|||||||
{
|
{
|
||||||
size_t len;
|
size_t len;
|
||||||
static char* last_line = NULL;
|
static char* last_line = NULL;
|
||||||
static size_t last_line_size = 0;
|
|
||||||
static size_t last_line_idx = 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 */
|
/* try first to fetch the remaining of an existing line */
|
||||||
if (last_line_idx == 0)
|
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' */
|
/* no remaining chars to be read from last line, grab a brand new line up to '\n' */
|
||||||
lexeme_flush();
|
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);
|
len = min(strlen(last_line + last_line_idx), size - 1);
|
||||||
|
@ -268,7 +268,7 @@ extern int break_add_condition(int bpnum, struct expr* exp);
|
|||||||
extern void parser(const char*);
|
extern void parser(const char*);
|
||||||
extern void parser_handle(HANDLE);
|
extern void parser_handle(HANDLE);
|
||||||
extern int input_read_line(const char* pfx, char* buffer, int size);
|
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 */
|
/* debug.l */
|
||||||
extern void lexeme_flush(void);
|
extern void lexeme_flush(void);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user