]> granicus.if.org Git - php/commitdiff
basic support for wineditline
authorAnatol Belski <ab@php.net>
Fri, 15 Jan 2016 11:06:24 +0000 (12:06 +0100)
committerAnatol Belski <ab@php.net>
Fri, 15 Jan 2016 11:45:54 +0000 (12:45 +0100)
ext/readline/readline.c
ext/readline/readline_cli.c

index ad9b01a94645904e001153d91e8b3b86a47565d9..0e6f849444846eeda5f52dfbe27ab8d23023e217 100644 (file)
@@ -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) {
index 3332fa56e0a65fe61db8da6c0698bcb78a4381d8..62852159e6966c759ade7cadeeacb729715255ea 100644 (file)
@@ -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 <dlfcn.h>
 #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();