其他分享
首页 > 其他分享> > YC编译器API函数(三)

YC编译器API函数(三)

作者:互联网

YC编译器提供了一些API函数,这些API函数的定义位于头文件ycapi.h,其动态链接库为ycapi.dll,静态库为ycapi.lib。

3.1  API函数概览

YC_cppRun(srcbuf,srclen,argc,argv)                运行c/c++源代码

YC_cppCompile(pExebuf,srcbuf,srclen,cppfile)      编译c/c++源代码

pHandle = YC_cppLoad(srcbuf,srclen,pObj,isScript) 调入c/c++源代码

YC_cppFree(pHandle)                               释放c/c++源代码

phtml = YC_htmlLoad(htmfile,pPost,hwnd…)    调入编译HTML,JS,YSP源代码到内存

YC_htmlFree(phtml)                          释放HTML,JS,YSP源代码所占内存

YC_jsRun(phtml,srcbuf,glen,pWide,pDouble)   执行Javascript源代码

YC_jsRunf(phtml,format, ...)                执行Javascript源代码(格式化)

 

YC_web()                                      获得接口YCWEB接口指针

char *YC_path()                               获得YC编译器路径

int YC_compress(pDesbuf,srcbuf,slen)          数据压缩函数

int YC_uncompress(pDesbuf,srcbuf,slen)        数据解压函数

unsigned char *YC_hashInit(int m_prime)       hasb表初始化

int YC_hashAddA(pHash_ptr,str_buf,str_len)    在hasb表中添加ansi字符串

int YC_hashFindA(hash_ptr,str_buf,str_len)    在hasb表中查找ansi字符串

int YC_hashAddW(pHash_ptr,str_buf,str_len)    在hasb表中添加unicode字符串

int YC_hashFindW(hash_ptr,str_buf,str_len)    在hasb表中查找unicode字符串

YC_ImageCreate(pimg,width,height,colorbit)    创建图像

YC_ImageLoad(pimg,srcptr,srclen)        调入图像

YC_ImageFree(pimg)                            释放图像

YC_wideToChar(pLen,srcbuf,glen)               unicode字符串转ansi字符串

YC_charToWide(pLen,srcbuf,glen)               ansi字符串转unicode字符串

YC_wideToCharEx(desbuf,dlen,srcbuf,glen)      unicode字符串转ansi字符串

YC_charToWideEx(desbuf,wlen,srcbuf,glen)      ansi字符串转unicode字符串

int YC_writefile(filename,tbuf,tlen)     将长度为tlen的tbuf写入本地文件filename

int YC_readfile(filename,pTxtbuf)        将本地文件或远程网页读入pTxtbuf

 

3.2  执行函数YC_cppRun()

   该函数可直接执行c/c++和Javascript源代码。

int YC_cppRun(

const char *srcbuf,  //文件名或代码地址

int srclen=0,        //0或代码长度

int argc=0,          //传给源代码主函数main()的第一个形式参数

void *argv=NULL      //传给源代码主函数main()的第二个形式参数

);

参数:

srcbuf, srclen

    当srclen等于0时,srcbuf是c/c++源代码的文件名

当srclen大于0时,srcbuf是源代码缓冲区,srclen是源代码长度。

argc, argv

    传给源码主函数main()的两个参数,其意义由源码自行定义。

返回值:

如果函数运行成功,返回值为0,

如果失败,返回非0值。

 

3.2.1  用YC_cppRun()执行缓冲区源代码

#include <string.h>

#include "ycapi.h"

void main()

{

    char *sptr = "void main(int argc,char *argv)   \

                  {                                \

                     printf(`%d - %s`,argc,argv);  \

                  }";

    YC_cppRun(sptr, strlen(sptr), 2019, "断肠人在天涯\n");

}

          c/c++代码文件: fox.cpp

 

编译:用YC命令: ycc fox.cpp  或VC++命令: cl fox.cpp 生成fox.exe

运行:在cmd界面执行fox.exe后,输出下列文字:

2019 - 断肠人在天涯

 

3.2.2  用YC_cppRun()执行C/C++源码文件

void main(int argc,char *argv[])

{

    if(argc > 4)

      {

        *(double*)argv[4] = 3.1415926;

        argc--;

      }

    for(int ii=0; ii<argc; ii++)    printf("argv[%d] = %s\n",ii,argv[ii]);

}

                   c/c++文件: big.cpp

 

#include <stdio.h>  //定义函数printf()的头文件.  用于VC等, YC编译器会自动包含

