aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar ridiculousfish <corydoras@ridiculousfish.com>2014-05-09 16:07:11 -0700
committerGravatar ridiculousfish <corydoras@ridiculousfish.com>2014-05-09 16:07:11 -0700
commitd554b7da08f18b006625805d3ba372de2de61997 (patch)
treed1bed65f3febb7a415fb3ac36e699cd9b5be2f45
parente97bec10eafec80d55e6e6b538a94597f3a6425d (diff)
parentcd7f1a15f86fd045d069d256ea7333d14c2913fa (diff)
Merge branch 'master' into death_of_fishd
-rw-r--r--builtin.cpp1
-rw-r--r--configure.ac10
-rw-r--r--fish_tests.cpp32
-rw-r--r--output.cpp24
-rw-r--r--output.h29
-rw-r--r--screen.cpp20
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);
}
diff --git a/output.cpp b/output.cpp
index 7f90df4b..149d9d99 100644
--- a/output.cpp
+++ b/output.cpp
@@ -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);
+ }
+}
diff --git a/output.h b/output.h
index 2d05c3d0..40012942 100644
--- a/output.h
+++ b/output.h
@@ -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().
diff --git a/screen.cpp b/screen.cpp
index 2fd7cc96..96fe0f2a 100644
--- a/screen.cpp
+++ b/screen.cpp
@@ -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);
+ }
}