aboutsummaryrefslogtreecommitdiff
path: root/ui-ssdiff.c
diff refs
from: back
to: back
| flip
diff options
context:
space:
mode:
Diffstat (limited to 'ui-ssdiff.c')
-rw-r--r--ui-ssdiff.c264
1 files changed, 0 insertions, 264 deletions
diff --git a/ui-ssdiff.c b/ui-ssdiff.c
deleted file mode 100644
index 3591ab4..0000000
--- a/ui-ssdiff.c
+++ /dev/null
@@ -1,264 +0,0 @@
-#include "cgit.h"
-#include "html.h"
-#include "ui-shared.h"
-
-extern int use_ssdiff;
-
-static int current_old_line, current_new_line;
-
-struct deferred_lines {
- int line_no;
- char *line;
- struct deferred_lines *next;
-};
-
-static struct deferred_lines *deferred_old, *deferred_old_last;
-static struct deferred_lines *deferred_new, *deferred_new_last;
-
-static int line_from_hunk(char *line, char type)
-{
- char *buf1, *buf2;
- int len;
-
- buf1 = strchr(line, type);
- if (buf1 == NULL)
- return 0;
- buf1 += 1;
- buf2 = strchr(buf1, ',');
- if (buf2 == NULL)
- return 0;
- len = buf2 - buf1;
- buf2 = xmalloc(len + 1);
- strncpy(buf2, buf1, len);
- buf2[len] = '\0';
- int res = atoi(buf2);
- free(buf2);
- return res;
-}
-
-static char *replace_tabs(char *line)
-{
- char *prev_buf = line;
- char *cur_buf;
- int linelen = strlen(line);
- int n_tabs = 0;
- int i;
- char *result;
- char *spaces = " ";
-
- if (linelen == 0) {
- result = xmalloc(1);
- result[0] = '\0';
- return result;
- }
-
- for (i = 0; i < linelen; i++)
- if (line[i] == '\t')
- n_tabs += 1;
- result = xmalloc(linelen + n_tabs * 8 + 1);
- result[0] = '\0';
-
- while (1) {
- cur_buf = strchr(prev_buf, '\t');
- if (!cur_buf) {
- strcat(result, prev_buf);
- break;
- } else {
- strcat(result, " ");
- strncat(result, spaces, 8 - (strlen(result) % 8));
- strncat(result, prev_buf, cur_buf - prev_buf);
- }
- prev_buf = cur_buf + 1;
- }
- return result;
-}
-
-static void deferred_old_add(char *line, int line_no)
-{
- struct deferred_lines *item = xmalloc(sizeof(struct deferred_lines));
- item->line = xstrdup(line);
- item->line_no = line_no;
- item->next = NULL;
- if (deferred_old) {
- deferred_old_last->next = item;
- deferred_old_last = item;
- } else {
- deferred_old = deferred_old_last = item;
- }
-}
-
-static void deferred_new_add(char *line, int line_no)
-{
- struct deferred_lines *item = xmalloc(sizeof(struct deferred_lines));
- item->line = xstrdup(line);
- item->line_no = line_no;
- item->next = NULL;
- if (deferred_new) {
- deferred_new_last->next = item;
- deferred_new_last = item;
- } else {
- deferred_new = deferred_new_last = item;
- }
-}
-
-static void print_ssdiff_line(char *class, int old_line_no, char *old_line,
- int new_line_no, char *new_line)
-{
- html("<tr>");
- if (old_line_no > 0)
- htmlf("<td class='%s'>%d </td><td class='%s'>", class,
- old_line_no, class);
- else
- htmlf("<td class='%s_dark'> </td><td class='%s_dark'>", class, class);
-
- if (old_line) {
- old_line = replace_tabs(old_line + 1);
- html_txt(old_line);
- free(old_line);
- }
-
- html(" </td>");
-
- if (new_line_no > 0)
- htmlf("<td class='%s'> %d </td><td class='%s'>", class,
- new_line_no, class);
- else
- htmlf("<td class='%s_dark'> </td><td class='%s_dark'>", class, class);
-
- if (new_line) {
- new_line = replace_tabs(new_line + 1);
- html_txt(new_line);
- free(new_line);
- }
-
- html("</td></tr>");
-}
-
-static void print_deferred_old_lines()
-{
- struct deferred_lines *iter_old, *tmp;
-
- iter_old = deferred_old;
- while (iter_old) {
- print_ssdiff_line("del", iter_old->line_no,
- iter_old->line, -1, NULL);
- tmp = iter_old->next;
- free(iter_old);
- iter_old = tmp;
- }
-}
-
-static void print_deferred_new_lines()
-{
- struct deferred_lines *iter_new, *tmp;
-
- iter_new = deferred_new;
- while (iter_new) {
- print_ssdiff_line("add", -1, NULL, iter_new->line_no,
- iter_new->line);
- tmp = iter_new->next;
- free(iter_new);
- iter_new = tmp;
- }
-}
-
-static void print_deferred_changed_lines()
-{
- struct deferred_lines *iter_old, *iter_new, *tmp;
-
- iter_old = deferred_old;
- iter_new = deferred_new;
- while (iter_old || iter_new) {
- if (iter_old && iter_new)
- print_ssdiff_line("changed", iter_old->line_no,
- iter_old->line,
- iter_new->line_no, iter_new->line);
- else if (iter_old)
- print_ssdiff_line("changed", iter_old->line_no,
- iter_old->line, -1, NULL);
- else if (iter_new)
- print_ssdiff_line("changed", -1, NULL,
- iter_new->line_no, iter_new->line);
-
- if (iter_old) {
- tmp = iter_old->next;
- free(iter_old);
- iter_old = tmp;
- }
-
- if (iter_new) {
- tmp = iter_new->next;
- free(iter_new);
- iter_new = tmp;
- }
- }
-}
-
-void cgit_ssdiff_print_deferred_lines()
-{
- if (!deferred_old && !deferred_new)
- return;
-
- if (deferred_old && !deferred_new)
- print_deferred_old_lines();
- else if (!deferred_old && deferred_new)
- print_deferred_new_lines();
- else
- print_deferred_changed_lines();
-
- deferred_old = deferred_old_last = NULL;
- deferred_new = deferred_new_last = NULL;
-}
-
-/*
- * print a single line returned from xdiff
- */
-void cgit_ssdiff_line_cb(char *line, int len)
-{
- char c = line[len - 1];
-
- line[len - 1] = '\0';
-
- if (line[0] == '@') {
- current_old_line = line_from_hunk(line, '-');
- current_new_line = line_from_hunk(line, '+');
- }
-
- if (line[0] == ' ') {
- if (deferred_old || deferred_new)
- cgit_ssdiff_print_deferred_lines();
- print_ssdiff_line("ctx", current_old_line, line,
- current_new_line, line);
- current_old_line += 1;
- current_new_line += 1;
- } else if (line[0] == '+') {
- deferred_new_add(line, current_new_line);
- current_new_line += 1;
- } else if (line[0] == '-') {
- deferred_old_add(line, current_old_line);
- current_old_line += 1;
- } else if (line[0] == '@') {
- html("<tr><td colspan='4' class='hunk'>");
- html_txt(line);
- html("</td></tr>");
- } else {
- html("<tr><td colspan='4' class='ctx'>");
- html_txt(line);
- html("</td></tr>");
- }
- line[len - 1] = c;
-}
-
-void cgit_ssdiff_header()
-{
- current_old_line = 0;
- current_new_line = 0;
- html("<table class='ssdiff'>");
-}
-
-void cgit_ssdiff_footer()
-{
- if (deferred_old || deferred_new)
- cgit_ssdiff_print_deferred_lines();
- html("</table>");
-}