diff --git a/30_day/Makefile b/30_day/Makefile index efee1ad..710ced7 100644 --- a/30_day/Makefile +++ b/30_day/Makefile @@ -23,7 +23,7 @@ haribote.img : haribote/ipl20.bin haribote/haribote.sys Makefile \ sosu/sosu.hrb sosu2/sosu2.hrb sosu3/sosu3.hrb \ type/type.hrb iroha/iroha.hrb chklang/chklang.hrb \ notrec/notrec.hrb bball/bball.hrb invader/invader.hrb \ - calc/calc.hrb + calc/calc.hrb tview/tview.hrb $(EDIMG) imgin:../z_tools/fdimg0at.tek \ wbinimg src:haribote/ipl20.bin len:512 from:0 to:0 \ copy from:haribote/haribote.sys to:@: \ @@ -56,6 +56,7 @@ haribote.img : haribote/ipl20.bin haribote/haribote.sys Makefile \ copy from:bball/bball.hrb to:@: \ copy from:invader/invader.hrb to:@: \ copy from:calc/calc.hrb to:@: \ + copy from:tview/tview.hrb to:@: \ copy from:nihongo/nihongo.fnt to:@: \ imgout:haribote.img @@ -100,6 +101,7 @@ full : $(MAKE) -C bball $(MAKE) -C invader $(MAKE) -C calc + $(MAKE) -C tview $(MAKE) haribote.img run_full : @@ -152,6 +154,7 @@ clean_full : $(MAKE) -C bball clean $(MAKE) -C invader clean $(MAKE) -C calc clean + $(MAKE) -C tview clean src_only_full : $(MAKE) -C haribote src_only @@ -183,6 +186,7 @@ src_only_full : $(MAKE) -C bball src_only $(MAKE) -C invader src_only $(MAKE) -C calc src_only + $(MAKE) -C tview src_only -$(DEL) haribote.img refresh : diff --git a/30_day/tview/!cons_9x.bat b/30_day/tview/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/30_day/tview/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/30_day/tview/!cons_nt.bat b/30_day/tview/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/30_day/tview/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/30_day/tview/Makefile b/30_day/tview/Makefile new file mode 100644 index 0000000..1ae00c8 --- /dev/null +++ b/30_day/tview/Makefile @@ -0,0 +1,5 @@ +APP = tview +STACK = 1024k +MALLOC = 0k + +include ../app_make.txt diff --git a/30_day/tview/make.bat b/30_day/tview/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/30_day/tview/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/30_day/tview/tview.c b/30_day/tview/tview.c new file mode 100644 index 0000000..e9c7975 --- /dev/null +++ b/30_day/tview/tview.c @@ -0,0 +1,276 @@ +#include "apilib.h" + +#include + +int strtol(char *s, char **endp, int base); /* 标准函数 */ + +char *skipspace(char *p); +void textview(int win, int w, int h, int xskip, char *p, int tab, int lang); +char *lineview(int win, int w, int y, int xskip, unsigned char *p, int tab, int lang); +int puttab(int x, int w, int xskip, char *s, int tab); + +void HariMain(void) +{ + char winbuf[1024 * 757], txtbuf[240 * 1024]; + int w = 30, h = 10, t = 4, spd_x = 1, spd_y = 1; + int win, i, j, lang = api_getlang(), xskip = 0; + char s[30], *p, *q = 0, *r = 0; + + /*命令行解析*/ + api_cmdline(s, 30); + for (p = s; *p > ' '; p++) { } /*一直读到空格为止*/ + for (; *p != 0; ) { + p = skipspace(p); + if (*p == '-') { + if (p[1] == 'w') { + w = strtol(p + 2, &p, 0); + if (w < 20) { + w = 20; + } + if (w > 126) { + w = 126; + } + } else if (p[1] == 'h') { + h = strtol(p + 2, &p, 0); + if (h < 1) { + h = 1; + } + if (h > 45) { + h = 45; + } + } else if (p[1] == 't') { + t = strtol(p + 2, &p, 0); + if (t < 1) { + t = 4; + } + } else { +err: + api_putstr0(" >tview file [-w30 -h10 -t4]\n"); + api_end(); + } + } else { /*找到文件名*/ + if (q != 0) { + goto err; + } + q = p; + for (; *p > ' '; p++) { } /*一直读到空格为止*/ + r = p; + } + } + if (q == 0) { + goto err; + } + + /*准备窗口*/ + win = api_openwin(winbuf, w * 8 + 16, h * 16 + 37, -1, "tview"); + api_boxfilwin(win, 6, 27, w * 8 + 9, h * 16 + 30, 7); + + /*载入文件*/ + *r = 0; + i = api_fopen(q); + if (i == 0) { + api_putstr0("file open error.\n"); + api_end(); + } + j = api_fsize(i, 0); + if (j >= 240 * 1024 - 1) { + j = 240 * 1024 - 2; + } + txtbuf[0] = 0x0a; /*卫兵用的换行代码*/ + api_fread(txtbuf + 1, j, i); + api_fclose(i); + txtbuf[j + 1] = 0; + q = txtbuf + 1; + for (p = txtbuf + 1; *p != 0; p++) { /*为了让处理变得简单,删掉0x0d的代码*/ + if (*p != 0x0d) { + *q = *p; + q++; + } + } + *q = 0; + + /*主体*/ + p = txtbuf + 1; + for (;;) { + textview(win, w, h, xskip, p, t, lang); + i = api_getkey(1); + if (i == 'Q' || i == 'q') { + api_end(); + } + if ('A' <= i && i <= 'F') { + spd_x = 1 << (i - 'A'); /* 1, 2, 4, 8, 16, 32 */ + } + if ('a' <= i && i <= 'f') { + spd_y = 1 << (i - 'a'); /* 1, 2, 4, 8, 16, 32 */ + } + if (i == '<' && t > 1) { + t /= 2; + } + if (i == '>' && t < 256) { + t *= 2; + } + if (i == '4') { + for (;;) { + xskip -= spd_x; + if (xskip < 0) { + xskip = 0; + } + if (api_getkey(0) != '4') { /*如果没有按下“4”则处理结束*/ + break; + } + } + } + if (i == '6') { + for (;;) { + xskip += spd_x; + if (api_getkey(0) != '6') { + break; + } + } + } + if (i == '8') { + for (;;) { + for (j = 0; j < spd_y; j++) { + if (p == txtbuf + 1) { + break; + } + for (p--; p[-1] != 0x0a; p--) { } /*回溯到上一个字符为0x0a为止*/ + } + if (api_getkey(0) != '8') { + break; + } + } + } + if (i == '2') { + for (;;) { + for (j = 0; j < spd_y; j++) { + for (q = p; *q != 0 && *q != 0x0a; q++) { } + if (*q == 0) { + break; + } + p = q + 1; + } + if (api_getkey(0) != '2') { + break; + } + } + } + } +} + +char *skipspace(char *p) +{ + for (; *p == ' '; p++) { } /*跳过空格*/ + return p; +} + +void textview(int win, int w, int h, int xskip, char *p, int tab, int lang) +{ + int i; + api_boxfilwin(win + 1, 8, 29, w * 8 + 7, h * 16 + 28, 7); + for (i = 0; i < h; i++) { + p = lineview(win, w, i * 16 + 29, xskip, p, tab, lang); + } + api_refreshwin(win, 8, 29, w * 8 + 8, h * 16 + 29); + return; +} + +char *lineview(int win, int w, int y, int xskip, unsigned char *p, int tab, int lang) +{ + int x = - xskip; + char s[130]; + for (;;) { + if (*p == 0) { + break; + } + if (*p == 0x0a) { + p++; + break; + } + if (lang == 0) { /* ASCII */ + if (*p == 0x09) { + x = puttab(x, w, xskip, s, tab); + } else { + if (0 <= x && x < w) { + s[x] = *p; + } + x++; + } + p++; + } + if (lang == 1) { /* SJIS */ + if (*p == 0x09) { + x = puttab(x, w, xskip, s, tab); + p++; + } else if ((0x81 <= *p && *p <= 0x9f) || (0xe0 <= *p && *p <= 0xfc)) { + /*全角字符*/ + if (x == -1) { + s[0] = ' '; + } + if (0 <= x && x < w - 1) { + s[x] = *p; + s[x + 1] = p[1]; + } + if (x == w - 1) { + s[x] = ' '; + } + x += 2; + p += 2; + } else { + if (0 <= x && x < w) { + s[x] = *p; + } + x++; + p++; + } + } + if (lang == 2) { /* EUC */ + if (*p == 0x09) { + x = puttab(x, w, xskip, s, tab); + p++; + } else if (0xa1 <= *p && *p <= 0xfe) { + /*全角字符*/ + if (x == -1) { + s[0] = ' '; + } + if (0 <= x && x < w - 1) { + s[x] = *p; + s[x + 1] = p[1]; + } + if (x == w - 1) { + s[x] = ' '; + } + x += 2; + p += 2; + } else { + if (0 <= x && x < w) { + s[x] = *p; + } + x++; + p++; + } + } + } + if (x > w) { + x = w; + } + if (x > 0) { + s[x] = 0; + api_putstrwin(win + 1, 8, y, 0, x, s); + } + return p; +} + +int puttab(int x, int w, int xskip, char *s, int tab) +{ + for (;;) { + if (0 <= x && x < w) { + s[x] = ' '; + } + x++; + if ((x + xskip) % tab == 0) { + break; + } + } + return x; +}