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