From: Anatol Belski Date: Fri, 15 Jan 2016 11:06:24 +0000 (+0100) Subject: basic support for wineditline X-Git-Tag: php-7.2.0alpha1~620^2~131 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d249321116a40d1819fd5d884a2a8a1d00221b3c;p=php basic support for wineditline --- diff --git a/ext/readline/readline.c b/ext/readline/readline.c index ad9b01a946..0e6f849444 100644 --- a/ext/readline/readline.c +++ b/ext/readline/readline.c @@ -251,7 +251,9 @@ PHP_FUNCTION(readline_info) array_init(return_value); add_assoc_string(return_value,"line_buffer",SAFE_STRING(rl_line_buffer)); add_assoc_long(return_value,"point",rl_point); +#ifndef PHP_WIN32 add_assoc_long(return_value,"end",rl_end); +#endif #ifdef HAVE_LIBREADLINE add_assoc_long(return_value,"mark",rl_mark); add_assoc_long(return_value,"done",rl_done); @@ -262,7 +264,9 @@ PHP_FUNCTION(readline_info) #if HAVE_ERASE_EMPTY_LINE add_assoc_long(return_value,"erase_empty_line",rl_erase_empty_line); #endif +#ifndef PHP_WIN32 add_assoc_string(return_value,"library_version",(char *)SAFE_STRING(rl_library_version)); +#endif add_assoc_string(return_value,"readline_name",(char *)SAFE_STRING(rl_readline_name)); add_assoc_long(return_value,"attempted_completion_over",rl_attempted_completion_over); } else { @@ -276,8 +280,10 @@ PHP_FUNCTION(readline_info) RETVAL_STRING(SAFE_STRING(oldstr)); } else if (!strcasecmp(what, "point")) { RETVAL_LONG(rl_point); +#ifndef PHP_WIN32 } else if (!strcasecmp(what, "end")) { RETVAL_LONG(rl_end); +#endif #ifdef HAVE_LIBREADLINE } else if (!strcasecmp(what, "mark")) { RETVAL_LONG(rl_mark); @@ -309,8 +315,10 @@ PHP_FUNCTION(readline_info) } RETVAL_LONG(oldval); #endif +#ifndef PHP_WIN32 } else if (!strcasecmp(what,"library_version")) { RETVAL_STRING((char *)SAFE_STRING(rl_library_version)); +#endif } else if (!strcasecmp(what, "readline_name")) { oldstr = (char*)rl_readline_name; if (value) { diff --git a/ext/readline/readline_cli.c b/ext/readline/readline_cli.c index 3332fa56e0..62852159e6 100644 --- a/ext/readline/readline_cli.c +++ b/ext/readline/readline_cli.c @@ -67,7 +67,7 @@ #include "sapi/cli/cli.h" #include "readline_cli.h" -#ifdef COMPILE_DL_READLINE +#if defined(COMPILE_DL_READLINE) && !defined(PHP_WIN32) #include #endif @@ -602,9 +602,15 @@ static int readline_shell_run(void) /* {{{ */ zend_execute_scripts(ZEND_REQUIRE, NULL, 1, prepend_file_p); } +#ifndef PHP_WIN32 history_file = tilde_expand("~/.php_history"); +#else + spprintf(&history_file, MAX_PATH, "%s/.php_history", getenv("USERPROFILE")); +#endif rl_attempted_completion_function = cli_code_completion; +#ifndef PHP_WIN32 rl_special_prefixes = "$"; +#endif read_history(history_file); EG(exit_status) = 0; @@ -690,13 +696,33 @@ static int readline_shell_run(void) /* {{{ */ php_last_char = '\0'; } +#ifdef PHP_WIN32 + efree(history_file); +#else free(history_file); +#endif efree(code); zend_string_release(prompt); return EG(exit_status); } /* }}} */ +#ifdef PHP_WIN32 +typedef cli_shell_callbacks_t *(__cdecl *get_cli_shell_callbacks)(void); +#define GET_SHELL_CB(cb) \ + do { \ + get_cli_shell_callbacks get_callbacks; \ + HMODULE hMod = GetModuleHandle("php.exe"); \ + (cb) = NULL; \ + if (strlen(sapi_module.name) >= 3 && 0 == strncmp("cli", sapi_module.name, 3)) { \ + get_callbacks = (get_cli_shell_callbacks)GetProcAddress(hMod, "php_cli_get_shell_callbacks"); \ + if (get_callbacks) { \ + (cb) = get_callbacks(); \ + } \ + } \ + } while(0) + +#else /* #ifdef COMPILE_DL_READLINE This dlsym() is always used as even the CGI SAPI is linked against "CLI"-only @@ -715,6 +741,7 @@ this extension sharedto offer compatibility. /*#else #define GET_SHELL_CB(cb) (cb) = php_cli_get_shell_callbacks() #endif*/ +#endif PHP_MINIT_FUNCTION(cli_readline) { @@ -759,7 +786,9 @@ PHP_MINFO_FUNCTION(cli_readline) { php_info_print_table_start(); php_info_print_table_header(2, "Readline Support", "enabled"); +#ifndef PHP_WIN32 php_info_print_table_row(2, "Readline library", (rl_library_version ? rl_library_version : "Unknown")); +#endif php_info_print_table_end(); DISPLAY_INI_ENTRIES();