mirror of
https://github.com/neovim/neovim.git
synced 2026-01-05 19:07:06 +10:00
Merge #8761 from janlazo/vim-8.0.1503
This commit is contained in:
@@ -2882,17 +2882,13 @@ void mch_print_start_line(int margin, int page_line)
|
||||
prt_half_width = FALSE;
|
||||
}
|
||||
|
||||
int mch_print_text_out(char_u *p, size_t len)
|
||||
int mch_print_text_out(char_u *const textp, size_t len)
|
||||
{
|
||||
int need_break;
|
||||
char_u *p = textp;
|
||||
char_u ch;
|
||||
char_u ch_buff[8];
|
||||
double char_width;
|
||||
double next_pos;
|
||||
int in_ascii;
|
||||
int half_width;
|
||||
|
||||
char_width = prt_char_width;
|
||||
char_u *tofree = NULL;
|
||||
double char_width = prt_char_width;
|
||||
|
||||
/* Ideally VIM would create a rearranged CID font to combine a Roman and
|
||||
* CJKV font to do what VIM is doing here - use a Roman font for characters
|
||||
@@ -2902,7 +2898,7 @@ int mch_print_text_out(char_u *p, size_t len)
|
||||
* years! If they ever do, a lot of this code will disappear.
|
||||
*/
|
||||
if (prt_use_courier) {
|
||||
in_ascii = (len == 1 && *p < 0x80);
|
||||
const bool in_ascii = (len == 1 && *p < 0x80);
|
||||
if (prt_in_ascii) {
|
||||
if (!in_ascii) {
|
||||
/* No longer in ASCII range - need to switch font */
|
||||
@@ -2918,9 +2914,10 @@ int mch_print_text_out(char_u *p, size_t len)
|
||||
}
|
||||
}
|
||||
if (prt_out_mbyte) {
|
||||
half_width = ((*mb_ptr2cells)(p) == 1);
|
||||
if (half_width)
|
||||
const bool half_width = ((*mb_ptr2cells)(p) == 1);
|
||||
if (half_width) {
|
||||
char_width /= 2;
|
||||
}
|
||||
if (prt_half_width) {
|
||||
if (!half_width) {
|
||||
prt_half_width = FALSE;
|
||||
@@ -2993,23 +2990,24 @@ int mch_print_text_out(char_u *p, size_t len)
|
||||
}
|
||||
|
||||
if (prt_do_conv) {
|
||||
/* Convert from multi-byte to 8-bit encoding */
|
||||
p = string_convert(&prt_conv, p, &len);
|
||||
if (p == NULL)
|
||||
p = (char_u *)xstrdup("");
|
||||
// Convert from multi-byte to 8-bit encoding
|
||||
tofree = p = string_convert(&prt_conv, p, &len);
|
||||
if (p == NULL) {
|
||||
p = (char_u *)"";
|
||||
len = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (prt_out_mbyte) {
|
||||
/* Multi-byte character strings are represented more efficiently as hex
|
||||
* strings when outputting clean 8 bit PS.
|
||||
*/
|
||||
do {
|
||||
// Multi-byte character strings are represented more efficiently as hex
|
||||
// strings when outputting clean 8 bit PS.
|
||||
while (len-- > 0) {
|
||||
ch = prt_hexchar[(unsigned)(*p) >> 4];
|
||||
ga_append(&prt_ps_buffer, (char)ch);
|
||||
ch = prt_hexchar[(*p) & 0xf];
|
||||
ga_append(&prt_ps_buffer, (char)ch);
|
||||
p++;
|
||||
} while (--len);
|
||||
}
|
||||
} else {
|
||||
/* Add next character to buffer of characters to output.
|
||||
* Note: One printed character may require several PS characters to
|
||||
@@ -3043,20 +3041,20 @@ int mch_print_text_out(char_u *p, size_t len)
|
||||
ga_append(&prt_ps_buffer, (char)ch);
|
||||
}
|
||||
|
||||
/* Need to free any translated characters */
|
||||
if (prt_do_conv)
|
||||
xfree(p);
|
||||
// Need to free any translated characters
|
||||
xfree(tofree);
|
||||
|
||||
prt_text_run += char_width;
|
||||
prt_pos_x += char_width;
|
||||
|
||||
// The downside of fp - use relative error on right margin check
|
||||
next_pos = prt_pos_x + prt_char_width;
|
||||
need_break = ((next_pos > prt_right_margin)
|
||||
&& ((next_pos - prt_right_margin) > (prt_right_margin * 1e-5)));
|
||||
const double next_pos = prt_pos_x + prt_char_width;
|
||||
const bool need_break = (next_pos > prt_right_margin)
|
||||
&& ((next_pos - prt_right_margin) > (prt_right_margin * 1e-5));
|
||||
|
||||
if (need_break)
|
||||
if (need_break) {
|
||||
prt_flush_buffer();
|
||||
}
|
||||
|
||||
return need_break;
|
||||
}
|
||||
|
||||
@@ -63,12 +63,27 @@ func Test_with_syntax()
|
||||
endfunc
|
||||
|
||||
func Test_fname_with_spaces()
|
||||
if has('postscript')
|
||||
split t\ e\ s\ t.txt
|
||||
call setline(1, ['just', 'some', 'text'])
|
||||
hardcopy > %.ps
|
||||
call assert_true(filereadable('t e s t.txt.ps'))
|
||||
call delete('t e s t.txt.ps')
|
||||
bwipe!
|
||||
if !has('postscript')
|
||||
return
|
||||
endif
|
||||
split t\ e\ s\ t.txt
|
||||
call setline(1, ['just', 'some', 'text'])
|
||||
hardcopy > %.ps
|
||||
call assert_true(filereadable('t e s t.txt.ps'))
|
||||
call delete('t e s t.txt.ps')
|
||||
bwipe!
|
||||
endfunc
|
||||
|
||||
func Test_illegal_byte()
|
||||
if !has('postscript') || &enc != 'utf-8'
|
||||
return
|
||||
endif
|
||||
new
|
||||
" conversion of 0xff will fail, this used to cause a crash
|
||||
call setline(1, "\xff")
|
||||
hardcopy >Xpstest
|
||||
|
||||
bwipe!
|
||||
call delete('Xpstest')
|
||||
endfunc
|
||||
|
||||
|
||||
Reference in New Issue
Block a user