From 3871740126956606ce99157f300d3f89d7ff00f3 Mon Sep 17 00:00:00 2001 From: Yourtion Date: Fri, 20 May 2016 11:01:41 +0800 Subject: [PATCH] =?UTF-8?q?=E5=91=BD=E4=BB=A4=E8=A1=8C=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 30_day/Makefile | 7 +- 30_day/calc/!cons_9x.bat | 1 + 30_day/calc/!cons_nt.bat | 1 + 30_day/calc/Makefile | 5 ++ 30_day/calc/calc.c | 163 +++++++++++++++++++++++++++++++++++++++ 30_day/calc/make.bat | 1 + 6 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 30_day/calc/!cons_9x.bat create mode 100644 30_day/calc/!cons_nt.bat create mode 100644 30_day/calc/Makefile create mode 100644 30_day/calc/calc.c create mode 100644 30_day/calc/make.bat diff --git a/30_day/Makefile b/30_day/Makefile index cfc8f48..efee1ad 100644 --- a/30_day/Makefile +++ b/30_day/Makefile @@ -22,7 +22,8 @@ haribote.img : haribote/ipl20.bin haribote/haribote.sys Makefile \ beepdown/beepdown.hrb color/color.hrb color2/color2.hrb \ 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 + notrec/notrec.hrb bball/bball.hrb invader/invader.hrb \ + calc/calc.hrb $(EDIMG) imgin:../z_tools/fdimg0at.tek \ wbinimg src:haribote/ipl20.bin len:512 from:0 to:0 \ copy from:haribote/haribote.sys to:@: \ @@ -54,6 +55,7 @@ haribote.img : haribote/ipl20.bin haribote/haribote.sys Makefile \ copy from:notrec/notrec.hrb to:@: \ copy from:bball/bball.hrb to:@: \ copy from:invader/invader.hrb to:@: \ + copy from:calc/calc.hrb to:@: \ copy from:nihongo/nihongo.fnt to:@: \ imgout:haribote.img @@ -97,6 +99,7 @@ full : $(MAKE) -C notrec $(MAKE) -C bball $(MAKE) -C invader + $(MAKE) -C calc $(MAKE) haribote.img run_full : @@ -148,6 +151,7 @@ clean_full : $(MAKE) -C notrec clean $(MAKE) -C bball clean $(MAKE) -C invader clean + $(MAKE) -C calc clean src_only_full : $(MAKE) -C haribote src_only @@ -178,6 +182,7 @@ src_only_full : $(MAKE) -C notrec src_only $(MAKE) -C bball src_only $(MAKE) -C invader src_only + $(MAKE) -C calc src_only -$(DEL) haribote.img refresh : diff --git a/30_day/calc/!cons_9x.bat b/30_day/calc/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/30_day/calc/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/30_day/calc/!cons_nt.bat b/30_day/calc/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/30_day/calc/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/30_day/calc/Makefile b/30_day/calc/Makefile new file mode 100644 index 0000000..411c006 --- /dev/null +++ b/30_day/calc/Makefile @@ -0,0 +1,5 @@ +APP = calc +STACK = 4k +MALLOC = 0k + +include ../app_make.txt diff --git a/30_day/calc/calc.c b/30_day/calc/calc.c new file mode 100644 index 0000000..cc3a31a --- /dev/null +++ b/30_day/calc/calc.c @@ -0,0 +1,163 @@ +#include "apilib.h" +#include /* sprintf */ + +#define INVALID -0x7fffffff + +int strtol(char *s, char **endp, int base); /* 标准函数 */ + +char *skipspace(char *p); +int getnum(char **pp, int priority); + +void HariMain(void) +{ + int i; + char s[30], *p; + + api_cmdline(s, 30); + for (p = s; *p > ' '; p++) { } /* 一直读到空格为止 */ + i = getnum(&p, 9); + if (i == INVALID) { + api_putstr0("error!\n"); + } else { + sprintf(s, "= %d = 0x%x\n", i, i); + api_putstr0(s); + } + api_end(); +} + +char *skipspace(char *p) +{ + for (; *p == ' '; p++) { } /* 将空格跳过去 */ + return p; +} + +int getnum(char **pp, int priority) +{ + char *p = *pp; + int i = INVALID, j; + p = skipspace(p); + + /*单项运算符*/ + if (*p == '+') { + p = skipspace(p + 1); + i = getnum(&p, 0); + } else if (*p == '-') { + p = skipspace(p + 1); + i = getnum(&p, 0); + if (i != INVALID) { + i = - i; + } + } else if (*p == '~') { + p = skipspace(p + 1); + i = getnum(&p, 0); + if (i != INVALID) { + i = ~i; + } + } else if (*p == '(') { /*括号*/ + p = skipspace(p + 1); + i = getnum(&p, 9); + if (*p == ')') { + p = skipspace(p + 1); + } else { + i = INVALID; + } + } else if ('0' <= *p && *p <= '9') { /*数值*/ + i = strtol(p, &p, 0); + } else { /*错误 */ + i = INVALID; + } + + /*二项运算符*/ + for (;;) { + if (i == INVALID) { + break; + } + p = skipspace(p); + if (*p == '+' && priority > 2) { + p = skipspace(p + 1); + j = getnum(&p, 2); + if (j != INVALID) { + i += j; + } else { + i = INVALID; + } + } else if (*p == '-' && priority > 2) { + p = skipspace(p + 1); + j = getnum(&p, 2); + if (j != INVALID) { + i -= j; + } else { + i = INVALID; + } + } else if (*p == '*' && priority > 1) { + p = skipspace(p + 1); + j = getnum(&p, 1); + if (j != INVALID) { + i *= j; + } else { + i = INVALID; + } + } else if (*p == '/' && priority > 1) { + p = skipspace(p + 1); + j = getnum(&p, 1); + if (j != INVALID && j != 0) { + i /= j; + } else { + i = INVALID; + } + } else if (*p == '%' && priority > 1) { + p = skipspace(p + 1); + j = getnum(&p, 1); + if (j != INVALID && j != 0) { + i %= j; + } else { + i = INVALID; + } + } else if (*p == '<' && p[1] == '<' && priority > 3) { + p = skipspace(p + 2); + j = getnum(&p, 3); + if (j != INVALID && j != 0) { + i <<= j; + } else { + i = INVALID; + } + } else if (*p == '>' && p[1] == '>' && priority > 3) { + p = skipspace(p + 2); + j = getnum(&p, 3); + if (j != INVALID && j != 0) { + i >>= j; + } else { + i = INVALID; + } + } else if (*p == '&' && priority > 4) { + p = skipspace(p + 1); + j = getnum(&p, 4); + if (j != INVALID) { + i &= j; + } else { + i = INVALID; + } + } else if (*p == '^' && priority > 5) { + p = skipspace(p + 1); + j = getnum(&p, 5); + if (j != INVALID) { + i ^= j; + } else { + i = INVALID; + } + } else if (*p == '|' && priority > 6) { + p = skipspace(p + 1); + j = getnum(&p, 6); + if (j != INVALID) { + i |= j; + } else { + i = INVALID; + } + } else { + break; + } + } + p = skipspace(p); + *pp = p; + return i; +} diff --git a/30_day/calc/make.bat b/30_day/calc/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/30_day/calc/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file