Skip to content

Commit 4cd8337

Browse files
committed
增加operator ()
1.增加operator () 2.完善module安装,卸载,以及检测功能(尚未完成)
1 parent b60d15f commit 4cd8337

6 files changed

Lines changed: 149 additions & 16 deletions

File tree

cpps/main.cpp

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,41 @@ void tcfree_func(void* p) {
2121
}
2222

2323
#endif
24+
#ifndef _DEBUG
25+
void __check_cpps_package_json(int argc, char** argv) {
26+
std::string path = cpps_rebuild_filepath("lib/@check_package/main.cpp");
27+
28+
#ifdef USE_TCMALLOC
29+
C* c = cpps::create(argc, argv, tcmalloc_func, tcfree_func);
30+
#else
31+
C* c = cpps::create(argc, argv);
32+
#endif
33+
34+
cpps_try
35+
if (!path.empty()) cpps::dofile(c, path.c_str());
36+
}
37+
catch (cpps_error& e)
38+
{
39+
printf("error: %d : %s file:%s line:%d \n", e.error(), e.what().c_str(), e.file().empty() ? (c->curnode ? c->curnode->filename.c_str() : "") : e.file().c_str(), e.line() == 0 ? (c->curnode ? c->curnode->line : 0) : e.line());
40+
cpps::close(c);
41+
exit(0);
42+
}
43+
catch (cpps_trycatch_error& e)
44+
{
45+
printf("error: %d : %s file:%s line:%d \n", e.error(), e.what().c_str(), e.file().empty() ? (c->curnode ? c->curnode->filename.c_str() : "") : e.file().c_str(), e.line() == 0 ? (c->curnode ? c->curnode->line : 0) : e.line());
46+
cpps::close(c);
47+
exit(0);
48+
}
49+
catch (const char* s)
50+
{
51+
printf("error: %s \n", s);
52+
cpps::close(c);
53+
exit(0);
54+
}
2455

56+
cpps::close(c);
57+
}
58+
#endif
2559
int32 main(int argc,char **argv)
2660
{
2761
#ifdef _WIN32
@@ -46,7 +80,7 @@ int32 main(int argc,char **argv)
4680
printf("%d\r\n", CPPS_VERN);
4781
return 0;
4882
}
49-
else if (path == "-install" || path == "-uninstall"|| path == "-update") {
83+
else if (path == "-install" || path == "-uninstall"|| path == "-update" || path == "-init") {
5084
path = "lib/install/main.cpp";
5185
path = cpps_rebuild_filepath(path);
5286
#ifdef WIN32
@@ -81,13 +115,16 @@ int32 main(int argc,char **argv)
81115
if(chdir(cpps_io_getfilepath(path).c_str())){}
82116
#endif
83117
}
84-
118+
printf("[CPPS %s (%s, %s) on %s %s]\n", CPPS_VER, __DATE__, __TIME__, CPPS_CURRENT_EASYPLANTFORM, CPPS_CURRENT_ARCH);
119+
#ifndef _DEBUG
120+
__check_cpps_package_json(argc, argv);
121+
#endif
85122
#ifdef USE_TCMALLOC
86123
C* c = cpps::create(argc, argv, tcmalloc_func, tcfree_func);
87124
#else
88125
C* c = cpps::create(argc,argv);
89126
#endif
90-
printf("[CPPS %s (%s, %s) on %s %s]\n", CPPS_VER,__DATE__,__TIME__, CPPS_CURRENT_EASYPLANTFORM, CPPS_CURRENT_ARCH);
127+
91128

92129

93130
cpps_try

include/cpps/cpps_symbol.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ namespace cpps
5959
CPPS_SYMBOL_TYPE_POWANDASSIGNMENT,
6060
CPPS_SYMBOL_TYPE_FLOORDIVISION,
6161
CPPS_SYMBOL_TYPE_FLOORDIVISIONANDASSIGNMENT,
62+
CPPS_SYMBOL_TYPE_FUNC,
6263
CPPS_SYMBOL_TYPE_END
6364

6465
};

libs/winreg/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ project(winreg)
88
# 将源代码添加到此项目的可执行文件。
99

1010
IF(WINDOWS)
11+
set(CMAKE_CXX_STANDARD 17)
1112
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/../../include )
1213
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/../../lib /lib)
1314
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/../../bin/lib/${PROJECT_NAME})

src/cpps_base.cpp

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ namespace cpps
1414
bool cpps_isbasevar(const cpps_value& v);
1515
bool cpps_io_isdir(std::string p);
1616
void cpps_debug_trace_domain(C* c, int kg, std::string parent, cpps_domain* root);
17+
std::string cpps_io_getfilepath(std::string str);
1718
bool cpps_base_isdebug() {
1819
#ifdef _DEBUG
1920
return true;
@@ -380,8 +381,69 @@ namespace cpps
380381
#endif
381382
}
382383

