You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

242 lines
8.4 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*********************************************************************
*文件说明: 脚本模块功能支持
*作者: 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 //防止重复包含