#include "ycapi.h"  //定义函数YC_cppRun()的头文件. 用于VC等, YC编译器会自动包含

void main()

{

    double pval;

    char *argv[] = {"五岭逶迤腾细浪","乌蒙磅礴走泥丸",   //设置形参之值

                    "金沙水拍云崖暖","大渡桥横铁索寒", (char*)&pval};

    int argc = sizeof(argv) / sizeof(argv[0]);           //设置形参个数

    YC_cppRun("big.cpp",0,argc,argv);   //用形参(argc,argv)执行c/c++文件big.cpp

    printf("pval = %.7f\n",pval);

}

                  c/c++文件: sky.cpp

 

编译:用YC命令: ycc sky.cpp  或VC++命令: cl sky.cpp  生成 sky.exe

运行:在cmd界面执行sky.exe,将输出下列文字:

argv[0] = 五岭逶迤腾细浪

argv[1] = 乌蒙磅礴走泥丸

argv[2] = 金沙水拍云崖暖

argv[3] = 大渡桥横铁索寒

pval = 3.1415926

 

3.2.3  用YC_cppRun()执行Javascript源代码文件

var t1 = new Date();

var res = 0;

function fibonacci(i)

{

    if(I < 2) return i;

    res += 2.1;

    res += Math.tan(i)

    res += Math.cos(i);

    res += Math.sin(i);

    return fibonacci(i-2) + fibonacci(i-1);

}

document.write(fibonacci(32));  document.write("<br>\n")

document.write("res=" + res);  document.write("<br>\n")

document.write(new Date() - t1);  document.write("<br>\n")

               

               Javascript代码文件: rain.js

 

#include <stdio.h>

#include <ycapi.h>

void main()

{

   printf("begin running...\n\n");

   YC_cppRun("rain.js");    //执行Javascript文件

   printf("\nend.");

}

              c/c++代码文件: snow.cpp

 

编译:用YC命令: ycc snow.cpp  或VC++命令: cl snow.cpp  生成 snow.exe

运行:在cmd界面执行snow.exe后,输出下列文字:

begin running...

 

2178309<br>

res=-1255767.7334986837<br>

809<br>

 

end.

编译:用YC命令: ycc rain.js  生成 rain.exe,

运行:在cmd界面执行rain.exe后,输出下列文字:

 

2178309<br>

res=-1255767.7334986837<br>

797<br>

 

3.2.4  用YC_cppRun()执行exe文件

 YC_cppRun()函数也可以执行exe文件,如:

void WinMain()

{

       YC_cppRun(`"C:/Program Files/Internet Explorer/iexplore.exe" %1`

                 ` http://www.ycbro.com`);

}

                c/c++代码文件: wind.cpp

 

编译:用YC命令: ycc wind.cpp  生成 wind.exe,

运行:在cmd界面执行wind url后,将运行默认浏览器打开指定网页url。

 

运行状态

YC_cppRun("file.exe")       窗口状态

YC_cppRun("file.exe",-1)    DOS状态

 

3.2.5  使用YC_cppRun()函数的文件

     yced.cpp

            YC_cppRun("ycmb.cpp",0,1,bdata);

YC_cppRun("ycmerge.cpp",0,0,&mbuild)

YC_cppRun("ycvm.cpp",0,0,&mbuild);

YC_cppRun("ycde.cpp",0,0,&mbuild);

      ycweb.cpp

int errval = YC_cppRun("ycofn.cpp",0,0,&ofm);

ycwin.cpp

YC_cppRun("yctest.cpp");

ycos.cpp

   YC_cppRun("bochs.exe -q -f ycos.src",-1);  //执行 bochs.exe 模拟器

 

3.3  c/c++编译函数YC_cppCompile()

   该函数将c/c++源代码编译转换为执行代码。

int YC_cppCompile(

char **pExebuf=NULL,        //执行代码缓冲区地址指针

const char *srcbuf=NULL,    //源代码文件名或源代码缓冲区

int srclen=0,               //源代码长度(用于源代码位于缓冲区的情形)

const char *cppfile=NULL    //源码文件名(用于源代码位于缓冲区的情形)

);

   参数:

pExebuf

    当pExebuf不等于NULL时,函数将申请内存,内存地址放入*pExebuf,生成的执行代码存入该内存。如果源代码有错误,则将以0结尾的语法错误文本放入该内存。当pExebuf等于NULL时,只打印行版权信息。应用程序必须用free()函数来释放该内存。

