|
|
/*********************************************************************
|
|
|
*文件说明: 脚本模块功能支持
|
|
|
*作者: 37
|
|
|
*日期: 2018/11/09
|
|
|
*修改日志: 2018/11/09 logos 创建
|
|
|
|
|
|
2018/12/12 增加if/elseif/else 控制语句
|
|
|
|
|
|
***********************************************************************/
|
|
|
#pragma once
|
|
|
#ifndef _DLL_INCLUDE_JS_H
|
|
|
#define _DLL_INCLUDE_JS_H
|
|
|
|
|
|
#ifndef EXPORT_C
|
|
|
#define EXPORT_C extern "C"
|
|
|
#endif
|
|
|
|
|
|
#ifndef WINAPI
|
|
|
#define WINAPI __stdcall
|
|
|
#endif
|
|
|
|
|
|
/*支持的运算符以及优先级,越靠前越优先
|
|
|
1. ! - ++ -- ~ //前置运算符
|
|
|
2. * / % //算术运算符
|
|
|
3. + - //算术运算符
|
|
|
4. << >> //按位移动运算符
|
|
|
5. < <= > >= //逻辑判断运算符
|
|
|
6. == != //逻辑判断运算符
|
|
|
7. & //按位与
|
|
|
8. ^ //按位异或
|
|
|
9. | //按位或
|
|
|
10. && //逻辑与
|
|
|
11. || //逻辑或
|
|
|
12. = += -= *= /= //赋值运算符
|
|
|
*/
|
|
|
|
|
|
class ijres
|
|
|
{//脚本结果类接口
|
|
|
public:
|
|
|
/****************************************************
|
|
|
*Function: 释放对象
|
|
|
*Intput: NULL
|
|
|
*Output: NULL
|
|
|
*Return: 成功返回0,失败返回错误码
|
|
|
*PS: 由script_calculate/script_calculate2
|
|
|
接口返回的对象需要调用此接口释放
|
|
|
******************************************************/
|
|
|
virtual void free() = 0;
|
|
|
|
|
|
/****************************************************
|
|
|
*Function: 获取对象类型
|
|
|
*Intput: NULL
|
|
|
*Output: NULL
|
|
|
*Return: 返回类型,0str 1int 2double
|
|
|
******************************************************/
|
|
|
virtual int type() = 0;
|
|
|
|
|
|
/****************************************************
|
|
|
*Function: 获取对象结果
|
|
|
*Intput: NULL
|
|
|
*Output: NULL
|
|
|
*Return: 返回结果
|
|
|
******************************************************/
|
|
|
virtual int geti() = 0; //str返回0 double返回int
|
|
|
virtual double getd() = 0; //str返回0
|
|
|
virtual const char* gets() = 0; //若类型为int/double 则格式化到字符串再返回
|
|
|
|
|
|
/****************************************************
|
|
|
*Function: 设置对象结果
|
|
|
*Intput: val int/double/string
|
|
|
*Output: NULL
|
|
|
*Return: NULL
|
|
|
******************************************************/
|
|
|
virtual void set(int val) = 0;
|
|
|
virtual void set(double val) = 0;
|
|
|
virtual void set(const char* val) = 0;
|
|
|
};
|
|
|
|
|
|
//导出接口
|
|
|
EXPORT_C void WINAPI ijres_free(ijres* p);
|
|
|
EXPORT_C int WINAPI ijres_type(ijres* p);
|
|
|
EXPORT_C int WINAPI ijres_geti(ijres* p);
|
|
|
EXPORT_C double WINAPI ijres_getd(ijres* p);
|
|
|
EXPORT_C int WINAPI ijres_gets(ijres* p, char* val);
|
|
|
EXPORT_C void WINAPI ijres_seti(ijres* p, int val);
|
|
|
EXPORT_C void WINAPI ijres_setd(ijres* p, double val);
|
|
|
EXPORT_C void WINAPI ijres_sets(ijres* p, const char* val);
|
|
|
|
|
|
typedef ijres* pjres;
|
|
|
typedef struct jstack* pstack; //脚本堆栈句柄
|
|
|
|
|
|
//p 脚本堆栈句柄
|
|
|
//r 运算结果 函数的返回结果放在这里
|
|
|
//err 错误消息返回接收区
|
|
|
//lparam 附加参数
|
|
|
//btest 1参数检查 or 0执行
|
|
|
//return: 函数执行成功返回0,失败返回错误码,若返回失败,则脚本执行会失败
|
|
|
//PS: btest为1时,仅检查参数
|
|
|
typedef int (WINAPI *jsfun)(pstack p, pjres r, char* err, int btest);
|
|
|
|
|
|
/****************************************************
|
|
|
*Function: 初始化脚本模块
|
|
|
*Intput: NULL
|
|
|
*Output: NULL
|
|
|
*Return: 成功返回0,失败返回错误码
|
|
|
******************************************************/
|
|
|
EXPORT_C int WINAPI script_init();
|
|
|
|
|
|
/****************************************************
|
|
|
*Function: 释放脚本模块
|
|
|
*Intput: NULL
|
|
|
*Output: NULL
|
|
|
*Return: 成功返回0,失败返回错误码
|
|
|
******************************************************/
|
|
|
EXPORT_C int WINAPI script_deinit();
|
|
|
|
|
|
/****************************************************
|
|
|
*Function: 重新加载
|
|
|
*Intput: NULL
|
|
|
*Output: NULL
|
|
|
*Return: 成功返回0,失败返回错误码
|
|
|
******************************************************/
|
|
|
EXPORT_C int WINAPI script_reload();
|
|
|
|
|
|
/****************************************************
|
|
|
*Function: 往脚本模块注册整型常量值
|
|
|
*Intput: pszname 脚本中的常量名称 <32字节
|
|
|
val 对应的值
|
|
|
*Output: NULL
|
|
|
*Return: 成功返回0,失败返回错误码
|
|
|
*PS: 必须在脚本运行前注册,否则脚本编译会报错
|
|
|
******************************************************/
|
|
|
EXPORT_C int WINAPI script_reg_const_int(const char* pszname, int val);
|
|
|
|
|
|
/****************************************************
|
|
|
*Function: 往脚本模块注册浮点型常量值
|
|
|
*Intput: pszname 脚本中的常量名称 <32字节
|
|
|
val 对应的值
|
|
|
*Output: NULL
|
|
|
*Return: 成功返回0,失败返回错误码
|
|
|
*PS: 必须在脚本运行前注册,否则脚本编译会报错
|
|
|
******************************************************/
|
|
|
EXPORT_C int WINAPI script_reg_const_double(const char* pszname, double val);
|
|
|
|
|
|
/****************************************************
|
|
|
*Function: 往脚本模块注册字符串常量值
|
|
|
*Intput: pszname 脚本中的常量名称 <32字节
|
|
|
val 对应的值
|
|
|
*Output: NULL
|
|
|
*Return: 成功返回0,失败返回错误码
|
|
|
*PS: 必须在脚本运行前注册,否则脚本编译会报错
|
|
|
******************************************************/
|
|
|
EXPORT_C int WINAPI script_reg_const_string(const char* pszname, const char* val);
|
|
|
|
|
|
/****************************************************
|
|
|
*Function: 往脚本模块注册自定义函数
|
|
|
*Intput: pszname 脚本中的函数名称 <32字节
|
|
|
f 对应的函数指针
|
|
|
*Output: NULL
|
|
|
*Return: 成功返回0,失败返回错误码
|
|
|
*PS: 必须在脚本运行前注册,否则脚本编译会报错
|
|
|
******************************************************/
|
|
|
EXPORT_C int WINAPI script_reg_fun(const char* pszname, jsfun f);
|
|
|
|
|
|
/****************************************************
|
|
|
*Function: 执行一个明文脚本
|
|
|
*Intput: pszcmd 脚本内容
|
|
|
err 错误消息接收区
|
|
|
*Output: NULL
|
|
|
*Return: 成功返回0,失败返回错误码
|
|
|
******************************************************/
|
|
|
EXPORT_C int WINAPI script_run(const char* pszcmd, char* err = 0);
|
|
|
|
|
|
/****************************************************
|
|
|
*Function: 编译一个明文脚本,返回脚本堆栈句柄
|
|
|
*Intput: pszcmd 脚本内容
|
|
|
err 错误消息接收区
|
|
|
*Output: NULL
|
|
|
*Return: 成功返回堆栈句柄,失败返回NULL
|
|
|
*PS:调用此接口时,会调用自定义函数进行参数检查
|
|
|
******************************************************/
|
|
|
EXPORT_C pstack WINAPI script_compile(const char* pszcmd, char* err = 0);
|
|
|
|
|
|
/****************************************************
|
|
|
*Function: 释放一个脚本堆栈
|
|
|
*Intput: p 堆栈句柄
|
|
|
*Output: NULL
|
|
|
*Return: 成功返回0,失败返回错误码
|
|
|
*PS: 传入句柄必须是由script_compile接口返回的
|
|
|
******************************************************/
|
|
|
EXPORT_C int WINAPI script_free(pstack p);
|
|
|
|
|
|
/****************************************************
|
|
|
*Function: 执行一个脚本堆栈,不需要返回结果
|
|
|
*Intput: p 堆栈句柄
|
|
|
err 错误消息接收区
|
|
|
*Output: NULL
|
|
|
*Return: 成功返回0,失败返回错误码
|
|
|
******************************************************/
|
|
|
EXPORT_C int WINAPI script_execute(pstack p, char* err = 0);
|
|
|
|
|
|
/****************************************************
|
|
|
*Function: 计算脚本堆栈值,需要返回结果 -- 支持单段
|
|
|
*Intput: p 堆栈句柄
|
|
|
err 错误消息接收区
|
|
|
*Output: NULL
|
|
|
*Return: 成功返回pjres句柄,失败返回NULL
|
|
|
*PS:此接口主要用于计算一段脚本返回值,若有多段脚本,则会返回错误
|
|
|
如: a+1 -- ok
|
|
|
a+b*4 -- ok
|
|
|
a+b,a-1 -- error
|
|
|
a+b a-1 -- error
|
|
|
******************************************************/
|
|
|
EXPORT_C pjres WINAPI script_calculate(pstack p, char* err = 0);
|
|
|
|
|
|
/****************************************************
|
|
|
*Function: 计算脚本堆栈,需要返回结果 -- 支持单段/多段
|
|
|
*Intput: p 堆栈句柄指针,执行一次后会自动指向下一段堆栈
|
|
|
err 错误消息接收区
|
|
|
*Output: NULL
|
|
|
*Return: 成功返回pjres句柄,失败返回NULL
|
|
|
*PS:此接口主要用于计算多段脚本返回值
|
|
|
如: a+1 -- ok p=NULL
|
|
|
a+b*4 -- ok p=NULL
|
|
|
a+b,a-1 -- ok p指向(a-1)
|
|
|
a+b a-1 -- ok p指向(a-1)
|
|
|
******************************************************/
|
|
|
EXPORT_C pjres WINAPI script_calculate2(pstack* p, char* err = 0);
|
|
|
|
|
|
/****************************************************
|
|
|
*Function: 计算脚本堆栈,需要返回结果 -- 支持单段/多段
|
|
|
*Intput: p 堆栈句柄指针,执行一次后会自动指向下一段堆栈
|
|
|
r 结果返回接收区
|
|
|
err 错误消息接收区
|
|
|
*Output: NULL
|
|
|
*Return: 成功返回0,失败返回错误码
|
|
|
*PS:与script_calculate2功能一致,区别是pjres句柄当成参数传入
|
|
|
不需要释放,一般用于函数内部调用
|
|
|
******************************************************/
|
|
|
EXPORT_C int WINAPI script_calculate3(pstack* p, pjres r, char* err = 0);
|
|
|
|
|
|
#endif //防止重复包含
|