MuJS是一款支持嵌入式开发的轻量级javascript解释器。
javascript主要是针对web开发的脚本语言,所以主要借助浏览器来调试;但mujs针对的是嵌入式开发,调试时的交互主要靠输入输出终端,javascript本身是不支持的,所以需要调用c语言的打印函数来实现。
下面给出两个例子,一个是普通输出,符合脚本语言的解释性语言的特点,不考虑变量的类型;另一个是简单的格式化输出。前一个例子是mujs开源包中main.c的例子,拿来做参考。
1.普通输出
print.c
#include <stdio.h>#include <mujs.h>static void jsB_print(js_State *J){int i, top = js_gettop(J);for (i = 1; i<top; ++i){const char *s = js_tostring(J, i);if(i>1){putchar(' ');}fputs(s, stdout);}putchar('\n');js_pushundefined(J);}void main(void){js_State *J = js_newstate(NULL, NULL, JS_STRICT);js_newcfunction(J, jsB_print, "print", 0);js_setglobal(J, "print");js_dofile(J, "print.js");}
print.js
print("hello", 12);
执行结果
[root@bogon javascript]# ./printhello 12
2.格式化输出
printf.c
#include <stdio.h>#include <mujs.h>void jsB_printf(js_State *J){int i,j, top = js_gettop(J);const char *p = js_tostring(J, 1);int data;float fdata;const char * str;char c;char buff[10];i = 2;for(;*p;p++){if(*p !='%'){putchar(*p);continue;}if(*p=='%'&&*(p+1)=='%'){putchar(*++p);continue;}j = 0;buff[j++] = '%';while((c=*++p)){if(c == 'd' || c=='f' || c=='x' || c=='s'){break; }buff[j++] = c;if(j>=9){return;}}buff[j++] = c;buff[j++] = '\0';switch(c){case 'd':data = js_tonumber(J, i); printf(buff, data);break;case 'f':fdata = js_tonumber(J, i);printf(buff, fdata);break;case 'x':data = js_tonumber(J, i);printf(buff, data);break;case 's':str = js_tostring(J, i);printf(buff, str);break;default:printf("\nerror:unsupported formats!\n"); return;break;}i++;}js_pushundefined(J);}void main(void){js_State *J = js_newstate(NULL, NULL, JS_STRICT);js_newcfunction(J, jsB_printf, "printf", 0);js_setglobal(J, "printf");js_dofile(J, "printf.js");}
printf.js
printf("value:%d%%, value:%d, value:0x%02x, value:%s\n", 60, 108, 16, "hello");printf("value:%p",100);
执行结果
[root@bogon javascript]# ./printfvalue:60%, value:108, value:0x10, value:hellovalue:error:unsupported formats!
实现了js的标准终端输出,对js的调试有很大的帮助;上面格式化代码中只实现了几个常用的格式符,我想对于debug调试应该是够了,如果有其他需求,可以再往里面加。