From: Laurent MAZET Date: Fri, 17 Jan 2025 17:49:52 +0000 (+0100) Subject: first version of view X-Git-Tag: v1.0~33 X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=193a77da9ba434bbc083c9652b3b3a8602b35827;p=fm.git first version of view --- diff --git a/display.c b/display.c index b3dd004..cc7d623 100644 --- 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: */ diff --git a/display.h b/display.h index d4e4c60..853a3bb 100644 --- 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 f11f31b..cc83ec3 100644 --- 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 #include @@ -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 index 0000000..172ede8 --- /dev/null +++ b/view.c @@ -0,0 +1,134 @@ +#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 new file mode 100644 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: */