first version of view
authorLaurent MAZET <laurent.mazet@thalesgroup.com>
Fri, 17 Jan 2025 17:49:52 +0000 (18:49 +0100)
committerLaurent MAZET <laurent.mazet@thalesgroup.com>
Fri, 17 Jan 2025 17:49:52 +0000 (18:49 +0100)
display.c
display.h
fm.c
view.c [new file with mode: 0644]
view.h [new file with mode: 0644]

index b3dd004df784bb2c9cc543ac34b1b33232a88c58..cc7d623b9b073bbc7aec9035e1d79269844ccf85 100644 (file)
--- a/display.c
+++ b/display.c
@@ -460,4 +460,25 @@ int askwindow (char *msg, window_t *win, char *ok, char *ko)
     return stop;
 }
 
+void viewwindow (char **lines, window_t *win, char *title)
+{
+    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, ' ');
+        }
+    }
+
+    for (i = 0; (i < win->ysize) && (lines[i] != NULL); i++) {
+        mvaddstr (win->yoffset + i, win->xoffset, lines[i]);
+    }
+    set_color (black);
+
+    return j;
+}
+
 /* vim: set ts=4 sw=4 et: */
index d4e4c60f878d74020718f4005d05af64702d35bc..853a3bb19be9d834908e72a9c3a249ffa79115e1 100644 (file)
--- a/display.h
+++ b/display.h
@@ -17,6 +17,8 @@ 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);
+
 #define KEY_DELETE 0x014a
 #define KEY_ESC 0x1b
 
diff --git a/fm.c b/fm.c
index f11f31bc79fede6abd07f28692b6c391f427c492..cc83ec3ebf7fc29383891c8e91cace3ccc8bc851 100644 (file)
--- a/fm.c
+++ b/fm.c
@@ -1,8 +1,8 @@
 /* depend: */
 /* cflags: */
-/* 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 */
+/* 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 */
 
 #include <curses.h>
 #include <stdio.h>
@@ -14,6 +14,7 @@
 #include "debug.h"
 #include "display.h"
 #include "function.h"
+#include "view.h"
 
 /* global constants */
 
@@ -430,6 +431,8 @@ int main (int argc, char *argv[])
                 }
                 break;
             case ALT_V: /* view */
+                current = list[panel]->tab + windir[panel]->index;
+                filewindow (current->name, winscreen);
                 break;
             case ALT_X: /* chmod */
                 string = getwindow ("Change to mode", winscreen, 4, 4, "0644");
diff --git a/view.c b/view.c
new file mode 100644 (file)
index 0000000..172ede8
--- /dev/null
+++ b/view.c
@@ -0,0 +1,134 @@
+#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
new file mode 100644 (file)
index 0000000..a2539da
--- /dev/null
+++ b/view.h
@@ -0,0 +1,10 @@
+#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: */