Merge branch 'jc/maint-1.6.0-blank-at-eof' (early part) into jc/maint-blank-at-eof
* 'jc/maint-1.6.0-blank-at-eof' (early part): diff.c: emit_add_line() takes only the rest of the line diff.c: split emit_line() from the first char and the rest of the line
This commit is contained in:
commit
61c6457e89
49
diff.c
49
diff.c
@ -273,18 +273,31 @@ static void check_blank_at_eof(mmfile_t *mf1, mmfile_t *mf2,
|
|||||||
ecbdata->blank_at_eof_in_postimage = (at - l2) + 1;
|
ecbdata->blank_at_eof_in_postimage = (at - l2) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void emit_line(FILE *file, const char *set, const char *reset, const char *line, int len)
|
static void emit_line_0(FILE *file, const char *set, const char *reset,
|
||||||
|
int first, const char *line, int len)
|
||||||
{
|
{
|
||||||
int has_trailing_newline, has_trailing_carriage_return;
|
int has_trailing_newline, has_trailing_carriage_return;
|
||||||
|
int nofirst;
|
||||||
|
|
||||||
has_trailing_newline = (len > 0 && line[len-1] == '\n');
|
if (len == 0) {
|
||||||
if (has_trailing_newline)
|
has_trailing_newline = (first == '\n');
|
||||||
len--;
|
has_trailing_carriage_return = (!has_trailing_newline &&
|
||||||
has_trailing_carriage_return = (len > 0 && line[len-1] == '\r');
|
(first == '\r'));
|
||||||
if (has_trailing_carriage_return)
|
nofirst = has_trailing_newline || has_trailing_carriage_return;
|
||||||
len--;
|
} else {
|
||||||
|
has_trailing_newline = (len > 0 && line[len-1] == '\n');
|
||||||
|
if (has_trailing_newline)
|
||||||
|
len--;
|
||||||
|
has_trailing_carriage_return = (len > 0 && line[len-1] == '\r');
|
||||||
|
if (has_trailing_carriage_return)
|
||||||
|
len--;
|
||||||
|
nofirst = 0;
|
||||||
|
}
|
||||||
|
|
||||||
fputs(set, file);
|
fputs(set, file);
|
||||||
|
|
||||||
|
if (!nofirst)
|
||||||
|
fputc(first, file);
|
||||||
fwrite(line, len, 1, file);
|
fwrite(line, len, 1, file);
|
||||||
fputs(reset, file);
|
fputs(reset, file);
|
||||||
if (has_trailing_carriage_return)
|
if (has_trailing_carriage_return)
|
||||||
@ -293,6 +306,12 @@ static void emit_line(FILE *file, const char *set, const char *reset, const char
|
|||||||
fputc('\n', file);
|
fputc('\n', file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void emit_line(FILE *file, const char *set, const char *reset,
|
||||||
|
const char *line, int len)
|
||||||
|
{
|
||||||
|
emit_line_0(file, set, reset, line[0], line+1, len-1);
|
||||||
|
}
|
||||||
|
|
||||||
static int new_blank_line_at_eof(struct emit_callback *ecbdata, const char *line, int len)
|
static int new_blank_line_at_eof(struct emit_callback *ecbdata, const char *line, int len)
|
||||||
{
|
{
|
||||||
if (!((ecbdata->ws_rule & WS_BLANK_AT_EOF) &&
|
if (!((ecbdata->ws_rule & WS_BLANK_AT_EOF) &&
|
||||||
@ -301,23 +320,25 @@ static int new_blank_line_at_eof(struct emit_callback *ecbdata, const char *line
|
|||||||
ecbdata->blank_at_eof_in_preimage <= ecbdata->lno_in_preimage &&
|
ecbdata->blank_at_eof_in_preimage <= ecbdata->lno_in_preimage &&
|
||||||
ecbdata->blank_at_eof_in_postimage <= ecbdata->lno_in_postimage))
|
ecbdata->blank_at_eof_in_postimage <= ecbdata->lno_in_postimage))
|
||||||
return 0;
|
return 0;
|
||||||
return ws_blank_line(line + 1, len - 1, ecbdata->ws_rule);
|
return ws_blank_line(line, len, ecbdata->ws_rule);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void emit_add_line(const char *reset, struct emit_callback *ecbdata, const char *line, int len)
|
static void emit_add_line(const char *reset,
|
||||||
|
struct emit_callback *ecbdata,
|
||||||
|
const char *line, int len)
|
||||||
{
|
{
|
||||||
const char *ws = diff_get_color(ecbdata->color_diff, DIFF_WHITESPACE);
|
const char *ws = diff_get_color(ecbdata->color_diff, DIFF_WHITESPACE);
|
||||||
const char *set = diff_get_color(ecbdata->color_diff, DIFF_FILE_NEW);
|
const char *set = diff_get_color(ecbdata->color_diff, DIFF_FILE_NEW);
|
||||||
|
|
||||||
if (!*ws)
|
if (!*ws)
|
||||||
emit_line(ecbdata->file, set, reset, line, len);
|
emit_line_0(ecbdata->file, set, reset, '+', line, len);
|
||||||
else if (new_blank_line_at_eof(ecbdata, line, len))
|
else if (new_blank_line_at_eof(ecbdata, line, len))
|
||||||
/* Blank line at EOF - paint '+' as well */
|
/* Blank line at EOF - paint '+' as well */
|
||||||
emit_line(ecbdata->file, ws, reset, line, len);
|
emit_line_0(ecbdata->file, ws, reset, '+', line, len);
|
||||||
else {
|
else {
|
||||||
/* Emit just the prefix, then the rest. */
|
/* Emit just the prefix, then the rest. */
|
||||||
emit_line(ecbdata->file, set, reset, line, 1);
|
emit_line_0(ecbdata->file, set, reset, '+', "", 0);
|
||||||
ws_check_emit(line + 1, len - 1, ecbdata->ws_rule,
|
ws_check_emit(line, len, ecbdata->ws_rule,
|
||||||
ecbdata->file, set, reset, ws);
|
ecbdata->file, set, reset, ws);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -770,7 +791,7 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
|
|||||||
emit_line(ecbdata->file, color, reset, line, len);
|
emit_line(ecbdata->file, color, reset, line, len);
|
||||||
} else {
|
} else {
|
||||||
ecbdata->lno_in_postimage++;
|
ecbdata->lno_in_postimage++;
|
||||||
emit_add_line(reset, ecbdata, line, len);
|
emit_add_line(reset, ecbdata, line + 1, len - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user