From b5181b73201ddc370d462c0b09fd5329d6ff637d Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Sat, 18 Jan 2025 15:14:41 +0100 Subject: [PATCH] add tests and memory fixes --- display.c | 66 +++++++++++++++++++++++++++++++++++++----------------- fm.c | 38 +++++++++++++++++++++++-------- function.c | 12 +++++----- 3 files changed, 81 insertions(+), 35 deletions(-) diff --git a/display.c b/display.c index 2e5ff7c..26e2837 100644 --- a/display.c +++ b/display.c @@ -2,6 +2,7 @@ #include #include #include +#include #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 = + " Help message\n" + " Move up\n" + " Move down\n" + " 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 0e0ad0b..14b28d1 100644 --- 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: */ diff --git a/function.c b/function.c index fac586e..6d74df0 100644 --- a/function.c +++ b/function.c @@ -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); -- 2.30.2