srcbuf, srclen

    当srclen等于0时,srcbuf是源代码的文件名,当srclen大于0时,srcbuf是源代码缓冲区,srclen则是源代码的长度。

cppfile

    该参数只有当srclen>0时使用,表示源代码文件名,该参数可设为NULL。

返回值:

如果函数运行成功,返回值大于0,表示执行代码长度,pExebuf中存放执行代码。

如果函数运行失败,返回值为0,pExebuf中存放以\0结尾的源代码语法错误文本。

   注意:

无论函数运行成功还是失败,应用程序都必须用语句free(*pExebuf)释放函数内部

申请的内存(*pExebuf)。

 

3.3.1  用YC_cppCompile()编译缓冲区C/C++代码

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include "yc.h"

void main()

{

    char *srcbuf = "void main(int argc,char **argv[])                          \

                    {                                                          \

                      printf(`编译缓冲区源代码.\n\n`);                         \

                      printf(`argc = %d\n`,argc);                              \

                      for(int ii=0; ii<argc; ii++)  printf(`%10s\n`,argv[ii]); \

                    }";

    char *exebuf;

    int glen = YC_cppCompile(&exebuf,srcbuf,strlen(srcbuf),__FILE__); //编译源码

    if(glen)  //缓冲区源代码srcbuf被编译成功

      {

        YC_writefile("p00.exe",exebuf,glen);  //将编译结果存入文件 p00.exe

        printf("p00.exe 已创建.\n");

      }

    else   //编译失败

      {

        remove("p00.exe");        //源代码srcbuf有错误,删除p00.exe

        printf("%s\n",exebuf);

      }

    free(exebuf);      //必须由应用程序释放编译结果所占内存

 

    char *argv[] = { "横看成岭侧成峰","远近高低各不同",

                     "不识庐山真面目","只缘身在此山中",};  //设置形参之值

    int argc = sizeof argv/sizeof argv[0];                 //设置形参个数

 

    //执行p00.exe。其参数srclen=-1: 用system()执行,0:用WinExec()执行。

    YC_cppRun("p00.exe 沙艳娜",-1,argc,argv);

}

                代码文件book.cpp

 

编译:用YC命令:ycc book.cpp 或 VC++命令:cl book.cpp 生成 book.exe。

运行:在cmd界面执行book.exe后,输出下列文字:

book.cpp

book.cpp - compiled OK.

p00.exe 已创建.

编译缓冲区源代码.

 

argc = 6

   p00.exe

    沙艳娜

横看成岭侧成峰

远近高低各不同

不识庐山真面目

只缘身在此山中

 

执行p00 one two后,输出下列文字:

编译缓冲区源代码.

 

argc = 3

       p00

       one

       two

 

3.3.2  用YC_cppCompile()编译C/C++文件

 

void main(int argc,char *argv[])

{

    for(int ii=0; ii<argc; ii++)    printf("argv[%d] = %s\n",ii,argv[ii]);

}

                  c/c++文件: ran.cpp

 

#include <stdio.h>

#include <stdlib.h>

#include "ycapi.h"

void main()

{

    char *exebuf;

    int glen = YC_cppCompile(&exebuf,"ran.cpp");

    if(glen)   //ran.cpp被编译成功

      {

        YC_writefile("p01.exe",exebuf,glen);    //将编译结果存入文件 p01.exe

        printf("p01.exe has been created.\n\n");

      }

    else    //编译失败

      {

        remove("p01.exe");

        printf("%s\n",exebuf);   //打印错误信息

      }

    free(exebuf);    //必须由应用程序释放编译结果所占内存

 

    char *argv[] = {"好雨知时节,","当春乃发生。",     //设置形参之值

                    "随风潜入夜,","润物细无声。" };

    int argc = sizeof(argv) / sizeof(argv[0]);         //设置形参个数

 

    YC_cppRun("p01.exe",-1,argc,argv); //-1: DOS方式运行exe文件

}

                c/c++文件: story.cpp

 

该程序将ran.cpp文件被编译生成的执行代码存入p01.exe。

编译:用YC命令:ycc story.cpp 或 VC++命令:cl story.cpp 生成 story.exe。

运行:在cmd界面执行story.exe后,输出下列文字:

ran.cpp

ran.cpp - compiled OK.

p01.exe has been created.

 

argv[0] = p01.exe

argv[1] = 好雨知时节,

argv[2] = 当春乃发生。

