summaryrefslogtreecommitdiffstats
path: root/web/server/h2o/libh2o/deps/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c
diff options
context:
space:
mode:
Diffstat (limited to 'web/server/h2o/libh2o/deps/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c')
-rw-r--r--web/server/h2o/libh2o/deps/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c501
1 files changed, 0 insertions, 501 deletions
diff --git a/web/server/h2o/libh2o/deps/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c b/web/server/h2o/libh2o/deps/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c
deleted file mode 100644
index 5984b623b..000000000
--- a/web/server/h2o/libh2o/deps/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c
+++ /dev/null
@@ -1,501 +0,0 @@
-/*
-** cmdmisc.c - mruby debugger miscellaneous command functions
-**
-*/
-
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "apilist.h"
-#include <mruby/compile.h>
-
-typedef struct help_msg {
- const char *cmd1;
- const char *cmd2;
- const char *short_msg;
- const char *long_msg;
-} help_msg;
-
-static help_msg help_msg_list[] = {
- {
- "b[reak]", NULL, "Set breakpoint",
- "Usage: break [file:]line\n"
- " break [class:]method\n"
- "\n"
- "Set breakpoint at specified line or method.\n"
- "If \'[file:]line\' is specified, break at start of code for that line (in a file).\n"
- "If \'[class:]method\' is specified, break at start of code for that method (of the class).\n"
- },
- {
- "c[ontinue]", NULL, "Continue program being debugged",
- "Usage: continue [N]\n"
- "\n"
- "Continue program stopped by a breakpoint.\n"
- "If N, which is non negative value, is passed,\n"
- "proceed program until the N-th breakpoint is coming.\n"
- "If N is not passed, N is assumed 1.\n"
- },
- {
- "d[elete]", NULL, "Delete some breakpoints",
- "Usage: delete [bpno1 [bpno2 [... [bpnoN]]]]\n"
- "\n"
- "Delete some breakpoints.\n"
- "Arguments are breakpoint numbers with spaces in between.\n"
- "To delete all breakpoints, give no argument.\n"
- },
- {
- "dis[able]", NULL, "Disable some breakpoints",
- "Usage: disable [bpno1 [bpno2 [... [bpnoN]]]]\n"
- "\n"
- "Disable some breakpoints.\n"
- "Arguments are breakpoint numbers with spaces in between.\n"
- "To disable all breakpoints, give no argument.\n"
- },
- {
- "en[able]", NULL, "Enable some breakpoints",
- "Usage: enable [bpno1 [bpno2 [... [bpnoN]]]]\n"
- "\n"
- "Enable some breakpoints.\n"
- "Arguments are breakpoint numbers with spaces in between.\n"
- "To enable all breakpoints, give no argument.\n"
- },
- {
- "ev[al]", NULL, "Evaluate expression",
- "Usage: eval expr\n"
- "\n"
- "It evaluates and prints the value of the mruby expression.\n"
- "This is equivalent to the \'print\' command.\n"
- },
- {
- "h[elp]", NULL, "Print this help",
- "Usage: help [command]\n"
- "\n"
- "With no arguments, help displays a short list of commands.\n"
- "With a command name as help argument, help displays how to use that command.\n"
- },
- {
- "i[nfo]", "b[reakpoints]", "Status of breakpoints",
- "Usage: info breakpoints [bpno1 [bpno2 [... [bpnoN]]]]\n"
- "\n"
- "Status of specified breakpoints (all user-settable breakpoints if no argument).\n"
- "Arguments are breakpoint numbers with spaces in between.\n"
- },
- {
- "l[ist]", NULL, "List specified line",
- "Usage: list\n"
- " list first[,last]\n"
- " list filename:first[,last]\n"
- "\n"
- "Print lines from a source file.\n"
- "\n"
- "With first and last, list prints lines from first to last.\n"
- "When last is empty, it stands for ten lines away from first.\n"
- "With filename, list prints lines in the specified source file.\n"
- },
- {
- "p[rint]", NULL, "Print value of expression",
- "Usage: print expr\n"
- "\n"
- "It evaluates and prints the value of the mruby expression.\n"
- "This is equivalent to the \'eval\' command.\n"
- },
- {
- "q[uit]", NULL, "Exit mrdb",
- "Usage: quit\n"
- "\n"
- "Exit mrdb.\n"
- },
- {
- "r[un]", NULL, "Start debugged program",
- "Usage: run\n"
- "\n"
- "Start debugged program.\n"
- },
- {
- "s[tep]", NULL, "Step program until it reaches a different source line",
- "Usage: step\n"
- "\n"
- "Step program until it reaches a different source line.\n"
- },
- { NULL, NULL, NULL, NULL }
-};
-
-typedef struct listcmd_parser_state {
- mrb_bool parse_error;
- mrb_bool has_line_min;
- mrb_bool has_line_max;
- char *filename;
- uint16_t line_min;
- uint16_t line_max;
-} listcmd_parser_state;
-
-static listcmd_parser_state*
-listcmd_parser_state_new(mrb_state *mrb)
-{
- listcmd_parser_state *st = mrb_malloc(mrb, sizeof(listcmd_parser_state));
- memset(st, 0, sizeof(listcmd_parser_state));
- return st;
-}
-
-static void
-listcmd_parser_state_free(mrb_state *mrb, listcmd_parser_state *st)
-{
- if (st != NULL) {
- if (st->filename != NULL) {
- mrb_free(mrb, st->filename);
- }
- mrb_free(mrb, st);
- }
-}
-
-static mrb_bool
-parse_uint(char **sp, uint16_t *n)
-{
- char *p;
- int i;
-
- if (*sp == NULL || **sp == '\0') {
- return FALSE;
- }
-
- for (p = *sp; *p != '\0' && ISDIGIT(*p); p++) ;
-
- if (p != *sp && (i = atoi(*sp)) >= 0) {
- *n = (uint16_t)i;
- *sp = p;
- return TRUE;
- }
- return FALSE;
-}
-
-static mrb_bool
-skip_char(char **sp, char c)
-{
- if (*sp != NULL && **sp == c) {
- ++*sp;
- return TRUE;
- }
- return FALSE;
-}
-
-static mrb_bool
-parse_lineno(mrb_state *mrb, char **sp, listcmd_parser_state *st)
-{
- if (*sp == NULL || **sp == '\0') {
- return FALSE;
- }
-
- st->has_line_min = FALSE;
- st->has_line_max = FALSE;
-
- if (parse_uint(sp, &st->line_min)) {
- st->has_line_min = TRUE;
- }
- else {
- return FALSE;
- }
-
- if (skip_char(sp, ',')) {
- if (parse_uint(sp, &st->line_max)) {
- st->has_line_max = TRUE;
- }
- else {
- st->parse_error = TRUE;
- return FALSE;
- }
- }
- return TRUE;
-}
-
-static mrb_bool
-parse_filename(mrb_state *mrb, char **sp, listcmd_parser_state *st)
-{
- char *p;
- int len;
-
- if (st->filename != NULL) {
- mrb_free(mrb, st->filename);
- st->filename = NULL;
- }
-
- if ((p = strchr(*sp, ':')) != NULL) {
- len = p - *sp;
- }
- else {
- len = strlen(*sp);
- }
-
- if (len > 0) {
- st->filename = mrb_malloc(mrb, len + 1);
- strncpy(st->filename, *sp, len);
- st->filename[len] = '\0';
- *sp += len;
- return TRUE;
- }
- else {
- return FALSE;
- }
-}
-
-char*
-replace_ext(mrb_state *mrb, const char *filename, const char *ext)
-{
- size_t len;
- char *p, *s;
-
- if (filename == NULL) {
- return NULL;
- }
-
- if ((p = strrchr(filename, '.')) != NULL && strchr(p, '/') == NULL) {
- len = p - filename;
- }
- else {
- len = strlen(filename);
- }
-
- s = mrb_malloc(mrb, len + strlen(ext) + 1);
- memset(s, '\0', len + strlen(ext) + 1);
- strncpy(s, filename, len);
- strcat(s, ext);
-
- return s;
-}
-
-static mrb_bool
-parse_listcmd_args(mrb_state *mrb, mrdb_state *mrdb, listcmd_parser_state *st)
-{
- char *p;
-
- switch (mrdb->wcnt) {
- case 2:
- p = mrdb->words[1];
-
- /* mrdb->words[1] ::= <lineno> | <filename> ':' <lineno> | <filename> */
- if (!parse_lineno(mrb, &p, st)) {
- if (parse_filename(mrb, &p, st)) {
- if (skip_char(&p, ':')) {
- if (!parse_lineno(mrb, &p, st)) {
- st->parse_error = TRUE;
- }
- }
- }
- else {
- st->parse_error = TRUE;
- }
- }
- if (*p != '\0') {
- st->parse_error = TRUE;
- }
- break;
- case 1:
- case 0:
- /* do nothing */
- break;
- default:
- st->parse_error = TRUE;
- printf("too many arguments\n");
- break;
- }
-
- if (!st->parse_error) {
- if (!st->has_line_min) {
- st->line_min = (!st->filename && mrdb->dbg->prvline > 0) ? mrdb->dbg->prvline : 1;
- }
-
- if (!st->has_line_max) {
- st->line_max = st->line_min + 9;
- }
-
- if (st->filename == NULL) {
- if (mrdb->dbg->prvfile && strcmp(mrdb->dbg->prvfile, "-")) {
- st->filename = replace_ext(mrb, mrdb->dbg->prvfile, ".rb");
- }
- }
- }
-
- if (st->parse_error || st->filename == NULL) {
- return FALSE;
- }
-
- return TRUE;
-}
-
-static mrb_bool
-check_cmd_pattern(const char *pattern, const char *cmd)
-{
- char *lbracket, *rbracket, *p, *q;
-
- if (pattern == NULL && cmd == NULL) {
- return TRUE;
- }
- if (pattern == NULL || cmd == NULL) {
- return FALSE;
- }
- if ((lbracket = strchr(pattern, '[')) == NULL) {
- return !strcmp(pattern, cmd);
- }
- if ((rbracket = strchr(pattern, ']')) == NULL) {
- return FALSE;
- }
- if (strncmp(pattern, cmd, lbracket - pattern)) {
- return FALSE;
- }
-
- p = lbracket + 1;
- q = (char *)cmd + (lbracket - pattern);
-
- for ( ; p < rbracket && *q != '\0'; p++, q++) {
- if (*p != *q) {
- break;
- }
- }
- return *q == '\0';
-}
-
-static help_msg*
-get_help_msg(char *cmd1, char *cmd2)
-{
- help_msg *p;
-
- if (cmd1 == NULL) {
- return NULL;
- }
- for (p = help_msg_list; p->cmd1 != NULL; p++) {
- if (check_cmd_pattern(p->cmd1, cmd1) && check_cmd_pattern(p->cmd2, cmd2)) {
- return p;
- }
- }
- return NULL;
-}
-
-static mrb_bool
-show_short_help(void)
-{
- help_msg *p;
-
- printf("Commands\n");
-
- for (p = help_msg_list; p->cmd1 != NULL; p++) {
- if (p->cmd2 == NULL) {
- printf(" %s -- %s\n", p->cmd1, p->short_msg);
- }
- else {
- printf(" %s %s -- %s\n", p->cmd1, p->cmd2, p->short_msg);
- }
- }
- return TRUE;
-}
-
-static mrb_bool
-show_long_help(char *cmd1, char *cmd2)
-{
- help_msg *help;
-
- if ((help = get_help_msg(cmd1, cmd2)) == NULL) {
- return FALSE;
- }
- printf("%s", help->long_msg);
- return TRUE;
-}
-
-dbgcmd_state
-dbgcmd_list(mrb_state *mrb, mrdb_state *mrdb)
-{
- char *filename;
- listcmd_parser_state *st = listcmd_parser_state_new(mrb);
-
- if (parse_listcmd_args(mrb, mrdb, st)) {
- if ((filename = mrb_debug_get_source(mrb, mrdb, mrdb->srcpath, st->filename)) == NULL) {
- filename = st->filename;
- }
- mrb_debug_list(mrb, mrdb->dbg, filename, st->line_min, st->line_max);
-
- if (filename != NULL && filename != st->filename) {
- mrb_free(mrb, filename);
- }
- listcmd_parser_state_free(mrb, st);
- }
-
- return DBGST_PROMPT;
-}
-
-dbgcmd_state
-dbgcmd_help(mrb_state *mrb, mrdb_state *mrdb)
-{
- mrb_bool is_valid;
- int i;
-
- switch (mrdb->wcnt) {
- case 0:
- case 1:
- is_valid = show_short_help();
- break;
- case 2:
- is_valid = show_long_help(mrdb->words[1], NULL);
- break;
- case 3:
- is_valid = show_long_help(mrdb->words[1], mrdb->words[2]);
- break;
- default:
- is_valid = FALSE;
- break;
- }
-
- if (!is_valid) {
- printf("Invalid command \"");
- for (i = 1; i < mrdb->wcnt; i++) {
- printf("%s%s", i == 1 ? "" : " ", mrdb->words[i]);
- }
- printf("\". Try \"help\".\n");
- }
-
- return DBGST_PROMPT;
-}
-
-dbgcmd_state
-dbgcmd_quit(mrb_state *mrb, mrdb_state *mrdb)
-{
- switch (mrdb->dbg->xm) {
- case DBG_RUN:
- case DBG_STEP:
- case DBG_NEXT:
- while (1) {
- char c;
- int buf;
-
- printf("The program is running. Exit anyway? (y or n) ");
- fflush(stdout);
-
- if ((buf = getchar()) == EOF) {
- mrdb->dbg->xm = DBG_QUIT;
- break;
- }
- c = buf;
- while (buf != '\n' && (buf = getchar()) != EOF) ;
-
- if (c == 'y' || c == 'Y') {
- mrdb->dbg->xm = DBG_QUIT;
- break;
- }
- else if (c == 'n' || c == 'N') {
- break;
- }
- else {
- printf("Please answer y or n.\n");
- }
- }
- break;
- default:
- mrdb->dbg->xm = DBG_QUIT;
- break;
- }
-
- if (mrdb->dbg->xm == DBG_QUIT) {
- struct RClass *exc;
- exc = mrb_define_class(mrb, "DebuggerExit", mrb_class_get(mrb, "Exception"));
- mrb_raise(mrb, exc, "Exit mrdb.");
- }
- return DBGST_PROMPT;
-}