commit - 26595c7df947f97507904fa391034b6a52bfca7d
commit + 7021523c6d7788c452572f0b48f0dcba23199dac
blob - 0450a007a948e500aa26ebd54a8aa533da5bbd63
blob + d3fb08b4f85c7df22caa8b63d284698ef9a26235
--- lib/diff_internal.h
+++ lib/diff_internal.h
const char *prefix, struct diff_atom *start_atom,
unsigned int count);
+int diff_output_trailing_newline_msg(struct diff_output_info *outinfo,
+ FILE *dest,
+ const struct diff_chunk *c);
+
struct diff_output_info *diff_output_info_alloc(void);
void
blob - c3b2ac5dc419e89767ba81d0b11e159efef02bc9
blob + 8fdb333fafc6ce71b39dd9e58a8c572346c797c2
--- lib/diff_output.c
+++ lib/diff_output.c
return DIFF_RC_OK;
}
+int
+diff_output_trailing_newline_msg(struct diff_output_info *outinfo, FILE *dest,
+ const struct diff_chunk *c)
+{
+ enum diff_chunk_type chunk_type = diff_chunk_type(c);
+ struct diff_atom *atom, *start_atom;
+ unsigned int atom_count;
+ int rc, ch;
+ off_t outoff = 0, *offp;
+
+ if (chunk_type == CHUNK_MINUS || chunk_type == CHUNK_SAME) {
+ start_atom = c->left_start;
+ atom_count = c->left_count;
+ } else if (chunk_type == CHUNK_PLUS) {
+ start_atom = c->right_start;
+ atom_count = c->right_count;
+ } else
+ return EINVAL;
+
+ /* Locate the last atom. */
+ foreach_diff_atom(atom, start_atom, atom_count - 1) {
+ /* do nothing */;
+ }
+
+ rc = get_atom_byte(&ch, atom, atom->len - 1);
+ if (rc != DIFF_RC_OK)
+ return rc;
+
+ if (ch != '\n') {
+ if (outinfo && outinfo->line_offsets.len > 0) {
+ unsigned int idx = outinfo->line_offsets.len - 1;
+ outoff = outinfo->line_offsets.head[idx];
+ }
+ rc = fprintf(dest, "\\ No newline at end of file\n");
+ if (rc < 0)
+ return errno;
+ if (outinfo) {
+ ARRAYLIST_ADD(offp, outinfo->line_offsets);
+ if (offp == NULL)
+ return ENOMEM;
+ outoff += rc;
+ *offp = outoff;
+ }
+ }
+
+ return DIFF_RC_OK;
+}
+
struct diff_output_info *
diff_output_info_alloc(void)
{
blob - eaea44c1044a8f6ee273c5559c2945e50f2475c9
blob + 1ca6f80e8c29baa9241a9768b18d41e97cf079be
--- lib/diff_output_unidiff.c
+++ lib/diff_output_unidiff.c
c->right_start, c->right_count);
if (rc)
return rc;
+
+ if (cc->chunk.end == result->chunks.len) {
+ rc = diff_output_trailing_newline_msg(outinfo, dest, c);
+ if (rc != DIFF_RC_OK)
+ return rc;
+ }
}
/* Trailing context? */