+#define COLOR_TRANSP (-1)
+
+
+enum line_type {
+ LINE_AUTHOR,
+ LINE_COMMIT,
+ LINE_DATE,
+ LINE_DIFF,
+ LINE_DIFF_ADD,
+ LINE_DIFF_DEL,
+ LINE_DIFF_CHUNK,
+ LINE_DIFF_TREE,
+ LINE_INDEX,
+ LINE_PARENT,
+ LINE_TREE,
+
+ LINE_UNKNOWN,
+ LINE_CURSOR,
+ LINE_STATUS,
+ LINE_TITLE,
+};
+
+struct line_info {
+ enum line_type type;
+ char *line;
+ int linelen;
+
+ int fg;
+ int bg;
+ int attr;
+};
+
+#define LINE(type, line, fg, bg, attr) \
+ { LINE_##type, (line), sizeof(line) - 1, (fg), (bg), (attr) }
+
+static struct line_info line_info[] = {
+ LINE(AUTHOR, "Author: ", COLOR_CYAN, COLOR_TRANSP, 0),
+ //LINE(AUTHOR, "author ", COLOR_CYAN, COLOR_TRANSP, 0),
+ LINE(COMMIT, "commit ", COLOR_GREEN, COLOR_TRANSP, 0),
+ LINE(DATE, "Date: ", COLOR_YELLOW, COLOR_TRANSP, 0),
+ LINE(DIFF_ADD, "+", COLOR_GREEN, COLOR_TRANSP, 0),
+ LINE(DIFF_CHUNK, "@", COLOR_MAGENTA, COLOR_TRANSP, 0),
+ LINE(DIFF_DEL, "-", COLOR_RED, COLOR_TRANSP, 0),
+ LINE(DIFF, "diff --git ", COLOR_YELLOW, COLOR_TRANSP, 0),
+ LINE(DIFF_TREE, "diff-tree ", COLOR_BLUE, COLOR_TRANSP, 0),
+ LINE(INDEX, "index ", COLOR_BLUE, COLOR_TRANSP, 0),
+ LINE(PARENT, "parent ", COLOR_GREEN, COLOR_TRANSP, 0),
+ LINE(TREE, "tree ", COLOR_GREEN, COLOR_TRANSP, 0),
+
+ LINE(UNKNOWN, "", COLOR_TRANSP, COLOR_TRANSP, A_NORMAL),
+
+ LINE(CURSOR, "", COLOR_WHITE, COLOR_GREEN, A_BOLD),
+ LINE(STATUS, "", COLOR_GREEN, COLOR_TRANSP, 0),
+ LINE(TITLE, "", COLOR_YELLOW, COLOR_BLUE, A_BOLD),
+};
+
+static struct line_info *
+get_line_info(char *line)
+{
+ int linelen = strlen(line);
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(line_info); i++) {
+ if (linelen < line_info[i].linelen
+ || strncmp(line_info[i].line, line, line_info[i].linelen))
+ continue;
+
+ return &line_info[i];
+ }
+
+ return NULL;
+}
+
+static enum line_type
+get_line_type(char *line)
+{
+ struct line_info *info = get_line_info(line);
+
+ return info ? info->type : LINE_UNKNOWN;
+}
+
+static int
+get_line_attr(enum line_type type)
+{
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(line_info); i++)
+ if (line_info[i].type == type)
+ return COLOR_PAIR(line_info[i].type) | line_info[i].attr;
+
+ return A_NORMAL;
+}
+
+static void
+init_colors(void)
+{
+ int transparent_bg = COLOR_BLACK;
+ int transparent_fg = COLOR_WHITE;
+ int i;
+
+ start_color();
+
+ if (use_default_colors() != ERR) {
+ transparent_bg = -1;
+ transparent_fg = -1;
+ }
+
+ for (i = 0; i < ARRAY_SIZE(line_info); i++) {
+ struct line_info *info = &line_info[i];
+ int bg = info->bg == COLOR_TRANSP ? transparent_bg : info->bg;
+ int fg = info->fg == COLOR_TRANSP ? transparent_fg : info->fg;
+
+ init_pair(info->type, fg, bg);
+ }
+}
+
+
+