|
|
1.1 root 1: #include <stdio.h>
2: #include <string.h>
3:
4: #include "dirwrap.h"
5:
6: #include "ciolib.h"
7: #include "keys.h"
8: #include "cterm.h"
9:
1.1.1.2 ! root 10: #define SCROLL_LINES 100000
1.1 root 11: #define BUF_SIZE 1024
12:
1.1.1.2 ! root 13: struct cterminal *cterm;
1.1 root 14:
15: void viewscroll(void)
16: {
17: int top;
18: int key;
19: int i;
20: struct text_info txtinfo;
21:
22: gettextinfo(&txtinfo);
1.1.1.2 ! root 23: cterm->backpos+=cterm->height;
! 24: if(cterm->backpos>cterm->backlines) {
! 25: memmove(cterm->scrollback,cterm->scrollback+cterm->width*2*(cterm->backpos-cterm->backlines),cterm->width*2*(cterm->backlines-(cterm->backpos-cterm->backlines)));
! 26: cterm->backpos=cterm->backlines;
! 27: }
! 28: gettext(1,1,txtinfo.screenwidth,txtinfo.screenheight,cterm->scrollback+(cterm->backpos)*cterm->width*2);
! 29: top=cterm->backpos;
1.1 root 30: for(i=0;!i;) {
31: if(top<1)
32: top=1;
1.1.1.2 ! root 33: if(top>cterm->backpos)
! 34: top=cterm->backpos;
! 35: puttext(1,1,txtinfo.screenwidth,txtinfo.screenheight,cterm->scrollback+(txtinfo.screenwidth*2*top));
1.1 root 36: key=getch();
37: switch(key) {
38: case 0xff:
39: case 0:
40: switch(key|getch()<<8) {
41: case CIO_KEY_UP:
42: top--;
43: break;
44: case CIO_KEY_DOWN:
45: top++;
46: break;
47: case CIO_KEY_PPAGE:
48: top-=txtinfo.screenheight;
49: break;
50: case CIO_KEY_NPAGE:
51: top+=txtinfo.screenheight;
52: break;
53: }
54: break;
55: case 'j':
56: case 'J':
57: top--;
58: break;
59: case 'k':
60: case 'K':
61: top++;
62: break;
63: case 'h':
64: case 'H':
65: top-=txtinfo.screenheight;
66: break;
67: case 'l':
68: case 'L':
69: top+=txtinfo.screenheight;
70: break;
71: case '\033':
72: i=1;
73: break;
74: }
75: }
76: return;
77: }
78:
79: void lfexpand(char *buf, int *len)
80: {
81: char newbuf[BUF_SIZE*2];
82: int newlen=0;
83: int i;
84:
85: for(i=0; i<*len; i++) {
86: if(buf[i]=='\n') {
87: newbuf[newlen++]='\r';
88: }
89: newbuf[newlen++]=buf[i];
90: }
91: *len=newlen;
92: memcpy(buf, newbuf, newlen);
93:
94: return;
95: }
96:
97: int main(int argc, char **argv)
98: {
99: struct text_info ti;
100: FILE *f;
101: char buf[BUF_SIZE*2]; /* Room for lfexpand */
102: int len;
1.1.1.2 ! root 103: int speed=0;
1.1 root 104: char *scrollbuf;
105: char *infile=NULL;
106: char title[MAX_PATH+1];
107: int expand=0;
1.1.1.2 ! root 108: int ansi=0;
1.1 root 109: int i;
110:
111: /* Parse command line */
112: for(i=1; i<argc; i++) {
113: if(argv[i][0]=='-') {
114: if(argv[i][1]=='l' && argv[i][2]==0)
115: expand=1;
1.1.1.2 ! root 116: else if(argv[i][1]=='a' && argv[i][2]==0)
! 117: ansi=1;
1.1 root 118: else
119: goto usage;
120: }
121: else {
122: if(infile==NULL)
123: infile=argv[i];
124: else
125: goto usage;
126: }
127: }
128:
1.1.1.2 ! root 129: if(ansi) {
! 130: initciolib(CIOLIB_MODE_ANSI);
! 131: puts("START OF ANSI...");
! 132: }
! 133:
! 134: textmode(C80);
! 135: gettextinfo(&ti);
! 136: if((scrollbuf=malloc(SCROLL_LINES*ti.screenwidth*2))==NULL) {
! 137: cprintf("Cannot allocate memory\n\n\rPress any key to exit.");
! 138: getch();
! 139: return(-1);
! 140: }
! 141:
! 142: cterm=cterm_init(ti.screenheight, ti.screenwidth, 1, 1, SCROLL_LINES, scrollbuf, CTERM_EMULATION_ANSI_BBS);
! 143: if(!cterm) {
! 144: fputs("ERROR Initializing CTerm!\n", stderr);
! 145: return 1;
! 146: }
1.1 root 147: if(infile) {
148: if((f=fopen(infile,"r"))==NULL) {
149: cprintf("Cannot read %s\n\n\rPress any key to exit.",argv[1]);
150: getch();
151: return(-1);
152: }
153: sprintf(title,"SyncView: %s",getfname(argv[1]));
154: }
155: else {
156: f=stdin;
157: strcpy(title,"SyncView: [stdin]");
158: }
159: settitle(title);
160: while((len=fread(buf, 1, BUF_SIZE, f))!=0) {
161: if(expand)
162: lfexpand(buf, &len);
1.1.1.2 ! root 163: cterm_write(cterm, buf, len, NULL, 0, &speed);
! 164: }
! 165: if(ansi) {
! 166: puts("");
! 167: puts("END OF ANSI");
! 168: gettext(1,1,ti.screenwidth,ti.screenheight,scrollbuf);
! 169: puttext_can_move=1;
! 170: puts("START OF SCREEN DUMP...");
! 171: clrscr();
! 172: puttext(1,1,ti.screenwidth,ti.screenheight,scrollbuf);
1.1 root 173: }
1.1.1.2 ! root 174: else
! 175: viewscroll();
1.1 root 176: return(0);
177:
178: usage:
1.1.1.2 ! root 179: cprintf("Usage: %s [-l] [-a] [filename]\r\n\r\n"
1.1 root 180: "Displays the ANSI file filename expanding \\n to \\r\\n if -l is specified.\r\n"
181: "If no filename is specified, reads input from stdin\r\n"
1.1.1.2 ! root 182: "If -a is specified, outputs ANSI to stdout\r\n"
1.1 root 183: "\r\n"
184: "Press any key to exit.");
185: getch();
186: return(-1);
187: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.