- Implemented output paging

This commit is contained in:
Felipe Pena 2015-10-18 12:08:04 -02:00
parent daddb7a832
commit f231ddddaf
7 changed files with 103 additions and 6 deletions

View file

@ -81,6 +81,7 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */
pg->colors[1] = NULL; pg->colors[1] = NULL;
pg->colors[2] = NULL; pg->colors[2] = NULL;
pg->lines = phpdbg_get_terminal_height();
pg->exec = NULL; pg->exec = NULL;
pg->exec_len = 0; pg->exec_len = 0;
pg->buffer = NULL; pg->buffer = NULL;

View file

@ -195,17 +195,19 @@ int phpdbg_do_parse(phpdbg_param_t *stack, char *input);
#define PHPDBG_DISCARD_OUTPUT (1ULL<<35) #define PHPDBG_DISCARD_OUTPUT (1ULL<<35)
#define PHPDBG_HAS_PAGINATION (1ULL<<36)
#define PHPDBG_SEEK_MASK (PHPDBG_IN_UNTIL | PHPDBG_IN_FINISH | PHPDBG_IN_LEAVE) #define PHPDBG_SEEK_MASK (PHPDBG_IN_UNTIL | PHPDBG_IN_FINISH | PHPDBG_IN_LEAVE)
#define PHPDBG_BP_RESOLVE_MASK (PHPDBG_HAS_FUNCTION_OPLINE_BP | PHPDBG_HAS_METHOD_OPLINE_BP | PHPDBG_HAS_FILE_OPLINE_BP) #define PHPDBG_BP_RESOLVE_MASK (PHPDBG_HAS_FUNCTION_OPLINE_BP | PHPDBG_HAS_METHOD_OPLINE_BP | PHPDBG_HAS_FILE_OPLINE_BP)
#define PHPDBG_BP_MASK (PHPDBG_HAS_FILE_BP | PHPDBG_HAS_SYM_BP | PHPDBG_HAS_METHOD_BP | PHPDBG_HAS_OPLINE_BP | PHPDBG_HAS_COND_BP | PHPDBG_HAS_OPCODE_BP | PHPDBG_HAS_FUNCTION_OPLINE_BP | PHPDBG_HAS_METHOD_OPLINE_BP | PHPDBG_HAS_FILE_OPLINE_BP) #define PHPDBG_BP_MASK (PHPDBG_HAS_FILE_BP | PHPDBG_HAS_SYM_BP | PHPDBG_HAS_METHOD_BP | PHPDBG_HAS_OPLINE_BP | PHPDBG_HAS_COND_BP | PHPDBG_HAS_OPCODE_BP | PHPDBG_HAS_FUNCTION_OPLINE_BP | PHPDBG_HAS_METHOD_OPLINE_BP | PHPDBG_HAS_FILE_OPLINE_BP)
#define PHPDBG_IS_STOPPING (PHPDBG_IS_QUITTING | PHPDBG_IS_CLEANING) #define PHPDBG_IS_STOPPING (PHPDBG_IS_QUITTING | PHPDBG_IS_CLEANING)
#define PHPDBG_PRESERVE_FLAGS_MASK (PHPDBG_SHOW_REFCOUNTS | PHPDBG_IS_STEPONEVAL | PHPDBG_IS_BP_ENABLED | PHPDBG_STEP_OPCODE | PHPDBG_IS_QUIET | PHPDBG_IS_COLOURED | PHPDBG_IS_REMOTE | PHPDBG_WRITE_XML | PHPDBG_IS_DISCONNECTED) #define PHPDBG_PRESERVE_FLAGS_MASK (PHPDBG_SHOW_REFCOUNTS | PHPDBG_IS_STEPONEVAL | PHPDBG_IS_BP_ENABLED | PHPDBG_STEP_OPCODE | PHPDBG_IS_QUIET | PHPDBG_IS_COLOURED | PHPDBG_IS_REMOTE | PHPDBG_WRITE_XML | PHPDBG_IS_DISCONNECTED | PHPDBG_HAS_PAGINATION)
#ifndef _WIN32 #ifndef _WIN32
# define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET | PHPDBG_IS_COLOURED | PHPDBG_IS_BP_ENABLED) # define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET | PHPDBG_IS_COLOURED | PHPDBG_IS_BP_ENABLED | PHPDBG_HAS_PAGINATION)
#else #else
# define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET | PHPDBG_IS_BP_ENABLED) # define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET | PHPDBG_IS_BP_ENABLED | PHPDBG_HAS_PAGINATION)
#endif /* }}} */ #endif /* }}} */
/* {{{ output descriptors */ /* {{{ output descriptors */
@ -314,6 +316,7 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg)
HANDLE sigio_watcher_thread; /* sigio watcher thread handle */ HANDLE sigio_watcher_thread; /* sigio watcher thread handle */
struct win32_sigio_watcher_data swd; struct win32_sigio_watcher_data swd;
#endif #endif
long lines; /* max number of lines to display */
ZEND_END_MODULE_GLOBALS(phpdbg) /* }}} */ ZEND_END_MODULE_GLOBALS(phpdbg) /* }}} */
#endif #endif

