diff options
author | ridiculousfish <corydoras@ridiculousfish.com> | 2014-05-09 16:07:11 -0700 |
---|---|---|
committer | ridiculousfish <corydoras@ridiculousfish.com> | 2014-05-09 16:07:11 -0700 |
commit | d554b7da08f18b006625805d3ba372de2de61997 (patch) | |
tree | d1bed65f3febb7a415fb3ac36e699cd9b5be2f45 | |
parent | e97bec10eafec80d55e6e6b538a94597f3a6425d (diff) | |
parent | cd7f1a15f86fd045d069d256ea7333d14c2913fa (diff) |
Merge branch 'master' into death_of_fishd
-rw-r--r-- | builtin.cpp | 1 | ||||
-rw-r--r-- | configure.ac | 10 | ||||
-rw-r--r-- | fish_tests.cpp | 32 | ||||
-rw-r--r-- | output.cpp | 24 | ||||
-rw-r--r-- | output.h | 29 | ||||
-rw-r--r-- | screen.cpp | 20 |
6 files changed, 62 insertions, 54 deletions
diff --git a/builtin.cpp b/builtin.cpp index 741dbd4a..fadd5a4a 100644 --- a/builtin.cpp +++ b/builtin.cpp @@ -2002,6 +2002,7 @@ int define_function(parser_t &parser, const wcstring_list_t &c_args, const wcstr else if (! wcslen(argv[woptind])) { append_format(*out_err, _(L"%ls: No function name given\n"), argv[0]); + res=1; } else { diff --git a/configure.ac b/configure.ac index b6b7626b..fefb2c46 100644 --- a/configure.ac +++ b/configure.ac @@ -213,6 +213,16 @@ if test `uname` != "Darwin"; then LDFLAGS_FISH="$LDFLAGS_FISH -rdynamic" fi +# +# On Cygwin, we need to add some flags for ncurses. +# +case `uname` in + CYGWIN*) + echo "adding flags for ncurses on Cygwin" + CXXFLAGS="$CXXFLAGS -I/usr/include -I/usr/include/ncursesw" + LDFLAGS_FISH="$LDFLAGS_FISH -L/usr/lib/ncursesw" + ;; +esac # # If we are compiling against glibc, set some flags to work around diff --git a/fish_tests.cpp b/fish_tests.cpp index aa9db117..b1061bbb 100644 --- a/fish_tests.cpp +++ b/fish_tests.cpp @@ -688,6 +688,9 @@ static void test_parser() parser_t::principal_parser().eval(L"function recursive1 ; recursive2 ; end ; function recursive2 ; recursive1 ; end ; recursive1; ", io_chain_t(), TOP); #endif + say(L"Testing empty function name"); + parser_t::principal_parser().eval(L"function '' ; echo fail; exit 42 ; end ; ''", io_chain_t(), TOP); + say(L"Testing eval_args"); completion_list_t comps; parser_t::principal_parser().expand_argument_list(L"alpha 'beta gamma' delta", comps); @@ -1022,28 +1025,23 @@ static void test_wchar2utf8(const wchar_t *src, size_t slen, const char *dst, si } } - do + size = wchar_to_utf8(src, slen, mem, dlen, flags); + if (res != size) { - size = wchar_to_utf8(src, slen, mem, dlen, flags); - if (res != size) - { - err(L"w2u: %s: FAILED (rv: %lu, must be %lu)", descr, size, res); - break; - } - - if (mem == NULL) - break; /* OK */ + err(L"w2u: %s: FAILED (rv: %lu, must be %lu)", descr, size, res); + goto finish; + } - if (memcmp(mem, dst, size) != 0) - { - err(L"w2u: %s: BROKEN", descr); - break; - } + if (mem == NULL) + goto finish; /* OK */ + if (memcmp(mem, dst, size) != 0) + { + err(L"w2u: %s: BROKEN", descr); + goto finish; } - while (0); - if (mem != NULL); + finish: free(mem); } @@ -418,13 +418,6 @@ int writeb(tputs_arg_t b) return 0; } -int writembs_internal(char *str) -{ - CHECK(str, 1); - - return tputs(str,1,&writeb)==ERR?1:0; -} - int writech(wint_t ch) { mbstate_t state; @@ -725,3 +718,20 @@ const wchar_t *output_get_term() { return current_term.empty() ? L"<unknown>" : current_term.c_str(); } + +void writembs_check(char *mbs, const char *mbs_name, const char *file, long line) +{ + if (mbs != NULL) + { + tputs(mbs, 1, &writeb); + } + else + { + debug( 0, _(L"Tried to use terminfo string %s on line %ld of %s, which is undefined in terminal of type \"%ls\". Please report this error to %s"), + mbs_name, + line, + file, + output_get_term(), + PACKAGE_BUGREPORT); + } +} @@ -78,33 +78,8 @@ void set_color(rgb_color_t c, rgb_color_t c2); /** Write specified multibyte string */ -#define writembs( mbs ) \ - { \ - char *tmp = mbs; \ - if( tmp ) \ - { \ - writembs_internal( tmp ); \ - } \ - else \ - { \ - debug( 0, \ - _(L"Tried to use terminfo string %s on line %d of %s, which is undefined in terminal of type \"%ls\". Please report this error to %s"), \ - #mbs, \ - __LINE__, \ - __FILE__, \ - output_get_term(), \ - PACKAGE_BUGREPORT); \ - } \ - } - - -/** - Write a char * narrow string to FD 1, needed for the terminfo - strings. This is usually just a wrapper aound tputs, using writeb - as the sending function. But a weird bug on PPC Linux means that on - this platform, write is instead used directly. -*/ -int writembs_internal(char *str); +void writembs_check(char *mbs, const char *mbs_name, const char *file, long line); +#define writembs(mbs) writembs_check((mbs), #mbs, __FILE__, __LINE__) /** Write a wide character using the output method specified using output_set_writer(). @@ -638,18 +638,32 @@ static void s_move(screen_t *s, data_buffer_t *b, int new_x, int new_y) x_steps = 0; } + char *multi_str = NULL; if (x_steps < 0) { str = cursor_left; + multi_str = parm_left_cursor; } else { str = cursor_right; + multi_str = parm_right_cursor; } - - for (i=0; i<abs(x_steps); i++) + + // Use the bulk ('multi') output for cursor movement if it is supported and it would be shorter + // Note that this is required to avoid some visual glitches in iTerm (#1448) + bool use_multi = (multi_str != NULL && multi_str[0] != '\0' && abs(x_steps) * strlen(str) > strlen(multi_str)); + if (use_multi) { - writembs(str); + char *multi_param = tparm(multi_str, abs(x_steps)); + writembs(multi_param); + } + else + { + for (i=0; i<abs(x_steps); i++) + { + writembs(str); + } } |