javascript格式化输出的实现(MuJS)

javascript格式化输出的实现(MuJS)MuJS是一款支持嵌入式开发的轻量级javascript解释器。javascript主要是针对web开发的脚本语言,所以主要借助浏览器来调试;但mujs针对的是嵌入式开发,调试时的交互主要靠输入输出终端,javascript本身是不支持的,所以需要调用c语言的打印函数来实现。下面给出两个例子,一个是普通输出,符合脚本语言的解释性语言的特点,不考虑变量的类型;另一个是简单的格式化输出。前一个…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

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");

}

Jetbrains全家桶1年46,售后保障稳定

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调试应该是够了,如果有其他需求,可以再往里面加。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/230947.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 永磁同步电机矢量控制(四)——simulink仿真搭建

    永磁同步电机矢量控制(四)——simulink仿真搭建由于是初学,对于simulink很多地方不熟悉,在此记下整个仿真搭建的选择元件的细节。1电机模型的选择及参数设置永磁同步电机的英文缩写为PMSM,全称PermanentMagnetSynchronousMachine。在library内搜索Permanent即可找到它。Numberofphase电机相数Back…

    2022年6月4日
    70
  • 如何修改手机IP地址

    如何修改手机IP地址说起手机换IP大家可能没有对电脑换IP那么熟悉,但是现在智能手机能做到事情越来越多,手机换IP也成为许多工作需要,一部分人还不知道怎么操作,就跟着小编一起来看看手机换IP的几种方法。一、手动换IP这个适合偶尔换IP,时间富裕的朋友,我们使用手机进行开关飞行模式,这样就可以进行换IP。也可以找到手机设置点进去先进入WiFi热点的列表,点击所连接的WiFi热点的名字。选择“修改网度络”,然后勾选“显示高级选项版”,就可以进行IP设置了。还有一种比较简单,就是用软件辅助换IP,这里以芝麻代理为例

    2022年6月28日
    66
  • return 、break和continue的区别和作用

    return 、break和continue的区别和作用return、break和continue的区别和作用1.return关键字并不是专门用于跳出循环的,return的功能是结束一个方法。一旦在循环体内执行到一个return语句,return语句将会结束该方法,循环自然也随之结束。与continue和break不同的是,return直接结束整个方法,不管这个return处于多少层循环之内。publicclassReturnT

    2022年5月1日
    37
  • 过压保护(2)_过压保护值和欠压保护值

    过压保护(2)_过压保护值和欠压保护值http://www.elecfans.com/dianlutu/protect/2009102499242.html采用CW136构成的过压保护电路图中是采用CW136构成的过压保护电路,当电子设备

    2022年8月2日
    8
  • Cygwin的安装教程

    1、在官网上选择你想要的版本(www.cygwin.com)2、笔者选的是64位的3、如果网速快的话可以选择第一个选项4、选择路径5、选择你下载的地方6、这个一般都是选择直接连接的7、然后选择镜像的话推荐选择阿里的阿里云镜像http://mirrors.aliyun.com/cygwin/8、随后就是重头戏选择你要的组件包:必选(bison,flex,gcc-core,gcc-g++,make)9、在后面的skip双击就好会出现版本名10、开始下载11、最后

    2022年4月7日
    39
  • PLANTINUM_plantuml流程图

    PLANTINUM_plantuml流程图bytotinunsplash1.背景随着工作时间的增长,越发觉得用专业的图形(用例图,时序图,ER图等等)去准确表达想法是很重要的。比如针对某个需求绘制的的用例图,比一段乏味的文字来的更加有意义,也便于别人理解。加之最近在学习源码的时候,发现很多书籍中都会使用类图,时序图等UML语言来描述逻辑关系。于是就在网上找了找绘制UML语言时,业界主流的一些工具都用什么,找了半天,大部分都用了下面…

    2025年7月20日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号