cleaner version of viewer
authorLaurent Mazet <mazet@softndesign.org>
Fri, 17 Jan 2025 22:53:16 +0000 (23:53 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Fri, 17 Jan 2025 22:53:16 +0000 (23:53 +0100)
display.c
display.h
fm.c
function.c
function.h
view.c [deleted file]
view.h [deleted file]

index cc7d623b9b073bbc7aec9035e1d79269844ccf85..2a8759f6a0f4a85ff3bf0ca6b5bef88c698fe20e 100644 (file)
--- 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: */
index 853a3bb19be9d834908e72a9c3a249ffa79115e1..e45887e4d2cb1858a2e83318ce8632938a99c978 100644 (file)
--- 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 cc83ec3ebf7fc29383891c8e91cace3ccc8bc851..5934865275241462dae6e90c671ec77a5965dd0c 100644 (file)
--- 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 <curses.h>
 #include <stdio.h>
@@ -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 */
index 7b0a5a6f60e2b8479128759d1f114ef80b39c08a..fac586eebb7a4b920c214896574547e6289a4647 100644 (file)
@@ -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: */
index 8fcfaab621e76603ab14d1efd553b61bba1a3be6..0aaac12eff3536ed224dd5d768e4a7b1bfe611f9 100644 (file)
@@ -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 (file)
index 172ede8..0000000
--- a/view.c
+++ /dev/null
@@ -1,134 +0,0 @@
-#include <curses.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#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 (file)
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: */