argv[3] = 随风潜入夜,

argv[4] = 润物细无声。

 

运行:在cmd界面执行p01 one two 后,输出下列文字:

argv[0] = p01

argv[1] = one

argv[2] = two

 

3.3.3  使用YC_cppCompile()函数的文件

         ycmk.cpp

int exelen = YC_cppCompile(&exebuf,cppfile);

ycc.cpp

int exelen = YC_cppCompile(&exebuf,srcbuf,glen,cppfile);

yced.cpp

int exe_len = YC_cppCompile(&exe_buf,…);

ycjs.cpp

exe_len = YC_cppCompile(&exe_ptr,fileName);

ycos.cpp

            int boot_len = YC_cppCompile(&boot_buf,"ycboot.cpp");

int head_len = YC_cppCompile(&head_buf,"ychead.cpp");

    int ker_len = YC_cppCompile(&ker_buf,"ycker.cpp");

            int fs_len = YC_cppCompile(&fs_buf,"ycfs.cpp");

    int mm_len = YC_cppCompile(&mm_buf,"ycmm.cpp");

 

3.4  编译驻留函数YC_cppLoad()、YC_cppFree()

       该函数编译c/c++源代码,编译结果驻留内存,对外提供源代码函数接口。

它与语法pObj = <file.cpp> 具有相同的功能。

void *YC_cppLoad(

const char *srcbuf,         //源代码文件名或源代码缓冲区

int srclen,                 //源代码长度

void *pObj,                 //接收源代码数据地址的指针

int isScript=0              //是否是Javascript代码调用该函数

);

   参数:

srcbuf, srclen

    当srclen等于0时,srcbuf是c/c++源代码的文件名,srclen大于0时,srcbuf

是源代码缓冲区,srclen是源代码长度。

pObj,isScript

    当isScript等于0时,是c/c++程序调用该函数,pObj接收函数接口的地址,

当isScript等于1时,是Javascript程序调用该函数,pObj接收定义JS方法和属性的结构数据地址。

 

返回值:

如果函数运行成功,返回值为执行代码所在的内存地址,该返回值必须用YC_cppFree()函数释放。

如果函数运行失败,返回值为NULL,*pObj被置为NULL,说明源码有语法错误。

释放函数:

void YC_cppFree(

void *pHandle    //YC_cppLoad()函数的返回值

);

 

3.4.1  用YC_cppLoad()获得源代码函数接口地址

 

struct XWEB

{

        int      sockid;

        char     *server_name;

};

struct hopeCLASS

{

        virtual double _stdcall sock_close(XWEB &pWeb);

        virtual char *_stdcall sock_read(XWEB &pWeb);

};

           源代码接口定义头文件hope.h

 

#include "hope.h"

double hopeCLASS::sock_close(XWEB &mweb)

{

    printf("%d\n",mweb.sockid);

    return 3.142592;

}

 

char *hopeCLASS::sock_read(XWEB &mweb)

{

    printf("%s\n",mweb.server_name);

    return "一览众山小。";

}

 

const hopeCLASS HOPE;

void main(void **pObj)

{

    *pObj = &HOPE;

}

                    源代码接口实现文件hope.cpp

 

#include <stdio.h>

#include "ycapi.h"

#include "hope.h"

void main()

{

    hopeCLASS *HOPE;                     //声明hopeCLASS对象(接口)指针

    XWEB mweb = { 2020, "会当凌绝顶" };  //声明XWEB结构变量并对其初始化

    void *pHandle = YC_cppLoad("hope.cpp",0,&HOPE);  //获得hope.cpp函数接口

    if(!pHandle)  return;

    printf("%s\n",HOPE->sock_read(mweb));    //执行hope.cpp的sock_read()函数

    printf("%f\n",HOPE->sock_close(mweb));   //执行hope.cpp的sock_close()函数

    YC_cppFree(pHandle);                     //释放hope.cpp所占资源

}

               调用源代码接口函数的程序: tiger.cpp

 

编译:用YC命令:ycc tiger.cpp 或 VC++命令:cl tiger.cpp 生成 tiger.exe

运行:在cmd界面执行tiger.exe后,输出下列文字:

会当凌绝顶

一览众山小。

2020

3.142592

 

3.4.2  使用YC_cppLoad()函数的文件

ychtml.cpp

            pObj->Handle = YC_cppLoad(href_name,0,&pObj->addy);

ycweb.cpp

yc86Handle = YC_cppLoad("yc86.cpp",0,&YC86);

