ui-tree: show hexdump of binary blobs

This teaches ui-tree to detect binary blobs and display them similar
to `hexdump -C` (only wider).

Signed-off-by: Lars Hjemli <hjemli@gmail.com>
This commit is contained in:
Lars Hjemli 2009-01-31 17:45:48 +01:00
parent c495cf02ba
commit ae1d4d75b2
2 changed files with 67 additions and 23 deletions

View File

@ -263,6 +263,25 @@ table.blob a.no a:hover {
color: black; color: black;
} }
table.bin-blob {
margin-top: 0.5em;
border: solid 1px black;
}
table.bin-blob th {
font-family: monospace;
white-space: pre;
border: solid 1px #777;
padding: 0.5em 1em;
}
table.bin-blob td {
font-family: monospace;
white-space: pre;
border-left: solid 1px #777;
padding: 0em 1em;
}
table.nowrap td { table.nowrap td {
white-space: nowrap; white-space: nowrap;
} }

View File

@ -6,6 +6,7 @@
* (see COPYING for full license text) * (see COPYING for full license text)
*/ */
#include <ctype.h>
#include "cgit.h" #include "cgit.h"
#include "html.h" #include "html.h"
#include "ui-shared.h" #include "ui-shared.h"
@ -14,12 +15,53 @@ char *curr_rev;
char *match_path; char *match_path;
int header = 0; int header = 0;
static void print_text_buffer(char *buf, unsigned long size)
{
unsigned long lineno, idx;
const char *numberfmt =
"<a class='no' id='n%1$d' name='n%1$d' href='#n%1$d'>%1$d</a>\n";
html("<table summary='blob content' class='blob'>\n");
html("<tr><td class='linenumbers'><pre>");
idx = 0;
lineno = 0;
htmlf(numberfmt, ++lineno);
while(idx < size - 1) { // skip absolute last newline
if (buf[idx] == '\n')
htmlf(numberfmt, ++lineno);
idx++;
}
html("</pre></td>\n");
html("<td class='lines'><pre><code>");
html_txt(buf);
html("</code></pre></td></tr></table>\n");
}
static void print_binary_buffer(char *buf, unsigned long size)
{
unsigned long ofs, idx;
html("<table summary='blob content' class='bin-blob'>\n");
html("<tr><th>ofs</th><th>hex dump</th><th>ascii</th></tr>");
for (ofs = 0; ofs < size; ofs += 32, buf += 32) {
htmlf("<tr><td class='right'>%04x</td><td class='hex'>", ofs);
for (idx = 0; idx < 32 && ofs + idx < size; idx++)
htmlf("%*s%02x",
idx == 16 ? 4 : 1, "",
buf[idx] & 0xff);
html(" </td><td class='hex'>");
for (idx = 0; idx < 32 && ofs + idx < size; idx++)
htmlf("%c", isgraph(buf[idx]) ? buf[idx] : '.');
html("</td></tr>\n");
}
html("</table>\n");
}
static void print_object(const unsigned char *sha1, char *path) static void print_object(const unsigned char *sha1, char *path)
{ {
enum object_type type; enum object_type type;
char *buf; char *buf;
unsigned long size, lineno, idx; unsigned long size;
const char *numberfmt = "<a class='no' id='n%1$d' name='n%1$d' href='#n%1$d'>%1$d</a>\n";
type = sha1_object_info(sha1, &size); type = sha1_object_info(sha1, &size);
if (type == OBJ_BAD) { if (type == OBJ_BAD) {
@ -40,27 +82,10 @@ static void print_object(const unsigned char *sha1, char *path)
curr_rev, path); curr_rev, path);
htmlf(")<br/>blob: %s\n", sha1_to_hex(sha1)); htmlf(")<br/>blob: %s\n", sha1_to_hex(sha1));
html("<table summary='blob content' class='blob'>\n"); if (buffer_is_binary(buf, size))
html("<tr>\n"); print_binary_buffer(buf, size);
else
html("<td class='linenumbers'><pre>"); print_text_buffer(buf, size);
idx = 0;
lineno = 0;
htmlf(numberfmt, ++lineno);
while(idx < size - 1) { // skip absolute last newline
if (buf[idx] == '\n') {
htmlf(numberfmt, ++lineno);
}
idx++;
}
html("</pre></td>\n");
html("<td class='lines'><pre><code>");
html_txt(buf);
html("</code></pre></td>\n");
html("</tr>\n");
html("</table>\n");
} }