-
Notifications
You must be signed in to change notification settings - Fork 0
/
plom-ii-view.c
109 lines (98 loc) · 2.45 KB
/
plom-ii-view.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <ncurses.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <sys/stat.h>
int main (int argc, char *argv[]) {
// Try to initialize map from command line arguments.
FILE * file;
if (argc != 2 && argc != 3 ||
!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) {
printf("IRC viewer.\n");
exit(0); }
else if (argc == 2) {
file = fopen(argv[1], "r"); }
else if (argc == 3) {
printf("In-files not yet implemented.\n");
exit(0); }
// Initialize screen.
WINDOW * screen = initscr();
curs_set(0);
timeout(10);
keypad(screen, TRUE);
noecho();
int rows, cols;
getmaxyx(screen, rows, cols);
int y, x, l, key, start = 0;
char line[1024], end = 0;
struct stat s;
stat(argv[1], &s);
int mtime = s.st_mtime;
while (1) {
stat(argv[1], &s);
fseek(file, start, 0);
for (y = 0; y < rows; y++) {
if (fgets(line, 1024, file))
l = strlen(line);
else {
l = 0;
end = 1; }
if (l && y == rows - 1)
end = 0;
for (x = 0; x < cols; x++)
if (x < l)
mvaddch(y, x, line[x]);
else
mvaddch(y, x, ' '); }
refresh();
key = getch();
if (!key)
continue;
else if (key == 'q')
break;
else if (key == KEY_UP || key == KEY_PPAGE) {
l = 1;
for (x = start - 2; ; x--) {
if (x <= 0) {
start = 0;
break; }
fseek(file, x, 0);
y = (char) fgetc(file);
if (y == '\n') {
if (key == KEY_UP || l == rows) {
start = x + 1;
break; }
l++; } } }
else if (key == KEY_DOWN && !end) {
fseek(file, start, 0);
fgets(line, 1024, file);
start = ftell(file); }
else if (key == KEY_NPAGE && !end) {
l = start;
for (x = 0; x < rows; x++) {
fseek(file, l, 0);
for (y = 0; y < rows; y++) {
if (y == 1)
l = ftell(file);
if (!fgets(line, 1024, file)) {
y = 0;
break; } }
if (!y)
break;
start = l; } }
else if (mtime != s.st_mtime) {
mtime = s.st_mtime;
l = start;
for (x = 0; ; x++) {
fseek(file, l, 0);
for (y = 0; y < rows; y++) {
if (y == 1)
l = ftell(file);
if (!fgets(line, 1024, file)) {
y = 0;
break; } }
if (!y)
break;
start = l; } } }
endwin();
exit(0); }