void *ycpop_Handle = YC_cppLoad("ycpop.cpp",0,&yc_PopupMenu);

ycdraw.cpp

ycsaveimg_Handle = YC_cppLoad("ycsaveimg.cpp",0,&ycx_ImageSave);

ycjs.cpp

pHandle = YC_cppLoad(exe_ptr,exe_len,&cppData,1);

pHandle = YC_cppLoad(fileName,0,&cppData,1);

 

3.5  HTML网页解析函数

1. 网页调入函数

该函数只调用ychtml.cpp的ychtmlCLASS::htmlLoad()函数。

YHTML *YC_htmlLoad(

const char *htmfile=0,  //文件名或网址,如yc.htm、http://www.ycbro.com

YPOST *pPost=0,         //POST数据指针

void *hwnd=0,           //窗口句柄。显示网页的窗口。为null时只渲染,不显示

htmlHOOK hookPage=0,    //回调函数。在网页的调入解析渲染过程中会通过消息调用它

void *pHookData=0,      //回调函数所需数据地址

void *pCppObject=0,     //通过<script language=ycscript>嵌入HTML的c/c++代码对象

int aState=0            //状态

int htmltype=HTML_DIALOG, //网页渲染的方式及用途

int aDebug=0,     //执行网页Javascript时是否记录代码位置,以便确定运行时错误的位置

YPARA *pPara=0   //其它参数

);

参数:

htmfile

文件名或网址,有下列4种方式:

(1) htmfile为null时,创建一个空白网页。

(2) htmfile的后缀名为.js时,将htmfile当作Javascript代码文件执行。

(3) htmfile的后缀名为.ysp时,将htmfile当作YSP动态网页文件处理。

(4) htmfile的后缀名为其它时,将htmfile当作静态网页处理。

        

返回值:

如果函数运行成功,将创建一个描述网页的YHTML数据结构,并返回其地址。返回值称为页面指针,必须用YC_cppFree()函数释放。如果函数运行失败,则返回NULL。

 

2.页面释放函数

该函数只调用ychtml.cpp的YCHTML->htmlFree(phtml)。

int YC_htmlFree(

YHTML *phtml   //被释放的网页

);

返回值

如果页面中的Javascript代码无错误,则返回0,否则返回其错误个数。

 

3. 执行Javascript代码的函数

该函数内部调用ycjit.cpp文件的ycjitCLASS::jsRun()函数。

_int64 YC_jsRun(

YHTML *phtml,         //执行Javascript代码的网页指针

wchar_t *srcbuf,      //Javascript代码地址

int glen=0,           //Javascript代码长度

wchar_t **pWide=0,    //unicode字符串返回地址

double *pDouble=0     //double类型数据返回地址

);

参数:

phtml

在网页phtml中执行Javascript代码。

   srcbuf

      unicode格式的Javascript代码缓冲区地址。

   glen

      Javascript代码长度。如果glen=0,函数内部将用语句:glen = wcslen(srcbuf);获得glen

   pWide

      当pWide不等于NULL时,代码返回值值以unicode字符串格式存放在内存,该内存的地址被放入*pWide。

该内存可能将在下一次参数pWide不为NULL的YC_jsRun()调用中被释放而变成无效,

因此调用者需及时将*pWide中的内容备份。

   pDouble

      当pDouble不等于NULL时,代码返回值以double格式存入pDouble。

 

返回值:

返回Javascript代码的返回值。

 

4.执行Javascript格式代码的函数

 _int64 YC_jsRunf(

YHTML *phtml,            //在phtml网页中执行Javascript代码

wchar_t *format, ...);   //定义格式的unicode字符串

 

该函数的源码为:

_int64 YC_jsRunf(YHTML *phtml,wchar_t *format, ...)

{

    va_list argptr;

    va_start(argptr, format);

    wchar_t srcbuf[16384];

    int kk = _vsnwprintf(srcbuf, wsizeof(srcbuf), format, argptr);

    _int64 glen = YCJIT->jsRun(phtml,srcbuf,kk);

    va_end(argptr);

    return glen;

}

 

3.5.1  C/C++程序用YC_jsRun()或YC_jsRunf()函数执行Javascript代码

#include <stdio.h>

#include <stdlib.h>

#include "yc.h"

void main()

