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: */
/* 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>
#include "debug.h"
#include "display.h"
#include "function.h"
+#include "view.h"
/* global constants */
}
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");
--- /dev/null
+#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: */