add tests and memory fixes
authorLaurent Mazet <mazet@softndesign.org>
Sat, 18 Jan 2025 14:14:41 +0000 (15:14 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Sat, 18 Jan 2025 14:14:41 +0000 (15:14 +0100)
display.c
fm.c
function.c

index 2e5ff7cdbe8423fc792acf1b156a793a62a9e4cd..26e283743a3f761bd1ad22cde030e55d8503d8ac 100644 (file)
--- a/display.c
+++ b/display.c
@@ -2,6 +2,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <unistd.h>
 
 #include "debug.h"
 #include "function.h"
@@ -139,6 +140,7 @@ int helpwindow (char *msg, int xoffset, int yoffset)
     int j = 2;
     j += _helpwindow (msg, xoffset, yoffset + j, length);
     _dobound (length, j, xoffset, yoffset);
+    set_color (black);
 
     return j;
 }
@@ -151,27 +153,31 @@ void menuwindow (window_t *win, char *menu, int *index)
         mvaddch (win->yoffset, win->xoffset + i, ' ');
     }
 
-    if (*index < 0) {
-        *index = 0;
+    int _index = (index) ? *index : 0;
+    if (_index < 0) {
+        _index = 0;
     }
-    if ((int)strlen (menu) - *index < win->xsize) {
-        *index = strlen (menu) - win->xsize;
+    if ((int)strlen (menu) - _index < win->xsize) {
+        _index = strlen (menu) - win->xsize;
     }
-    if (*index < 0) {
-        *index = 0;
+    if (_index < 0) {
+        _index = 0;
+    }
+    if (index) {
+        *index = _index;
     }
 
-    for (i = 0; (i < win->xsize) && (menu[*index + i] != 0); i++) {
-        set_color (((menu[*index + i] >= 'A') && (menu[*index + i] <= 'Z')) ? iblue : black);
-        mvaddch (win->yoffset, win->xoffset + i, menu[*index + i]);
+    for (i = 0; (i < win->xsize) && (menu[_index + i] != 0); i++) {
+        set_color (((menu[_index + i] >= 'A') && (menu[_index + i] <= 'Z')) ? iblue : black);
+        mvaddch (win->yoffset, win->xoffset + i, menu[_index + i]);
     }
     set_color (white);
 
     set_color (blue);
-    if (*index > 0) {
+    if (_index > 0) {
         mvaddch (win->yoffset, win->xoffset, ACS_LARROW);
     }
-    if ((int)strlen (menu) - *index > win->xsize) {
+    if ((int)strlen (menu) - _index > win->xsize) {
         mvaddch (win->yoffset, win->xoffset + win->xsize - 1, ACS_RARROW);
     }
     set_color (white);
@@ -190,10 +196,18 @@ void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *in
     }
     VERBOSE (DEBUG, fprintf (stderr, "rem: %d\n", rem));
 
-    if ((page + *index_y == n - 1) && (*index_x > rem - 1)) {
-        *index_x = rem - 1;
+    int _index_x = (index_x) ? *index_x : 0;
+    int _index_y = (index_y) ? *index_y : 0;
+    if ((page + _index_y == n - 1) && (_index_x > rem - 1)) {
+        _index_x = rem - 1;
+    }
+    int index = page + _index_y + n * _index_x;
+    if (index_x) {
+        *index_x = _index_x;
+    }
+    if (index_y) {
+        *index_y = _index_y;
     }
-    int index = page + *index_y + n * *index_x;
     VERBOSE (DEBUG, fprintf (stderr, "index: %d\n", index));
 
     set_color (white);
@@ -282,6 +296,9 @@ void elementwindow (window_t *win, char *status, int *index)
     if (_index < 0) {
         _index = 0;
     }
+    if (index) {
+        *index = _index;
+    }
 
     for (i = 0; (i < win->xsize) && (status[_index + i] != 0); i++) {
         mvaddch (win->yoffset, win->xoffset + i, status[_index + i]);
@@ -295,10 +312,6 @@ void elementwindow (window_t *win, char *status, int *index)
         mvaddch (win->yoffset, win->xoffset + win->xsize - 1, ACS_RARROW);
     }
     set_color (white);
-
-    if (index) {
-        *index = _index;
-    }
 }
 
 char *getwindow (char *msg, window_t *win, int length, int size, char *init)
@@ -467,6 +480,13 @@ int askwindow (char *msg, window_t *win, char *ok, char *ko)
 
 char *filewindow (char *name, window_t *win)
 {
+    static char *_help =
+        "<h> Help message\n"
+        "<i> Move up\n"
+        "<k> Move down\n"
+        "<q> Quit view mode\n"
+        ;
+
     char *buffer = loadfile (name);
     if (buffer == NULL) {
         return strdupcat ("Can't open file '", name, "'", NULL);
@@ -475,7 +495,7 @@ char *filewindow (char *name, window_t *win)
     free (buffer);
 
     char *title = strdupcat ("File: ", name, NULL);
-    set_color (white);
+    set_color (black);
     _dobound (win->xsize, win->ysize, win->xoffset, win->yoffset);
     _displaytitle (title, win->xoffset, win->yoffset, win->xsize);
 
@@ -502,6 +522,12 @@ char *filewindow (char *name, window_t *win)
         case 'q':
             stop = 1;
             break;
+        case 'h':
+            helpwindow (_help, (win->xsize - strmaxlen (_help, '\n')) / 2, 3 * win->yoffset);
+            while (getch () == ERR) {
+                usleep (200 * 1000);
+            }
+            break;
         case 'i':
         case KEY_UP:
             if (skip > 0) {
@@ -516,7 +542,7 @@ char *filewindow (char *name, window_t *win)
             break;
         }
     }
-    set_color (black);
+    set_color (white);
 
     freelines (lines);
     free (title);
diff --git a/fm.c b/fm.c
index 0e0ad0bbdc425420d012eec8fd16e227b49fab8a..14b28d160c11689c7ea00b6c0204a54467a430f2 100644 (file)
--- a/fm.c
+++ b/fm.c
@@ -52,11 +52,11 @@ char *menu = "Help View Copy Move Rename Delete Newdir Select Filter Xmod Quit";
 int usage (int ret)
 {
     FILE *fd = ret ? stderr : stdout;
-    fprintf (fd, "usage: %s [-d dir] [-h] [-w]\n", progname);
+    fprintf (fd, "usage: %s [-d dir] [-h] [-x width] [-y height]\n", progname);
     fprintf (fd, " -d: dir name (%s)\n", (dirname[0]) ? dirname[0] : ".");
     fprintf (fd, " -h: help message\n");
-    fprintf (fd, " -x: screen height (%d)\n", (height) ? height : LINES);
     fprintf (fd, " -x: screen width (%d)\n", (width) ? width : COLS);
+    fprintf (fd, " -y: screen height (%d)\n", (height) ? height : LINES);
     fprintf (fd, "%s version %s\n", progname, version);
 
     return ret;
@@ -265,6 +265,13 @@ int main (int argc, char *argv[])
                 page[panel]++;
             }
             break;
+        case 'H':
+        case 'h':
+            helpwindow (help, (width - strmaxlen (help, '\n')) / 2, 3 * yoffset);
+            while (getch () == ERR) {
+                usleep (200 * 1000);
+            }
+            break;
         case KEY_UP:
         case 'i':
             if (index_y[panel]> 0) {
@@ -434,13 +441,19 @@ int main (int argc, char *argv[])
                 for (i = 0; i < MAXPANELS; i++) {
                     elementwindow (winelem[i], "", NULL);
                 }
+                menuwindow (winmenu, "Help up(I) down(J) Quit", NULL);
                 elementwindow (winelem[0], current->name, NULL);
-                string = filewindow (current->name, winscreen);
-                if (string) {
-                    msgwindow (string, winscreen, 0);
-                    getch ();
-                    free (string);
+                {
+                    char *src = strdupcat (dirname[panel], SEPARATOR, current->name, NULL);
+                    char *msg = filewindow (src, winscreen);
+                    if (msg) {
+                        msgwindow (msg, winscreen, 0);
+                        getch ();
+                        free (msg);
+                    }
+                    free (src);
                 }
+                menuwindow (winmenu, menu, &index_menu);
                 break;
             case ALT_X: /* chmod */
                 string = getwindow ("Change to mode", winscreen, 4, 4, "0644");
@@ -502,6 +515,7 @@ int main (int argc, char *argv[])
 /* test: { sleep 1; echo -en '\eq'; sleep 1; echo -en '\e'; sleep 1; echo -en '\eq'; sleep 1; echo; } | fm.exe */
 
 /* Help */
+/* test: { sleep 1; echo -n 'h'; sleep 1; echo ""; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -d . -d /dev -d .. */
 /* test: { sleep 1; echo -en '\eh'; sleep 1; echo ""; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -d . -d /dev -d .. */
 
 /* Navigation */
@@ -543,8 +557,14 @@ int main (int argc, char *argv[])
 
 /* Chmod */
 /* test: touch .a && { sleep 1; echo -en 'k\es'; sleep 1; echo -en '\ex'; sleep 1; echo -n 0640; sleep 1; echo; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe && rm .a */
-/* test: mkdir .a && { sleep 1; echo -en 'k\es'; sleep 1; echo -en '\ex'; sleep 1; echo -n 0750; sleep 1; echo; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe && rmdir .a */
+/* test: mkdir .a .a/b && { sleep 1; echo -en 'k\es'; sleep 1; echo -en '\ex'; sleep 1; echo -n 0750; sleep 1; echo; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe && rmdir .a/b .a */
+/* test: touch .a && { sleep 1; echo -en 'k\es'; sleep 1; echo -en '\ex'; sleep 1; echo -n 0649; sleep 1; echo; sleep 1; echo; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe && rm .a */
 /* test: touch .a && { sleep 1; echo -en 'k\es'; sleep 1; echo -en '\ex'; sleep 1; echo -n 0649; sleep 1; echo; sleep 1; echo; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe && rm .a */
-/* test: touch .a && { sleep 1; echo -en 'k\es'; sleep 1; echo -en '\ex'; sleep 1; echo -en '\e'; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe && rm .a */
+/* test: ln -s .b .a && { sleep 1; echo -en 'k\es'; sleep 1; echo -en '\ex'; sleep 1; echo; sleep 1; echo ; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe && rm .a */
+
+/* View */
+/* test: cp fm.c .a && { sleep 1; echo -n 'k'; sleep 1; echo -en '\ev'; sleep 1; for i in $(seq 1 100); do echo -n k; done; sleep 1; for i in $(seq 1 110); do echo -n i; done; sleep 1; echo -n h; sleep 1; echo; sleep 1;  echo -n q; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -x 60 -y 20 && rm .a */
+/* test: mkdir .a && { sleep 1; echo -n 'k'; sleep 1; echo -en '\ev'; sleep 1; echo; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -x 60 -y 20 && rmdir .a */
+/* test: ln -s .b .a && { sleep 1; echo -n 'k'; sleep 1; echo -en '\ev'; sleep 1; echo; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -x 60 -y 20 && rm .a */
 
 /* vim: set ts=4 sw=4 et: */
index fac586eebb7a4b920c214896574547e6289a4647..6d74df04dbd00ea08e6b7b76996ad1a4c988aa0f 100644 (file)
@@ -500,16 +500,16 @@ char *processdelete (char *name)
                 if (msg == NULL) {
                     VERBOSE (DEBUG, fprintf (stderr, "rmdir '%s'\n", name));
                     if (rmdir (name) != 0) {
-                        msg = strdupcat ("Can't remove directory '", name, "'");
+                        msg = strdupcat ("Can't remove directory '", name, "'", NULL);
                     }
                 }
             } else {
-                msg = strdupcat ("Can't open directory '", name, "'");
+                msg = strdupcat ("Can't open directory '", name, "'", NULL);
             }
         } else {
             VERBOSE (DEBUG, fprintf (stderr, "unlink '%s'\n", name));
             if (unlink (name) != 0) {
-                msg = strdupcat ("Can't remove file '", name, "'");
+                msg = strdupcat ("Can't remove file '", name, "'", NULL);
             }
         }
     } else {
@@ -577,16 +577,16 @@ char *processchmod (char *name, int mode)
                 if (msg == NULL) {
                     VERBOSE (DEBUG, fprintf (stderr, "chmod '%s' to 0%o\n", name, mode));
                     if (chmod (name, mode) != 0) {
-                        msg = strdupcat ("Can't change mode ", octal, " for directory '", name, "'");
+                        msg = strdupcat ("Can't change mode ", octal, " for directory '", name, "'", NULL);
                     }
                 }
             } else {
-                msg = strdupcat ("Can't open directory '", name, "'");
+                msg = strdupcat ("Can't open directory '", name, "'", NULL);
             }
         } else {
             VERBOSE (DEBUG, fprintf (stderr, "chmod  '%s' to 0%o\n", name, mode));
             if (chmod (name, mode) != 0) {
-                msg = strdupcat ("Can't change mode ", octal, " for file '", name, "'");
+                msg = strdupcat ("Can't change mode ", octal, " for file '", name, "'", NULL);
             }
         }
         free (octal);