{

    _int64 t0 = YCWEB->clock();

    YHTML *phtml = YC_htmlLoad();      //创建的空白网页

 

    double pval;

    int glen = YC_jsRun(phtml,L"Math.sin(3.14/8) + Math.pow(3, 2.7)",0,0,&pval);

    printf("pval =  %.15f\n",pval);  //打印Javascript表达式的值pval,它是浮点数

    printf("glen =  %d\n\n",glen);   //打印YC_jsRun()返回值,它是pval的整数部分

 

    wchar_t *pWide;

    glen = YC_jsRun(phtml,L" `日暮苍山远,"

                            L"天寒白屋贫。"

                            L"柴门闻犬吠,"

                            L"风雪夜归人。`"

                            L" + new Date().toLocaleDateString()",

                             0,&pWide,&pval);

    char *pChar = YC_wideToChar(&glen,pWide,glen); //将表达式的值转换为ansi格式

    printf("pChar = %s\n\n",pChar);              //打印类型为字符串的表达式的值

    free(pChar);

 

    int kk = YC_jsRunf(phtml,L"Math.tan( Math.PI / %f) * %f", 2.001735, 2.71828);

    printf("kk = %d\n",kk);

 

    YC_htmlFree(phtml);

    printf("time: %d ms\n",YCWEB->clock() - t0);

}

                   c/c++代码文件:fair.cpp

 

编译:用 YC命令: ycc fair.cpp 或 VC++命令: cl fair.cpp 生成执行文件: fair.exe

运行:在cmd界面运行fair.exe后,输出下列文字:

pval =  19.801523017047352

glen =  19

 

pChar = 日暮苍山远,天寒白屋贫。柴门闻犬吠,风雪夜归人。2020年2月9日

 

kk = 1996

time: 22 ms

 

 

3.5.2  C/C++程序用YC_htmlLoad()函数执行Javascript文件

const t1 = new Date();

(function ()

{

    var res = 7.01

    for(var ii=0; ii<3999999; ii++)

      {

        res += Math.cos(ii)

        res += Math.sin(ii)

      }

    document.write(res, "<br>\n")

    document.write(ii, "<br>\n")

})()

 

function getdate(str)

{

    document.write(`  <br>\n\n${str}  <br>` );

    return `日期: ${ new Date().toLocaleDateString() }\n` +

           `时间: ${ new Date().toLocaleTimeString() }\n`

}

document.write(new Date() - t1 + 'ms')

Javascript代码文件:dark.js

 

#include <stdio.h>

#include <ycapi.h>

void main()

{

    YHTML *phtml = YC_htmlLoad("dark.js");  //创建网页执行Javascript文件dark.js

    wchar_t *pWide;

    int glen = YC_jsRun(phtml,L"getdate(`人间四月芳菲尽,山寺桃花始盛开。"

                              L"长恨春归无觅处,不知转入此中来。`)",

                              0,

                              &pWide); //执行 dark.js 函数 getdate()

    char srcbuf[1024];

    YC_wideToCharEx(srcbuf,sizeof srcbuf,pWide,glen); //unicode转换为ansi字符串

    printf("\n\n%s",srcbuf);

    YC_htmlFree(phtml);

}

c/c++代码文件:kind.cpp

 

编译:用 YC命令: ycc kind.cpp  或 VC++命令: cl kind.cpp 生成执行文件: kind.exe

运行:在cmd界面执行kind.exe后,输出下列文字:

9.2261870027<br>

3999999<br>

359ms  <br>

 

人间四月芳菲尽,山寺桃花始盛开。长恨春归无觅处,不知转入此中来。  <br>

 

日期: 2020年2月9日

时间: 12:30:47

 

文件dark.js也可以在下列的HTML文件中执行:

<body style='font-size:24px;'>

<script src=dark.js></script>

<script>

  document.write("<br><span style='font-size:20px;'>")

  document.write(getdate(`曾经沧海难为水,<br>

                          除却巫山不是云。<br>

                          取次花丛懒回顾,<br>

                          半缘修道半缘君。<br>`))

</script>

 

          HTML代码文件:dark.htm

 

将dark.htm调入YC编辑器,按F9键运行后,输出下列文字:

9.2261870027

3999999

375ms

 

曾经沧海难为水,

除却巫山不是云。

取次花丛懒回顾,

半缘修道半缘君。

日期: 2020年2月9日 时间: 12:42:05

 

在Chrome浏览器调入dark.htm,显示下列文字:

9.226187002699044
3999999
739ms 

曾经沧海难为水,
除却巫山不是云。
取次花丛懒回顾,
半缘修道半缘君。

