diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-07-30 08:41:26 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-07-30 08:41:26 +0900 |
| commit | 16ddb16608c5de4d152382c24233bea90215921d (patch) | |
| tree | 8d72d4c20a257933abcf0398ad7848de716309b7 | |
| parent | 23b6e22cf05db5add8a08e7d1c1c847594446729 (diff) | |
| parent | 82a335643eabb40f96f73603a41ca244223a3281 (diff) | |
| download | mruby-16ddb16608c5de4d152382c24233bea90215921d.tar.gz mruby-16ddb16608c5de4d152382c24233bea90215921d.zip | |
Merge pull request #2462 from cremno/mirb-malloc-history_path
mirb: allocate `history_path` dynamically
| -rw-r--r-- | mrbgems/mruby-bin-mirb/tools/mirb/mirb.c | 78 |
1 files changed, 53 insertions, 25 deletions
diff --git a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c index f96508d55..40fc5cc93 100644 --- a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +++ b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c @@ -29,18 +29,48 @@ #define MIRB_USING_HISTORY() #endif -#ifdef ENABLE_READLINE -#include <limits.h> -static const char *history_file_name = ".mirb_history"; -char history_path[PATH_MAX]; -#endif - #include "mruby.h" #include "mruby/array.h" #include "mruby/proc.h" #include "mruby/compile.h" #include "mruby/string.h" +#ifdef ENABLE_READLINE + +static const char history_file_name[] = ".mirb_history"; + +static char * +get_history_path(mrb_state *mrb) +{ + char *path = NULL; + const char *home = getenv("HOME"); + +#ifdef _WIN32 + if (home != NULL) { + home = getenv("USERPROFILE"); + } +#endif + + if (home != NULL) { + int len = snprintf(NULL, 0, "%s/%s", home, history_file_name); + if (len >= 0) { + size_t size = len + 1; + path = (char *)mrb_malloc_simple(mrb, size); + if (path != NULL) { + int n = snprintf(path, size, "%s/%s", home, history_file_name); + if (n != len) { + mrb_free(mrb, path); + path = NULL; + } + } + } + } + + return path; +} + +#endif + static void p(mrb_state *mrb, mrb_value obj, int prompt) { @@ -283,7 +313,7 @@ main(int argc, char **argv) int last_char; int char_index; #else - char *home = NULL; + char *history_path; #endif mrbc_context *cxt; struct mrb_parser_state *parser; @@ -310,6 +340,18 @@ main(int argc, char **argv) return n; } +#ifdef ENABLE_READLINE + history_path = get_history_path(mrb); + if (history_path == NULL) { + fputs("failed to get history path\n", stderr); + mrb_close(mrb); + return EXIT_FAILURE; + } + + MIRB_USING_HISTORY(); + MIRB_READ_HISTORY(history_path); +#endif + print_hint(); cxt = mrbc_context_new(mrb); @@ -320,22 +362,6 @@ main(int argc, char **argv) ai = mrb_gc_arena_save(mrb); -#ifdef ENABLE_READLINE - MIRB_USING_HISTORY(); - home = getenv("HOME"); -#ifdef _WIN32 - if (!home) - home = getenv("USERPROFILE"); -#endif - if (home) { - strcpy(history_path, home); - strcat(history_path, "/"); - strcat(history_path, history_file_name); - MIRB_READ_HISTORY(history_path); - } -#endif - - while (TRUE) { #ifndef ENABLE_READLINE print_cmdline(code_block_open); @@ -436,12 +462,14 @@ main(int argc, char **argv) mrb_parser_free(parser); cxt->lineno++; } - mrbc_context_free(mrb, cxt); - mrb_close(mrb); #ifdef ENABLE_READLINE MIRB_WRITE_HISTORY(history_path); + mrb_free(mrb, history_path); #endif + mrbc_context_free(mrb, cxt); + mrb_close(mrb); + return 0; } |
