From 3b435621a55ffada58f9c2c991c61fc50b358c01 Mon Sep 17 00:00:00 2001 From: Thiago de Arruda Date: Fri, 5 Dec 2014 09:13:10 -0300 Subject: [PATCH 1/2] shell: Fix shell command output Shell command output was broken in @8a5a8db, which refactored nvim to no longer switch to cooked mode(linefeeds are processed differently). Fix the problem by refactoring write_output to accept to extra arguments that control the flushing behavior and where data will be written to: buffer or directly to the screen. --- src/nvim/os/shell.c | 52 +++++++++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 14 deletions(-) diff --git a/src/nvim/os/shell.c b/src/nvim/os/shell.c index cdd85e4e96..88b7f5c73d 100644 --- a/src/nvim/os/shell.c +++ b/src/nvim/os/shell.c @@ -141,7 +141,7 @@ int os_call_shell(char_u *cmd, ShellOpts opts, char_u *extra_arg) } if (output) { - write_output(output, nread); + (void)write_output(output, nread, true, true); free(output); } @@ -197,6 +197,9 @@ static int shell(const char *cmd, // the output buffer DynamicBuffer buf = DYNAMIC_BUFFER_INIT; rstream_cb data_cb = system_data_cb; + if (nread) { + *nread = 0; + } if (forward_output) { data_cb = out_data_cb; @@ -296,9 +299,9 @@ static void system_data_cb(RStream *rstream, void *data, bool eof) static void out_data_cb(RStream *rstream, void *data, bool eof) { RBuffer *rbuffer = rstream_buffer(rstream); - size_t len = rbuffer_pending(rbuffer); - ui_write((char_u *)rbuffer_read_ptr(rbuffer), (int)len); - rbuffer_consumed(rbuffer, len); + size_t written = write_output(rbuffer_read_ptr(rbuffer), + rbuffer_pending(rbuffer), false, eof); + rbuffer_consumed(rbuffer, written); } /// Parses a command string into a sequence of words, taking quotes into @@ -407,18 +410,27 @@ static void read_input(DynamicBuffer *buf) } } -static void write_output(char *output, size_t remaining) +static size_t write_output(char *output, size_t remaining, bool to_buffer, + bool eof) { if (!output) { - return; + return 0; } + char *start = output; size_t off = 0; while (off < remaining) { if (output[off] == NL) { // Insert the line output[off] = NUL; - ml_append(curwin->w_cursor.lnum++, (char_u *)output, 0, false); + if (to_buffer) { + ml_append(curwin->w_cursor.lnum++, (char_u *)output, 0, false); + } else { + // pending data from the output buffer has been flushed to the screen, + // safe to call ui_write directly + ui_write((char_u *)output, (int)off); + ui_write((char_u *)"\r\n", 2); + } size_t skip = off + 1; output += skip; remaining -= skip; @@ -433,14 +445,26 @@ static void write_output(char *output, size_t remaining) off++; } - if (remaining) { - // append unfinished line - ml_append(curwin->w_cursor.lnum++, (char_u *)output, 0, false); - // remember that the NL was missing - curbuf->b_no_eol_lnum = curwin->w_cursor.lnum; - } else { - curbuf->b_no_eol_lnum = 0; + if (eof) { + if (remaining) { + if (to_buffer) { + // append unfinished line + ml_append(curwin->w_cursor.lnum++, (char_u *)output, 0, false); + // remember that the NL was missing + curbuf->b_no_eol_lnum = curwin->w_cursor.lnum; + } else { + ui_write((char_u *)output, (int)remaining); + ui_write((char_u *)"\r\n", 2); + } + output += remaining; + } else if (to_buffer) { + curbuf->b_no_eol_lnum = 0; + } } + + out_flush(); + + return (size_t)(output - start); } static void shell_write_cb(WStream *wstream, void *data, int status) From f76df2475356add68212d737acd7da5bba3b64d6 Mon Sep 17 00:00:00 2001 From: Thiago de Arruda Date: Sat, 6 Dec 2014 07:54:59 -0300 Subject: [PATCH 2/2] deps: Fix 32-bit build of lib{unibilium,termkey,tickit} --- third-party/CMakeLists.txt | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/third-party/CMakeLists.txt b/third-party/CMakeLists.txt index 8f1b12213d..859be62adb 100644 --- a/third-party/CMakeLists.txt +++ b/third-party/CMakeLists.txt @@ -97,9 +97,10 @@ if(USE_BUNDLED_LIBUNIBILIUM) -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake CONFIGURE_COMMAND "" BUILD_IN_SOURCE 1 - BUILD_COMMAND ${MAKE_PRG} CC=${DEPS_C_COMPILER} + BUILD_COMMAND ${MAKE_PRG} CC=${CMAKE_C_COMPILER} PREFIX=${DEPS_INSTALL_DIR} - CFLAGS=-fPIC + CFLAGS+=${CMAKE_C_COMPILER_ARG1} + CFLAGS+=-fPIC INSTALL_COMMAND ${MAKE_PRG} PREFIX=${DEPS_INSTALL_DIR} install) list(APPEND THIRD_PARTY_DEPS libunibilium) endif() @@ -120,10 +121,11 @@ if(USE_BUNDLED_LIBTERMKEY) CONFIGURE_COMMAND "" BUILD_IN_SOURCE 1 BUILD_COMMAND "" - INSTALL_COMMAND ${MAKE_PRG} CC=${DEPS_C_COMPILER} + INSTALL_COMMAND ${MAKE_PRG} CC=${CMAKE_C_COMPILER} PREFIX=${DEPS_INSTALL_DIR} PKG_CONFIG_PATH=${DEPS_LIB_DIR}/pkgconfig - CFLAGS=-fPIC + CFLAGS+=${CMAKE_C_COMPILER_ARG1} + CFLAGS+=-fPIC install) list(APPEND THIRD_PARTY_DEPS libtermkey) add_dependencies(libtermkey libunibilium) @@ -145,10 +147,11 @@ if(USE_BUNDLED_LIBTICKIT) CONFIGURE_COMMAND "" BUILD_IN_SOURCE 1 BUILD_COMMAND "" - INSTALL_COMMAND ${MAKE_PRG} CC=${DEPS_C_COMPILER} + INSTALL_COMMAND ${MAKE_PRG} CC=${CMAKE_C_COMPILER} PREFIX=${DEPS_INSTALL_DIR} PKG_CONFIG_PATH=${DEPS_LIB_DIR}/pkgconfig - CFLAGS=-fPIC + CFLAGS+=${CMAKE_C_COMPILER_ARG1} + CFLAGS+=-fPIC install) list(APPEND THIRD_PARTY_DEPS libtickit) add_dependencies(libtickit libtermkey)