commit 1426ca963932ab7521eb40914f98ff0cc9e00ffb
parent e4f82ab1904209a27bc9c4f5fa065287bb576f29
Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date: Thu, 25 Mar 2021 18:13:13 +0100
add function to print a single line, ignoring \r and \n
This can happen when there is no newline at end of file in the diff which is
served by libgit2 as:
"\n\ No newline at end of file\n".
Diffstat:
1 file changed, 23 insertions(+), 2 deletions(-)
diff --git a/src/stagit.c b/src/stagit.c
@@ -280,6 +280,26 @@ xmlencode(FILE *fp, const char *s, size_t len)
}
}
+/* Escape characters below as HTML 2.0 / XML 1.0, ignore printing '\n', '\r' */
+void
+xmlencodeline(FILE *fp, const char *s, size_t len)
+{
+ size_t i;
+
+ for (i = 0; *s && i < len; s++, i++) {
+ switch(*s) {
+ case '<': fputs("<", fp); break;
+ case '>': fputs(">", fp); break;
+ case '\'': fputs("'", fp); break;
+ case '&': fputs("&", fp); break;
+ case '"': fputs(""", fp); break;
+ case '\r': break; /* ignore CR */
+ case '\n': break; /* ignore LF */
+ default: putc(*s, fp);
+ }
+ }
+}
+
int
mkdirp(const char *path)
{
@@ -617,8 +637,9 @@ printshowfile(FILE *fp, struct commitinfo *ci)
fprintf(fp, "<a href=\"#h%zu-%zu-%zu\" id=\"h%zu-%zu-%zu\" class=\"d\">-",
i, j, k, i, j, k);
else
- fputc(' ', fp);
- xmlencode(fp, line->content, line->content_len);
+ putc(' ', fp);
+ xmlencodeline(fp, line->content, line->content_len);
+ putc('\n', fp);
if (line->old_lineno == -1 || line->new_lineno == -1)
fputs("</a>", fp);
}