From aa81ed84fc03060ea270766427d9e3232d130855 Mon Sep 17 00:00:00 2001 From: Curtis McEnroe Date: Thu, 31 Aug 2017 15:37:36 -0400 Subject: Clean up merge tool Choose the version with the most recent access if the modify times are the same. --- merge.c | 53 +++++++++++++++++++++++++---------------------------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/merge.c b/merge.c index 26e00dd..ff02ba5 100644 --- a/merge.c +++ b/merge.c @@ -56,62 +56,59 @@ static void drawTile(int offsetY, const struct Tile *tile) { int main(int argc, char *argv[]) { if (argc != 4) return EX_USAGE; - int a = open(argv[1], O_RDONLY); - if (a < 0) err(EX_IOERR, "%s", argv[1]); + int fileA = open(argv[1], O_RDONLY); + if (fileA < 0) err(EX_IOERR, "%s", argv[1]); - int b = open(argv[2], O_RDONLY); - if (b < 0) err(EX_IOERR, "%s", argv[2]); + int fileB = open(argv[2], O_RDONLY); + if (fileB < 0) err(EX_IOERR, "%s", argv[2]); - int c = open(argv[3], O_WRONLY | O_CREAT, 0644); - if (c < 0) err(EX_IOERR, "%s", argv[3]); + int fileC = open(argv[3], O_WRONLY | O_CREAT, 0644); + if (fileC < 0) err(EX_IOERR, "%s", argv[3]); initscr(); cbreak(); noecho(); keypad(stdscr, true); set_escdelay(100); + start_color(); for (int bg = COLOR_BLACK; bg < COLOR_BRIGHT; ++bg) { for (int fg = COLOR_BLACK; fg < COLOR_BRIGHT; ++fg) { init_pair(bg << 4 | fg, fg, bg); } } + mvhline(CELL_ROWS, 0, 0, CELL_COLS); + mvhline(CELL_ROWS * 2 + 1, 0, 0, CELL_COLS); + mvvline(0, CELL_COLS, 0, CELL_ROWS * 2 + 1); + mvaddch(CELL_ROWS, CELL_COLS, ACS_RTEE); + mvaddch(CELL_ROWS * 2 + 1, CELL_COLS, ACS_LRCORNER); struct Tile tileA, tileB; for (;;) { - ssize_t lenA = read(a, &tileA, sizeof(tileA)); + ssize_t lenA = read(fileA, &tileA, sizeof(tileA)); if (lenA < 0) err(EX_IOERR, "%s", argv[1]); - ssize_t lenB = read(b, &tileB, sizeof(tileB)); + ssize_t lenB = read(fileB, &tileB, sizeof(tileB)); if (lenB < 0) err(EX_IOERR, "%s", argv[2]); if (!lenA && !lenB) break; if (!lenA || !lenB) errx(EX_IOERR, "different size inputs"); - if (tileA.modify == tileB.modify) { - ssize_t lenC = writeAll(c, (char *)&tileB, sizeof(tileB)); - if (lenC < 0) err(EX_IOERR, "%s", argv[3]); - continue; - } + const struct Tile *tileC = (tileA.access > tileB.access) ? &tileA : &tileB; + + if (tileA.modify != tileB.modify) { + drawTile(0, &tileA); + drawTile(CELL_ROWS + 1, &tileB); + move(CELL_ROWS * 2 + 2, 0); + refresh(); - drawTile(0, &tileA); - drawTile(CELL_ROWS + 1, &tileB); - refresh(); - - const struct Tile *choice; - int ch; -retry: - ch = getch(); - if (ch == 'a') { - choice = &tileA; - } else if (ch == 'b') { - choice = &tileB; - } else { - goto retry; + int c; + do { c = getch(); } while (c != 'a' && c != 'b'); + tileC = (c == 'a') ? &tileA : &tileB; } - ssize_t lenC = writeAll(c, (char *)choice, sizeof(*choice)); + ssize_t lenC = writeAll(fileC, (char *)tileC, sizeof(*tileC)); if (lenC < 0) err(EX_IOERR, "%s", argv[3]); } -- cgit 1.4.1