save name window
authorLaurent Mazet <mazet@softndesign.org>
Wed, 26 Jun 2024 23:30:44 +0000 (01:30 +0200)
committerLaurent Mazet <mazet@softndesign.org>
Wed, 26 Jun 2024 23:30:44 +0000 (01:30 +0200)
display.c
display.h
function.c
gameoflife.c

index 0919e6caad7cb20e62430f726cfea680f72f9bf7..404eb425380ca7424920dafa2e5a47cc7fb9b066 100644 (file)
--- a/display.c
+++ b/display.c
@@ -1,5 +1,6 @@
 #include <curses.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 
 #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: */
index d1c7e232f54b79992df463499ef414a673f8d13b..3f4ce7d8bc0c347ea883912e25cbaa5291b33789 100644 (file)
--- 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: */
index 43e61a6285c171de26d9a33d0bbf9a47a70ab250..82ecba57988e3eb8dc9b8fa2aac8193eaaf4a1a3 100644 (file)
@@ -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));
index 54ed96a843a59534034b692db6c868a8200eec7d..0c2fa5e90f6e75ab5a78b920d11a769d4d12ab13 100644 (file)
@@ -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--;