384+
std::string cpps_module_path(std::string libname) {
385+
std::string path = "lib/" + libname + "/";
386+
std::string fpath;
387+
#ifdef _WIN32
388+
fpath = cpps_rebuild_filepath(path + (libname + ".dll"));
389+
if (!fpath.empty())
390+
{
391+
return cpps_io_getfilepath(fpath);
392+
}
383393

384-
394+
#else
395+
396+
#if defined LINUX
397+
fpath = cpps_rebuild_filepath(path + "lib" + (libname + ".so"));
398+
#elif defined __APPLE__
399+
fpath = cpps_rebuild_filepath(path + "lib" + (libname + ".dylib"));
400+
#endif
401+
if (!fpath.empty())
402+
{
403+
return cpps_io_getfilepath(fpath);
404+
}
405+
406+
#endif
407+
fpath = cpps_rebuild_filepath(path + "main.cpp");
408+
if (!fpath.empty())
409+
{
410+
return cpps_io_getfilepath(fpath);
411+
}
412+
413+
return "";
414+
}
415+
bool cpps_checklibrary(std::string libname) {
416+
417+
std::string path = "lib/" + libname + "/";
418+
std::string fpath;
419+
#ifdef _WIN32
420+
fpath = cpps_rebuild_filepath(path + (libname + ".dll"));
421+
if (!fpath.empty())
422+
{
423+
return true;
424+
}
425+
426+
#else
427+
428+
#if defined LINUX
429+
fpath = cpps_rebuild_filepath(path + "lib" + (libname + ".so"));
430+
#elif defined __APPLE__
431+
fpath = cpps_rebuild_filepath(path + "lib" + (libname + ".dylib"));
432+
#endif
433+
if (!fpath.empty())
434+
{
435+
return true;
436+
}
437+
438+
#endif
439+
fpath = cpps_rebuild_filepath(path + "main.cpp");
440+
if (!fpath.empty())
441+
{
442+
return true;
443+
}
444+
445+
return false;
446+
}
385447