日期: 2020/2/9 时间: 下午12:40:20

 

从结果看,尽管YC编译器编译Javascript源码还有较大优化空间有待完成,但其生成的Javascript执行代码在运行速度上与Chrome浏览器还是接近的。

 

3.5.3  C/C++程序用YC_htmlLoad()函数执行YSP文件

<!--http:/127.0.0.1:80/moon.ysp?size=32&type=Peking&%u6587%u672C=%u5317%u4EAC&color=red&yxb=fire&xuan=spring-->

<% printf("document.file = %s<br>",document.file) %>

<% printf("document.URL = %s<br>",document.URL) %>

<script> document.write('春眠不觉晓<br>'); </script>

<%=`处处闻` + "啼鸟<br>"%>

<%

    YC_form({ type:"离离原上草", 文本:"一岁一枯荣", yxb:"野火烧不尽",

                                                        xuan:"春风吹又生"})

    printf("\n参数 request.form.type = %s<br>\n",request.form.type);

    printf("参数 request.form.文本 = %s<br>\n",request.form.文本);

    printf("参数 request.form.yxb = %s<br>\n",request.form.yxb);

    printf("参数 request.form.xuan = %s<br>\n",request.form.xuan);

%>

<div style="color:<%=request.form.color%>;font-size:<%=request.form.size%>">

<%=request.form.文本%>

</div>

<%

  pstr = sprintf("%s  %s<br>\n",new Date().toLocaleDateString()

                               ,new Date().toLocaleTimeString());

  printf(pstr);

 

  if(localStorage.visit_count == undefined)  localStorage.visit_count = 0;

  else                                       localStorage.visit_count++;

  printf("visit_count = %d  <br>\n",localStorage.visit_count);

%>

<script> document.write('夜来风雨声<br>'); </script>

                   

   YSP代码文件:moon.ysp

 

#include <stdio.h>

#include <stdlib.h>

#include "yc.h"

void main()

{

  char pfile[] = "moon.ysp?size=88&type=Peking&文本=北京&color=red&yxb=1&xuan=9";

  YHTML *phtml = YC_htmlLoad(pfile);

  int glen;

  wchar_t *wiptr = YCHTML->sourceHTML(phtml,&glen);    //获得YSP输出文本

  char *yspPtr = YC_wideToChar(&glen,wiptr,glen);

  printf(yspPtr);

  YCWEB->MessageBoxA(phtml,yspPtr,pfile,0,glen);  //在对话框中显示网页

  free(yspPtr);

  YC_htmlFree(phtml);

}

                      c/c++代码文件:star.cpp

 

编译:用 YC命令: ycc star.cpp  或 VC++命令: cl star.cpp 生成执行文件: star.exe

运行:在cmd界面执行star.exe后,输出下列文字:

<!--http:/127.0.0.1:80/moon.ysp?size=88&type=Peking&43283488658742233888672C=9828692531718527967814EAC&color=red&yxb=fire&xuan=spring-->

document.file = moon<br>

document.URL = moon.ysp<br>

<script> document.write('春眠不觉晓<br>'); </script>

处处闻啼鸟<br>

参数 request.form.type = Peking<br>

参数 request.form.文本 = 北京<br>

参数 request.form.yxb = 1<br>

参数 request.form.xuan = 9<br>

<div style="color:red;font-size:88">

北京

</div>

2020年1月13日  7:33:34<br>

visit_count = 152  <br>

<script> document.write('夜来风雨声<br>'); </script>

 

  并显示一个对话框。

  

运行ycs.exe服务器,在Chrome浏览器地址栏输入网址:

http:/127.0.0.1:80/moon.ysp?size=32&type=Peking&%u6587%u672C=%u5317%u4EAC&color=red&yxb=fire&xuan=spring

(其中,参数 &文本=北京 经escape编码后变为 &%u6587%u672C=%u5317%u4EAC)

回车后,显示如下:

document.file = moon
document.URL = F:/yjy/qxzm/moon.ysp
春眠不觉晓
处处闻啼鸟
参数 request.form.type = Peking
参数 request.form.文本 = 北京
参数 request.form.yxb = fire
参数 request.form.xuan = spring

北京

2020年2月9日 13:38:50
visit_count = 16
夜来风雨声

 

3.5.4  C/C++程序用YC_htmlLoad()执行嵌入了C/C++代码的YSP文件

<div style="color:green;font-size:56px;font-family:黑体;

        text-shadow:3px 3px 25px #000;">计算圆周率的800位</div><hr>

