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]# ./print
hello 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]# ./printf
value:60%, value:108, value:0x10, value:hello
value:
error:unsupported formats!
实现了js的标准终端输出,对js的调试有很大的帮助;上面格式化代码中只实现了几个常用的格式符,我想对于debug调试应该是够了,如果有其他需求,可以再往里面加。