diff --git a/stagit.c b/stagit.c
@@ -61,6 +61,16 @@ struct referenceinfo {
static git_repository *repo;
+static const char *line_number_format_strings[7] = {
+ "<a href=\"#l%zu\" class=\"line\" id=\"l%zu\">%1zu</a> ",
+ "<a href=\"#l%zu\" class=\"line\" id=\"l%zu\">%2zu</a> ",
+ "<a href=\"#l%zu\" class=\"line\" id=\"l%zu\">%3zu</a> ",
+ "<a href=\"#l%zu\" class=\"line\" id=\"l%zu\">%4zu</a> ",
+ "<a href=\"#l%zu\" class=\"line\" id=\"l%zu\">%5zu</a> ",
+ "<a href=\"#l%zu\" class=\"line\" id=\"l%zu\">%6zu</a> ",
+ "<a href=\"#l%zu\" class=\"line\" id=\"l%zu\">%7zu</a> ",
+};
+
static const char *baseurl = ""; /* base URL to make absolute RSS/Atom URI */
static const char *relpath = "";
static const char *repodir;
@@ -517,15 +527,41 @@ ssize_t writeblobraw(const git_blob *blob, const char *fpath)
return size;
}
+/* Counts the number of lines in a string */
+inline size_t line_count(const char *s, size_t len)
+{
+ size_t result = 1;
+ for (size_t i = 0; i < len; i++) if (s[i] == '\n') result += 1;
+ return result;
+}
+
+/* Returns floor(log(n, 10)) */
+inline size_t floor_log(size_t n)
+{
+ if (n == 0) return 1;
+
+ size_t result = 0;
+
+ while (n > 0)
+ {
+ n /= 10;
+ result += 1;
+ }
+
+ return result;
+}
+
size_t writeblobhtml(FILE *fp, const git_blob *blob)
{
size_t n = 0, i, len, prev;
- const char *nfmt = "<a href=\"#l%zu\" class=\"line\" id=\"l%zu\">%7zu</a> ";
const char *s = git_blob_rawcontent(blob);
len = git_blob_rawsize(blob);
fputs("<pre id=\"blob\">\n", fp);
+ size_t l_pad = floor_log(line_count(s, len));
+ const char *nfmt = line_number_format_strings[l_pad];
+
if (len > 0) {
for (i = 0, prev = 0; i < len; i++) {
if (s[i] != '\n')