网页调入函数
该函数只调用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。
页面释放函数
该函数只调用ychtml.cpp的YCHTML->htmlFree(phtml)。
int YC_htmlFree(
YHTML *phtml //被释放的网页
);
返回值
如果页面中的Javascript代码无错误,则返回0,否则返回其错误个数。
执行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代码的返回值。
执行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;
}
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
2. C/C++程序用YC_htmlLoad()函数执行Javascript文件
```c
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
3999999
359ms
人间四月芳菲尽,山寺桃花始盛开。长恨春归无觅处,不知转入此中来。
日期: 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. 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后,输出下列文字:
document.file = moon
document.URL = moon.ysp
处处闻啼鸟
参数 request.form.type = Peking
参数 request.form.文本 = 北京
参数 request.form.yxb = 1
参数 request.form.xuan = 9
visit_count = 152
并显示一个对话框。
运行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
夜来风雨声
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编译器生成的动态网页。