Merge #8761 from janlazo/vim-8.0.1503

This commit is contained in:
Justin M. Keyes
2018-07-20 03:56:13 +02:00
committed by GitHub
2 changed files with 47 additions and 34 deletions

View File

@@ -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;
}

View File

@@ -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