From f393715b18a0e5450a62489f76cfcf9b2855626e Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Fri, 17 Jan 2025 23:53:16 +0100 Subject: [PATCH] cleaner version of viewer --- display.c | 80 ++++++++++++++++++++++++-------- display.h | 2 +- fm.c | 11 +++-- function.c | 81 ++++++++++++++++++++++++++++++++ function.h | 6 +++ view.c | 134 ----------------------------------------------------- view.h | 10 ---- 7 files changed, 156 insertions(+), 168 deletions(-) delete mode 100644 view.c delete mode 100644 view.h diff --git a/display.c b/display.c index cc7d623..2a8759f 100644 --- a/display.c +++ b/display.c @@ -272,28 +272,33 @@ void elementwindow (window_t *win, char *status, 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 (status) - *index < win->xsize) { - *index = strlen (status) - win->xsize; + if ((int)strlen (status) - _index < win->xsize) { + _index = strlen (status) - win->xsize; } - if (*index < 0) { - *index = 0; + if (_index < 0) { + _index = 0; } - for (i = 0; (i < win->xsize) && (status[*index + i] != 0); i++) { - mvaddch (win->yoffset, win->xoffset + i, status[*index + i]); + for (i = 0; (i < win->xsize) && (status[_index + i] != 0); i++) { + mvaddch (win->yoffset, win->xoffset + i, status[_index + i]); } set_color (blue); - if (*index > 0) { + if (_index > 0) { mvaddch (win->yoffset, win->xoffset, ACS_LARROW); } - if ((int)strlen (status) - *index > win->xsize) { + if ((int)strlen (status) - _index > win->xsize) { 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) @@ -460,25 +465,62 @@ int askwindow (char *msg, window_t *win, char *ok, char *ko) return stop; } -void viewwindow (char **lines, window_t *win, char *title) +char *filewindow (char *name, window_t *win) { + char *msg = NULL; + + char *buffer = loadfile (name); + char **lines = splitlines (buffer, win->xsize); + free (buffer); + + char *title = strdupcat ("File: ", name, NULL); set_color (white); _dobound (win->xsize, win->ysize, win->xoffset, win->yoffset); _displaytitle (title, win->xoffset, win->yoffset, win->xsize); - int i, j; - for (i = 0; i < win->ysize; i++) { - for (j = 0; j < win->xsize; j++) { - mvaddch (win->yoffset + i, win->xoffset + j, ' '); + int skip = 0; + int stop = 0; + while (!stop) { + int i, j; + int eol = 0; + for (i = 0; i < win->ysize; i++) { + for (j = 0; j < win->xsize; j++) { + mvaddch (win->yoffset + i, win->xoffset + j, ' '); + } + if (!eol) { + if (lines[skip + i] != NULL) { + mvaddstr (win->yoffset + i, win->xoffset, lines[skip + i]); + } else { + eol = 1; + } + } } - } - for (i = 0; (i < win->ysize) && (lines[i] != NULL); i++) { - mvaddstr (win->yoffset + i, win->xoffset, lines[i]); + switch (getch ()) { + case KEY_ESC: + case 'q': + stop = 1; + break; + case 'i': + case KEY_UP: + if (skip > 0) { + skip--; + } + break; + case 'k': + case KEY_DOWN: + if (lines[skip + 1] != NULL) { + skip++; + } + break; + } } set_color (black); - return j; + freelines (lines); + free (title); + + return msg; } /* vim: set ts=4 sw=4 et: */ diff --git a/display.h b/display.h index 853a3bb..e45887e 100644 --- a/display.h +++ b/display.h @@ -17,7 +17,7 @@ void msgwindow (char *msg, window_t *win, int length); int askwindow (char *msg, window_t *win, char *ok, char *ko); -void viewwindow (char **line, window_t *win, char *title); +char *filewindow (char *name, window_t *win); #define KEY_DELETE 0x014a #define KEY_ESC 0x1b diff --git a/fm.c b/fm.c index cc83ec3..5934865 100644 --- a/fm.c +++ b/fm.c @@ -1,8 +1,8 @@ /* depend: */ /* cflags: */ -/* linker: debug.o display.o function.o view.o -lcurses */ -/* doslnk: debug.o display.o function.o view.o -lpdc~1 -lreg~1 */ -/* winlnk: debug.o display.o function.o view.o -lpdcurses -lregex */ +/* linker: debug.o display.o function.o -lcurses */ +/* doslnk: debug.o display.o function.o -lpdc~1 -lreg~1 */ +/* winlnk: debug.o display.o function.o -lpdcurses -lregex */ #include #include @@ -14,7 +14,6 @@ #include "debug.h" #include "display.h" #include "function.h" -#include "view.h" /* global constants */ @@ -432,6 +431,10 @@ int main (int argc, char *argv[]) break; case ALT_V: /* view */ current = list[panel]->tab + windir[panel]->index; + for (i = 0; i < MAXPANELS; i++) { + elementwindow (winelem[i], "", NULL); + } + elementwindow (winelem[0], current->name, NULL); filewindow (current->name, winscreen); break; case ALT_X: /* chmod */ diff --git a/function.c b/function.c index 7b0a5a6..fac586e 100644 --- a/function.c +++ b/function.c @@ -598,4 +598,85 @@ char *processchmod (char *name, int mode) return msg; } +static char *_readstream (FILE *sd) +{ + char *buffer = NULL; + size_t size = 0; + do { + size += BUFMAX + (size == 0); + buffer = (char *) realloc (buffer, size); + memset (buffer + size - BUFMAX - 1, 0, BUFMAX + 1); + } while (fread (buffer + size - BUFMAX - 1, 1, BUFMAX, sd) > 0); + + /* check size */ + if (buffer[0] == '\0') { + free (buffer); + buffer = NULL; + } + + return buffer; +} + +char *loadfile (char *name) +{ + int status = -1; + char *buffer = NULL; + + VERBOSE (DEBUG, fprintf (stdout, "open file: %s\n", name)); + FILE *fd = fopen (name, "r"); + if (fd != NULL) { + buffer = _readstream (fd); + status = fclose (fd); + } + + if (status == -1) { + free (buffer); + buffer = NULL; + } + + return buffer; +} + +char **splitlines (char *buffer, int max) +{ + int n = 0; + + char **lines = NULL; + int i, j; + char *line = (char *) calloc (max + 1, sizeof (char)); + for (i = j = 0; buffer[i] != '\0'; i++) { + if (buffer[i] >= ' ') { + line[j++] = buffer[i]; + } + if ((j == max) || (buffer[i] == '\n')) { + lines = (char **) realloc (lines, (n + 2) * sizeof (char *)); + lines[n] = line; + lines[n + 1] = NULL; + line = calloc (max + 1, sizeof (char)); + n++; + j = 0; + } + } + if (line[0] != '\0') { + lines = (char **) realloc (lines, (n + 2) * sizeof (char *)); + lines[n++] = line; + } else { + free (line); + } + VERBOSE (DEBUG, fprintf (stdout, "split lines: %d\n", n)); + + return lines; +} + +void freelines (char **lines) +{ + if (lines) { + int i = 0; + while (lines[i]) { + free (lines[i++]); + } + free (lines); + } +} + /* vim: set ts=4 sw=4 et: */ diff --git a/function.h b/function.h index 8fcfaab..0aaac12 100644 --- a/function.h +++ b/function.h @@ -59,6 +59,12 @@ char *processmove (char *dest, char *src); char *processchmod (char *name, int mode); +char *loadfile (char *name); + +char **splitlines (char *buffer, int max); + +void freelines (char **lines); + #endif /* __FUNCTION_H__ */ /* vim: set ts=4 sw=4 et: */ diff --git a/view.c b/view.c deleted file mode 100644 index 172ede8..0000000 --- a/view.c +++ /dev/null @@ -1,134 +0,0 @@ -#include -#include -#include -#include - -#include "debug.h" -#include "display.h" -#include "function.h" - -#include "view.h" - -#define BUFFERSIZE 4096 - -static char *_read_stream (FILE *sd) -{ - char *buffer = NULL; - size_t size = 0; - do { - size += BUFFERSIZE + (size == 0); - buffer = (char *) realloc (buffer, size); - memset (buffer + size - BUFFERSIZE - 1, 0, BUFFERSIZE + 1); - } while (fread (buffer + size - BUFFERSIZE - 1, 1, BUFFERSIZE, sd) > 0); - - /* check size */ - if (buffer[0] == '\0') { - free (buffer); - buffer = NULL; - } - - return buffer; -} - -char *load_file (char *name) -{ - int status = -1; - char *buffer = NULL; - - VERBOSE (DEBUG, fprintf (stdout, "open file: %s\n", name)); - FILE *fd = fopen (name, "r"); - if (fd != NULL) { - buffer = _read_stream (fd); - status = fclose (fd); - } - - if (status == -1) { - free (buffer); - buffer = NULL; - } - - return buffer; -} - -char **split_lines (char *buffer, int max) -{ - int n = 0; - - char **lines = NULL; - int i, j; - char *line = (char *) calloc (max + 1, sizeof (char)); - for (i = j = 0; buffer[i] != '\0'; i++) { - if (buffer[i] >= ' ') { - line[j++] = buffer[i]; - } - if ((j == max) || (buffer[i] == '\n')) { - lines = (char **) realloc (lines, (n + 2) * sizeof (char *)); - lines[n] = line; - lines[n + 1] = NULL; - line = calloc (max + 1, sizeof (char)); - n++; - j = 0; - } - } - if (line[0] != '\0') { - lines = (char **) realloc (lines, (n + 2) * sizeof (char *)); - lines[n++] = line; - } else { - free (line); - } - VERBOSE (DEBUG, fprintf (stdout, "split lines: %d\n", n)); - - return lines; -} - -void free_lines (char **lines) -{ - int i = 0; - - if (!lines) { - return; - } - - while (lines[i]) { - free (lines[i++]); - } - free (lines); -} - -char *filewindow (char *name, window_t *win) -{ - char *msg = NULL; - - char *buffer = load_file (name); - char **lines = split_lines (buffer, win->xsize); - free (buffer); - - char *title = strdupcat ("File: ", name, NULL); - - int skip = 0; - int stop = 0; - while (!stop) { - viewwindow (lines + skip, win, title); - - int key = getch (); - switch (key) { - case KEY_ESC: - case 'q': - stop = 1; - break; - case 'i': - case KEY_UP: - skip = (skip > 0) ? skip - 1 : skip; - break; - case 'k': - case KEY_DOWN: - skip = (lines[skip + 1] != NULL) ? skip + 1 : skip; - break; - } - } - free (title); - - return msg; -} - -/* vim: set ts=4 sw=4 et: */ diff --git a/view.h b/view.h deleted file mode 100644 index a2539da..0000000 --- a/view.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef __VIEW_H__ -#define __VIEW_H__ - -#include "type.h" - -char *filewindow (char *name, window_t *win); - -#endif /* __VIEW_H__ */ - -/* vim: set ts=4 sw=4 et: */ -- 2.30.2