View file

@ -190,16 +190,50 @@ PHPDBG_API int phpdbg_mixed_read(int sock, char *ptr, int len, int tmo) {
return ret; return ret;
} }
static int phpdbg_output_pager(int sock, const char *ptr, int len) {
int count = 0, bytes = 0;
const char *p = ptr, *endp = ptr + len;
while ((p = memchr(p, '\n', endp - p))) {
count++;
p++;
if (count % PHPDBG_G(lines) == 0) {
bytes += write(sock, ptr + bytes, (p - ptr) - bytes);
if (memchr(p, '\n', endp - p)) {
int chr;
printf("\r---Type <return> to continue or q <return> to quit---");
chr = getchar();
if (chr == 'q') {
break;
}
printf("\r");
} else break;
}
}
if (bytes && count % PHPDBG_G(lines) != 0) {
bytes += write(sock, ptr + bytes, len - bytes);
} else if (!bytes) {
bytes += write(sock, ptr, len);
}
return bytes;
}
PHPDBG_API int phpdbg_mixed_write(int sock, const char *ptr, int len) { PHPDBG_API int phpdbg_mixed_write(int sock, const char *ptr, int len) {
if (PHPDBG_G(flags) & PHPDBG_IS_REMOTE) { if (PHPDBG_G(flags) & PHPDBG_IS_REMOTE) {
return phpdbg_send_bytes(sock, ptr, len); return phpdbg_send_bytes(sock, ptr, len);
} }
if (PHPDBG_G(flags) & PHPDBG_HAS_PAGINATION
&& PHPDBG_G(io)[PHPDBG_STDOUT].fd == sock
&& PHPDBG_G(lines) > 0) {
return phpdbg_output_pager(sock, ptr, len);
}
return write(sock, ptr, len); return write(sock, ptr, len);
} }
PHPDBG_API int phpdbg_open_socket(const char *interface, unsigned short port) { PHPDBG_API int phpdbg_open_socket(const char *interface, unsigned short port) {
struct addrinfo res; struct addrinfo res;
int fd = phpdbg_create_listenable_socket(interface, port, &res); int fd = phpdbg_create_listenable_socket(interface, port, &res);

View file

@ -32,6 +32,7 @@ ZEND_EXTERN_MODULE_GLOBALS(phpdbg);
const phpdbg_command_t phpdbg_set_commands[] = { const phpdbg_command_t phpdbg_set_commands[] = {
PHPDBG_SET_COMMAND_D(prompt, "usage: set prompt [<string>]", 'p', set_prompt, NULL, "|s", 0), PHPDBG_SET_COMMAND_D(prompt, "usage: set prompt [<string>]", 'p', set_prompt, NULL, "|s", 0),
PHPDBG_SET_COMMAND_D(pagination, "usage: set pagination [<on|off>]", 'P', set_pagination, NULL, "|b", PHPDBG_ASYNC_SAFE),
#ifndef _WIN32 #ifndef _WIN32
PHPDBG_SET_COMMAND_D(color, "usage: set color <element> <color>", 'c', set_color, NULL, "ss", PHPDBG_ASYNC_SAFE), PHPDBG_SET_COMMAND_D(color, "usage: set color <element> <color>", 'c', set_color, NULL, "ss", PHPDBG_ASYNC_SAFE),
PHPDBG_SET_COMMAND_D(colors, "usage: set colors [<on|off>]", 'C', set_colors, NULL, "|b", PHPDBG_ASYNC_SAFE), PHPDBG_SET_COMMAND_D(colors, "usage: set colors [<on|off>]", 'C', set_colors, NULL, "|b", PHPDBG_ASYNC_SAFE),
@ -42,6 +43,7 @@ const phpdbg_command_t phpdbg_set_commands[] = {
PHPDBG_SET_COMMAND_D(quiet, "usage: set quiet [<on|off>]", 'q', set_quiet, NULL, "|b", PHPDBG_ASYNC_SAFE), PHPDBG_SET_COMMAND_D(quiet, "usage: set quiet [<on|off>]", 'q', set_quiet, NULL, "|b", PHPDBG_ASYNC_SAFE),
PHPDBG_SET_COMMAND_D(stepping, "usage: set stepping [<line|op>]", 's', set_stepping, NULL, "|s", PHPDBG_ASYNC_SAFE), PHPDBG_SET_COMMAND_D(stepping, "usage: set stepping [<line|op>]", 's', set_stepping, NULL, "|s", PHPDBG_ASYNC_SAFE),
PHPDBG_SET_COMMAND_D(refcount, "usage: set refcount [<on|off>]", 'r', set_refcount, NULL, "|b", PHPDBG_ASYNC_SAFE), PHPDBG_SET_COMMAND_D(refcount, "usage: set refcount [<on|off>]", 'r', set_refcount, NULL, "|b", PHPDBG_ASYNC_SAFE),
PHPDBG_SET_COMMAND_D(lines, "usage: set lines [<number>]", 'l', set_lines, NULL, "|l", PHPDBG_ASYNC_SAFE),
PHPDBG_END_COMMAND PHPDBG_END_COMMAND
}; };
@ -56,6 +58,42 @@ PHPDBG_SET(prompt) /* {{{ */
return SUCCESS; return SUCCESS;
} /* }}} */ } /* }}} */
PHPDBG_SET(pagination) /* {{{ */
{
if (!param || param->type == EMPTY_PARAM) {
phpdbg_writeln("setpagination", "active=\"%s\"", "Pagination %s", PHPDBG_G(flags) & PHPDBG_HAS_PAGINATION ? "on" : "off");
} else switch (param->type) {
case NUMERIC_PARAM: {
if (param->num) {
PHPDBG_G(flags) |= PHPDBG_HAS_PAGINATION;
} else {
PHPDBG_G(flags) &= ~PHPDBG_HAS_PAGINATION;
}
} break;
default:
phpdbg_error("setpagination", "type=\"wrongargs\"", "set pagination used incorrectly: set pagination <on|off>");
}
return SUCCESS;
} /* }}} */
PHPDBG_SET(lines) /* {{{ */
{
if (!param || param->type == EMPTY_PARAM) {
phpdbg_writeln("setlines", "active=\"%s\"", "Lines %ld", PHPDBG_G(lines));
} else switch (param->type) {
case NUMERIC_PARAM: {
PHPDBG_G(lines) = param->num;
} break;
default:
phpdbg_error("setlines", "type=\"wrongargs\"", "set lines used incorrectly: set lines <number>");
}
return SUCCESS;
} /* }}} */
PHPDBG_SET(break) /* {{{ */ PHPDBG_SET(break) /* {{{ */
{ {
switch (param->type) { switch (param->type) {

View file

@ -36,6 +36,8 @@ PHPDBG_SET(breaks);
PHPDBG_SET(quiet); PHPDBG_SET(quiet);
PHPDBG_SET(stepping); PHPDBG_SET(stepping);
PHPDBG_SET(refcount); PHPDBG_SET(refcount);
PHPDBG_SET(pagination);
PHPDBG_SET(lines);
extern const phpdbg_command_t phpdbg_set_commands[]; extern const phpdbg_command_t phpdbg_set_commands[];

View file

@ -351,6 +351,24 @@ PHPDBG_API int phpdbg_get_terminal_width(void) /* {{{ */
return columns; return columns;
} /* }}} */ } /* }}} */
PHPDBG_API int phpdbg_get_terminal_height(void) /* {{{ */
{
int lines;
#ifdef _WIN32
CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
lines = csbi.srWindow.Bottom - csbi.srWindow.Top + 1;
#elif defined(HAVE_SYS_IOCTL_H) && defined(TIOCGWINSZ)
struct winsize w;
lines = ioctl(fileno(stdout), TIOCGWINSZ, &w) == 0 ? w.ws_row : 40;
#else
lines = 40;
#endif
return lines;
} /* }}} */
PHPDBG_API void phpdbg_set_async_io(int fd) { PHPDBG_API void phpdbg_set_async_io(int fd) {
#if !defined(_WIN32) && defined(FASYNC) #if !defined(_WIN32) && defined(FASYNC)
int flags; int flags;

View file

@ -73,8 +73,9 @@ PHPDBG_API int phpdbg_get_element(const char *name, size_t len); /* }}} */
PHPDBG_API void phpdbg_set_prompt(const char*); PHPDBG_API void phpdbg_set_prompt(const char*);
PHPDBG_API const char *phpdbg_get_prompt(void); /* }}} */ PHPDBG_API const char *phpdbg_get_prompt(void); /* }}} */
/* {{{ Console Width */ /* {{{ Console size */
PHPDBG_API int phpdbg_get_terminal_width(void); /* }}} */ PHPDBG_API int phpdbg_get_terminal_width(void);
PHPDBG_API int phpdbg_get_terminal_height(void); /* }}} */
PHPDBG_API void phpdbg_set_async_io(int fd); PHPDBG_API void phpdbg_set_async_io(int fd);