<%  //在此用标签<% % >嵌入与Javascript代码

[%   //在此用标签[% % ]嵌入c/c++代码

char *calc_pi(char *cStr,char *pTim)

{

    int b_time = clock();

    #define  PI_LEN   80 * 7 * 5

    static char pbuf[PI_LEN];

    int *f = new int[PI_LEN + 1];

 

    int a=10000,b=0,c=PI_LEN,d,e=0,g,kk=0;

    for(; b-c; )  f[b++] = a/5;

 

    for(; d=0, g=c*2; c -= 14,

                      sprintf(&pbuf[kk],"%.4d",e+d/a),

                      kk ? 0 : (memmove(&pbuf[2],&pbuf[1],3),pbuf[1]='.',kk=1),

                      kk += 4,

                      e = d % a)

          for(b=c; d+=f[b]*a, f[b]=d%--g,d/=g--,--b; d*=b);

 

    delete f;

    sprintf(&pbuf[kk],"\n<br>%d %s\n<br>%s: %d ",kk-1,cStr,pTim,clock() - b_time);

    return pbuf;

}

%]

 

 printf(`<style> #tp { font-size:48px;font-family:黑体;color:olive;} </style>

         <div id=tp></div><hr><span style="font-size:20px;word-break:break-all;">

         <script>

         function timer()

           {

             const wk = ["日","一","二","三","四","五","六"]

             var as = new Date().toLocaleDateString()

             as += ' 星期' + wk[new Date().getDay()]

             as += ' ' + new Date().toLocaleTimeString()

             as += ' ' + new Date().getMilliseconds()

             tp.innerHTML = as;

           }

         timer();

         setInterval(timer,1);

         </script>\n`);

 printf(calc_pi("位","时间"));

%>

                      YSP代码文件:sea.ysp

#include <stdio.h>

#include <stdlib.h>

#include "yc.h"

void main()

{

  YHTML *phtml = YC_htmlLoad("sea.ysp");

  int glen;

  wchar_t *wiptr = YCHTML->sourceHTML(phtml,&glen);    //获得YSP输出文本

  char *yspPtr = YC_wideToChar(&glen,wiptr,glen);

  printf(yspPtr);

  YCWEB->MessageBoxW(phtml,wiptr,L"计算圆周率",0,glen);

  free(yspPtr);

  YC_htmlFree(phtml);

}

                   c/c++代码文件:land.cpp

 

编译:用 YC命令: ycc land.cpp  或 VC++命令: cl land.cpp 生成执行文件: land.exe

运行:在cmd界面执行land.exe后,将显示一个对话框并输出下列文字:

<div style="color:green;font-size:56px;font-family:黑体;

        text-shadow:3px 3px 25px #000;">计算圆周率的800位</div><hr>

<style> #tp { font-size:48px;font-family:黑体;color:olive;} </style>

         <div id=tp></div><hr><span style="font-size:20px;word-break:break-all;">

         <script>

         function timer()

           {

             const wk = ["日","一","二","三","四","五","六"]

             var as = new Date().toLocaleDateString()

             as += ' 星期' + wk[new Date().getDay()]

             as += ' ' + new Date().toLocaleTimeString()

             as += ' ' + new Date().getMilliseconds()

             tp.innerHTML = as;

           }

         timer();

         setInterval(timer,1);

         </script>

3.141592653589793238462643383279502884197169399375105820974944592307816406286208

99862803482534211706798214808651328230664709384460955058223172535940812848111745

02841027019385211055596446229489549303819644288109756659334461284756482337867831

65271201909145648566923460348610454326648213393607260249141273724587006606315588

17488152092096282925409171536436789259036001133053054882046652138414695194151160

94330572703657595919530921861173819326117931051185480744623799627495673518857527

24891227938183011949129833673362440656643086021394946395224737190702179860943702

77053921717629317675238467481846766940513200056812714526356082778577134275778960

91736371787214684409012249534301465495853710507922796892589235420199561121290219

608640344181598136297747713099605187072113499999983729780499510597317328160963185

<br>800 位

<br>时间: 0

运行ycs.exe服务器,在Chrome浏览器地址栏输入网址:http://127.0.0.1/sea.ysp并回车后,将显示一个由YC编译器生成的动态网页。

标签:exe,int,YC,srcbuf,编译器,API,cpp,源代码
来源: https://blog.csdn.net/xiaobingyang/article/details/104906170