From da84628f18eeaccc4d7b1bb2bdb471f616570f6d Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Thu, 27 Jun 2024 01:30:44 +0200 Subject: [PATCH] save name window --- display.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++ display.h | 5 ++++ function.c | 2 +- gameoflife.c | 19 +++++++++----- 4 files changed, 91 insertions(+), 8 deletions(-) diff --git a/display.c b/display.c index 0919e6c..404eb42 100644 --- a/display.c +++ b/display.c @@ -1,5 +1,6 @@ #include #include +#include #include #include "debug.h" @@ -175,4 +176,76 @@ void elementwindow (board_t *board, int xoffset, int yoffset, board_t *element, } } +char *savewindow (int length, int xoffset, int yoffset) +{ + char *name = (char *) calloc (1, length + 1); + CHECKALLOC (name); + memset (name, ' ', length); + + set_color (black); + _dobound (length, 1, xoffset, yoffset); + set_color (white); + + int i = 0, j; + int stop = 0; + while (!stop) { + for (j = 0; j < length; j++) { + set_color ((j == i) ? yellow : black); + mvaddch (yoffset, xoffset + j, name[j]); + set_color (white); + } + int ch = getch (); + switch (ch) { + case '\n': + case '\r': + stop = 1; + break; + case KEY_BACKSPACE: + case KEY_DELETE: + case 127: + case '\b': + name[i] = ' '; + i--; + break; + case KEY_LEFT: + i--; + break; + case KEY_RIGHT: + i++; + break; + case KEY_ESC: + free (name); + name = NULL; + stop = 1; + break; + default: + if ((ch >= 32) && ( ch < 128)) { + name[i] = ch; + i++; + } + } + + if (i < 0) { + i = 0; + } + if (i >= length) { + i = length - 1; + } + } + + if (name) { + for (j = length - 1; j >= 0; j--) { + if (name[i] == ' ') { + name[i] = '\0'; + } + } + if (*name == '\0') { + free (name); + name = NULL; + } + } + + return name; +} + /* vim: set ts=4 sw=4 et: */ diff --git a/display.h b/display.h index d1c7e23..3f4ce7d 100644 --- a/display.h +++ b/display.h @@ -3,6 +3,9 @@ #include "type.h" +#define KEY_ESC 0x1b +#define KEY_DELETE 0x014a + int helpwindow (char *msg, int xoffset, int yoffset); void librarywindow (char *msg, int xoffset, int yoffset); @@ -11,6 +14,8 @@ void boardwindow (board_t *board, int xboard, int yboard, int bound); void elementwindow (board_t *board, int xoffset, int yoffset, board_t *element, int x, int y); +char *savewindow (int length, int xoffset, int yoffset); + #endif /* __DISPLAY_H__ */ /* vim: set ts=4 sw=4 et: */ diff --git a/function.c b/function.c index 43e61a6..82ecba5 100644 --- a/function.c +++ b/function.c @@ -388,7 +388,7 @@ library_t *processlibrary (char *libname) if (libname) { char *saveptr; - char *filename = strtok_r (libname, ":", &saveptr); + char *filename = strtok_r (libname, ": ", &saveptr); while (filename) { char *name; lib = (library_t *) realloc (lib, (n + 2) * sizeof (library_t)); diff --git a/gameoflife.c b/gameoflife.c index 54ed96a..0c2fa5e 100644 --- a/gameoflife.c +++ b/gameoflife.c @@ -15,9 +15,6 @@ #include "function.h" #include "type.h" -#define KEY_ESC 0x1b -#define KEY_DELETE 0x014a - #define max(a,b) ({ __typeof__ (a) _a = (a); __typeof__ (b) _b = (b); _a > _b ? _a : _b; }) /* static variables */ @@ -33,6 +30,7 @@ int ysize = 0; int xoffset = 1; int yoffset = 1; +int savelen = 12; char *help = "< > Play generations\n" @@ -197,6 +195,9 @@ int main (int argc, char *argv[]) int yhelp = yboard; int xelement = (xsize - element->xsize) / 2; int yelement = (ysize - element->ysize) / 2; + int xsave = xboard + (board->xsize - savelen) / 2; + int ysave = yboard + (board->ysize - 1) / 2; + char *savename = NULL; /* init windows */ int l = helpwindow (help, xhelp, yhelp); @@ -281,11 +282,15 @@ int main (int argc, char *argv[]) rotate = 1; break; case 's': - ptr = saveboard (board, "Board"); - if (writedata ("board.gol", ptr)) { - VERBOSE (WARNING, printf ("issue writing Board\n")); + savename = savewindow (savelen, xsave, ysave); + if (savename != NULL) { + ptr = saveboard (board, "Board"); + if (writedata (savename, ptr)) { + VERBOSE (WARNING, printf ("issue writing Board\n")); + } + free (ptr); + free (savename); } - free (ptr); break; case 'u': n--; -- 2.30.2