386448
bool cpps_loadlibrary(C *c,std::string libname, cppsbuffer& buffer)
387449
{
@@ -921,6 +983,8 @@ namespace cpps
921983
def_inside("setechofunc", cpps_setechofunc),
922984
defvar(c,"_VERSION", CPPS_VER),
923985
defvar(c,"_VERSIONNO", CPPS_VERN),
986+
def("check_module", cpps_checklibrary),
987+
def("module_path", cpps_module_path),
924988
//def_inside("loadlibrary", cpps_loadlibrary),
925989
//def_inside("freelibrary", cpps_freelibrary),
926990
def_inside("getargs", cpps_getargs),

src/cpps_symbol.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2508,6 +2508,7 @@ namespace cpps
25082508
c->symbolmap["..="] = new cpps_symbol(9, 2, LEFTMUSTVAR, "..", CPPS_SYMBOL_TYPE_STRCATASSIGNMENT);
25092509
c->symbolmap["[]"] = new cpps_symbol(9, 2, LEFTMUSTVAR, "[]", CPPS_SYMBOL_TYPE_GETOBJECT);
25102510
c->symbolmap["->"] = new cpps_symbol(9, 2, LEFTMUSTVAR, "->", CPPS_SYMBOL_TYPE_GETSUBOBJECT);
2511+
c->symbolmap["()"] = new cpps_symbol(9, 2, RIGHTMUSTVAR, "()", CPPS_SYMBOL_TYPE_FUNC);
25112512

25122513
c->symbolleftasso[0] = false;
25132514
c->symbolleftasso[1] = true;

src/libcpps.cpp

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ namespace cpps {
4444
bool cpps_io_isdir(std::string p);
4545
bool cpps_io_isfile(std::string p);
4646
void cpps_cpp_real_walk(std::vector<std::string>& vct, std::string path, bool bfindchildren);
47+
node* cpps_parse_getsymbol2node(C* c, node* o, std::string symbolStr, cppsbuffer& buffer, bool leftsymbol);
48+
49+
4750
void cpps_load_filebuffer(const char* path, std::string& fileSrc)
4851
{
4952
#ifdef _WIN32
@@ -575,7 +578,15 @@ namespace cpps {
575578
}
576579
if (str->s == "operator") {
577580
cpps_parse_rmspaceandenter(buffer);
578-
node* op = cpps_parse_symbol(c, domain, str, buffer);
581+
node* op = NULL;
582+
if (buffer.cur() == '(' && buffer.at(buffer.offset() + 1) == ')') {
583+
//operator () 特殊处理
584+
op = cpps_parse_getsymbol2node(c, str, "()", buffer, false);
585+
}
586+
else {
587+
op = cpps_parse_symbol(c, domain, str, buffer);
588+
}
589+
579590
if (!op) throw(cpps_error(str->filename, buffer.line(), cpps_error_varerror, "invalid operator symbol."));
580591
str->s = op->symbol->symbolfuncname;
581592
str->symbol = op->symbol;
@@ -1530,6 +1541,18 @@ namespace cpps {
15301541

15311542
return p;
15321543
}
1544+
node* cpps_parse_getsymbol2node(C*c, node* o, std::string symbolStr, cppsbuffer& buffer, bool leftsymbol) {
1545+
cpps_symbol* symbol = cpps_parse_getsymbol(c, symbolStr, leftsymbol);
1546+
if (!symbol) {
1547+
return(NULL);
1548+
}
1549+
buffer.seek(buffer.offset() + (int32)symbolStr.size());
1550+
node* pNode = CPPSNEW(node)(o->filename, buffer.line());
1551+
pNode->type = CPPS_FUNCNAME;
1552+
pNode->symbol = symbol;
1553+
pNode->s = symbolStr;
1554+
return pNode;
1555+
}
15331556
node* cpps_parse_symbol(C* c, cpps_node_domain* domain, node* o, cppsbuffer& buffer, bool leftsymbol) {
15341557
std::string symbolStr;
15351558
std::string tempStr;
@@ -1549,16 +1572,7 @@ namespace cpps {
15491572
curoffset += 1;
15501573
ch = buffer.at(curoffset);
15511574
}
1552-
cpps_symbol* symbol = cpps_parse_getsymbol(c, symbolStr, leftsymbol);
1553-
if (!symbol) {
1554-
return(NULL);
1555-
}
1556-
buffer.seek(buffer.offset() + (int32)symbolStr.size());
1557-
node* pNode = CPPSNEW (node)(o->filename, buffer.line());
1558-
pNode->type = CPPS_FUNCNAME;
1559-
pNode->symbol = symbol;
1560-
pNode->s = symbolStr;
1561-
return(pNode);
1575+
return cpps_parse_getsymbol2node(c,o,symbolStr,buffer,leftsymbol);
15621576
}
15631577
void cpps_parse_expression(C* c, cpps_node_domain* domain, node* param, node* root, cppsbuffer& buffer) {
15641578
node* lastOpNode = param;
@@ -5373,12 +5387,24 @@ namespace cpps {
53735387
}
53745388
cpps_value cpps_step_callfunction(C* c, cpps_domain* domain, cpps_domain* root, cpps_value func, node* d, cpps_domain* leftdomain) {
53755389
cpps_value ret;
5390+
cpps_domain* _tmp = leftdomain;
53765391
if (func.tt == CPPS_TLAMBDAFUNCTION) {
53775392
cpps_cppsclassvar* cppsclassvar = (cpps_cppsclassvar*)func.value.domain;
53785393
cpps_lambda_function* pfunc = (cpps_lambda_function*)cppsclassvar->getclsptr();
53795394
func = pfunc;
53805395
func.tt = CPPS_TFUNCTION;
53815396
}
5397+
if (func.tt == CPPS_TCLASSVAR) {
5398+
cpps_cppsclassvar* cppsclassvar = cpps_to_cpps_cppsclassvar(func);
5399+
cpps_cppsclass* cppsclass = cppsclassvar->getcppsclass();
5400+
cpps_function* _func = cppsclass->getoperator("()");
5401+
if (_func) {
5402+
leftdomain = cppsclassvar;
5403+
func = _func;
5404+
func.tt = CPPS_TFUNCTION;
5405+
}
5406+
}
5407+
53825408
if (func.tt == CPPS_TFUNCTION) {
53835409
cpps_function* f = func.value.func;
53845410
bool take_disabled_non_def_var = c->disabled_non_def_var;
@@ -5426,11 +5452,14 @@ namespace cpps {
54265452
}
54275453
}
54285454
else {
5455+
54295456
/* 需要一个函数,但是他不是!!!! */
54305457
if (d->getleft()->l.size() == 2)
5431-
printf("cpps warring: [%s] is not function line:%d , file:%s \n", d->getleft()->getright()->s.c_str(), d->line, d->filename.c_str()); else
5458+
printf("cpps warring: [%s] is not function line:%d , file:%s \n", d->getleft()->getright()->s.c_str(), d->line, d->filename.c_str());
5459+
else
54325460
printf("cpps warring: [%s] is not function line:%d , file:%s \n", d->getleft()->s.c_str(), d->line, d->filename.c_str());
54335461
}
5462+
leftdomain = _tmp;
54345463
return(ret);
54355464
}
54365465
cpps::object _G(C* c) {

0 commit comments

Comments
 (0)