diff --git a/builtin_commandline.c b/builtin_commandline.c index 4aaadb052..7d29efc56 100644 --- a/builtin_commandline.c +++ b/builtin_commandline.c @@ -146,7 +146,6 @@ static void write_part( const wchar_t *begin, if( tokenize ) { - buff = wcsndup( begin, end-begin ); // fwprintf( stderr, L"Subshell: %ls, end char %lc\n", buff, *end ); sb_init( &out ); @@ -159,20 +158,21 @@ static void write_part( const wchar_t *begin, (tok_get_pos( &tok)+wcslen(tok_last( &tok)) >= pos) ) break; -// fwprintf( stderr, L"Next token %ls\n", tok_last( &tok ) ); - switch( tok_last_type( &tok ) ) { case TOK_STRING: - sb_append2( &out, tok_last( &tok), L"\n", (void *)0 ); + { + wchar_t *tmp = unescape( tok_last( &tok ), UNESCAPE_INCOMPLETE ); + sb_append2( &out, tmp, L"\n", (void *)0 ); + free( tmp ); break; - + } + } } - - if( out.buff ) - sb_append( sb_out, - (wchar_t *)out.buff ); + + sb_append( sb_out, + (wchar_t *)out.buff ); free( buff ); tok_destroy( &tok ); @@ -180,12 +180,24 @@ static void write_part( const wchar_t *begin, } else { + wchar_t *buff, *esc; + if( cut_at_cursor ) { end = begin+pos; } - sb_append_substring( sb_out, begin, end-begin ); - sb_append( sb_out, L"\n" ); + + buff = wcsndup( begin, end-begin ); + esc = unescape( buff, UNESCAPE_INCOMPLETE ); + +// debug( 0, L"woot2 %ls -> %ls", buff, esc ); + + sb_append( sb_out, esc ); + sb_append( sb_out, L"\n" ); + + free( esc ); + free( buff ); + } } diff --git a/common.c b/common.c index a28bff46e..1e42cb731 100644 --- a/common.c +++ b/common.c @@ -1303,7 +1303,7 @@ wchar_t *unescape( const wchar_t * orig, int flags ) free( in ); return 0; } - + in[out_pos]=L'\0'; return in; } diff --git a/expand.c b/expand.c index 8088e4577..f3b55b373 100644 --- a/expand.c +++ b/expand.c @@ -1584,8 +1584,14 @@ int expand_string( void *context, { wchar_t *next; - next = expand_unescape( (wchar_t *)al_get( in, i ), - 1); + /* + We accept incomplete strings here, since complete uses + expand_string to expand incomplete strings from the + commandline. + */ + int unescape_flags = UNESCAPE_SPECIAL | UNESCAPE_INCOMPLETE; + + next = expand_unescape( (wchar_t *)al_get( in, i ), unescape_flags ); free( (void *)al_get( in, i ) ); diff --git a/tokenizer.c b/tokenizer.c index c497408c2..4f48e46e4 100644 --- a/tokenizer.c +++ b/tokenizer.c @@ -202,11 +202,7 @@ int tok_has_next( tokenizer *tok ) static int is_string_char( wchar_t c ) { - if( !c || wcschr( SEP, c ) ) - { - return 0; - } - return 1; + return !( !c || wcschr( SEP, c ) ); } /**