From ee038986a96bcea12b0c2cc410278dbb23ce392b Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Sun, 12 Jan 2025 00:00:24 +0100 Subject: [PATCH] add rename function --- display.c | 7 +++++-- display.h | 2 +- fm.c | 33 +++++++++++++++++++++++++++++---- function.c | 21 +++++++++++++++++++++ function.h | 2 ++ 5 files changed, 58 insertions(+), 7 deletions(-) diff --git a/display.c b/display.c index 50c92dd..7a3e3b8 100644 --- a/display.c +++ b/display.c @@ -296,12 +296,15 @@ void elementwindow (window_t *win, char *status, int *index) set_color (white); } -char *getwindow (char *msg, window_t *win, int length, int size) +char *getwindow (char *msg, window_t *win, int length, int size, char *init) { int j; - char *name = (char *) calloc (1, size + 1); + char *name = (char *) calloc (size + 1, 1); CHECKALLOC (name); memset (name, ' ', size); + if (init) { + memcpy (name, init, strlen (init)); + } int xoffset = win->xoffset + (win->xsize - strlen (msg) - 1 - length) / 2; if (xoffset < 1) { diff --git a/display.h b/display.h index 98a5bf1..d4e4c60 100644 --- a/display.h +++ b/display.h @@ -11,7 +11,7 @@ void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *in void elementwindow (window_t *win, char *status, int *index); -char *getwindow (char *msg, window_t *win, int length, int size); +char *getwindow (char *msg, window_t *win, int length, int size, char *init); void msgwindow (char *msg, window_t *win, int length); diff --git a/fm.c b/fm.c index d3a9ef0..38e0425 100644 --- a/fm.c +++ b/fm.c @@ -18,6 +18,8 @@ /* global constants */ #define MAXPANES 2 +#define MAXFILTER 32 +#define MAXFNAME 64 #define MAXSTATUS 128 /* static variables */ @@ -166,6 +168,13 @@ int main (int argc, char *argv[]) windir[i]->ysize = height - 2 * yoffset; } + /* init screen window */ + window_t *winscreen = allocwindow (); + winscreen->xoffset = xoffset; + winscreen->xsize = width - 2 * xoffset; + winscreen->yoffset = yoffset; + winscreen->ysize = height - 2 * yoffset; + /* init status windows */ window_t *winelem[MAXPANES] = {0}; for (i = 0; i < MAXPANES; i++) { @@ -186,6 +195,7 @@ int main (int argc, char *argv[]) /* event loop */ int stop = 0; while (!stop) { + int len = 0; elem_t *current = NULL; char *string = NULL; @@ -301,7 +311,7 @@ int main (int argc, char *argv[]) case ALT_E: /* edit */ break; case ALT_F: /* filter */ - string = getwindow ("Set filter", windir[pane], 8, 32); + string = getwindow ("Set filter", winscreen, MAXFILTER / 2, MAXFILTER, NULL); if (string) { filterlist (list[pane], string); free (string); @@ -316,14 +326,14 @@ int main (int argc, char *argv[]) case ALT_M: /* move */ break; case ALT_N: /* new dir */ - string = getwindow ("New directory", windir[pane], 8, 32); + string = getwindow ("New directory", winscreen, MAXFNAME / 2, MAXFNAME, NULL); if (string) { #ifdef WIN32 if (mkdir (string) != 0) { #else if (mkdir (string, 0750) != 0) { #endif - msgwindow ("Can't create directory", windir[pane], 0); + msgwindow ("Can't create directory", winscreen, 0); getch (); } freelist (list[pane]); @@ -332,11 +342,26 @@ int main (int argc, char *argv[]) } break; case ALT_Q: /* quit */ - if (askwindow (" Restart (Y/N) ", windir[pane], "Yy", "Nn") == 1) { + if (askwindow (" Restart (Y/N) ", winscreen, "Yy", "Nn") == 1) { stop = 1; } break; case ALT_R: /* rename */ + current = list[pane]->tab + windir[pane]->index; + len = (strlen (current->name) > MAXFNAME * 80 / 100) ? 2 * MAXFNAME + 1: MAXFNAME + 1; + string = getwindow ("Rename", winscreen, MAXFNAME / 2, len, current->name); + if (string) { + struct stat sb; + if ((stat (string, &sb) == 0) || (rename (current->name, string) != 0)) { + char *buf = strdupcat ("Can't rename file to '", string, "'", NULL); + msgwindow (buf, winscreen, 0); + getch (); + free (buf); + } + freelist (list[pane]); + list[pane] = NULL; + free (string); + } break; case ALT_S: /* select */ current = list[pane]->tab + windir[pane]->index; diff --git a/function.c b/function.c index f18804d..5bf83e9 100644 --- a/function.c +++ b/function.c @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -32,6 +33,26 @@ int strmaxlen (char *str, char ch) return len; } +char *strdupcat (char *init, ...) +{ + va_list va; + va_start (va, init); + + char *string = strdup (init); + for (;;) { + char *buf = va_arg (va, char *); + if (buf == NULL) { + break; + } + string = (char *) realloc (string, strlen (string) + strlen (buf) + 1); + strcat (string, buf); + } + + va_end (va); + + return string; +} + char *newfilename (char *dirname, char *filename) { char *name = (char *) calloc (strlen (dirname) + strlen (SEPARATOR) + strlen (filename) + 1, 1); diff --git a/function.h b/function.h index 99be0a8..838f0ce 100644 --- a/function.h +++ b/function.h @@ -17,6 +17,8 @@ int strmaxlen (char *str, char ch); +char *strdupcat (char *init, ...); + char *newfilename (char *dirname, char *filename); list_t *alloclist (void); -- 2.30.2