From e22729320bcb8c6187a62de23610a465b86df49a Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sun, 18 Aug 2024 22:21:25 +0900 Subject: [PATCH 01/47] add: is_reference() --- sstd/src/memory/terp/terp.cpp | 1 + sstd/src/memory/terp/terp.hpp | 3 ++- test/src_test/memory/terp/terp.cpp | 16 ++++++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/sstd/src/memory/terp/terp.cpp b/sstd/src/memory/terp/terp.cpp index 445d7657..0da10204 100644 --- a/sstd/src/memory/terp/terp.cpp +++ b/sstd/src/memory/terp/terp.cpp @@ -207,6 +207,7 @@ void sstd::terp::var::list(){ //--- // internal +bool sstd::terp::var::is_reference() const { return this->_is_reference; } void* sstd::terp::var::p() const { return this->_p; } uint sstd::terp::var::type() const { return this->_type; } void*& sstd::terp::var::p_RW(){ return this->_p; } diff --git a/sstd/src/memory/terp/terp.hpp b/sstd/src/memory/terp/terp.hpp index 544f6be0..8411429f 100644 --- a/sstd/src/memory/terp/terp.hpp +++ b/sstd/src/memory/terp/terp.hpp @@ -88,7 +88,8 @@ class sstd::terp::var{ //--- // internal - + + bool is_reference() const; void* p() const; uint type() const; diff --git a/test/src_test/memory/terp/terp.cpp b/test/src_test/memory/terp/terp.cpp index 6020826e..03c8648a 100644 --- a/test/src_test/memory/terp/terp.cpp +++ b/test/src_test/memory/terp/terp.cpp @@ -52,6 +52,22 @@ TEST(memory_terp, var_typeStr_c){ ASSERT_STREQ(a.typeStr().c_str(), "str"); // TEST THIS LINE } +//----------------------------------------------------------------------------------------------------------------------------------------------- +// interface + +TEST(memory_terp, _is_reference){ + sstd::terp::var a; + ASSERT_TRUE(a.is_reference() == false); // TEST THIS LINE +} +TEST(memory_terp, _p){ + sstd::terp::var a; + ASSERT_TRUE(a.p() == NULL); // TEST THIS LINE +} +TEST(memory_terp, _type){ + sstd::terp::var a; + ASSERT_TRUE(a.type() == sstd::num_null); // TEST THIS LINE +} + //----------------------------------------------------------------------------------------------------------------------------------------------- // common From fd1a6551cc23e34ceb56f125f80731643c350590 Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sun, 18 Aug 2024 22:59:42 +0900 Subject: [PATCH 02/47] add: TEST(memory_terp, list_ope_assign_with_reference) --- test/src_test/memory/terp/terp.cpp | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/test/src_test/memory/terp/terp.cpp b/test/src_test/memory/terp/terp.cpp index 03c8648a..da1c2aab 100644 --- a/test/src_test/memory/terp/terp.cpp +++ b/test/src_test/memory/terp/terp.cpp @@ -53,7 +53,7 @@ TEST(memory_terp, var_typeStr_c){ } //----------------------------------------------------------------------------------------------------------------------------------------------- -// interface +// internal interface TEST(memory_terp, _is_reference){ sstd::terp::var a; @@ -84,7 +84,7 @@ TEST(memory_terp, to_SEGV_null_ptr){ //----------------------------------------------------------------------------------------------------------------------------------------------- // sstd::terp::list -// operator= +// operator= (copy) TEST(memory_terp, list_ope_assign){ // Ope= sstd::terp::var a; a = sstd::terp::list(1); // TEST THIS LINE @@ -96,6 +96,31 @@ TEST(memory_terp, list_ope_assign){ // Ope= ASSERT_STREQ(a[0][0].to().c_str(), "v1"); ASSERT_STREQ(a[0][1].to().c_str(), "v2"); } +TEST(memory_terp, list_ope_assign_with_reference){ // Ope= + sstd::terp::var a; + a = sstd::terp::list(2); + a[0] = sstd::terp::list(3); + a[0][0] = "a"; + a[0][1] = "b"; + a[0][2] = "c"; + a[1] = &a[0]; + + ASSERT_TRUE(a[0].is_reference() == false); + ASSERT_TRUE(a[1].is_reference() == true ); + + sstd::terp::var x = a; // TEST THIS LINE + + ASSERT_TRUE(x[0].is_reference() == false); + ASSERT_TRUE(x[1].is_reference() == false); + + a[0][0]="x1"; + ASSERT_TRUE(a[0][0].to() == "x1"); + ASSERT_TRUE(a[1][0].to() == "x1"); + + x[0][0]="x2"; + ASSERT_TRUE(x[0][0].to() == "x2"); + ASSERT_TRUE(x[1][0].to() == "a"); +} // operator== TEST(memory_terp, list_ope_eq_true_type){ From 1370077611f8e537f5e890ac14c12502fd906c44 Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sun, 14 Jul 2024 22:37:29 +0900 Subject: [PATCH 03/47] change name from sstd_yaml::num_ to sstd_yaml::type_ --- sstd/src/file/yaml.cpp | 90 ++++++++++++------------ sstd/src/file/yaml.hpp | 48 +++++++------ sstd/src/string/strmatch.hpp | 10 +-- test/src_test/file/yaml.cpp | 114 +++++++++++++++---------------- tests_list_for_build_and_run.txt | 84 +++++++++++------------ 5 files changed, 172 insertions(+), 174 deletions(-) diff --git a/sstd/src/file/yaml.cpp b/sstd/src/file/yaml.cpp index 994a8f7f..23a56c3a 100644 --- a/sstd/src/file/yaml.cpp +++ b/sstd/src/file/yaml.cpp @@ -351,7 +351,7 @@ bool sstd_yaml::_token2cmd(std::vector& ret_vCmd, con // Construct alloc() or assign() command struct sstd_yaml::command c; switch(t.type){ - case sstd_yaml::num_str: { + case sstd_yaml::type_str: { // --- debug info --- c.line_num_begin = t.line_num_begin; c.line_num_end = t.line_num_end; @@ -359,12 +359,12 @@ bool sstd_yaml::_token2cmd(std::vector& ret_vCmd, con // --- construct info --- c.ope = sstd_yaml::ope_assign; c.hsc = t.hsc_hx; // t.hsc_lx - c.type = sstd_yaml::num_str; + c.type = sstd_yaml::type_str; c.format = t.format; c.val = t.val; // t.key; ret_vCmd.push_back(c); } break; - case sstd_yaml::num_list: { + case sstd_yaml::type_list: { { // --- debug info --- c.line_num_begin = t.line_num_begin; @@ -373,7 +373,7 @@ bool sstd_yaml::_token2cmd(std::vector& ret_vCmd, con // --- construct info --- c.ope = sstd_yaml::ope_alloc; c.hsc = t.hsc_lx; // t.hsc_hx - c.type = sstd_yaml::num_list; + c.type = sstd_yaml::type_list; //c.format = t.format; //c.val = t.val; // t.key; ret_vCmd.push_back(c); @@ -387,13 +387,13 @@ bool sstd_yaml::_token2cmd(std::vector& ret_vCmd, con // --- construct info --- c.ope = sstd_yaml::ope_assign; c.hsc = t.hsc_hx; // t.hsc_lx; - c.type = sstd_yaml::num_str; + c.type = sstd_yaml::type_str; c.format = t.format; c.val = t.val; // t.key; ret_vCmd.push_back(c); } } break; - case sstd_yaml::num_hash: { + case sstd_yaml::type_hash: { // --- debug info --- c.line_num_begin = t.line_num_begin; c.line_num_end = t.line_num_end; @@ -401,7 +401,7 @@ bool sstd_yaml::_token2cmd(std::vector& ret_vCmd, con // --- construct info --- c.ope = sstd_yaml::ope_alloc; c.hsc = t.hsc_hx; // t.hsc_lx - c.type = sstd_yaml::num_hash; + c.type = sstd_yaml::type_hash; //c.format = t.format; c.val = t.key; // t.val; // key ret_vCmd.push_back(c); @@ -414,13 +414,13 @@ bool sstd_yaml::_token2cmd(std::vector& ret_vCmd, con // --- construct info --- c.ope = sstd_yaml::ope_assign; c.hsc = t.hsc_hx + 2; // t.hsc_lx; - c.type = sstd_yaml::num_str; + c.type = sstd_yaml::type_str; c.format = t.format; c.val = t.val; // t.key; // value ret_vCmd.push_back(c); } } break; - case sstd_yaml::num_list_and_hash:{ + case sstd_yaml::type_list_and_hash:{ { // --- debug info --- c.line_num_begin = t.line_num_begin; @@ -429,7 +429,7 @@ bool sstd_yaml::_token2cmd(std::vector& ret_vCmd, con // --- construct info --- c.ope = sstd_yaml::ope_alloc; c.hsc = t.hsc_lx; // t.hsc_hx + 2*ti - c.type = sstd_yaml::num_list; + c.type = sstd_yaml::type_list; //c.format = t.format; //c.val = t.val; // t.key; ret_vCmd.push_back(c); @@ -456,7 +456,7 @@ bool sstd_yaml::_token2cmd(std::vector& ret_vCmd, con // --- construct info --- c.ope = sstd_yaml::ope_alloc; c.hsc = t.hsc_hx; // hsc_lx - c.type = sstd_yaml::num_hash; + c.type = sstd_yaml::type_hash; //c.format = t.format; c.val = t.key; // t.val; // key ret_vCmd.push_back(c); @@ -469,7 +469,7 @@ bool sstd_yaml::_token2cmd(std::vector& ret_vCmd, con // --- construct info --- c.ope = sstd_yaml::ope_assign; c.hsc = t.hsc_hx + 2; // t.hsc_lx; - c.type = sstd_yaml::num_str; + c.type = sstd_yaml::type_str; c.format = t.format; c.val = t.val; // t.key; // value ret_vCmd.push_back(c); @@ -480,7 +480,7 @@ bool sstd_yaml::_token2cmd(std::vector& ret_vCmd, con // construction of stack() command - if( !t.hasValue && (t.type==sstd_yaml::num_list || t.type==sstd_yaml::num_hash || t.type==sstd_yaml::num_list_and_hash )){ + if( !t.hasValue && (t.type==sstd_yaml::type_list || t.type==sstd_yaml::type_hash || t.type==sstd_yaml::type_list_and_hash )){ uint hsc_curr = c.hsc; uint hsc_next = 0; @@ -495,11 +495,11 @@ bool sstd_yaml::_token2cmd(std::vector& ret_vCmd, con const sstd_yaml::token& t_nx = v_token[i+1]; // _nx: next switch(t_nx.type){ - //case sstd_yaml::num_str: { hsc_next = t_nx.hsc_hx; } break; - case sstd_yaml::num_str: { continue; } break; - case sstd_yaml::num_list: { hsc_next = t_nx.hsc_lx + 2*(t_nx.list_type_cnt-1); } break; - case sstd_yaml::num_hash: { hsc_next = t_nx.hsc_hx; } break; - case sstd_yaml::num_list_and_hash: { hsc_next = t_nx.hsc_lx + 2*(t_nx.list_type_cnt-1); } break; // works as a list + //case sstd_yaml::type_str: { hsc_next = t_nx.hsc_hx; } break; + case sstd_yaml::type_str: { continue; } break; + case sstd_yaml::type_list: { hsc_next = t_nx.hsc_lx + 2*(t_nx.list_type_cnt-1); } break; + case sstd_yaml::type_hash: { hsc_next = t_nx.hsc_hx; } break; + case sstd_yaml::type_list_and_hash: { hsc_next = t_nx.hsc_lx + 2*(t_nx.list_type_cnt-1); } break; // works as a list default: { sstd::pdbg_err("Unexpected data type\n"); return false; } break; }; @@ -521,7 +521,7 @@ bool sstd_yaml::_token2cmd(std::vector& ret_vCmd, con // │ t │ │ │ │ │ // └───┴───────────────────┴───────────────────┴───────────────────┴───────────────────┘ // - bool isGr = t.type==sstd_yaml::num_list || t_nx.type==sstd_yaml::num_hash; // check '>' case + bool isGr = t.type==sstd_yaml::type_list || t_nx.type==sstd_yaml::type_hash; // check '>' case bool isGrOrEq = !isGr; // check '>=' case if((isGr && hsc_next> hsc_curr) || (isGrOrEq && hsc_next>=hsc_curr) ) @@ -715,7 +715,7 @@ bool _construct_var(sstd::terp::var& ret_yml, const std::vector& ret, tmp.val_is_dqed=dqed; tmp.val_is_sqed=sqed; - if(is_list){ tmp.type += sstd_yaml::num_list; tmp.hsc_hx+=2; } - if(is_hash){ tmp.type += sstd_yaml::num_hash; } - if(is_flow){ tmp.format = sstd_yaml::num_flow_style_base; } + if(is_list){ tmp.type += sstd_yaml::type_list; tmp.hsc_hx+=2; } + if(is_hash){ tmp.type += sstd_yaml::type_hash; } + if(is_flow){ tmp.format = sstd_yaml::type_flow_style_base; } // Skip empty tokens until the first non-empty token occurs. (Empty token is treated as a line-break related with to other token in a context of multi-line YAML) if(ret.size()==0 && tmp.key.size()==0 && tmp.val.size()==0 && - tmp.type==sstd_yaml::num_str){ continue; } + tmp.type==sstd_yaml::type_str){ continue; } // set hasValue tmp.hasValue=false; switch(tmp.type){ - case sstd_yaml::num_str: { if(tmp.val_is_dqed||tmp.val_is_sqed||tmp.val.size()>=1){tmp.hasValue=true;} } break; - case sstd_yaml::num_list: { if(tmp.val_is_dqed||tmp.val_is_sqed||tmp.val.size()>=1){tmp.hasValue=true;} } break; // check the value is NOT NULL - case sstd_yaml::num_list_and_hash: - case sstd_yaml::num_hash: { if(tmp.val_is_dqed||tmp.val_is_sqed||tmp.val.size()>=1){tmp.hasValue=true;} } break; // check the value is NOT NULL + case sstd_yaml::type_str: { if(tmp.val_is_dqed||tmp.val_is_sqed||tmp.val.size()>=1){tmp.hasValue=true;} } break; + case sstd_yaml::type_list: { if(tmp.val_is_dqed||tmp.val_is_sqed||tmp.val.size()>=1){tmp.hasValue=true;} } break; // check the value is NOT NULL + case sstd_yaml::type_list_and_hash: + case sstd_yaml::type_hash: { if(tmp.val_is_dqed||tmp.val_is_sqed||tmp.val.size()>=1){tmp.hasValue=true;} } break; // check the value is NOT NULL default: { sstd::pdbg_err("Unexpected data type\n"); return false; } break; } @@ -914,13 +914,13 @@ bool sstd_yaml::_str2token_except_multilines(std::vector& ret, } bool _is_all_the_data_str_type(const std::vector& v){ for(uint i=0; i& v){ for(uint i=0; i& ret, const std::vector& io){ @@ -973,8 +973,8 @@ bool sstd_yaml::_token2token_split_bv_list_type_cnt(std::vector& io) // │ - k2: v2 // Update `start_with_string` to the current token - start_with_string |= (*pT).type==sstd_yaml::num_str; // for "k:\n l1\n l2" + start_with_string |= (*pT).type==sstd_yaml::type_str; // for "k:\n l1\n l2" // Check the needs of breaking the merge process // Under the following situation, the parser needs to break the process of multi-line merging. // - `start_with_string`: The string start with non-control charactor @@ -1104,10 +1104,10 @@ bool _escape_to_unicode_character(std::string& io){ case '0': { tmp += (uchar)0x00; break; } //case ' ': { tmp += '\\'; break; } -// case '_': { tmp += '\u00a0'; break; } // Needs to check "How UTF-8 encode" if we treats as UTF-8. -// case 'N': { tmp += '\u0085'; break; } // Needs to check "How UTF-8 encode" if we treats as UTF-8. -// case 'L': { tmp += '\u2028'; break; } // Needs to check "How UTF-8 encode" if we treats as UTF-8. -// case 'P': { tmp += '\u2029'; break; } // Needs to check "How UTF-8 encode" if we treats as UTF-8. +// case '_': { tmp += '\u00a0'; break; } // Needs to check "How UTF-8 encode" if we treats as UTF-8. (Byte order is the concern point) +// case 'N': { tmp += '\u0085'; break; } // Needs to check "How UTF-8 encode" if we treats as UTF-8. (Byte order is the concern point) +// case 'L': { tmp += '\u2028'; break; } // Needs to check "How UTF-8 encode" if we treats as UTF-8. (Byte order is the concern point) +// case 'P': { tmp += '\u2029'; break; } // Needs to check "How UTF-8 encode" if we treats as UTF-8. (Byte order is the concern point) default: { // if (sstd::startswith(&io[i+1], "x41" )){ tmp += "A"; i+=strlen("x41" ); break; // Needs to check "How UTF-8 encode" if we treats as UTF-8. // }else if(sstd::startswith(&io[i+1], "u0041" )){ tmp += "A"; i+=strlen("u0041" ); break; // Needs to check "How UTF-8 encode" if we treats as UTF-8. diff --git a/sstd/src/file/yaml.hpp b/sstd/src/file/yaml.hpp index 28b546d2..b681cd33 100644 --- a/sstd/src/file/yaml.hpp +++ b/sstd/src/file/yaml.hpp @@ -22,36 +22,34 @@ namespace sstd_yaml{ //--- // type definition - // TODO: num_ -> type_ に名前を置換する - - const static uint8 num_null = 255; - const static uint8 num_block_style_base = 0; - const static uint8 num_str = 0; // for BLOCK_STYLE - const static uint8 num_list = 1; // for BLOCK_STYLE - const static uint8 num_hash = 2; // for BLOCK_STYLE - const static uint8 num_list_and_hash = 3; // for BLOCK_STYLE - const static uint8 num_flow_style_base = 4; - // sstd_yaml::num_flow_style_base + sstd_yaml::num_str 4 // reserved number for FLOW_STYLE - // sstd_yaml::num_flow_style_base + sstd_yaml::num_list 5 // reserved number for FLOW_STYLE - // sstd_yaml::num_flow_style_base + sstd_yaml::num_hash 6 // reserved number for FLOW_STYLE - // sstd_yaml::num_flow_style_base + sstd_yaml::num_list_and_hash 7 // reserved number for FLOW_STYLE + const static uint8 type_null = 255; + const static uint8 type_block_style_base = 0; + const static uint8 type_str = 0; // for BLOCK_STYLE + const static uint8 type_list = 1; // for BLOCK_STYLE + const static uint8 type_hash = 2; // for BLOCK_STYLE + const static uint8 type_list_and_hash = 3; // for BLOCK_STYLE + const static uint8 type_flow_style_base = 4; + // sstd_yaml::type_flow_style_base + sstd_yaml::type_str 4 // reserved number for FLOW_STYLE + // sstd_yaml::type_flow_style_base + sstd_yaml::type_list 5 // reserved number for FLOW_STYLE + // sstd_yaml::type_flow_style_base + sstd_yaml::type_hash 6 // reserved number for FLOW_STYLE + // sstd_yaml::type_flow_style_base + sstd_yaml::type_list_and_hash 7 // reserved number for FLOW_STYLE //--- // token for proceed YAML parsing struct token { // Data for Debug YAML parsing - uint line_num_begin = 1; // beginning line number - uint line_num_end = 1; // endding line number (for multipleline) - std::string rawStr; // A raw string splitted by line concering the YAML processing units. + uint line_num_begin = 1; // beginning line number + uint line_num_end = 1; // endding line number (for multipleline) + std::string rawStr; // A raw string splitted by line concering the YAML processing units. // Data structure to load YAML - //uint type = sstd_yaml::num_null; // sstd_yaml::num_str; // A destination type number of this line - uint type = sstd_yaml::num_str; // A destination type number of this line - uint format = sstd_yaml::num_block_style_base; // If containing flow style notation - uint list_type_cnt = 0; // Number of list type. (`- - - v`) - uint hsc_lx = 0; // head space counts for list type - uint hsc_hx = 0; // head space counts for hash type + //uint type = sstd_yaml::type_null; // sstd_yaml::type_str; // A destination type number of this line + uint type = sstd_yaml::type_str; // A destination type number of this line + uint format = sstd_yaml::type_block_style_base; // If containing flow style notation + uint list_type_cnt = 0; // Number of list type. (`- - - v`) + uint hsc_lx = 0; // head space counts for list type + uint hsc_hx = 0; // head space counts for hash type bool hasValue = false; // If the value (val1 or val2) is vaild for each data type (list or hash). bool key_is_dqed = false; @@ -64,9 +62,9 @@ namespace sstd_yaml{ }; struct command{ // Data for Debug YAML parsing - uint line_num_begin = 1; // beginning line number - uint line_num_end = 1; // endding line number (for multipleline) - std::string rawStr; // A raw string splitted by line concering the YAML processing units. + uint line_num_begin = 1; // beginning line number + uint line_num_end = 1; // endding line number (for multipleline) + std::string rawStr; // A raw string splitted by line concering the YAML processing units. // Data structure to construct YAML uint ope; // operation diff --git a/sstd/src/string/strmatch.hpp b/sstd/src/string/strmatch.hpp index 3eed7355..485f8942 100755 --- a/sstd/src/string/strmatch.hpp +++ b/sstd/src/string/strmatch.hpp @@ -18,11 +18,6 @@ namespace sstd{ bool strmatch(const std::string& str, const char* wildcard); bool strmatch(const std::string& str, const std::string& wildcard); - bool pathmatch(const char* str, const char* wildcard); - bool pathmatch(const char* str, const std::string& wildcard); - bool pathmatch(const std::string& str, const char* wildcard); - bool pathmatch(const std::string& str, const std::string& wildcard); - bool strmatch_getWC( const char* str, // target string to search const char* wildcard, // wild card ('*' and '?' are available.) @@ -32,6 +27,11 @@ namespace sstd{ bool strmatch_getWC(const std::string& str, const char* wildcard, std::string& retWC); bool strmatch_getWC(const std::string& str, const std::string& wildcard, std::string& retWC); + bool pathmatch(const char* str, const char* wildcard); + bool pathmatch(const char* str, const std::string& wildcard); + bool pathmatch(const std::string& str, const char* wildcard); + bool pathmatch(const std::string& str, const std::string& wildcard); + uint rcount(const char* str, char X); uint rcount(const std::string& str, char X); uint lcount(const char* str, char X); diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index 43ba34db..41b91e84 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -80,12 +80,12 @@ TEST(yaml, _split_quotes_by_control_chars_02){ ASSERT_TRUE(ret); \ ASSERT_EQ((uint)v_ret.size(), (uint)1); \ \ - uint ans_type=sstd_yaml::num_str; \ - if(IS_LIST){ ans_type += sstd_yaml::num_list; } \ - if(IS_HASH){ ans_type += sstd_yaml::num_hash; } \ + uint ans_type=sstd_yaml::type_str; \ + if(IS_LIST){ ans_type += sstd_yaml::type_list; } \ + if(IS_HASH){ ans_type += sstd_yaml::type_hash; } \ ASSERT_EQ(v_ret[0].type, (uint)ans_type); \ \ - uint ans_flow = IS_FLOW ? sstd_yaml::num_flow_style_base : sstd_yaml::num_block_style_base; \ + uint ans_flow = IS_FLOW ? sstd_yaml::type_flow_style_base : sstd_yaml::type_block_style_base; \ ASSERT_EQ(v_ret[0].format, (uint)ans_flow); \ ASSERT_EQ(v_ret[0].list_type_cnt, (uint)LIST_TYPE_COUNT); @@ -117,13 +117,13 @@ TEST(yaml, _str2token__data_type_and_format_case06_02){ TEST_STR2TOKEN__DATA_TYP //--- // Test _str2token() of val1 and val2 -#define TEST_STR2TOKEN__KEY_VAL(KEY, VAL, S_IN) \ - std::string s = S_IN; \ - std::vector v_ret; \ - bool ret = sstd_yaml::_str2token(v_ret, s); \ - ASSERT_TRUE(ret); \ - ASSERT_EQ(v_ret.size(), (uint)1); \ - ASSERT_STREQ(v_ret[0].key.c_str(), KEY); \ +#define TEST_STR2TOKEN__KEY_VAL(KEY, VAL, S_IN) \ + std::string s = S_IN; \ + std::vector v_ret; \ + bool ret = sstd_yaml::_str2token(v_ret, s); \ + ASSERT_TRUE(ret); \ + ASSERT_EQ(v_ret.size(), (uint)1); \ + ASSERT_STREQ(v_ret[0].key.c_str(), KEY); \ ASSERT_STREQ(v_ret[0].val.c_str(), VAL); TEST(yaml, _str2token_val1_val2_list ){ TEST_STR2TOKEN__KEY_VAL("", "a", "- a"); } @@ -669,34 +669,34 @@ TEST(yaml, _token2cmd_usual_cases){ // - ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); ASSERT_EQ(ret_v_cmd[idx].hsc, (uint)0); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_list); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_list); ++idx; ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_stack); // stack ++idx; // k1: ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); ASSERT_EQ(ret_v_cmd[idx].hsc, (uint)2); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_hash); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_hash); ASSERT_STREQ(ret_v_cmd[idx].val.c_str(), "k1"); ++idx; // v11 ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_assign); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_str); - ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::num_block_style_base); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_str); + ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::type_block_style_base); ASSERT_STREQ(ret_v_cmd[idx].val.c_str(), "v11"); ++idx; // - ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); ASSERT_EQ(ret_v_cmd[idx].hsc, (uint)0); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_list); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_list); ++idx; ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_stack); // stack ++idx; // k2: ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); ASSERT_EQ(ret_v_cmd[idx].hsc, (uint)2); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_hash); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_hash); ASSERT_STREQ(ret_v_cmd[idx].val.c_str(), "k2"); ++idx; ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_stack); // stack @@ -705,161 +705,161 @@ TEST(yaml, _token2cmd_usual_cases){ // - ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); ASSERT_EQ(ret_v_cmd[idx].hsc, (uint)2); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_list); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_list); ++idx; // v21 ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_assign); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_str); - ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::num_block_style_base); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_str); + ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::type_block_style_base); ASSERT_STREQ(ret_v_cmd[idx].val.c_str(), "v21"); ++idx; // - ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); ASSERT_EQ(ret_v_cmd[idx].hsc, (uint)2); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_list); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_list); ++idx; // v22 ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_assign); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_str); - ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::num_block_style_base); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_str); + ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::type_block_style_base); ASSERT_STREQ(ret_v_cmd[idx].val.c_str(), "v22"); ++idx; // - ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); ASSERT_EQ(ret_v_cmd[idx].hsc, (uint)2); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_list); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_list); ++idx; ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_stack); // stack ++idx; // k23: ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); ASSERT_EQ(ret_v_cmd[idx].hsc, (uint)4); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_hash); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_hash); ASSERT_STREQ(ret_v_cmd[idx].val.c_str(), "k23"); ++idx; // - ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); ASSERT_EQ(ret_v_cmd[idx].hsc, (uint)2); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_list); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_list); ++idx; ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_stack); // stack ++idx; // k24: ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); ASSERT_EQ(ret_v_cmd[idx].hsc, (uint)4); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_hash); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_hash); ASSERT_STREQ(ret_v_cmd[idx].val.c_str(), "k24"); ++idx; // v241 ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_assign); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_str); - ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::num_block_style_base); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_str); + ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::type_block_style_base); ASSERT_STREQ(ret_v_cmd[idx].val.c_str(), "v241"); ++idx; // - ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); ASSERT_EQ(ret_v_cmd[idx].hsc, (uint)0); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_list); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_list); ++idx; ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_stack); // stack ++idx; // k3: ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); ASSERT_EQ(ret_v_cmd[idx].hsc, (uint)2); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_hash); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_hash); ASSERT_STREQ(ret_v_cmd[idx].val.c_str(), "k3"); ++idx; // v31 ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_assign); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_str); - ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::num_block_style_base); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_str); + ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::type_block_style_base); ASSERT_STREQ(ret_v_cmd[idx].val.c_str(), "v31"); ++idx; // - ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); ASSERT_EQ(ret_v_cmd[idx].hsc, (uint)0); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_list); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_list); ++idx; ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_stack); // stack ++idx; // k5: #null ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); ASSERT_EQ(ret_v_cmd[idx].hsc, (uint)2); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_hash); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_hash); ASSERT_STREQ(ret_v_cmd[idx].val.c_str(), "k5"); ++idx; // k51: ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); ASSERT_EQ(ret_v_cmd[idx].hsc, (uint)2); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_hash); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_hash); ASSERT_STREQ(ret_v_cmd[idx].val.c_str(), "k51"); ++idx; // v511 ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_assign); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_str); - ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::num_block_style_base); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_str); + ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::type_block_style_base); ASSERT_STREQ(ret_v_cmd[idx].val.c_str(), "v511"); ++idx; // - # null ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); ASSERT_EQ(ret_v_cmd[idx].hsc, (uint)0); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_list); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_list); ++idx; // - # null ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); ASSERT_EQ(ret_v_cmd[idx].hsc, (uint)0); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_list); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_list); ++idx; // - ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); ASSERT_EQ(ret_v_cmd[idx].hsc, (uint)0); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_list); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_list); ++idx; ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_stack); // stack ++idx; // - ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); ASSERT_EQ(ret_v_cmd[idx].hsc, (uint)2); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_list); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_list); ++idx; ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_stack); // stack ++idx; // - ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); ASSERT_EQ(ret_v_cmd[idx].hsc, (uint)4); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_list); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_list); ++idx; ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_stack); // stack ++idx; // - ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); ASSERT_EQ(ret_v_cmd[idx].hsc, (uint)6); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_list); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_list); ++idx; // v8111 ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_assign); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_str); - ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::num_block_style_base); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_str); + ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::type_block_style_base); ASSERT_STREQ(ret_v_cmd[idx].val.c_str(), "v8111"); ++idx; // - ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); ASSERT_EQ(ret_v_cmd[idx].hsc, (uint)0); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_list); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_list); ++idx; // v9 ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_assign); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_str); - ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::num_block_style_base); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_str); + ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::type_block_style_base); ASSERT_STREQ(ret_v_cmd[idx].val.c_str(), "v9"); ++idx; } @@ -882,11 +882,11 @@ TEST(yaml, _token2cmd_null_values_case01){ uint idx=0; // - ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_list); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_list); ++idx; // - ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_list); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_list); ++idx; } TEST(yaml, _token2cmd_null_values_case02){ @@ -905,11 +905,11 @@ TEST(yaml, _token2cmd_null_values_case02){ uint idx=0; // k1: ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_hash); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_hash); ++idx; // k2: ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_hash); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_hash); ++idx; } TEST(yaml, _token2cmd_null_values_case03){ @@ -928,23 +928,23 @@ TEST(yaml, _token2cmd_null_values_case03){ uint idx=0; // - ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_list); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_list); ++idx; ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_stack); // stack ++idx; // k1: ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_hash); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_hash); ++idx; // - ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_list); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_list); ++idx; ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_stack); // stack ++idx; // k2: ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_alloc); - ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::num_hash); + ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_hash); ++idx; } //*/ diff --git a/tests_list_for_build_and_run.txt b/tests_list_for_build_and_run.txt index 04185d55..a8a61805 100644 --- a/tests_list_for_build_and_run.txt +++ b/tests_list_for_build_and_run.txt @@ -6,46 +6,46 @@ # このファイルに記載されたテストコードは "$ make" コマンドでビルドされます. # また,テスト実行は,実行対象として判定されます. -../test/src_test/cast/typeConversion.cpp -../test/src_test/container/matrixContainer_binary/bmat.cpp -../test/src_test/container/matrixContainer_colMajor/mat_c.cpp -../test/src_test/container/matrixContainer_colMajor/ope.cpp -../test/src_test/container/matrixContainer_rowMajor/mat_r.cpp -../test/src_test/container/vector/slice.cpp -../test/src_test/container/vector/stdVector_expansion.cpp -../test/src_test/container/vector/vec_manipulation.cpp -../test/src_test/container/vector/vvec.cpp -../test/src_test/definitions/typeDef.cpp -../test/src_test/definitions/typeNum.cpp -../test/src_test/file/cp.cpp -../test/src_test/file/csv.cpp -../test/src_test/file/file.cpp -../test/src_test/file/file_c.cpp -../test/src_test/file/file_operations.cpp -../test/src_test/file/glob.cpp -../test/src_test/file/mkdir.cpp -../test/src_test/file/mv.cpp -../test/src_test/file/path.cpp -../test/src_test/file/read_write.cpp -../test/src_test/file/rm.cpp -../test/src_test/file/tinyInterpreter.cpp +#../test/src_test/cast/typeConversion.cpp +#../test/src_test/container/matrixContainer_binary/bmat.cpp +#../test/src_test/container/matrixContainer_colMajor/mat_c.cpp +#../test/src_test/container/matrixContainer_colMajor/ope.cpp +#../test/src_test/container/matrixContainer_rowMajor/mat_r.cpp +#../test/src_test/container/vector/slice.cpp +#../test/src_test/container/vector/stdVector_expansion.cpp +#../test/src_test/container/vector/vec_manipulation.cpp +#../test/src_test/container/vector/vvec.cpp +#../test/src_test/definitions/typeDef.cpp +#../test/src_test/definitions/typeNum.cpp +#../test/src_test/file/cp.cpp +#../test/src_test/file/csv.cpp +#../test/src_test/file/file.cpp +#../test/src_test/file/file_c.cpp +#../test/src_test/file/file_operations.cpp +#../test/src_test/file/glob.cpp +#../test/src_test/file/mkdir.cpp +#../test/src_test/file/mv.cpp +#../test/src_test/file/path.cpp +#../test/src_test/file/read_write.cpp +#../test/src_test/file/rm.cpp +#../test/src_test/file/tinyInterpreter.cpp ../test/src_test/file/yaml.cpp -../test/src_test/math/math.cpp -../test/src_test/math/signal.cpp -../test/src_test/math/hashFnc_of_MD5_SHA1_SHA2/hashSum.cpp -../test/src_test/math/hashFnc_of_MD5_SHA1_SHA2/sstd_md5_sha1_sha2_wrapper.cpp -../test/src_test/memory/terp/terp.cpp -../test/src_test/memory/terp/terp_print.cpp -../test/src_test/memory/unique_void_ptr.cpp -../test/src_test/memory/void_ptr.cpp -../test/src_test/print/pdbg.cpp -../test/src_test/print/print_printn_printn_all.cpp -../test/src_test/python/c2py.cpp -../test/src_test/string/encode_decode.cpp -../test/src_test/string/strEdit.cpp -../test/src_test/string/strmatch.cpp -../test/src_test/string/utf8.cpp -../test/src_test/sys/status.cpp -../test/src_test/sys/system.cpp -../test/src_test/time/measureTime.cpp -../test/src_test/time/time.cpp +#../test/src_test/math/math.cpp +#../test/src_test/math/signal.cpp +#../test/src_test/math/hashFnc_of_MD5_SHA1_SHA2/hashSum.cpp +#../test/src_test/math/hashFnc_of_MD5_SHA1_SHA2/sstd_md5_sha1_sha2_wrapper.cpp +#../test/src_test/memory/terp/terp.cpp +#../test/src_test/memory/terp/terp_print.cpp +#../test/src_test/memory/unique_void_ptr.cpp +#../test/src_test/memory/void_ptr.cpp +#../test/src_test/print/pdbg.cpp +#../test/src_test/print/print_printn_printn_all.cpp +#../test/src_test/python/c2py.cpp +#../test/src_test/string/encode_decode.cpp +#../test/src_test/string/strEdit.cpp +#../test/src_test/string/strmatch.cpp +#../test/src_test/string/utf8.cpp +#../test/src_test/sys/status.cpp +#../test/src_test/sys/system.cpp +#../test/src_test/time/measureTime.cpp +#../test/src_test/time/time.cpp From 693828865dde795c29a48c57abcf7d8ff3285686 Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sun, 4 Aug 2024 20:08:19 +0900 Subject: [PATCH 04/47] split type and format --- sstd/src/file/yaml.cpp | 9 +++--- sstd/src/file/yaml.hpp | 33 ++++++++++----------- test/src_test/file/yaml.cpp | 57 +++++++++++++++++++++++++++++++------ 3 files changed, 70 insertions(+), 29 deletions(-) diff --git a/sstd/src/file/yaml.cpp b/sstd/src/file/yaml.cpp index 23a56c3a..dfca04a2 100644 --- a/sstd/src/file/yaml.cpp +++ b/sstd/src/file/yaml.cpp @@ -715,7 +715,7 @@ bool _construct_var(sstd::terp::var& ret_yml, const std::vector& ret, if(is_list){ tmp.type += sstd_yaml::type_list; tmp.hsc_hx+=2; } if(is_hash){ tmp.type += sstd_yaml::type_hash; } - if(is_flow){ tmp.format = sstd_yaml::type_flow_style_base; } + if(is_flow){ tmp.format = sstd_yaml::format_flow_style; } // Skip empty tokens until the first non-empty token occurs. (Empty token is treated as a line-break related with to other token in a context of multi-line YAML) if(ret.size()==0 && @@ -920,7 +920,7 @@ bool _is_all_the_data_str_type(const std::vector& v){ } bool _is_all_the_data_flowStyle(const std::vector& v){ for(uint i=0; i& ret, const char* str_i std::string str = std::regex_replace(str_in, std::regex("\r"), ""); // "\r\n" -> "\n" if(!sstd_yaml::_str2token_except_multilines(ret, str.c_str())){ sstd::pdbg_err("sstd_yaml::_str2token_except_multilines() was failed.\n"); return false; } + sstd::printn(ret); if(!sstd_yaml::_token2token_split_bv_list_type_cnt(ret)){ sstd::pdbg_err("sstd_yaml::_token2token_split_bv_list_type_cnt() was failed.\n"); return false; } if(!sstd_yaml::_token2token_merge_multilines(ret)){ sstd::pdbg_err("sstd_yaml::_token2token_merge_multilines() was failed.\n"); return false; } if(!sstd_yaml::_token2token_postprocess(ret)){ sstd::pdbg_err("sstd_yaml::_token2token_postprocess() was failed.\n"); return false; } diff --git a/sstd/src/file/yaml.hpp b/sstd/src/file/yaml.hpp index b681cd33..255ec521 100644 --- a/sstd/src/file/yaml.hpp +++ b/sstd/src/file/yaml.hpp @@ -23,16 +23,16 @@ namespace sstd_yaml{ // type definition const static uint8 type_null = 255; - const static uint8 type_block_style_base = 0; const static uint8 type_str = 0; // for BLOCK_STYLE const static uint8 type_list = 1; // for BLOCK_STYLE const static uint8 type_hash = 2; // for BLOCK_STYLE const static uint8 type_list_and_hash = 3; // for BLOCK_STYLE - const static uint8 type_flow_style_base = 4; - // sstd_yaml::type_flow_style_base + sstd_yaml::type_str 4 // reserved number for FLOW_STYLE - // sstd_yaml::type_flow_style_base + sstd_yaml::type_list 5 // reserved number for FLOW_STYLE - // sstd_yaml::type_flow_style_base + sstd_yaml::type_hash 6 // reserved number for FLOW_STYLE - // sstd_yaml::type_flow_style_base + sstd_yaml::type_list_and_hash 7 // reserved number for FLOW_STYLE + + const static uint8 format_null = 255; + const static uint8 format_block_style = 0; + const static uint8 format_flow_style = 1; + const static uint8 format_anchor = 2; + const static uint8 format_alias = 3; //--- // token for proceed YAML parsing @@ -44,18 +44,17 @@ namespace sstd_yaml{ std::string rawStr; // A raw string splitted by line concering the YAML processing units. // Data structure to load YAML - //uint type = sstd_yaml::type_null; // sstd_yaml::type_str; // A destination type number of this line - uint type = sstd_yaml::type_str; // A destination type number of this line - uint format = sstd_yaml::type_block_style_base; // If containing flow style notation - uint list_type_cnt = 0; // Number of list type. (`- - - v`) - uint hsc_lx = 0; // head space counts for list type - uint hsc_hx = 0; // head space counts for hash type + uint8 type = sstd_yaml::type_str; // A destination type number of this line + uint8 format = sstd_yaml::format_block_style; // If containing flow style notation + uint list_type_cnt = 0; // Number of list type. (`- - - v`) + uint hsc_lx = 0; // head space counts for list type + uint hsc_hx = 0; // head space counts for hash type bool hasValue = false; // If the value (val1 or val2) is vaild for each data type (list or hash). - bool key_is_dqed = false; - bool key_is_sqed = false; - bool val_is_dqed = false; - bool val_is_sqed = false; + bool key_is_dqed = false; // _dqed: double quated + bool key_is_sqed = false; // _sqed: single quated + bool val_is_dqed = false; // _dqed: double quated + bool val_is_sqed = false; // _sqed: single quated bool mult_line_val = false; std::string key; // key for "hash" std::string val; // value for "list" or "hash" @@ -72,6 +71,8 @@ namespace sstd_yaml{ uint8 type; // data type uint8 format; // data format std::string val; // value +// std::string anchor; // anchor name +// std::string alias; // alias name }; //--- diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index 41b91e84..11993f93 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -85,7 +85,7 @@ TEST(yaml, _split_quotes_by_control_chars_02){ if(IS_HASH){ ans_type += sstd_yaml::type_hash; } \ ASSERT_EQ(v_ret[0].type, (uint)ans_type); \ \ - uint ans_flow = IS_FLOW ? sstd_yaml::type_flow_style_base : sstd_yaml::type_block_style_base; \ + uint ans_flow = IS_FLOW ? sstd_yaml::format_flow_style : sstd_yaml::format_block_style; \ ASSERT_EQ(v_ret[0].format, (uint)ans_flow); \ ASSERT_EQ(v_ret[0].list_type_cnt, (uint)LIST_TYPE_COUNT); @@ -682,7 +682,7 @@ TEST(yaml, _token2cmd_usual_cases){ // v11 ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_assign); ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_str); - ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::type_block_style_base); + ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::format_block_style); ASSERT_STREQ(ret_v_cmd[idx].val.c_str(), "v11"); ++idx; @@ -710,7 +710,7 @@ TEST(yaml, _token2cmd_usual_cases){ // v21 ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_assign); ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_str); - ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::type_block_style_base); + ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::format_block_style); ASSERT_STREQ(ret_v_cmd[idx].val.c_str(), "v21"); ++idx; @@ -722,7 +722,7 @@ TEST(yaml, _token2cmd_usual_cases){ // v22 ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_assign); ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_str); - ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::type_block_style_base); + ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::format_block_style); ASSERT_STREQ(ret_v_cmd[idx].val.c_str(), "v22"); ++idx; @@ -756,7 +756,7 @@ TEST(yaml, _token2cmd_usual_cases){ // v241 ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_assign); ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_str); - ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::type_block_style_base); + ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::format_block_style); ASSERT_STREQ(ret_v_cmd[idx].val.c_str(), "v241"); ++idx; @@ -776,7 +776,7 @@ TEST(yaml, _token2cmd_usual_cases){ // v31 ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_assign); ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_str); - ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::type_block_style_base); + ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::format_block_style); ASSERT_STREQ(ret_v_cmd[idx].val.c_str(), "v31"); ++idx; @@ -803,7 +803,7 @@ TEST(yaml, _token2cmd_usual_cases){ // v511 ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_assign); ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_str); - ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::type_block_style_base); + ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::format_block_style); ASSERT_STREQ(ret_v_cmd[idx].val.c_str(), "v511"); ++idx; @@ -848,7 +848,7 @@ TEST(yaml, _token2cmd_usual_cases){ // v8111 ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_assign); ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_str); - ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::type_block_style_base); + ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::format_block_style); ASSERT_STREQ(ret_v_cmd[idx].val.c_str(), "v8111"); ++idx; // - @@ -859,7 +859,7 @@ TEST(yaml, _token2cmd_usual_cases){ // v9 ASSERT_EQ(ret_v_cmd[idx].ope, sstd_yaml::ope_assign); ASSERT_EQ(ret_v_cmd[idx].type, sstd_yaml::type_str); - ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::type_block_style_base); + ASSERT_EQ(ret_v_cmd[idx].format, sstd_yaml::format_block_style); ASSERT_STREQ(ret_v_cmd[idx].val.c_str(), "v9"); ++idx; } @@ -4288,4 +4288,43 @@ TEST(yaml, yaml_load_all_fp){ //*/ //----------------------------------------------------------------------------------------------------------------------------------------------- +TEST(yaml, _str2token_multi_list_case00_tmp){ + printf("#####################################################\n"); + std::string s = R"( +- &ll + - a + - b + - c + +#hh: &hh +# k1: v1 +# k2: v2 + +#- &l a # anchor +#- *l # alias +#- [*l] +#- {*l} +)"; + std::vector v_ret; + bool ret = sstd_yaml::_str2token(v_ret, s); + sstd::printn(ret); + sstd::printn(v_ret.size()); + sstd::printn(v_ret); + /* + ASSERT_TRUE(ret); + ASSERT_EQ(v_ret.size(), (uint)3); + ASSERT_STREQ(v_ret[0].rawStr.c_str(), "k_X: "); + ASSERT_STREQ(v_ret[0].val.c_str(), "" ); + ASSERT_STREQ(v_ret[1].rawStr.c_str(), " k1: |+\n a\n \n c\n "); + ASSERT_STREQ(v_ret[1].key.c_str(), "k1" ); + ASSERT_STREQ(v_ret[1].val.c_str(), "a\n\nc\n\n"); // "|+\n a\n \n c\n " + ASSERT_STREQ(v_ret[2].rawStr.c_str(), "k_Y: v_Y"); + ASSERT_STREQ(v_ret[2].key.c_str(), "k_Y"); + ASSERT_STREQ(v_ret[2].val.c_str(), "v_Y"); + */ +} + +//-- + EXECUTE_TESTS(); + From 7dc6b81ce0a15c50c0ec95f90e7bb7b5b16c8ca6 Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sun, 4 Aug 2024 21:14:58 +0900 Subject: [PATCH 05/47] wip --- sstd/src/file/yaml.cpp | 28 ++++++++++++++++++++-------- sstd/src/file/yaml.hpp | 16 +++++++--------- test/src_test/file/yaml.cpp | 1 + 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/sstd/src/file/yaml.cpp b/sstd/src/file/yaml.cpp index dfca04a2..f6b32c6d 100644 --- a/sstd/src/file/yaml.cpp +++ b/sstd/src/file/yaml.cpp @@ -751,14 +751,20 @@ bool _construct_var(sstd::terp::var& ret_yml, const std::vector& ret, const std::string& str){ @@ -827,7 +833,7 @@ bool sstd_yaml::_str2token_except_multilines(std::vector& ret, if(!is_escaped && !in_s_quate && str[r]=='"' ){ in_d_quate = !in_d_quate; dqed=true; } if(!is_escaped && !in_d_quate && str[r]=='\''){ in_s_quate = !in_s_quate; sqed=true; } - + if(!in_d_quate && !in_s_quate){ if((subt.size()==0 && str[r]=='#') || (str[r]==' ' && str[r+1]=='#')){ tmp.rawStr+=str[r]; ++r; @@ -880,10 +886,16 @@ bool sstd_yaml::_str2token_except_multilines(std::vector& ret, tmp.val=std::move(sstd::strip(subt)); tmp.val_is_dqed=dqed; tmp.val_is_sqed=sqed; + bool is_anchor = _is_anchor(tmp.val); + bool is_alias = _is_alias (tmp.val); if(is_list){ tmp.type += sstd_yaml::type_list; tmp.hsc_hx+=2; } if(is_hash){ tmp.type += sstd_yaml::type_hash; } - if(is_flow){ tmp.format = sstd_yaml::format_flow_style; } + + if( (is_flow&&is_anchor) || (is_anchor&&is_alias) || (is_alias&&is_flow) ){ sstd::pdbg_err("The flags of `is_flow`, `is_anchor` and `is_alias` are three-way choice. More than 2 flags can not have true value.\n is_flow: %s\n is_anchor: %s\n is_alias: %s\n", (is_flow?"true":"false"), (is_anchor?"true":"false"), (is_alias?"true":"false")); return false; } + if(is_flow ){ tmp.format = sstd_yaml::format_flow_style; } + if(is_anchor){ tmp.format = sstd_yaml::format_anchor; tmp.val.erase(0,1); } // 1) set format type, 2) remove '&' in the head of the string + if(is_alias ){ tmp.format = sstd_yaml::format_alias; tmp.val.erase(0,1); } // 1) set format type, 2) remove '*' in the head of the string // Skip empty tokens until the first non-empty token occurs. (Empty token is treated as a line-break related with to other token in a context of multi-line YAML) if(ret.size()==0 && diff --git a/sstd/src/file/yaml.hpp b/sstd/src/file/yaml.hpp index 255ec521..52db0e24 100644 --- a/sstd/src/file/yaml.hpp +++ b/sstd/src/file/yaml.hpp @@ -22,15 +22,15 @@ namespace sstd_yaml{ //--- // type definition - const static uint8 type_null = 255; - const static uint8 type_str = 0; // for BLOCK_STYLE - const static uint8 type_list = 1; // for BLOCK_STYLE - const static uint8 type_hash = 2; // for BLOCK_STYLE - const static uint8 type_list_and_hash = 3; // for BLOCK_STYLE + const static uint8 type_null = 255; + const static uint8 type_str = 0; // for BLOCK_STYLE + const static uint8 type_list = 1; // for BLOCK_STYLE + const static uint8 type_hash = 2; // for BLOCK_STYLE + const static uint8 type_list_and_hash = 3; // for BLOCK_STYLE const static uint8 format_null = 255; - const static uint8 format_block_style = 0; - const static uint8 format_flow_style = 1; + const static uint8 format_block_style = 0; // using indents to construct + const static uint8 format_flow_style = 1; // list [] or {} const static uint8 format_anchor = 2; const static uint8 format_alias = 3; @@ -71,8 +71,6 @@ namespace sstd_yaml{ uint8 type; // data type uint8 format; // data format std::string val; // value -// std::string anchor; // anchor name -// std::string alias; // alias name }; //--- diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index 11993f93..f8c46251 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -4295,6 +4295,7 @@ TEST(yaml, _str2token_multi_list_case00_tmp){ - a - b - c +- *ll #hh: &hh # k1: v1 From 659bc52f1bf0771a75209dcc66506e82ad73d845 Mon Sep 17 00:00:00 2001 From: admiswalker Date: Mon, 19 Aug 2024 20:21:05 +0900 Subject: [PATCH 06/47] Fix bug of multiple line string input with multile list. add: TEST(yaml, _str2token_multi_list_case11) --- sstd/src/file/yaml.cpp | 29 +++++++++++----- sstd/src/file/yaml.hpp | 7 ++-- test/src_test/file/yaml.cpp | 67 +++++++++++++++++++++++++++++++++---- 3 files changed, 86 insertions(+), 17 deletions(-) diff --git a/sstd/src/file/yaml.cpp b/sstd/src/file/yaml.cpp index f6b32c6d..838d4515 100644 --- a/sstd/src/file/yaml.cpp +++ b/sstd/src/file/yaml.cpp @@ -32,6 +32,7 @@ printf("command:\n"); \ printf(" type: %d\n", rhs.type); \ printf(" format: %d\n", rhs.format); \ + printf(" ref_type: %d\n", rhs.ref_type); \ printf(" list_type_cnt: %d\n", rhs.list_type_cnt); \ printf(" hsc_lx: %d\n", rhs.hsc_lx); \ printf(" hsc_hx: %d\n", rhs.hsc_hx); \ @@ -886,16 +887,16 @@ bool sstd_yaml::_str2token_except_multilines(std::vector& ret, tmp.val=std::move(sstd::strip(subt)); tmp.val_is_dqed=dqed; tmp.val_is_sqed=sqed; - bool is_anchor = _is_anchor(tmp.val); - bool is_alias = _is_alias (tmp.val); + bool is_anchor = _is_anchor(tmp.val); // for the '&' (anchor) + bool is_alias = _is_alias (tmp.val); // for the '*' (alias) if(is_list){ tmp.type += sstd_yaml::type_list; tmp.hsc_hx+=2; } if(is_hash){ tmp.type += sstd_yaml::type_hash; } if( (is_flow&&is_anchor) || (is_anchor&&is_alias) || (is_alias&&is_flow) ){ sstd::pdbg_err("The flags of `is_flow`, `is_anchor` and `is_alias` are three-way choice. More than 2 flags can not have true value.\n is_flow: %s\n is_anchor: %s\n is_alias: %s\n", (is_flow?"true":"false"), (is_anchor?"true":"false"), (is_alias?"true":"false")); return false; } - if(is_flow ){ tmp.format = sstd_yaml::format_flow_style; } - if(is_anchor){ tmp.format = sstd_yaml::format_anchor; tmp.val.erase(0,1); } // 1) set format type, 2) remove '&' in the head of the string - if(is_alias ){ tmp.format = sstd_yaml::format_alias; tmp.val.erase(0,1); } // 1) set format type, 2) remove '*' in the head of the string + if(is_flow ){ tmp.format = sstd_yaml::format_flow_style; } + if(is_anchor){ tmp.ref_type = sstd_yaml::ref_type_anchor; tmp.val.erase(0,1); } // 1) set format type, 2) remove '&' in the head of the string + if(is_alias ){ tmp.ref_type = sstd_yaml::ref_type_alias; tmp.val.erase(0,1); } // 1) set format type, 2) remove '*' in the head of the string // Skip empty tokens until the first non-empty token occurs. (Empty token is treated as a line-break related with to other token in a context of multi-line YAML) if(ret.size()==0 && @@ -961,6 +962,7 @@ uint _get_criteria_hsc(const sstd_yaml::token& t){ if(t.type==sstd_yaml::type_hash || t.type==sstd_yaml::type_list_and_hash){ return t.hsc_hx; }else{ + if(t.list_type_cnt!=1){ return t.hsc_lx + t.list_type_cnt * 2; } return t.hsc_lx; } } @@ -972,6 +974,16 @@ uint _get_current_hsc(const sstd_yaml::token& t){ } } bool sstd_yaml::_token2token_split_bv_list_type_cnt(std::vector& io){ + // Example: + // + // in: + // > - - - a + // + // out: + // > - + // > - + // > - a + std::vector ret; for(uint i=0; i& io) // Check criteria values (Defining criteria value as a base token like list, hash or list_and_hash type to merge) bool start_with_string = (*pT).val.size()>=1; - uint criteria_hsc = _get_criteria_hsc((*pT)); + uint criteria_hsc = _get_criteria_hsc((*pT)); // criteria_hsc: criteria head space count for(uint merge_cnt=1;; ++merge_cnt){ // Update @@ -1058,7 +1070,7 @@ bool sstd_yaml::_token2token_merge_multilines(std::vector& io) bool is_control_types = _is_control_types((*pT).type); // Check break - uint curr_hsc = _get_current_hsc((*pT)); + uint curr_hsc = _get_current_hsc((*pT)); // curr_hsc: current head space count if( merge_cnt==1 && is_control_types && (!start_with_string||(curr_hsc<=criteria_hsc)) ){ break; } // - `!start_with_string` is for: // │ k0: @@ -1175,9 +1187,8 @@ bool sstd_yaml::_str2token(std::vector& ret, const char* str_i std::string str = std::regex_replace(str_in, std::regex("\r"), ""); // "\r\n" -> "\n" if(!sstd_yaml::_str2token_except_multilines(ret, str.c_str())){ sstd::pdbg_err("sstd_yaml::_str2token_except_multilines() was failed.\n"); return false; } - sstd::printn(ret); - if(!sstd_yaml::_token2token_split_bv_list_type_cnt(ret)){ sstd::pdbg_err("sstd_yaml::_token2token_split_bv_list_type_cnt() was failed.\n"); return false; } if(!sstd_yaml::_token2token_merge_multilines(ret)){ sstd::pdbg_err("sstd_yaml::_token2token_merge_multilines() was failed.\n"); return false; } + if(!sstd_yaml::_token2token_split_bv_list_type_cnt(ret)){ sstd::pdbg_err("sstd_yaml::_token2token_split_bv_list_type_cnt() was failed.\n"); return false; } if(!sstd_yaml::_token2token_postprocess(ret)){ sstd::pdbg_err("sstd_yaml::_token2token_postprocess() was failed.\n"); return false; } return true; } diff --git a/sstd/src/file/yaml.hpp b/sstd/src/file/yaml.hpp index 52db0e24..32b54874 100644 --- a/sstd/src/file/yaml.hpp +++ b/sstd/src/file/yaml.hpp @@ -31,8 +31,10 @@ namespace sstd_yaml{ const static uint8 format_null = 255; const static uint8 format_block_style = 0; // using indents to construct const static uint8 format_flow_style = 1; // list [] or {} - const static uint8 format_anchor = 2; - const static uint8 format_alias = 3; + + const static uint8 ref_type_null = 255; + const static uint8 ref_type_anchor = 0; + const static uint8 ref_type_alias = 1; //--- // token for proceed YAML parsing @@ -46,6 +48,7 @@ namespace sstd_yaml{ // Data structure to load YAML uint8 type = sstd_yaml::type_str; // A destination type number of this line uint8 format = sstd_yaml::format_block_style; // If containing flow style notation + uint8 ref_type = sstd_yaml::ref_type_null; // If containing anchor or alias uint list_type_cnt = 0; // Number of list type. (`- - - v`) uint hsc_lx = 0; // head space counts for list type uint hsc_hx = 0; // head space counts for hash type diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index f8c46251..a98c925c 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -377,6 +377,21 @@ TEST(yaml, _str2token_multi_list_case10){ // sstd::printn(v_ret[0].val.c_str()); ASSERT_STREQ(v_ret[0].val.c_str(), "a - a"); // "a\n - a" } +TEST(yaml, _str2token_multi_list_case11){ + std::string s=R"( +- x + - - a + - b + - c +)"; + std::vector v_ret; + bool ret = sstd_yaml::_str2token(v_ret, s); + //sstd::printn(v_ret); + + ASSERT_TRUE(ret); + ASSERT_EQ(v_ret.size(), (uint)1); + ASSERT_STREQ(v_ret[0].val.c_str(), "x - - a - b - c"); // "a\n - a" +} //--- @@ -4292,11 +4307,12 @@ TEST(yaml, _str2token_multi_list_case00_tmp){ printf("#####################################################\n"); std::string s = R"( - &ll - - a + - - a - b - c - *ll - +)"; + /* #hh: &hh # k1: v1 # k2: v2 @@ -4305,12 +4321,12 @@ TEST(yaml, _str2token_multi_list_case00_tmp){ #- *l # alias #- [*l] #- {*l} -)"; +*/ std::vector v_ret; bool ret = sstd_yaml::_str2token(v_ret, s); - sstd::printn(ret); - sstd::printn(v_ret.size()); - sstd::printn(v_ret); + sstd::printn_all(ret); + sstd::printn_all(v_ret.size()); + sstd::printn_all(v_ret); /* ASSERT_TRUE(ret); ASSERT_EQ(v_ret.size(), (uint)3); @@ -4325,6 +4341,45 @@ TEST(yaml, _str2token_multi_list_case00_tmp){ */ } +TEST(yaml, _str2token_multi_list_case00_tmp02){ + printf("#####################################################\n"); + std::string s = R"( +- x + - - a + - b + - c +)"; + + std::vector v_ret; + bool ret = sstd_yaml::_str2token(v_ret, s); + sstd::printn_all(ret); + sstd::printn_all(v_ret.size()); + sstd::printn_all(v_ret); +} + +TEST(yaml, _str2token_multi_list_case00_tmp03){ + std::string s=R"( +- x + - - a + - b + - c +)"; + sstd::terp::var yml; ASSERT_TRUE(sstd::yaml_load(yml, s)); // TEST THIS LINE + sstd::printn(yml); + + //--- + +// sstd::terp::var ans; +// ans = sstd::terp::list(2); +// ans[0] = "a"; +// ans[1] = "b"; + + //--- + +// ASSERT_TRUE(yml==ans); +} + + //-- EXECUTE_TESTS(); From dbf7500ee48f2f955013f6c161c9a6140294976e Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sat, 7 Sep 2024 14:45:20 +0900 Subject: [PATCH 07/47] WIP (under implementing the anchor and alias to sstd::yaml) --- sstd/src/file/yaml.cpp | 93 +++++++++++++++++--- sstd/src/file/yaml.hpp | 19 ++-- sstd/src/memory/terp/terp.cpp | 1 + test/src_test/file/yaml.cpp | 161 ++++++++++++++++++++++++++++++---- 4 files changed, 238 insertions(+), 36 deletions(-) diff --git a/sstd/src/file/yaml.cpp b/sstd/src/file/yaml.cpp index 838d4515..8112f907 100644 --- a/sstd/src/file/yaml.cpp +++ b/sstd/src/file/yaml.cpp @@ -44,6 +44,9 @@ printf(" mult_line_val: %s\n", (rhs.mult_line_val?"ture":"false")); \ printf(" key: `%s`\n", rhs.key.c_str()); \ printf(" val: `%s`\n", rhs.val.c_str()); \ + printf("anchor and alias:\n"); \ + printf(" ref_type: %d\n", rhs.ref_type); \ + printf(" aa_val: `%s`\n", rhs.aa_val.c_str()); \ printf(",\n"); void sstd::print(const sstd_yaml::token& rhs){ @@ -71,6 +74,9 @@ void sstd::print_for_vT(const sstd_yaml::token& rhs){ printf(" type: %d\n", rhs.type); \ printf(" format: %d\n", rhs.format); \ printf(" val: `%s`\n", rhs.val.c_str()); \ + printf("anchor and alias:\n"); \ + printf(" ref_type: %d\n", rhs.ref_type); \ + printf(" aa_val: `%s`\n", rhs.aa_val.c_str()); \ printf(",\n"); void sstd::print(const sstd_yaml::command& rhs){ @@ -377,9 +383,17 @@ bool sstd_yaml::_token2cmd(std::vector& ret_vCmd, con c.type = sstd_yaml::type_list; //c.format = t.format; //c.val = t.val; // t.key; + // --- anchor and alias --- + if(t.ref_type==sstd_yaml::ref_type_anchor){ + c.ref_type = t.ref_type; + c.aa_val = t.val; // ここはあとで,c.aa_val = t.aa_val にする + }else if(t.ref_type==sstd_yaml::ref_type_alias){ + c.ref_type = t.ref_type; + c.aa_val = t.val; // ここはあとで,c.aa_val = t.aa_val にする + } ret_vCmd.push_back(c); } - + if(t.hasValue){ // check the value is NOT NULL // --- debug info --- c.line_num_begin = t.line_num_begin; @@ -393,6 +407,24 @@ bool sstd_yaml::_token2cmd(std::vector& ret_vCmd, con c.val = t.val; // t.key; ret_vCmd.push_back(c); } + /* + if(t.ref_type==sstd_yaml::ref_type_anchor){ + // --- debug info --- + c.line_num_begin = t.line_num_begin; + c.line_num_end = t.line_num_end; + c.rawStr = t.rawStr; + // --- construct info --- + c.ope = sstd_yaml::ope_push_ref; + c.hsc = t.hsc_hx; // t.hsc_lx; + c.type = sstd_yaml::type_null; + c.format = t.format; + c.val = t.val; // t.key; + // --- anchor and alias --- + c.ref_type = t.ref_type; + c.aa_val = t.val; // ここはあとで,c.aa_val = t.aa_val にする + ret_vCmd.push_back(c); + }*/ + } break; case sstd_yaml::type_hash: { // --- debug info --- @@ -482,6 +514,7 @@ bool sstd_yaml::_token2cmd(std::vector& ret_vCmd, con // construction of stack() command if( !t.hasValue && (t.type==sstd_yaml::type_list || t.type==sstd_yaml::type_hash || t.type==sstd_yaml::type_list_and_hash )){ + sstd::printn_all("in\n"); uint hsc_curr = c.hsc; uint hsc_next = 0; @@ -496,7 +529,7 @@ bool sstd_yaml::_token2cmd(std::vector& ret_vCmd, con const sstd_yaml::token& t_nx = v_token[i+1]; // _nx: next switch(t_nx.type){ - //case sstd_yaml::type_str: { hsc_next = t_nx.hsc_hx; } break; + //case sstd_yaml::type_str: { hsc_next = t_nx.hsc_hx; } break; case sstd_yaml::type_str: { continue; } break; case sstd_yaml::type_list: { hsc_next = t_nx.hsc_lx + 2*(t_nx.list_type_cnt-1); } break; case sstd_yaml::type_hash: { hsc_next = t_nx.hsc_hx; } break; @@ -522,11 +555,12 @@ bool sstd_yaml::_token2cmd(std::vector& ret_vCmd, con // │ t │ │ │ │ │ // └───┴───────────────────┴───────────────────┴───────────────────┴───────────────────┘ // - bool isGr = t.type==sstd_yaml::type_list || t_nx.type==sstd_yaml::type_hash; // check '>' case - bool isGrOrEq = !isGr; // check '>=' case + bool isGr = t.type==sstd_yaml::type_list || t_nx.type==sstd_yaml::type_hash; // check '>' case + bool isGrOrEq = !isGr; // check '>=' case if((isGr && hsc_next> hsc_curr) || (isGrOrEq && hsc_next>=hsc_curr) ) { + sstd::printn_all("in2\n"); // --- debug info --- c.line_num_begin = t.line_num_begin; c.line_num_end = t.line_num_end; @@ -675,12 +709,14 @@ bool _flow_style_str_to_obj(sstd::terp::var& var_out, const std::string& s_in){ return true; } bool _construct_var(sstd::terp::var& ret_yml, const std::vector& v_cmd){ - std::vector v_dst; // v: vector, _dst: destination. An address stack for sstd_yaml::ope_alloc (follows the YAML indent) + std::vector v_dst; // v: vector, _dst: destination address. An address stack for sstd_yaml::ope_alloc (follows the YAML indent) std::vector v_dst_cr; // v: vector, _dst: destination address, _cr: current. An address stack for sstd_yaml::ope_stack or sstd_yaml::ope_assign. std::vector v_hsc; // v: vector, hsc: head space count v_dst.push_back(&ret_yml); v_dst_cr.push_back(&ret_yml); v_hsc.push_back(0); + + std::unordered_map tbl_anchor_to_address; for(uint i=0; i& ret, if(is_list){ tmp.type += sstd_yaml::type_list; tmp.hsc_hx+=2; } if(is_hash){ tmp.type += sstd_yaml::type_hash; } - - if( (is_flow&&is_anchor) || (is_anchor&&is_alias) || (is_alias&&is_flow) ){ sstd::pdbg_err("The flags of `is_flow`, `is_anchor` and `is_alias` are three-way choice. More than 2 flags can not have true value.\n is_flow: %s\n is_anchor: %s\n is_alias: %s\n", (is_flow?"true":"false"), (is_anchor?"true":"false"), (is_alias?"true":"false")); return false; } + if(is_flow ){ tmp.format = sstd_yaml::format_flow_style; } if(is_anchor){ tmp.ref_type = sstd_yaml::ref_type_anchor; tmp.val.erase(0,1); } // 1) set format type, 2) remove '&' in the head of the string if(is_alias ){ tmp.ref_type = sstd_yaml::ref_type_alias; tmp.val.erase(0,1); } // 1) set format type, 2) remove '*' in the head of the string @@ -907,10 +973,10 @@ bool sstd_yaml::_str2token_except_multilines(std::vector& ret, // set hasValue tmp.hasValue=false; switch(tmp.type){ - case sstd_yaml::type_str: { if(tmp.val_is_dqed||tmp.val_is_sqed||tmp.val.size()>=1){tmp.hasValue=true;} } break; - case sstd_yaml::type_list: { if(tmp.val_is_dqed||tmp.val_is_sqed||tmp.val.size()>=1){tmp.hasValue=true;} } break; // check the value is NOT NULL + case sstd_yaml::type_str: { if((tmp.val_is_dqed||tmp.val_is_sqed||tmp.val.size()>=1) && (tmp.ref_type==sstd_yaml::ref_type_null)){tmp.hasValue=true;} } break; + case sstd_yaml::type_list: { if((tmp.val_is_dqed||tmp.val_is_sqed||tmp.val.size()>=1) && (tmp.ref_type==sstd_yaml::ref_type_null)){tmp.hasValue=true;} } break; // check the value is NOT NULL case sstd_yaml::type_list_and_hash: - case sstd_yaml::type_hash: { if(tmp.val_is_dqed||tmp.val_is_sqed||tmp.val.size()>=1){tmp.hasValue=true;} } break; // check the value is NOT NULL + case sstd_yaml::type_hash: { if((tmp.val_is_dqed||tmp.val_is_sqed||tmp.val.size()>=1) && (tmp.ref_type==sstd_yaml::ref_type_null)){tmp.hasValue=true;} } break; // check the value is NOT NULL default: { sstd::pdbg_err("Unexpected data type\n"); return false; } break; } @@ -1058,7 +1124,7 @@ bool sstd_yaml::_token2token_merge_multilines(std::vector& io) sstd_yaml::token tmp = (*pT); // Check criteria values (Defining criteria value as a base token like list, hash or list_and_hash type to merge) - bool start_with_string = (*pT).val.size()>=1; + bool start_with_string = (*pT).val.size()>=1 && (*pT).ref_type==sstd_yaml::ref_type_null; uint criteria_hsc = _get_criteria_hsc((*pT)); // criteria_hsc: criteria head space count for(uint merge_cnt=1;; ++merge_cnt){ @@ -1199,8 +1265,11 @@ bool sstd_yaml::_str2token(std::vector& ret, const std::string bool _yaml_load_base(sstd::terp::var& ret_yml, const std::vector& v_token){ + sstd::printn(v_token); std::vector v_cmd; if(!sstd_yaml::_token2cmd(v_cmd, v_token)){ return false; } + printf("\n\n"); + sstd::printn(v_cmd); if(!_construct_var(ret_yml, v_cmd)){ return false; } diff --git a/sstd/src/file/yaml.hpp b/sstd/src/file/yaml.hpp index 32b54874..7c9033bc 100644 --- a/sstd/src/file/yaml.hpp +++ b/sstd/src/file/yaml.hpp @@ -14,10 +14,12 @@ namespace sstd_yaml{ //--- // operation definition - const static uint8 ope_null = 255; - const static uint8 ope_alloc = 0; // allocate - const static uint8 ope_stack = 1; // stacking a value to v_dst - const static uint8 ope_assign = 2; // assignemnt + const static uint8 ope_null = 255; + const static uint8 ope_alloc = 0; // allocate + const static uint8 ope_stack = 1; // stacking a value to v_dst + const static uint8 ope_assign = 2; // assignemnt +// const static uint8 ope_push_ref = 3; // pushing a reference address to the hash table +// const static uint8 ope_pull_ref = 4; // pulling a reference address from the hash table //--- // type definition @@ -53,7 +55,7 @@ namespace sstd_yaml{ uint hsc_lx = 0; // head space counts for list type uint hsc_hx = 0; // head space counts for hash type - bool hasValue = false; // If the value (val1 or val2) is vaild for each data type (list or hash). + bool hasValue = false; // If the value (val1 or val2) is vaild for each data type (list or hash) bool key_is_dqed = false; // _dqed: double quated bool key_is_sqed = false; // _sqed: single quated bool val_is_dqed = false; // _dqed: double quated @@ -61,19 +63,24 @@ namespace sstd_yaml{ bool mult_line_val = false; std::string key; // key for "hash" std::string val; // value for "list" or "hash" + std::string aa_val; // value for anchor and alias }; struct command{ // Data for Debug YAML parsing uint line_num_begin = 1; // beginning line number uint line_num_end = 1; // endding line number (for multipleline) std::string rawStr; // A raw string splitted by line concering the YAML processing units. - + // Data structure to construct YAML uint ope; // operation uint hsc; // hsc: head space count uint8 type; // data type uint8 format; // data format std::string val; // value + + // Anchor and Alias + uint8 ref_type = sstd_yaml::ref_type_null; // If containing anchor or alias + std::string aa_val; // anchor and alias value }; //--- diff --git a/sstd/src/memory/terp/terp.cpp b/sstd/src/memory/terp/terp.cpp index 0da10204..4e659e1d 100644 --- a/sstd/src/memory/terp/terp.cpp +++ b/sstd/src/memory/terp/terp.cpp @@ -324,6 +324,7 @@ sstd::terp::var& sstd::terp::var::operator=(const sstd::terp::var& rhs){ return *this; } sstd::terp::var& sstd::terp::var::operator=(const sstd::terp::var* rhs){ + sstd::terp::var::free(); this->_is_reference = true; this->_type = rhs->type(); this->_p = rhs->p(); diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index a98c925c..576c9319 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -4302,6 +4302,7 @@ TEST(yaml, yaml_load_all_fp){ } //*/ //----------------------------------------------------------------------------------------------------------------------------------------------- +// anchor and alias TEST(yaml, _str2token_multi_list_case00_tmp){ printf("#####################################################\n"); @@ -4340,32 +4341,149 @@ TEST(yaml, _str2token_multi_list_case00_tmp){ ASSERT_STREQ(v_ret[2].val.c_str(), "v_Y"); */ } +TEST(yaml, _str2token_multi_list_case00_tmp2){ + std::string s=R"( +- &ll + - a +- *ll +)"; +/* +v_token = [ +debug info: + line_num_begin: 2 + line_num_end: 2 + rawStr: `- ` +command: + type: 1 + format: 0 + ref_type: 255 + list_type_cnt: 1 + hsc_lx: 0 + hsc_hx: 2 + hasValue: false + key_is_dqed: false + key_is_sqed: false + val_is_dqed: false + val_is_sqed: false + mult_line_val: false + key: `` + val: `` +, + +debug info: + line_num_begin: 3 + line_num_end: 1 + rawStr: ` - a` +command: + type: 1 + format: 0 + ref_type: 255 + list_type_cnt: 1 + hsc_lx: 2 + hsc_hx: 4 + hasValue: ture + key_is_dqed: false + key_is_sqed: false + val_is_dqed: false + val_is_sqed: false + mult_line_val: ture + key: `` + val: `a` +, +] +yml = [["a"]] -TEST(yaml, _str2token_multi_list_case00_tmp02){ - printf("#####################################################\n"); - std::string s = R"( -- x +--- + +v_cmd = [ +debug info: + line_num_begin: 2 + line_num_end: 2 + rawStr: `-` +command: + ope: 0 + hsc: 0 + type: 1 + format: 0 + val: `` +anchor and alias: + ref_type: 255 + aa_val: `` +, + +debug info: + line_num_begin: 2 + line_num_end: 2 + rawStr: `-` +command: + ope: 1 + hsc: 2 + type: 1 + format: 0 + val: `` +anchor and alias: + ref_type: 255 + aa_val: `` +, + +debug info: + line_num_begin: 3 + line_num_end: 1 + rawStr: ` - a` +command: + ope: 0 + hsc: 2 + type: 1 + format: 0 + val: `` +anchor and alias: + ref_type: 255 + aa_val: `` +, + +debug info: + line_num_begin: 3 + line_num_end: 1 + rawStr: ` - a` +command: + ope: 2 + hsc: 4 + type: 0 + format: 0 + val: `a` +anchor and alias: + ref_type: 255 + aa_val: `` +, +] +yml = [["a"]] +*/ +/* +- &ll - - a - b - c -)"; - - std::vector v_ret; - bool ret = sstd_yaml::_str2token(v_ret, s); - sstd::printn_all(ret); - sstd::printn_all(v_ret.size()); - sstd::printn_all(v_ret); -} - -TEST(yaml, _str2token_multi_list_case00_tmp03){ - std::string s=R"( -- x +- *ll +*/ +/* +- - - a - b - c -)"; +- + - - a + - b + - c +*/ sstd::terp::var yml; ASSERT_TRUE(sstd::yaml_load(yml, s)); // TEST THIS LINE sstd::printn(yml); + sstd::printn((void*)&yml); + sstd::printn((void*) yml.p()); + sstd::printn((void*)&yml[0]); + sstd::printn((void*) yml[0].p()); + sstd::printn((void*)&yml[0][0]); + sstd::printn((void*) yml[0][0].p()); + sstd::printn((void*)&yml[1]); //--- @@ -4373,13 +4491,20 @@ TEST(yaml, _str2token_multi_list_case00_tmp03){ // ans = sstd::terp::list(2); // ans[0] = "a"; // ans[1] = "b"; + + /* + sstd::terp::var x; + x = sstd::terp::list(2); + x[0] = sstd::terp::list(1); + x[0][0] = "a"; + x[1] = &x[0]; + */ //--- // ASSERT_TRUE(yml==ans); } - //-- EXECUTE_TESTS(); From 33220946d62202c6059806fdc4f26bc654b6a3a9 Mon Sep 17 00:00:00 2001 From: admiswalker Date: Mon, 30 Dec 2024 15:42:35 +0900 Subject: [PATCH 08/47] fix mearge conflict of print --- sstd/src/file/yaml.cpp | 13 ++----------- sstd/src/file/yaml.hpp | 9 ++------- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/sstd/src/file/yaml.cpp b/sstd/src/file/yaml.cpp index 8112f907..bb13a5f7 100644 --- a/sstd/src/file/yaml.cpp +++ b/sstd/src/file/yaml.cpp @@ -49,12 +49,7 @@ printf(" aa_val: `%s`\n", rhs.aa_val.c_str()); \ printf(",\n"); -void sstd::print(const sstd_yaml::token& rhs){ - sstd_print_token_base(rhs); - printf("\n"); -} -void sstd::for_printn(const sstd_yaml::token& rhs){ printf(" = "); sstd::print(rhs); } -void sstd::print_for_vT(const sstd_yaml::token& rhs){ +void sstd::print_base(const sstd_yaml::token& rhs){ sstd_print_token_base(rhs); } @@ -79,14 +74,10 @@ void sstd::print_for_vT(const sstd_yaml::token& rhs){ printf(" aa_val: `%s`\n", rhs.aa_val.c_str()); \ printf(",\n"); -void sstd::print(const sstd_yaml::command& rhs){ +void sstd::print_base(const sstd_yaml::command& rhs){ sstd_print_command_v2_base(rhs); printf("\n"); } -void sstd::for_printn(const sstd_yaml::command& rhs){ printf(" = "); sstd::print(rhs); } -void sstd::print_for_vT(const sstd_yaml::command& rhs){ - sstd_print_command_v2_base(rhs); -} #undef sstd_print_command_v2_base diff --git a/sstd/src/file/yaml.hpp b/sstd/src/file/yaml.hpp index 7c9033bc..2ca66ae9 100644 --- a/sstd/src/file/yaml.hpp +++ b/sstd/src/file/yaml.hpp @@ -109,13 +109,8 @@ namespace sstd_yaml{ //----------------------------------------------------------------------------------------------------------------------------------------------- namespace sstd{ - void print(const sstd_yaml::token& rhs); - void for_printn(const sstd_yaml::token& rhs); - void print_for_vT(const sstd_yaml::token& rhs); - - void print(const sstd_yaml::command& rhs); - void for_printn(const sstd_yaml::command& rhs); - void print_for_vT(const sstd_yaml::command& rhs); + void print_base(const sstd_yaml::token& rhs); + void print_base(const sstd_yaml::command& rhs); bool yaml_load ( sstd::terp::var & ret_yml, const char* s); bool yaml_load ( sstd::terp::var & ret_yml, const std::string& s); From 9192b2da7cc95dcfb666de4047882adfcb1b10f8 Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sat, 18 Jan 2025 13:19:10 +0900 Subject: [PATCH 09/47] rm unused lines --- sstd/src/file/yaml.cpp | 46 ------------------------------------- test/src_test/file/yaml.cpp | 2 +- 2 files changed, 1 insertion(+), 47 deletions(-) diff --git a/sstd/src/file/yaml.cpp b/sstd/src/file/yaml.cpp index bb13a5f7..558bb863 100644 --- a/sstd/src/file/yaml.cpp +++ b/sstd/src/file/yaml.cpp @@ -398,24 +398,6 @@ bool sstd_yaml::_token2cmd(std::vector& ret_vCmd, con c.val = t.val; // t.key; ret_vCmd.push_back(c); } - /* - if(t.ref_type==sstd_yaml::ref_type_anchor){ - // --- debug info --- - c.line_num_begin = t.line_num_begin; - c.line_num_end = t.line_num_end; - c.rawStr = t.rawStr; - // --- construct info --- - c.ope = sstd_yaml::ope_push_ref; - c.hsc = t.hsc_hx; // t.hsc_lx; - c.type = sstd_yaml::type_null; - c.format = t.format; - c.val = t.val; // t.key; - // --- anchor and alias --- - c.ref_type = t.ref_type; - c.aa_val = t.val; // ここはあとで,c.aa_val = t.aa_val にする - ret_vCmd.push_back(c); - }*/ - } break; case sstd_yaml::type_hash: { // --- debug info --- @@ -747,17 +729,6 @@ bool _construct_var(sstd::terp::var& ret_yml, const std::vector& ret, const std::string bool _yaml_load_base(sstd::terp::var& ret_yml, const std::vector& v_token){ - sstd::printn(v_token); std::vector v_cmd; if(!sstd_yaml::_token2cmd(v_cmd, v_token)){ return false; } - printf("\n\n"); - sstd::printn(v_cmd); if(!_construct_var(ret_yml, v_cmd)){ return false; } diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index 576c9319..f7bdfd9e 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -4476,7 +4476,7 @@ yml = [["a"]] - c */ sstd::terp::var yml; ASSERT_TRUE(sstd::yaml_load(yml, s)); // TEST THIS LINE - sstd::printn(yml); + sstd::printn_all(yml); sstd::printn((void*)&yml); sstd::printn((void*) yml.p()); sstd::printn((void*)&yml[0]); From f89571d9430ce211f75a676b793bd0853cb2a20d Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sat, 18 Jan 2025 16:15:23 +0900 Subject: [PATCH 10/47] add: TEST(yaml, _str2token__multi_list__anchor_and_alias__case1), TEST(yaml, _str2token__multi_list__anchor_and_alias__case2) --- sstd/src/file/yaml.cpp | 10 +- test/src_test/file/yaml.cpp | 269 +++++++++++++++--------------------- 2 files changed, 113 insertions(+), 166 deletions(-) diff --git a/sstd/src/file/yaml.cpp b/sstd/src/file/yaml.cpp index 558bb863..0d4e9898 100644 --- a/sstd/src/file/yaml.cpp +++ b/sstd/src/file/yaml.cpp @@ -377,10 +377,10 @@ bool sstd_yaml::_token2cmd(std::vector& ret_vCmd, con // --- anchor and alias --- if(t.ref_type==sstd_yaml::ref_type_anchor){ c.ref_type = t.ref_type; - c.aa_val = t.val; // ここはあとで,c.aa_val = t.aa_val にする + c.aa_val = t.aa_val; }else if(t.ref_type==sstd_yaml::ref_type_alias){ c.ref_type = t.ref_type; - c.aa_val = t.val; // ここはあとで,c.aa_val = t.aa_val にする + c.aa_val = t.aa_val; } ret_vCmd.push_back(c); } @@ -908,9 +908,9 @@ bool sstd_yaml::_str2token_except_multilines(std::vector& ret, if(is_list){ tmp.type += sstd_yaml::type_list; tmp.hsc_hx+=2; } if(is_hash){ tmp.type += sstd_yaml::type_hash; } - if(is_flow ){ tmp.format = sstd_yaml::format_flow_style; } - if(is_anchor){ tmp.ref_type = sstd_yaml::ref_type_anchor; tmp.val.erase(0,1); } // 1) set format type, 2) remove '&' in the head of the string - if(is_alias ){ tmp.ref_type = sstd_yaml::ref_type_alias; tmp.val.erase(0,1); } // 1) set format type, 2) remove '*' in the head of the string + if(is_flow ){ tmp.format = sstd_yaml::format_flow_style; } + if(is_anchor){ tmp.ref_type = sstd_yaml::ref_type_anchor; tmp.val.erase(0,1); std::swap(tmp.val, tmp.aa_val); } // 1) set format type, 2) remove '&' in the head of the string + if(is_alias ){ tmp.ref_type = sstd_yaml::ref_type_alias; tmp.val.erase(0,1); std::swap(tmp.val, tmp.aa_val); } // 1) set format type, 2) remove '*' in the head of the string // Skip empty tokens until the first non-empty token occurs. (Empty token is treated as a line-break related with to other token in a context of multi-line YAML) if(ret.size()==0 && diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index f7bdfd9e..0c308236 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -397,6 +397,11 @@ TEST(yaml, _str2token_multi_list_case11){ //TEST(yaml, _str2token_multi_list_except_pipe_or_inequality_sign_case01){ //} + +//--- + + + //*/ //----------------------------------------------------------------------------------------------------------------------------------------------- // Test _format_mult_line_str() @@ -4304,8 +4309,98 @@ TEST(yaml, yaml_load_all_fp){ //----------------------------------------------------------------------------------------------------------------------------------------------- // anchor and alias -TEST(yaml, _str2token_multi_list_case00_tmp){ - printf("#####################################################\n"); +TEST(yaml, _str2token__multi_list__anchor_and_alias__case1){ + std::string s=R"( +- &ll + - a +- *ll +)"; + std::vector v_ret; + bool ret = sstd_yaml::_str2token(v_ret, s); +// sstd::printn_all(ret); +// sstd::printn_all(v_ret.size()); +// sstd::printn_all(v_ret); + + //--- + + ASSERT_TRUE(ret); + ASSERT_EQ(v_ret.size(), (uint)3); + + ASSERT_STREQ(v_ret[0].rawStr.c_str(), "- &ll" ); + ASSERT_STREQ(v_ret[0].key.c_str(), "" ); + ASSERT_STREQ(v_ret[0].val.c_str(), "" ); + ASSERT_STREQ(v_ret[0].aa_val.c_str(), "ll" ); + ASSERT_EQ (v_ret[0].ref_type, (uint) 0); + + ASSERT_STREQ(v_ret[1].rawStr.c_str(), " - a" ); + ASSERT_STREQ(v_ret[1].key.c_str(), "" ); + ASSERT_STREQ(v_ret[1].val.c_str(), "a" ); + ASSERT_STREQ(v_ret[1].aa_val.c_str(), "" ); + ASSERT_EQ (v_ret[1].ref_type, (uint)255); + + ASSERT_STREQ(v_ret[2].rawStr.c_str(), "- *ll" ); + ASSERT_STREQ(v_ret[2].key.c_str(), "" ); + ASSERT_STREQ(v_ret[2].val.c_str(), "" ); + ASSERT_STREQ(v_ret[2].aa_val.c_str(), "ll" ); + ASSERT_EQ (v_ret[2].ref_type, (uint) 1); +} +TEST(yaml, _str2token__multi_list__anchor_and_alias__case2){ + std::string s = R"( +- &ll + - - a + - b + - c +- *ll +)"; + std::vector v_ret; + bool ret = sstd_yaml::_str2token(v_ret, s); +// sstd::printn_all(ret); +// sstd::printn_all(v_ret.size()); +// sstd::printn_all(v_ret); + + ASSERT_TRUE(ret); + ASSERT_EQ(v_ret.size(), (uint)6); + + ASSERT_STREQ(v_ret[0].rawStr.c_str(), "- &ll" ); + ASSERT_STREQ(v_ret[0].key.c_str(), "" ); + ASSERT_STREQ(v_ret[0].val.c_str(), "" ); + ASSERT_STREQ(v_ret[0].aa_val.c_str(), "ll" ); + ASSERT_EQ (v_ret[0].ref_type, (uint) 0); + + ASSERT_STREQ(v_ret[1].rawStr.c_str(), " - - a"); + ASSERT_STREQ(v_ret[1].key.c_str(), "" ); + ASSERT_STREQ(v_ret[1].val.c_str(), "" ); + ASSERT_STREQ(v_ret[1].aa_val.c_str(), "" ); + ASSERT_EQ (v_ret[1].ref_type, (uint)255); + + ASSERT_STREQ(v_ret[2].rawStr.c_str(), " - - a"); + ASSERT_STREQ(v_ret[2].key.c_str(), "" ); + ASSERT_STREQ(v_ret[2].val.c_str(), "a" ); + ASSERT_STREQ(v_ret[2].aa_val.c_str(), "" ); + ASSERT_EQ (v_ret[2].ref_type, (uint)255); + + ASSERT_STREQ(v_ret[3].rawStr.c_str(), " - b" ); + ASSERT_STREQ(v_ret[3].key.c_str(), "" ); + ASSERT_STREQ(v_ret[3].val.c_str(), "b" ); + ASSERT_STREQ(v_ret[3].aa_val.c_str(), "" ); + ASSERT_EQ (v_ret[3].ref_type, (uint)255); + + ASSERT_STREQ(v_ret[4].rawStr.c_str(), " - c" ); + ASSERT_STREQ(v_ret[4].key.c_str(), "" ); + ASSERT_STREQ(v_ret[4].val.c_str(), "c" ); + ASSERT_STREQ(v_ret[4].aa_val.c_str(), "" ); + ASSERT_EQ (v_ret[4].ref_type, (uint)255); + + ASSERT_STREQ(v_ret[5].rawStr.c_str(), "- *ll" ); + ASSERT_STREQ(v_ret[5].key.c_str(), "" ); + ASSERT_STREQ(v_ret[5].val.c_str(), "" ); + ASSERT_STREQ(v_ret[5].aa_val.c_str(), "ll" ); + ASSERT_EQ (v_ret[5].ref_type, (uint) 1); +} + +//--- + +TEST(yaml, anchor_and_alias__case01){ std::string s = R"( - &ll - - a @@ -4323,167 +4418,23 @@ TEST(yaml, _str2token_multi_list_case00_tmp){ #- [*l] #- {*l} */ - std::vector v_ret; - bool ret = sstd_yaml::_str2token(v_ret, s); - sstd::printn_all(ret); - sstd::printn_all(v_ret.size()); - sstd::printn_all(v_ret); - /* - ASSERT_TRUE(ret); - ASSERT_EQ(v_ret.size(), (uint)3); - ASSERT_STREQ(v_ret[0].rawStr.c_str(), "k_X: "); - ASSERT_STREQ(v_ret[0].val.c_str(), "" ); - ASSERT_STREQ(v_ret[1].rawStr.c_str(), " k1: |+\n a\n \n c\n "); - ASSERT_STREQ(v_ret[1].key.c_str(), "k1" ); - ASSERT_STREQ(v_ret[1].val.c_str(), "a\n\nc\n\n"); // "|+\n a\n \n c\n " - ASSERT_STREQ(v_ret[2].rawStr.c_str(), "k_Y: v_Y"); - ASSERT_STREQ(v_ret[2].key.c_str(), "k_Y"); - ASSERT_STREQ(v_ret[2].val.c_str(), "v_Y"); - */ } -TEST(yaml, _str2token_multi_list_case00_tmp2){ +TEST(yaml, anchor_and_alias__case02){ std::string s=R"( - &ll - a - *ll )"; -/* -v_token = [ -debug info: - line_num_begin: 2 - line_num_end: 2 - rawStr: `- ` -command: - type: 1 - format: 0 - ref_type: 255 - list_type_cnt: 1 - hsc_lx: 0 - hsc_hx: 2 - hasValue: false - key_is_dqed: false - key_is_sqed: false - val_is_dqed: false - val_is_sqed: false - mult_line_val: false - key: `` - val: `` -, - -debug info: - line_num_begin: 3 - line_num_end: 1 - rawStr: ` - a` -command: - type: 1 - format: 0 - ref_type: 255 - list_type_cnt: 1 - hsc_lx: 2 - hsc_hx: 4 - hasValue: ture - key_is_dqed: false - key_is_sqed: false - val_is_dqed: false - val_is_sqed: false - mult_line_val: ture - key: `` - val: `a` -, -] -yml = [["a"]] - ---- +// sstd::terp::var yml; ASSERT_TRUE(sstd::yaml_load(yml, s)); // TEST THIS LINE +// sstd::printn_all(yml); -v_cmd = [ -debug info: - line_num_begin: 2 - line_num_end: 2 - rawStr: `-` -command: - ope: 0 - hsc: 0 - type: 1 - format: 0 - val: `` -anchor and alias: - ref_type: 255 - aa_val: `` -, - -debug info: - line_num_begin: 2 - line_num_end: 2 - rawStr: `-` -command: - ope: 1 - hsc: 2 - type: 1 - format: 0 - val: `` -anchor and alias: - ref_type: 255 - aa_val: `` -, - -debug info: - line_num_begin: 3 - line_num_end: 1 - rawStr: ` - a` -command: - ope: 0 - hsc: 2 - type: 1 - format: 0 - val: `` -anchor and alias: - ref_type: 255 - aa_val: `` -, - -debug info: - line_num_begin: 3 - line_num_end: 1 - rawStr: ` - a` -command: - ope: 2 - hsc: 4 - type: 0 - format: 0 - val: `a` -anchor and alias: - ref_type: 255 - aa_val: `` -, -] -yml = [["a"]] -*/ -/* -- &ll - - - a - - b - - c -- *ll -*/ -/* -- - - - a - - b - - c -- - - - a - - b - - c -*/ - sstd::terp::var yml; ASSERT_TRUE(sstd::yaml_load(yml, s)); // TEST THIS LINE - sstd::printn_all(yml); - sstd::printn((void*)&yml); - sstd::printn((void*) yml.p()); - sstd::printn((void*)&yml[0]); - sstd::printn((void*) yml[0].p()); - sstd::printn((void*)&yml[0][0]); - sstd::printn((void*) yml[0][0].p()); - sstd::printn((void*)&yml[1]); +// sstd::printn((void*)&yml); +// sstd::printn((void*) yml.p()); +// sstd::printn((void*)&yml[0]); +// sstd::printn((void*) yml[0].p()); +// sstd::printn((void*)&yml[0][0]); +// sstd::printn((void*) yml[0][0].p()); +// sstd::printn((void*)&yml[1]); //--- @@ -4499,13 +4450,9 @@ yml = [["a"]] x[0][0] = "a"; x[1] = &x[0]; */ - - //--- - -// ASSERT_TRUE(yml==ans); } -//-- +//----------------------------------------------------------------------------------------------------------------------------------------------- EXECUTE_TESTS(); From ef0f548571ed92a6887d1c1499cb363a14d94cf3 Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sat, 18 Jan 2025 18:09:15 +0900 Subject: [PATCH 11/47] wip --- sstd/src/memory/terp/terp.cpp | 4 +- sstd/src/memory/terp/terp.hpp | 2 +- test/src_test/file/yaml.cpp | 97 +++++++++++++++++++++-------------- 3 files changed, 61 insertions(+), 42 deletions(-) diff --git a/sstd/src/memory/terp/terp.cpp b/sstd/src/memory/terp/terp.cpp index 18fb5091..3485c578 100644 --- a/sstd/src/memory/terp/terp.cpp +++ b/sstd/src/memory/terp/terp.cpp @@ -637,7 +637,7 @@ bool _is_equal(const sstd::terp::var& lhs, const sstd::terp::var& rhs, // ├────────────────────────────────┼───────────────────────────────────────────────┼──────────────┤ // │ sstd::terp::equal_val() │ true │ false │ false │ │ // ├────────────────────────────────┼───────────────────────────────────────────────┼──────────────┤ - // │ sstd::terp::equal_refAbsAddr() │ true │ true │ false │ │ + // │ sstd::terp::equal_refAbsAddr() │ true │ true │ false │ │ /* <- This is NOT implimented yet */ // └────────────────────────────────┴───────────────────────────────────────────────┴──────────────┘ // *1. Options: // true: sets to check the option @@ -658,7 +658,7 @@ bool _is_equal(const sstd::terp::var& lhs, const sstd::terp::var& rhs, vStack_lhsP_and_rhsP.push_back( std::make_tuple((sstd::terp::var*)&lhs, (sstd::terp::var*)&rhs) ); }else{ // If the reference is `external` reference. - if(lhs.p() != rhs.p()){ sstd::printn_all("");return false; } + if(lhs.p() != rhs.p()){ return false; } } } } diff --git a/sstd/src/memory/terp/terp.hpp b/sstd/src/memory/terp/terp.hpp index bece6638..de64b7b5 100644 --- a/sstd/src/memory/terp/terp.hpp +++ b/sstd/src/memory/terp/terp.hpp @@ -120,7 +120,7 @@ class sstd::terp::var{ void _fill_ref_src_null(const std::unordered_set& hash_set); void _fillout_ref_src_null(); - + bool _copy_base(const class sstd::terp::var* pRhs, const char opt_a, const char opt_i, const char opt_e); bool copy(const class sstd::terp::var& rhs); void move( class sstd::terp::var&& rhs); diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index 0c308236..0cec3f5f 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -4401,55 +4401,74 @@ TEST(yaml, _str2token__multi_list__anchor_and_alias__case2){ //--- TEST(yaml, anchor_and_alias__case01){ - std::string s = R"( -- &ll - - - a - - b - - c -- *ll -)"; - /* -#hh: &hh -# k1: v1 -# k2: v2 - -#- &l a # anchor -#- *l # alias -#- [*l] -#- {*l} -*/ -} -TEST(yaml, anchor_and_alias__case02){ std::string s=R"( - &ll - a - *ll )"; -// sstd::terp::var yml; ASSERT_TRUE(sstd::yaml_load(yml, s)); // TEST THIS LINE -// sstd::printn_all(yml); + sstd::terp::var yml; + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + + ASSERT_TRUE(ret); + + ASSERT_EQ(yml.size(), (uint)2); + ASSERT_EQ(yml[0].size(), (uint)1); + ASSERT_EQ(yml[1].size(), (uint)1); -// sstd::printn((void*)&yml); -// sstd::printn((void*) yml.p()); -// sstd::printn((void*)&yml[0]); -// sstd::printn((void*) yml[0].p()); -// sstd::printn((void*)&yml[0][0]); -// sstd::printn((void*) yml[0][0].p()); -// sstd::printn((void*)&yml[1]); + ASSERT_STREQ(yml[0][0].to().c_str(), "a"); + ASSERT_STREQ(yml[1][0].to().c_str(), "a"); + ASSERT_EQ(yml[0].is_reference(), false); + ASSERT_EQ(yml[1].is_reference(), true ); + //--- -// sstd::terp::var ans; -// ans = sstd::terp::list(2); -// ans[0] = "a"; -// ans[1] = "b"; + sstd::terp::var ans; + ans = sstd::terp::list(2); + ans[0] = sstd::terp::list(1); + ans[0][0] = "a"; + ans[1] = &ans[0]; - /* - sstd::terp::var x; - x = sstd::terp::list(2); - x[0] = sstd::terp::list(1); - x[0][0] = "a"; - x[1] = &x[0]; - */ + sstd::printn(yml); + sstd::printn(ans); + + sstd::printn(*yml.pSRCR_tbl()); + sstd::printn(*ans.pSRCR_tbl()); + + sstd::printn(yml == ans); + sstd::printn(sstd::terp::equal(yml, ans)); + sstd::printn(sstd::terp::equal_val(yml, ans)); + + sstd::printn(yml[0].is_reference()); + sstd::printn(yml[1].is_reference()); + sstd::printn(ans[0].is_reference()); + sstd::printn(ans[1].is_reference()); + + ASSERT_TRUE(yml == ans); + + //--- + +} +TEST(yaml, anchor_and_alias__case02){ + std::string s = R"( +- &ll + - - a + - b + - c +- *ll +)"; +} +TEST(yaml, anchor_and_alias__case03){ + std::string s = R"( +hh: &hh + k1: v1 + k2: v2 + +- &l a # anchor +- *l # alias +- [*l] +- {*l} +)"; } //----------------------------------------------------------------------------------------------------------------------------------------------- From f06240338b9d747cbf729fd2a88afef41efbbbd4 Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sat, 18 Jan 2025 23:03:22 +0900 Subject: [PATCH 12/47] wip --- sstd/src/file/yaml.cpp | 8 +++++++- sstd/src/memory/terp/terp.cpp | 3 +++ test/src_test/file/yaml.cpp | 5 +++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/sstd/src/file/yaml.cpp b/sstd/src/file/yaml.cpp index 0d4e9898..7c3efa7b 100644 --- a/sstd/src/file/yaml.cpp +++ b/sstd/src/file/yaml.cpp @@ -746,7 +746,13 @@ bool _construct_var(sstd::terp::var& ret_yml, const std::vectoris_reference()) ? (sstd::terp::var*)pRhs_in : (sstd::terp::var*)pRhs_in->p(); // resolve double reference this->_is_reference = true; this->_type = pRhs->type(); this->_p = (void*)pRhs; (*pRhs->_pSRCR_tbl)[ (sstd::terp::var*)pRhs ].insert( (sstd::terp::var*)this ); + sstd::printn_all(pRhs->_pSRCR_tbl); + sstd::printn_all(*pRhs->_pSRCR_tbl); return *this; } diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index 0cec3f5f..39256e10 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -4444,6 +4444,11 @@ TEST(yaml, anchor_and_alias__case01){ sstd::printn(ans[0].is_reference()); sstd::printn(ans[1].is_reference()); + sstd::printn(yml[0].is_pSRCR_tbl_base()); + sstd::printn(yml[1].is_pSRCR_tbl_base()); + sstd::printn(ans[0].is_pSRCR_tbl_base()); + sstd::printn(ans[1].is_pSRCR_tbl_base()); + ASSERT_TRUE(yml == ans); //--- From e3b1cfd98f032f374d956822bbe7183b24312e34 Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sun, 19 Jan 2025 00:33:30 +0900 Subject: [PATCH 13/47] fix bug of sstd::terp::var::push_back() --- sstd/src/memory/terp/terp.cpp | 17 ++-- sstd/src/memory/terp/terp.hpp | 5 +- test/src_test/memory/terp/terp.cpp | 125 ++++++++++++++++++++--------- tests_list_for_build_and_run.txt | 4 +- 4 files changed, 103 insertions(+), 48 deletions(-) diff --git a/sstd/src/memory/terp/terp.cpp b/sstd/src/memory/terp/terp.cpp index 4e93f4ca..7a48195d 100644 --- a/sstd/src/memory/terp/terp.cpp +++ b/sstd/src/memory/terp/terp.cpp @@ -210,7 +210,11 @@ sstd::terp::var::var( float rhs): _type(sstd::num_str ), _is_referen sstd::terp::var::var( double rhs): _type(sstd::num_str ), _is_reference(false), _is_pSRCR_tbl_base(true), _pSRCR_tbl(new sstd::terp::srcr_tbl()), _p(new std::string(sstd::ssprintf(_format(rhs).c_str(), rhs))) {} sstd::terp::var::var(const char* rhs): _type(sstd::num_str ), _is_reference(false), _is_pSRCR_tbl_base(true), _pSRCR_tbl(new sstd::terp::srcr_tbl()), _p(new std::string(rhs)) {} sstd::terp::var::var(const std::string& rhs): _type(sstd::num_str ), _is_reference(false), _is_pSRCR_tbl_base(true), _pSRCR_tbl(new sstd::terp::srcr_tbl()), _p(new std::string(rhs)) {} -sstd::terp::var::var(const sstd::terp::srcr_tbl* rhs): _type(sstd::num_null), _is_reference(false), _is_pSRCR_tbl_base(false), _pSRCR_tbl((sstd::terp::srcr_tbl*)rhs), _p(NULL) {} + +sstd::terp::var::var(const sstd::terp::srcr_tbl* tbl ): _type(sstd::num_null), _is_reference(false), _is_pSRCR_tbl_base(false), _pSRCR_tbl((sstd::terp::srcr_tbl*)tbl), _p(NULL) {} +sstd::terp::var::var(const sstd::terp::srcr_tbl* tbl, const class var& rhs): _type(sstd::num_null), _is_reference(false), _is_pSRCR_tbl_base(false), _pSRCR_tbl((sstd::terp::srcr_tbl*)tbl), _p(NULL) { copy(rhs); } +sstd::terp::var::var(const sstd::terp::srcr_tbl* tbl, class var&& rhs): _type(sstd::num_null), _is_reference(false), _is_pSRCR_tbl_base(false), _pSRCR_tbl((sstd::terp::srcr_tbl*)tbl), _p(NULL) { free(); move(std::move(rhs)); } +sstd::terp::var::var(const sstd::terp::srcr_tbl* tbl, const char* rhs): _type(sstd::num_str ), _is_reference(false), _is_pSRCR_tbl_base(false), _pSRCR_tbl((sstd::terp::srcr_tbl*)tbl), _p(new std::string(rhs)) {} sstd::terp::var::~var(){ sstd::terp::var::free(); } @@ -563,14 +567,11 @@ sstd::terp::var sstd::terp::var::operator=( sstd::terp::var&& rhs){ return *this; } sstd::terp::var& sstd::terp::var::operator=(const sstd::terp::var* pRhs_in){ - sstd::printn_all("imh"); sstd::terp::var* pRhs = (! pRhs_in->is_reference()) ? (sstd::terp::var*)pRhs_in : (sstd::terp::var*)pRhs_in->p(); // resolve double reference this->_is_reference = true; this->_type = pRhs->type(); this->_p = (void*)pRhs; (*pRhs->_pSRCR_tbl)[ (sstd::terp::var*)pRhs ].insert( (sstd::terp::var*)this ); - sstd::printn_all(pRhs->_pSRCR_tbl); - sstd::printn_all(*pRhs->_pSRCR_tbl); return *this; } @@ -869,22 +870,22 @@ void sstd::terp::var::pop_back(){ void sstd::terp::var::push_back(){ // push_back null NULL_CHECK(_p); if(_type!=sstd::num_vec_terp_var){ sstd::pdbg_err("push_back(char*) is failed. Unexpedted data type. This function requires sstd::num_vec_terp_var type, but takes %s type.\n", sstd::typeNum2str(this->_type).c_str()); return; } - _CAST2VEC(_p).push_back(new sstd::terp::var()); + _CAST2VEC(_p).push_back(new sstd::terp::var((sstd::terp::srcr_tbl*)this->_pSRCR_tbl)); } void sstd::terp::var::push_back(const char* pRhs){ NULL_CHECK(_p); if(_type!=sstd::num_vec_terp_var){ sstd::pdbg_err("push_back(char*) is failed. Unexpedted data type. This function requires sstd::num_vec_terp_var type, but takes %s type.\n", sstd::typeNum2str(this->_type).c_str()); return; } - _CAST2VEC(_p).push_back(new sstd::terp::var(pRhs)); + _CAST2VEC(_p).push_back(new sstd::terp::var((sstd::terp::srcr_tbl*)this->_pSRCR_tbl, pRhs)); } void sstd::terp::var::push_back(const sstd::terp::var& rhs){ NULL_CHECK(_p); if(_type!=sstd::num_vec_terp_var){ sstd::pdbg_err("push_back(var&) is failed. Unexpedted data type. This function requires sstd::num_vec_terp_var type, but takes %s type.\n", sstd::typeNum2str(this->_type).c_str()); return; } - _CAST2VEC(_p).push_back(new sstd::terp::var(rhs)); + _CAST2VEC(_p).push_back(new sstd::terp::var((sstd::terp::srcr_tbl*)this->_pSRCR_tbl, rhs)); } void sstd::terp::var::push_back( sstd::terp::var&& rhs){ NULL_CHECK(_p); if(_type!=sstd::num_vec_terp_var){ sstd::pdbg_err("push_back(var&) is failed. Unexpedted data type. This function requires sstd::num_vec_terp_var type, but takes %s type.\n", sstd::typeNum2str(this->_type).c_str()); return; } - _CAST2VEC(_p).push_back(new sstd::terp::var(std::move(rhs))); // call move constructor of "sstd::void_ptr::void_ptr()" + _CAST2VEC(_p).push_back(new sstd::terp::var((sstd::terp::srcr_tbl*)this->_pSRCR_tbl, std::move(rhs))); // call move constructor of "sstd::void_ptr::void_ptr()" } void sstd::terp::var::resize(uint len){ diff --git a/sstd/src/memory/terp/terp.hpp b/sstd/src/memory/terp/terp.hpp index de64b7b5..33fedeee 100644 --- a/sstd/src/memory/terp/terp.hpp +++ b/sstd/src/memory/terp/terp.hpp @@ -97,7 +97,10 @@ class sstd::terp::var{ var(const double rhs); var(const char* rhs); var(const std::string& rhs); - var(const sstd::terp::srcr_tbl* rhs); // for internal use of sstd::terp::var + var(const sstd::terp::srcr_tbl* tbl ); // for internal use of sstd::terp::var + var(const sstd::terp::srcr_tbl* tbl, const class var& rhs); // for internal use of sstd::terp::var + var(const sstd::terp::srcr_tbl* tbl, class var&& rhs); // for internal use of sstd::terp::var + var(const sstd::terp::srcr_tbl* tbl, const char* rhs); // for internal use of sstd::terp::var ~var(); //--- diff --git a/test/src_test/memory/terp/terp.cpp b/test/src_test/memory/terp/terp.cpp index 2220559c..3c2a3917 100644 --- a/test/src_test/memory/terp/terp.cpp +++ b/test/src_test/memory/terp/terp.cpp @@ -907,6 +907,94 @@ TEST(memory_terp, var_init_list){ ASSERT_TRUE( a.pSRCR_tbl() == a[0].pSRCR_tbl() ); ASSERT_TRUE( a.pSRCR_tbl() == a[1].pSRCR_tbl() ); } +TEST(memory_terp, var_init_list_by_push_back_NULL){ + sstd::terp::var a = sstd::terp::list(); + a.push_back(); // TEST THIS LINE + a.push_back(); // TEST THIS LINE + + ASSERT_TRUE(a.is_pSRCR_tbl_base() == true ); + ASSERT_TRUE(a.pSRCR_tbl() != NULL ); + + ASSERT_TRUE(a[0].is_pSRCR_tbl_base() == false ); + ASSERT_TRUE(a[0].pSRCR_tbl() != NULL ); + + ASSERT_TRUE(a[1].is_pSRCR_tbl_base() == false ); + ASSERT_TRUE(a[1].pSRCR_tbl() != NULL ); + + ASSERT_TRUE( a.pSRCR_tbl() == a[0].pSRCR_tbl() ); + ASSERT_TRUE( a.pSRCR_tbl() == a[1].pSRCR_tbl() ); +} +TEST(memory_terp, var_init_list_by_push_back_CHAR){ + sstd::terp::var a = sstd::terp::list(); + a.push_back("a"); // TEST THIS LINE + a.push_back("b"); // TEST THIS LINE + + ASSERT_EQ(a.size(), (uint)2); + ASSERT_STREQ(a[0].to().c_str(), "a"); + ASSERT_STREQ(a[1].to().c_str(), "b"); + + ASSERT_TRUE(a.is_pSRCR_tbl_base() == true ); + ASSERT_TRUE(a.pSRCR_tbl() != NULL ); + + ASSERT_TRUE(a[0].is_pSRCR_tbl_base() == false ); + ASSERT_TRUE(a[0].pSRCR_tbl() != NULL ); + + ASSERT_TRUE(a[1].is_pSRCR_tbl_base() == false ); + ASSERT_TRUE(a[1].pSRCR_tbl() != NULL ); + + ASSERT_TRUE( a.pSRCR_tbl() == a[0].pSRCR_tbl() ); + ASSERT_TRUE( a.pSRCR_tbl() == a[1].pSRCR_tbl() ); + +} +TEST(memory_terp, var_init_list_by_push_back_VAR){ + sstd::terp::var x = "x"; + + sstd::terp::var a = sstd::terp::list(); + a.push_back(x); // TEST THIS LINE + a.push_back(x); // TEST THIS LINE + + ASSERT_EQ(a.size(), (uint)2); + ASSERT_STREQ(a[0].to().c_str(), "x"); + ASSERT_STREQ(a[1].to().c_str(), "x"); + + ASSERT_TRUE(a.is_pSRCR_tbl_base() == true ); + ASSERT_TRUE(a.pSRCR_tbl() != NULL ); + + ASSERT_TRUE(a[0].is_pSRCR_tbl_base() == false ); + ASSERT_TRUE(a[0].pSRCR_tbl() != NULL ); + + ASSERT_TRUE(a[1].is_pSRCR_tbl_base() == false ); + ASSERT_TRUE(a[1].pSRCR_tbl() != NULL ); + + ASSERT_TRUE( a.pSRCR_tbl() == a[0].pSRCR_tbl() ); + ASSERT_TRUE( a.pSRCR_tbl() == a[1].pSRCR_tbl() ); + +} +TEST(memory_terp, var_init_list_by_push_back_VAR_MOVE){ + sstd::terp::var x1 = "x1"; + sstd::terp::var x2 = "x2"; + + sstd::terp::var a = sstd::terp::list(); + a.push_back(std::move(x1)); // TEST THIS LINE + a.push_back(std::move(x2)); // TEST THIS LINE + + ASSERT_EQ(a.size(), (uint)2); + ASSERT_STREQ(a[0].to().c_str(), "x1"); + ASSERT_STREQ(a[1].to().c_str(), "x2"); + + ASSERT_TRUE(a.is_pSRCR_tbl_base() == true ); + ASSERT_TRUE(a.pSRCR_tbl() != NULL ); + + ASSERT_TRUE(a[0].is_pSRCR_tbl_base() == false ); + ASSERT_TRUE(a[0].pSRCR_tbl() != NULL ); + + ASSERT_TRUE(a[1].is_pSRCR_tbl_base() == false ); + ASSERT_TRUE(a[1].pSRCR_tbl() != NULL ); + + ASSERT_TRUE( a.pSRCR_tbl() == a[0].pSRCR_tbl() ); + ASSERT_TRUE( a.pSRCR_tbl() == a[1].pSRCR_tbl() ); + +} //----------------------------------------------------------------------------------------------------------------------------------------------- // For the Reference Type (Operator) @@ -1443,43 +1531,6 @@ TEST(memory_terp, terp__equal_val__case05_not_eq){ //----------------------------------------------------------------------------------------------------------------------------------------------- -//--- - -/* -TEST(memory_terp, list_ope_assign_with_reference_tmp){ // Ope= - sstd::terp::var a; - a = sstd::terp::list(2); - a[0] = sstd::terp::list(3); - a[0][0] = "a"; - a[0][1] = "b"; - a[0][2] = "c"; - printf("894\n"); - sstd::printn(a.pSRCR_tbl()); - sstd::printn(a[0].pSRCR_tbl()); - printf("895\n"); - a[1] = &a[0]; - printf("897\n"); - - ASSERT_TRUE(a[0].is_reference() == false); - ASSERT_TRUE(a[1].is_reference() == true ); - printf("899\n"); - - sstd::terp::var x = a; // TEST THIS LINE - - ASSERT_TRUE(x[0].is_reference() == false); - ASSERT_TRUE(x[1].is_reference() == true ); - printf("905\n"); - - x[0][0]="x"; - ASSERT_TRUE(a[0][0].to() == "x"); - ASSERT_TRUE(a[1][0].to() == "x"); - printf("910\n"); - - ASSERT_TRUE(x[0][0].to() == "x"); - ASSERT_TRUE(x[1][0].to() == "x"); - printf("913\n"); -} -*/ TEST(memory_terp, list_ope_assign_with_reference_case_01_delete_src){ sstd::terp::var dst; { diff --git a/tests_list_for_build_and_run.txt b/tests_list_for_build_and_run.txt index a8a61805..8d05fc5e 100644 --- a/tests_list_for_build_and_run.txt +++ b/tests_list_for_build_and_run.txt @@ -29,12 +29,12 @@ #../test/src_test/file/read_write.cpp #../test/src_test/file/rm.cpp #../test/src_test/file/tinyInterpreter.cpp -../test/src_test/file/yaml.cpp +#../test/src_test/file/yaml.cpp #../test/src_test/math/math.cpp #../test/src_test/math/signal.cpp #../test/src_test/math/hashFnc_of_MD5_SHA1_SHA2/hashSum.cpp #../test/src_test/math/hashFnc_of_MD5_SHA1_SHA2/sstd_md5_sha1_sha2_wrapper.cpp -#../test/src_test/memory/terp/terp.cpp +../test/src_test/memory/terp/terp.cpp #../test/src_test/memory/terp/terp_print.cpp #../test/src_test/memory/unique_void_ptr.cpp #../test/src_test/memory/void_ptr.cpp From beed14d6244c33c4299841e13fe514f11fea6809 Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sun, 19 Jan 2025 16:07:07 +0900 Subject: [PATCH 14/47] wip --- sstd/src/file/yaml.cpp | 11 +---- test/src_test/file/yaml.cpp | 71 +++++++++++++++++++------------- tests_list_for_build_and_run.txt | 4 +- 3 files changed, 47 insertions(+), 39 deletions(-) diff --git a/sstd/src/file/yaml.cpp b/sstd/src/file/yaml.cpp index 7c3efa7b..34512c4b 100644 --- a/sstd/src/file/yaml.cpp +++ b/sstd/src/file/yaml.cpp @@ -487,7 +487,6 @@ bool sstd_yaml::_token2cmd(std::vector& ret_vCmd, con // construction of stack() command if( !t.hasValue && (t.type==sstd_yaml::type_list || t.type==sstd_yaml::type_hash || t.type==sstd_yaml::type_list_and_hash )){ - sstd::printn_all("in\n"); uint hsc_curr = c.hsc; uint hsc_next = 0; @@ -533,7 +532,6 @@ bool sstd_yaml::_token2cmd(std::vector& ret_vCmd, con if((isGr && hsc_next> hsc_curr) || (isGrOrEq && hsc_next>=hsc_curr) ) { - sstd::printn_all("in2\n"); // --- debug info --- c.line_num_begin = t.line_num_begin; c.line_num_end = t.line_num_end; @@ -746,13 +744,7 @@ bool _construct_var(sstd::terp::var& ret_yml, const std::vector v_token; if(!sstd_yaml::_str2token(v_token, s)){ sstd::pdbg_err("single or double quatation is not closed\n"); return false; } // v: vector, ls: line string + sstd::printn_all(v_token); if(!_yaml_load_base(ret_yml, v_token)){ sstd::pdbg_err("_yaml_load_base() is failed.\n"); return false; } diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index 39256e10..ebec5ed4 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -4409,6 +4409,8 @@ TEST(yaml, anchor_and_alias__case01){ sstd::terp::var yml; bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + //--- + ASSERT_TRUE(ret); ASSERT_EQ(yml.size(), (uint)2); @@ -4429,30 +4431,7 @@ TEST(yaml, anchor_and_alias__case01){ ans[0][0] = "a"; ans[1] = &ans[0]; - sstd::printn(yml); - sstd::printn(ans); - - sstd::printn(*yml.pSRCR_tbl()); - sstd::printn(*ans.pSRCR_tbl()); - - sstd::printn(yml == ans); - sstd::printn(sstd::terp::equal(yml, ans)); - sstd::printn(sstd::terp::equal_val(yml, ans)); - - sstd::printn(yml[0].is_reference()); - sstd::printn(yml[1].is_reference()); - sstd::printn(ans[0].is_reference()); - sstd::printn(ans[1].is_reference()); - - sstd::printn(yml[0].is_pSRCR_tbl_base()); - sstd::printn(yml[1].is_pSRCR_tbl_base()); - sstd::printn(ans[0].is_pSRCR_tbl_base()); - sstd::printn(ans[1].is_pSRCR_tbl_base()); - ASSERT_TRUE(yml == ans); - - //--- - } TEST(yaml, anchor_and_alias__case02){ std::string s = R"( @@ -4462,17 +4441,53 @@ TEST(yaml, anchor_and_alias__case02){ - c - *ll )"; + sstd::terp::var yml; + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE +// sstd::printn_all(yml); + + //--- + + sstd::terp::var ans; + ans = sstd::terp::list(2); + ans[0] = sstd::terp::list(3); + ans[0][0] = sstd::terp::list(1); + ans[0][0][0] = "a"; + ans[0][1] = "b"; + ans[0][2] = "c"; + ans[1] = &ans[0]; + + ASSERT_TRUE(yml == ans); } TEST(yaml, anchor_and_alias__case03){ std::string s = R"( +- &l a x # anchor +- *l # alias +#- [*l] +#- {*l} +)"; + sstd::terp::var yml; + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + sstd::printn_all(yml); + + //--- + + sstd::terp::var ans; +// ans = sstd::terp::list(4); + ans = sstd::terp::list(3); + ans[0] = "a"; + ans[1] = &ans[0]; + ans[2] = sstd::terp::list(1); + ans[2][0] = &ans[0]; +// ans[3] = sstd::terp::hash(); +// ans[3][ &ans[0] ]; + + ASSERT_TRUE(yml == ans); +} +TEST(yaml, anchor_and_alias__case04){ + std::string s = R"( hh: &hh k1: v1 k2: v2 - -- &l a # anchor -- *l # alias -- [*l] -- {*l} )"; } diff --git a/tests_list_for_build_and_run.txt b/tests_list_for_build_and_run.txt index 8d05fc5e..a8a61805 100644 --- a/tests_list_for_build_and_run.txt +++ b/tests_list_for_build_and_run.txt @@ -29,12 +29,12 @@ #../test/src_test/file/read_write.cpp #../test/src_test/file/rm.cpp #../test/src_test/file/tinyInterpreter.cpp -#../test/src_test/file/yaml.cpp +../test/src_test/file/yaml.cpp #../test/src_test/math/math.cpp #../test/src_test/math/signal.cpp #../test/src_test/math/hashFnc_of_MD5_SHA1_SHA2/hashSum.cpp #../test/src_test/math/hashFnc_of_MD5_SHA1_SHA2/sstd_md5_sha1_sha2_wrapper.cpp -../test/src_test/memory/terp/terp.cpp +#../test/src_test/memory/terp/terp.cpp #../test/src_test/memory/terp/terp_print.cpp #../test/src_test/memory/unique_void_ptr.cpp #../test/src_test/memory/void_ptr.cpp From 8b9589e18f7f3d0ebeae0f745180eaff77139b80 Mon Sep 17 00:00:00 2001 From: admiswalker Date: Mon, 20 Jan 2025 00:28:58 +0900 Subject: [PATCH 15/47] add: sstd::split(c, c, int), sstd::split(s, c, int) --- sstd/src/string/strEdit.cpp | 23 ++++++++++++++++------- sstd/src/string/strEdit.hpp | 9 ++++++++- test/src_test/string/strEdit.cpp | 15 +++++++++++++++ tests_list_for_build_and_run.txt | 4 ++-- 4 files changed, 41 insertions(+), 10 deletions(-) diff --git a/sstd/src/string/strEdit.cpp b/sstd/src/string/strEdit.cpp index 3ed6b87f..75421013 100755 --- a/sstd/src/string/strEdit.cpp +++ b/sstd/src/string/strEdit.cpp @@ -111,13 +111,20 @@ bool sstd::splitByLine_quotes(std::vector& ret, const std::string& //----------------------------------------------------------------------------------------------------------------------------------------------- -std::vector _asAX_rmSpace(const char* str, const char X){ +std::vector _asAX_rmSpace(const char* str, const char X, const int maxsplit){ + if(maxsplit==0){ return std::vector({str}); } std::vector splitList; std::string buf; uint i=0; + while(str[i]!='\0'){ if(str[i]==' '){++i;}else{break;} } // skip space while(str[i]!='\0'){ + if(maxsplit>=0 && splitList.size()==(uint)maxsplit){ + buf += (const char*)&str[i]; + break; + } + if(X==str[i]){ sstd::rstrip_ow(buf); splitList.push_back(buf); buf.clear(); ++i; @@ -153,8 +160,10 @@ std::vector _asAX(const char* str, const char X){ if(i>=1 && str[i-1]==X){ splitList.push_back(std::string()); } return splitList; } -std::vector sstd::split(const char* str ){ return _asAX_rmSpace(str, ' '); } -std::vector sstd::split(const std::string& str ){ return _asAX_rmSpace(str.c_str(), ' '); } +std::vector sstd::split(const char* str ){ return _asAX_rmSpace(str, ' ', -1); } +std::vector sstd::split(const std::string& str ){ return _asAX_rmSpace(str.c_str(), ' ', -1); } +std::vector sstd::split(const char* str, int maxsplit){ return _asAX_rmSpace(str, ' ', maxsplit); } +std::vector sstd::split(const std::string& str, int maxsplit){ return _asAX_rmSpace(str.c_str(), ' ', maxsplit); } std::vector sstd::split(const char* str, const char X){ return _asAX(str, X ); } std::vector sstd::split(const std::string& str, const char X){ return _asAX(str.c_str(), X ); } @@ -184,10 +193,10 @@ std::vector sstd::split(const std::string& str, const std::string& //--- -std::vector sstd::split_rmSpace(const char* str ){ return _asAX_rmSpace(str, ' '); } -std::vector sstd::split_rmSpace(const std::string& str ){ return _asAX_rmSpace(str.c_str(), ' '); } -std::vector sstd::split_rmSpace(const char* str, const char X){ return _asAX_rmSpace(str , X ); } -std::vector sstd::split_rmSpace(const std::string& str, const char X){ return _asAX_rmSpace(str.c_str(), X ); } +std::vector sstd::split_rmSpace(const char* str ){ return _asAX_rmSpace(str, ' ', -1); } +std::vector sstd::split_rmSpace(const std::string& str ){ return _asAX_rmSpace(str.c_str(), ' ', -1); } +std::vector sstd::split_rmSpace(const char* str, const char X){ return _asAX_rmSpace(str , X , -1); } +std::vector sstd::split_rmSpace(const std::string& str, const char X){ return _asAX_rmSpace(str.c_str(), X , -1); } //----------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/sstd/src/string/strEdit.hpp b/sstd/src/string/strEdit.hpp index 866f633c..099d6688 100755 --- a/sstd/src/string/strEdit.hpp +++ b/sstd/src/string/strEdit.hpp @@ -14,16 +14,23 @@ namespace sstd{ std::vector splitByLine(const char* str); std::vector splitByLine(const std::string& str); - bool splitByLine_quotes(std::vector& ret, const char* str); bool splitByLine_quotes(std::vector& ret, const std::string& str); std::vector split(const char* str); std::vector split(const std::string& str); + std::vector split(const char* str, int maxsplit); + std::vector split(const std::string& str, int maxsplit); + std::vector split(const char* str, const char X); std::vector split(const std::string& str, const char X); +// std::vector split(const char* str, const char X, int maxsplit); // TODO +// std::vector split(const std::string& str, const char X, int maxsplit); // TODO + std::vector split(const char* str, const char* X); std::vector split(const std::string& str, const std::string& X); +// std::vector split(const char* str, const char* X, int maxsplit); // TODO +// std::vector split(const std::string& str, const std::string& X, int maxsplit); // TODO std::vector split_rmSpace(const char* str); // rm: remove std::vector split_rmSpace(const std::string& str); // rm: remove diff --git a/test/src_test/string/strEdit.cpp b/test/src_test/string/strEdit.cpp index aad6665e..99c1c5ae 100644 --- a/test/src_test/string/strEdit.cpp +++ b/test/src_test/string/strEdit.cpp @@ -201,6 +201,21 @@ TEST(strEdit, split_s){ TEST_SPLIT_CS(std::string(" a b, c"), "a", "b,", "c"); //--- +#define TEST_SPLIT_MAX_CS(S_IN, MAX, ...) \ + std::vector ret_v = sstd::split(S_IN, MAX); /* TEST THIS LINE */ \ + /* sstd::printn(ret_v); */ \ + ASSERT_TRUE(ret_v == std::vector({__VA_ARGS__}) ); + +TEST(strEdit, split_max_c_0){ TEST_SPLIT_MAX_CS(" a b, c ", 0, " a b, c "); } +TEST(strEdit, split_max_c_1){ TEST_SPLIT_MAX_CS(" a b, c ", 1, "a", "b, c"); } +TEST(strEdit, split_max_c_2){ TEST_SPLIT_MAX_CS(" a b, c ", 2, "a", "b,", "c"); } +TEST(strEdit, split_max_c_3){ TEST_SPLIT_MAX_CS(" a b, c ", 3, "a", "b,", "c"); } +TEST(strEdit, split_max_s){ TEST_SPLIT_MAX_CS(std::string(" a b, c "), 1, "a", "b, c"); } + +#undef TEST_SPLIT_MAX_CS + +//--- + #define TEST_SPLIT_CS_X(X_IN, S_IN, ...) \ std::vector ret_v = sstd::split(S_IN, X_IN); /* TEST THIS LINE */ \ /* sstd::printn(ret_v); */ \ diff --git a/tests_list_for_build_and_run.txt b/tests_list_for_build_and_run.txt index a8a61805..512f474a 100644 --- a/tests_list_for_build_and_run.txt +++ b/tests_list_for_build_and_run.txt @@ -29,7 +29,7 @@ #../test/src_test/file/read_write.cpp #../test/src_test/file/rm.cpp #../test/src_test/file/tinyInterpreter.cpp -../test/src_test/file/yaml.cpp +#../test/src_test/file/yaml.cpp #../test/src_test/math/math.cpp #../test/src_test/math/signal.cpp #../test/src_test/math/hashFnc_of_MD5_SHA1_SHA2/hashSum.cpp @@ -42,7 +42,7 @@ #../test/src_test/print/print_printn_printn_all.cpp #../test/src_test/python/c2py.cpp #../test/src_test/string/encode_decode.cpp -#../test/src_test/string/strEdit.cpp +../test/src_test/string/strEdit.cpp #../test/src_test/string/strmatch.cpp #../test/src_test/string/utf8.cpp #../test/src_test/sys/status.cpp From 31599ab225a4ca03c99969beeffd00464b4092cc Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sat, 1 Feb 2025 13:32:59 +0900 Subject: [PATCH 16/47] add TEST(yaml, anchor_and_alias__case03) --- sstd/src/file/yaml.cpp | 27 +++++++++++++++++----- test/src_test/file/yaml.cpp | 39 ++++++++++++++++++++++++-------- tests_list_for_build_and_run.txt | 4 ++-- 3 files changed, 52 insertions(+), 18 deletions(-) diff --git a/sstd/src/file/yaml.cpp b/sstd/src/file/yaml.cpp index 34512c4b..53f1d49a 100644 --- a/sstd/src/file/yaml.cpp +++ b/sstd/src/file/yaml.cpp @@ -780,7 +780,20 @@ bool _is_anchor(const std::string& s){ bool _is_alias(const std::string& s){ return s.starts_with("*"); } - +void _split_aa_val_and_val(std::string& out_aa_val, std::string& out_val, const std::string& in){ + std::vector v_tmp = sstd::split(in, 1); + if(v_tmp.size()==1){ + std::string tmp; + std::swap(out_aa_val, v_tmp[0]); + std::swap(out_val, tmp ); + }else if(v_tmp.size()==2){ + std::swap(out_aa_val, v_tmp[0]); + std::swap(out_val, v_tmp[1]); + }else{ + sstd::pdbg_err("Unexpected data size\n"); + } + return; +} bool sstd_yaml::_str2token_except_multilines(std::vector& ret, const std::string& str){ // Parse rule of YAML string // @@ -907,8 +920,8 @@ bool sstd_yaml::_str2token_except_multilines(std::vector& ret, if(is_hash){ tmp.type += sstd_yaml::type_hash; } if(is_flow ){ tmp.format = sstd_yaml::format_flow_style; } - if(is_anchor){ tmp.ref_type = sstd_yaml::ref_type_anchor; tmp.val.erase(0,1); std::swap(tmp.val, tmp.aa_val); } // 1) set format type, 2) remove '&' in the head of the string - if(is_alias ){ tmp.ref_type = sstd_yaml::ref_type_alias; tmp.val.erase(0,1); std::swap(tmp.val, tmp.aa_val); } // 1) set format type, 2) remove '*' in the head of the string + if(is_anchor){ tmp.ref_type = sstd_yaml::ref_type_anchor; tmp.val.erase(0,1); _split_aa_val_and_val(tmp.aa_val, tmp.val, tmp.val); } // 1) set format type, 2) remove '&' in the head of the string + if(is_alias ){ tmp.ref_type = sstd_yaml::ref_type_alias; tmp.val.erase(0,1); _split_aa_val_and_val(tmp.aa_val, tmp.val, tmp.val); } // 1) set format type, 2) remove '*' in the head of the string // Skip empty tokens until the first non-empty token occurs. (Empty token is treated as a line-break related with to other token in a context of multi-line YAML) if(ret.size()==0 && @@ -919,10 +932,10 @@ bool sstd_yaml::_str2token_except_multilines(std::vector& ret, // set hasValue tmp.hasValue=false; switch(tmp.type){ - case sstd_yaml::type_str: { if((tmp.val_is_dqed||tmp.val_is_sqed||tmp.val.size()>=1) && (tmp.ref_type==sstd_yaml::ref_type_null)){tmp.hasValue=true;} } break; - case sstd_yaml::type_list: { if((tmp.val_is_dqed||tmp.val_is_sqed||tmp.val.size()>=1) && (tmp.ref_type==sstd_yaml::ref_type_null)){tmp.hasValue=true;} } break; // check the value is NOT NULL + case sstd_yaml::type_str: + case sstd_yaml::type_list: case sstd_yaml::type_list_and_hash: - case sstd_yaml::type_hash: { if((tmp.val_is_dqed||tmp.val_is_sqed||tmp.val.size()>=1) && (tmp.ref_type==sstd_yaml::ref_type_null)){tmp.hasValue=true;} } break; // check the value is NOT NULL + case sstd_yaml::type_hash: { if(tmp.val_is_dqed||tmp.val_is_sqed||tmp.val.size()>=1){tmp.hasValue=true;} } break; // check the value is NOT NULL default: { sstd::pdbg_err("Unexpected data type\n"); return false; } break; } @@ -1213,6 +1226,7 @@ bool _yaml_load_base(sstd::terp::var& ret_yml, const std::vector v_cmd; if(!sstd_yaml::_token2cmd(v_cmd, v_token)){ return false; } + sstd::printn_all(v_cmd); if(!_construct_var(ret_yml, v_cmd)){ return false; } @@ -1225,6 +1239,7 @@ bool sstd::yaml_load(sstd::terp::var& ret_yml, const char* s){ sstd::printn_all(v_token); if(!_yaml_load_base(ret_yml, v_token)){ sstd::pdbg_err("_yaml_load_base() is failed.\n"); return false; } + sstd::printn_all(ret_yml); return true; } diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index ebec5ed4..e898655a 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -4435,15 +4435,16 @@ TEST(yaml, anchor_and_alias__case01){ } TEST(yaml, anchor_and_alias__case02){ std::string s = R"( -- &ll +- &rr - - a - b - c -- *ll +- *rr )"; sstd::terp::var yml; bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE // sstd::printn_all(yml); +// sstd::printn_all(yml.size()); //--- @@ -4460,10 +4461,27 @@ TEST(yaml, anchor_and_alias__case02){ } TEST(yaml, anchor_and_alias__case03){ std::string s = R"( -- &l a x # anchor -- *l # alias -#- [*l] -#- {*l} +- &r a x # anchor +- *r # alias +)"; + sstd::terp::var yml; + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE +// sstd::printn_all(yml); + + //--- + + sstd::terp::var ans; + ans = sstd::terp::list(2); + ans[0] = "a x"; + ans[1] = &ans[0]; + + ASSERT_TRUE(yml == ans); +} +TEST(yaml, anchor_and_alias__case04){ + std::string s = R"( +- &r a +- [*r] +- {*r} )"; sstd::terp::var yml; bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE @@ -4472,19 +4490,20 @@ TEST(yaml, anchor_and_alias__case03){ //--- sstd::terp::var ans; -// ans = sstd::terp::list(4); ans = sstd::terp::list(3); ans[0] = "a"; ans[1] = &ans[0]; ans[2] = sstd::terp::list(1); ans[2][0] = &ans[0]; -// ans[3] = sstd::terp::hash(); -// ans[3][ &ans[0] ]; + ans[3] = sstd::terp::hash(); + ans[3][ &ans[0] ]; ASSERT_TRUE(yml == ans); } -TEST(yaml, anchor_and_alias__case04){ +TEST(yaml, anchor_and_alias__case05){ std::string s = R"( +- &r [a, b, c] +- *r hh: &hh k1: v1 k2: v2 diff --git a/tests_list_for_build_and_run.txt b/tests_list_for_build_and_run.txt index 512f474a..a8a61805 100644 --- a/tests_list_for_build_and_run.txt +++ b/tests_list_for_build_and_run.txt @@ -29,7 +29,7 @@ #../test/src_test/file/read_write.cpp #../test/src_test/file/rm.cpp #../test/src_test/file/tinyInterpreter.cpp -#../test/src_test/file/yaml.cpp +../test/src_test/file/yaml.cpp #../test/src_test/math/math.cpp #../test/src_test/math/signal.cpp #../test/src_test/math/hashFnc_of_MD5_SHA1_SHA2/hashSum.cpp @@ -42,7 +42,7 @@ #../test/src_test/print/print_printn_printn_all.cpp #../test/src_test/python/c2py.cpp #../test/src_test/string/encode_decode.cpp -../test/src_test/string/strEdit.cpp +#../test/src_test/string/strEdit.cpp #../test/src_test/string/strmatch.cpp #../test/src_test/string/utf8.cpp #../test/src_test/sys/status.cpp From be43d12311ab31344492a642b23493d5c9902ab4 Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sat, 1 Feb 2025 16:08:02 +0900 Subject: [PATCH 17/47] wip --- sstd/src/file/yaml.cpp | 15 +++++++++++---- test/src_test/file/yaml.cpp | 6 +++--- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/sstd/src/file/yaml.cpp b/sstd/src/file/yaml.cpp index 53f1d49a..9ecd1722 100644 --- a/sstd/src/file/yaml.cpp +++ b/sstd/src/file/yaml.cpp @@ -311,7 +311,7 @@ bool sstd_yaml::_format_mult_line_str(std::string& ret_str, const std::string& s v_tmp.push_back(tmp); } - + if((!ret_plusSymbol) && (!ret_minusSymbol)){ // "|N" or ">N" @@ -608,7 +608,8 @@ bool _get_hash_value(bool& is_null, std::string& ret_value, const std::vector& tbl_anchor_to_address, const std::string& s_in){ + std::vector v_cs; // vector of commands and string if(!sstd_yaml::_split_quotes_by_control_chars(v_cs, s_in.c_str(), s_in.size())){ sstd::pdbg_err("_split_quotes_by_control_chars() is failed. Un-cloused quate.\n"); return false; } @@ -656,7 +657,13 @@ bool _flow_style_str_to_obj(sstd::terp::var& var_out, const std::string& s_in){ v_dst.push_back( &(var[var.size()-1]) ); --i; continue; } - var.push_back(v_cs[i]); + +// bool is_alias = _is_alias(v_cs[i]); // for the '*' (alias) +// if(is_alias){ +// var.push_back( (sstd::terp::var*)tbl_anchor_to_address[ v_cs[i] ] ); +// }else{ + var.push_back( v_cs[i] ); +// } } break; case sstd::num_hash_terp_var: { // hash @@ -724,7 +731,7 @@ bool _construct_var(sstd::terp::var& ret_yml, const std::vector Date: Sat, 1 Feb 2025 16:26:40 +0900 Subject: [PATCH 18/47] change the order of code to resolve dependencies --- sstd/src/file/yaml.cpp | 451 +++++++++++++++++++++-------------------- 1 file changed, 229 insertions(+), 222 deletions(-) diff --git a/sstd/src/file/yaml.cpp b/sstd/src/file/yaml.cpp index 9ecd1722..763f5d96 100644 --- a/sstd/src/file/yaml.cpp +++ b/sstd/src/file/yaml.cpp @@ -144,7 +144,8 @@ std::string _rm_comment(const std::string& s){ return sstd::rstrip(v[0]); } -//--- +//----------------------------------------------------------------------------------------------------------------------------------------------- +// _format_mult_line_str() section std::string _join_mult_line(const std::vector& v, const bool ret_pipeSymbol, const bool ret_greaterThanSymbol){ std::string ret; @@ -341,6 +342,9 @@ bool sstd_yaml::_format_mult_line_str(std::string& ret_str, const std::string& s return true; } +//----------------------------------------------------------------------------------------------------------------------------------------------- +// _token2cmd() section + bool sstd_yaml::_token2cmd(std::vector& ret_vCmd, const std::vector& v_token){ for(uint i=0; i& ret_vCmd, con return true; } -bool _is_control_chars(const char c){ - return (c=='[' || c==']' || c=='{' || c=='}' || c==':' || c==','); -} -bool sstd_yaml::_split_quotes_by_control_chars(std::vector& ret, const char* str, const uint str_len){ - bool is_escaped=false; - bool in_d_quate=false; // double quate - bool in_s_quate=false; // single quate - std::string buf; - uint i=0; - while(i=str_len){break;} } - - if(!is_escaped && !in_s_quate && str[i]=='"' ){ in_d_quate = !in_d_quate; } - if(!is_escaped && !in_d_quate && str[i]=='\''){ in_s_quate = !in_s_quate; } - - if(!in_d_quate && !in_s_quate && (_is_control_chars(str[i]))){ - buf = sstd::strip(buf); - if(buf.size()!=0){ - ret.push_back(buf); - buf.clear(); - } - ret.push_back(std::string(1, str[i])); // append a control char - ++i; - }else{ - buf += str[i]; - ++i; - } - - is_escaped=false; - } - if(in_d_quate){ ret.clear(); return false; } - if(in_s_quate){ ret.clear(); return false; } - buf = sstd::strip(buf); - if(buf.size()!=0){ ret.push_back(buf); } - - return true; -} -bool _get_hash_value(bool& is_null, std::string& ret_value, const std::vector& v_cs, uint& i){ - - if(i+3& tbl_anchor_to_address, const std::string& s_in){ - - std::vector v_cs; // vector of commands and string - if(!sstd_yaml::_split_quotes_by_control_chars(v_cs, s_in.c_str(), s_in.size())){ sstd::pdbg_err("_split_quotes_by_control_chars() is failed. Un-cloused quate.\n"); return false; } - - std::vector v_dst; - v_dst.push_back( &var_out ); - - for(uint i=0; i& v_cmd){ - std::vector v_dst; // v: vector, _dst: destination address. An address stack for sstd_yaml::ope_alloc (follows the YAML indent) - std::vector v_dst_cr; // v: vector, _dst: destination address, _cr: current. An address stack for sstd_yaml::ope_stack or sstd_yaml::ope_assign. - std::vector v_hsc; // v: vector, hsc: head space count - v_dst.push_back(&ret_yml); - v_dst_cr.push_back(&ret_yml); - v_hsc.push_back(0); - - std::unordered_map tbl_anchor_to_address; - - for(uint i=0; i& ret, const char* str_i } bool sstd_yaml::_str2token(std::vector& ret, const std::string& str){ return sstd_yaml::_str2token(ret, str.c_str()); } +//----------------------------------------------------------------------------------------------------------------------------------------------- +// _construct_var() section + +bool _is_control_chars(const char c){ + return (c=='[' || c==']' || c=='{' || c=='}' || c==':' || c==','); +} +bool sstd_yaml::_split_quotes_by_control_chars(std::vector& ret, const char* str, const uint str_len){ + bool is_escaped=false; + bool in_d_quate=false; // double quate + bool in_s_quate=false; // single quate + std::string buf; + uint i=0; + while(i=str_len){break;} } + + if(!is_escaped && !in_s_quate && str[i]=='"' ){ in_d_quate = !in_d_quate; } + if(!is_escaped && !in_d_quate && str[i]=='\''){ in_s_quate = !in_s_quate; } + + if(!in_d_quate && !in_s_quate && (_is_control_chars(str[i]))){ + buf = sstd::strip(buf); + if(buf.size()!=0){ + ret.push_back(buf); + buf.clear(); + } + ret.push_back(std::string(1, str[i])); // append a control char + ++i; + }else{ + buf += str[i]; + ++i; + } + + is_escaped=false; + } + if(in_d_quate){ ret.clear(); return false; } + if(in_s_quate){ ret.clear(); return false; } + buf = sstd::strip(buf); + if(buf.size()!=0){ ret.push_back(buf); } + + return true; +} +bool _get_hash_value(bool& is_null, std::string& ret_value, const std::vector& v_cs, uint& i){ + + if(i+3& tbl_anchor_to_address, const std::string& s_in){ + + std::vector v_cs; // vector of commands and string + if(!sstd_yaml::_split_quotes_by_control_chars(v_cs, s_in.c_str(), s_in.size())){ sstd::pdbg_err("_split_quotes_by_control_chars() is failed. Un-cloused quate.\n"); return false; } + + std::vector v_dst; + v_dst.push_back( &var_out ); + + for(uint i=0; i& v_cmd){ + std::vector v_dst; // v: vector, _dst: destination address. An address stack for sstd_yaml::ope_alloc (follows the YAML indent) + std::vector v_dst_cr; // v: vector, _dst: destination address, _cr: current. An address stack for sstd_yaml::ope_stack or sstd_yaml::ope_assign. + std::vector v_hsc; // v: vector, hsc: head space count + v_dst.push_back(&ret_yml); + v_dst_cr.push_back(&ret_yml); + v_hsc.push_back(0); + + std::unordered_map tbl_anchor_to_address; + + for(uint i=0; i Date: Sat, 1 Feb 2025 17:06:49 +0900 Subject: [PATCH 19/47] add: TEST(yaml, anchor_and_alias__case04) --- sstd/src/file/yaml.cpp | 17 +++++++++++------ test/src_test/file/yaml.cpp | 35 +++++++++++++++++++++++++++-------- 2 files changed, 38 insertions(+), 14 deletions(-) diff --git a/sstd/src/file/yaml.cpp b/sstd/src/file/yaml.cpp index 763f5d96..7ff3b95c 100644 --- a/sstd/src/file/yaml.cpp +++ b/sstd/src/file/yaml.cpp @@ -1122,12 +1122,15 @@ bool _flow_style_str_to_obj(sstd::terp::var& var_out, const std::unordered_mapsecond ); + }else{ var.push_back( v_cs[i] ); -// } + } } break; case sstd::num_hash_terp_var: { // hash @@ -1215,7 +1218,9 @@ bool _construct_var(sstd::terp::var& ret_yml, const std::vectorsecond; } } break; case sstd_yaml::type_hash: { diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index cdf0c4ef..22478e1d 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -4466,6 +4466,7 @@ TEST(yaml, anchor_and_alias__case03){ )"; sstd::terp::var yml; bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + ASSERT_TRUE(ret); // sstd::printn_all(yml); //--- @@ -4481,26 +4482,44 @@ TEST(yaml, anchor_and_alias__case04){ std::string s = R"( - &r a - [*r] -#- {*r} )"; sstd::terp::var yml; bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + ASSERT_TRUE(ret); sstd::printn_all(yml); //--- sstd::terp::var ans; - ans = sstd::terp::list(3); + ans = sstd::terp::list(2); + ans[0] = "a"; + ans[1] = sstd::terp::list(1); + ans[1][0] = &ans[0]; + + ASSERT_TRUE(yml == ans); +}/* +TEST(yaml, anchor_and_alias__case05){ + std::string s = R"( +- &r a +- {*r} +)"; + sstd::terp::var yml; + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + ASSERT_TRUE(ret); + sstd::printn_all(yml); + + //--- + + sstd::terp::var ans; + ans = sstd::terp::list(2); ans[0] = "a"; ans[1] = &ans[0]; - ans[2] = sstd::terp::list(1); - ans[2][0] = &ans[0]; -// ans[3] = sstd::terp::hash(); -// ans[3][ &ans[0] ]; + ans[2] = sstd::terp::hash(); + ans[2]["a"]; ASSERT_TRUE(yml == ans); } -TEST(yaml, anchor_and_alias__case05){ +TEST(yaml, anchor_and_alias__case06){ std::string s = R"( - &r [a, b, c] - *r @@ -4509,7 +4528,7 @@ hh: &hh k2: v2 )"; } - +//*/ //----------------------------------------------------------------------------------------------------------------------------------------------- EXECUTE_TESTS(); From 6df881ecc6277de9807577f82d37d60a485d69f4 Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sat, 1 Feb 2025 20:01:18 +0900 Subject: [PATCH 20/47] add: TEST(yaml, anchor_and_alias__case06_hash_value) (WIP) --- sstd/src/file/yaml.cpp | 51 +++++++++++++++++++++++++++++-------- test/src_test/file/yaml.cpp | 50 +++++++++++++++++++++++++++++++----- 2 files changed, 85 insertions(+), 16 deletions(-) diff --git a/sstd/src/file/yaml.cpp b/sstd/src/file/yaml.cpp index 7ff3b95c..6755d11a 100644 --- a/sstd/src/file/yaml.cpp +++ b/sstd/src/file/yaml.cpp @@ -1072,6 +1072,21 @@ bool _get_hash_value(bool& is_null, std::string& ret_value, const std::vector& tbl_anchor_to_address, const std::string& s_in){ + + out_is_alias = _is_alias(s_in); + + if(out_is_alias){ + std::string alias_name = std::string(s_in).erase(0,1); // removes '*' in the head of the string + + auto itr = tbl_anchor_to_address.find( alias_name ); + if(itr==tbl_anchor_to_address.end()){ sstd::pdbg_err("Anchor does NOT found. Anchor name: %s\n", s_in.c_str()); return false; } + + out_address = itr->second; + } + + return true; +} bool _flow_style_str_to_obj(sstd::terp::var& var_out, const std::unordered_map& tbl_anchor_to_address, const std::string& s_in){ std::vector v_cs; // vector of commands and string @@ -1122,24 +1137,40 @@ bool _flow_style_str_to_obj(sstd::terp::var& var_out, const std::unordered_mapsecond ); + var.push_back( address ); }else{ var.push_back( v_cs[i] ); } } break; case sstd::num_hash_terp_var: { + bool is_key_alias; sstd::terp::var* key_address; + if(!_get_alias_address(is_key_alias, key_address, tbl_anchor_to_address, v_cs[i])){ sstd::pdbg_err("_get_alias_address() failed.\n"); return false; } // for the '*' (alias) + // hash bool is_null; - std::string key = v_cs[i]; + std::string key = (!is_key_alias ? v_cs[i] : key_address->to()); std::string val; - if(_get_hash_value(is_null, val, v_cs, i)){ - if(!is_null){ var[ key.c_str() ] = _extract_quotes_value(sstd::strip_quotes(val.c_str())); - } else { var[ key.c_str() ]; } + bool has_object_value = _get_hash_value(is_null, val, v_cs, i); + if(has_object_value){ + bool is_value_alias; sstd::terp::var* value_address; + if(!_get_alias_address(is_value_alias, value_address, tbl_anchor_to_address, val)){ sstd::pdbg_err("_get_alias_address() failed.\n"); return false; } // for the '*' (alias) + sstd::printn_all(is_null); + sstd::printn_all(val); + sstd::printn_all(is_value_alias); + sstd::printn_all(value_address); + + if(!is_null){ + if(!is_value_alias){ + var[ key.c_str() ] = _extract_quotes_value(sstd::strip_quotes(val.c_str())); + }else{ + var[ key.c_str() ] = value_address; + } + } else { + var[ key.c_str() ]; + } }else{ v_dst.push_back( &(var[key.c_str()]) ); } @@ -1160,7 +1191,7 @@ bool _construct_var(sstd::terp::var& ret_yml, const std::vector tbl_anchor_to_address; for(uint i=0; i Date: Sat, 19 Apr 2025 23:38:41 +0900 Subject: [PATCH 21/47] fix bug of sstd::terp::equal() --- sstd/src/memory/terp/terp.cpp | 23 ++++++++++------------- test/src_test/memory/terp/terp.cpp | 23 +++++++++++++++++++++++ tests_list_for_build_and_run.txt | 4 ++-- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/sstd/src/memory/terp/terp.cpp b/sstd/src/memory/terp/terp.cpp index 7a48195d..e898bc63 100644 --- a/sstd/src/memory/terp/terp.cpp +++ b/sstd/src/memory/terp/terp.cpp @@ -19,11 +19,6 @@ void _free_val(sstd::terp::var* _pVar, void*& _p, sstd::terp::srcr_tbl* _pSRCR_t //----------------------------------------------------------------------------------------------------------------------------------------------- // for internal use -// cast -std::string* _cast2str (void* rhs){ return ( std::string*)rhs; } -std::vector* _cast2vec (void* rhs){ return (std::vector*)rhs; } -std::unordered_map* _cast2hash(void* rhs){ return (std::unordered_map*)rhs; } - #define STR (*(std::string*)src.p()) void sstd::terp::_to( bool & dst, const sstd::terp::var& src){ @@ -578,8 +573,8 @@ sstd::terp::var& sstd::terp::var::operator=(const sstd::terp::var* pRhs_in){ template void sstd::terp::var::_overwrite(T* ptr){ _free_val(this, _p, _pSRCR_tbl, _type, _is_reference); - this->_type = sstd::type2num(T()); - this->_p = ptr; + this->_type = sstd::type2num(T()); + this->_p = ptr; } sstd::terp::var& sstd::terp::var::operator=(const char* rhs){ _overwrite(new std::string(rhs)); @@ -618,8 +613,9 @@ bool _is_equal_hash(const sstd::terp::var& lhs, const sstd::terp::var& rhs, auto itr_rhs = rhs.find(key.c_str()); if(!(itr_rhs!=rhs.end())){ return false; } - - if(!_is_equal(itr.second(), itr_rhs.second(), check_ref_flag, ref_addr_graph, check_ref_abs_addr, vStack_lhsP_and_rhsP, tbl_lhsAds_to_rhsAds)){ return false; } + + //if(!_is_equal(itr.second(), itr_rhs.second(), check_ref_flag, ref_addr_graph, check_ref_abs_addr, vStack_lhsP_and_rhsP, tbl_lhsAds_to_rhsAds)){ return false; } // This is invalid implimentation. Because the "itr.second()" makes the new temporal object and the address of `pSRCR_tbl()` changed. + if(!_is_equal(lhs[key.c_str()], rhs[key.c_str()], check_ref_flag, ref_addr_graph, check_ref_abs_addr, vStack_lhsP_and_rhsP, tbl_lhsAds_to_rhsAds)){ return false; } } return true; @@ -656,6 +652,7 @@ bool _is_equal(const sstd::terp::var& lhs, const sstd::terp::var& rhs, if(lhs.is_reference()){ bool is_internal_ref_lhs = _is_internal_ref(&lhs); bool is_internal_ref_rhs = _is_internal_ref(&rhs); + if(is_internal_ref_lhs != is_internal_ref_rhs){ return false; } if(is_internal_ref_lhs){ // If the reference is `internal` reference. @@ -730,7 +727,7 @@ bool sstd::terp::var::operator!=(const sstd::terp::var& rhs){ return !sstd::terp switch(_type){ \ case sstd::num_hash_terp_var: { \ sstd::terp::var** ppVal = &(_CAST2HASH(_p)[pKey]); \ - if(*ppVal==NULL){ (*ppVal)=new sstd::terp::var(_pSRCR_tbl); } \ + if(*ppVal==NULL){ (*ppVal)=new sstd::terp::var(_pSRCR_tbl); } \ return **ppVal; \ } break; \ case sstd::num_null: { \ @@ -746,9 +743,9 @@ bool sstd::terp::var::operator!=(const sstd::terp::var& rhs){ return !sstd::terp #define _OPE_SUBSCRIPT_KEY_BASE_CONST(pKey) \ switch(_type){ \ case sstd::num_hash_terp_var: { \ - sstd::terp::var* pVal = _CAST2HASH(_p)[pKey]; \ - if(pVal==NULL){ sstd::pdbg_err("Ope[](char*) is failed. NULL pointer detection error. pKey: `%s` is NOT allocated.\n", pKey); return *this; } \ - return *pVal; \ + sstd::terp::var** ppVal = &(_CAST2HASH(_p)[pKey]); \ + if(*ppVal==NULL){ sstd::pdbg_err("Ope[](char*) is failed. NULL pointer detection error. pKey: `%s` is NOT allocated.\n", pKey); return *this; } \ + return **ppVal; \ } break; \ default: { sstd::pdbg_err("Ope[](char*) is failed. Unexpedted data type. sstd::terp::var takes type number `%d`, but treat as a \"sstd::terp::hash()\".\n", _type); } break; \ } \ diff --git a/test/src_test/memory/terp/terp.cpp b/test/src_test/memory/terp/terp.cpp index 3c2a3917..7b11bba3 100644 --- a/test/src_test/memory/terp/terp.cpp +++ b/test/src_test/memory/terp/terp.cpp @@ -1344,6 +1344,9 @@ TEST(memory_terp, terp__deep_copy_err){} //----------------------------------------------------------------------------------------------------------------------------------------------- // For the Reference Type: `sstd::terp::equal()` +//--- +// for list() + TEST(memory_terp, terp__equal__case01_not_eq){ sstd::terp::var x; x = sstd::terp::list(2); @@ -1442,6 +1445,26 @@ TEST(memory_terp, terp__equal__case05_not_eq){ } //--- +// for hash() + +TEST(memory_terp, terp__equal__list_and_hash__case01_eq){ + sstd::terp::var x; + x = sstd::terp::list(2); + x[0] = "a-z"; + x[1] = sstd::terp::hash(); + x[1]["key"] = &x[0]; + + sstd::terp::var y; + y = sstd::terp::list(2); + y[0] = "a-z"; + y[1] = sstd::terp::hash(); + y[1]["key"] = &y[0]; + + ASSERT_TRUE(sstd::terp::equal(x, y)); // TEST THIS LINE +} + +//----------------------------------------------------------------------------------------------------------------------------------------------- +// For the Reference Type: `sstd::terp::equal_val()` TEST(memory_terp, terp__equal_val__case01_eq){ sstd::terp::var x; diff --git a/tests_list_for_build_and_run.txt b/tests_list_for_build_and_run.txt index a8a61805..8d05fc5e 100644 --- a/tests_list_for_build_and_run.txt +++ b/tests_list_for_build_and_run.txt @@ -29,12 +29,12 @@ #../test/src_test/file/read_write.cpp #../test/src_test/file/rm.cpp #../test/src_test/file/tinyInterpreter.cpp -../test/src_test/file/yaml.cpp +#../test/src_test/file/yaml.cpp #../test/src_test/math/math.cpp #../test/src_test/math/signal.cpp #../test/src_test/math/hashFnc_of_MD5_SHA1_SHA2/hashSum.cpp #../test/src_test/math/hashFnc_of_MD5_SHA1_SHA2/sstd_md5_sha1_sha2_wrapper.cpp -#../test/src_test/memory/terp/terp.cpp +../test/src_test/memory/terp/terp.cpp #../test/src_test/memory/terp/terp_print.cpp #../test/src_test/memory/unique_void_ptr.cpp #../test/src_test/memory/void_ptr.cpp From b9536487dd112ac4f789b06aed05dea95beb7149 Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sun, 27 Apr 2025 23:16:09 +0900 Subject: [PATCH 22/47] add: TEST(yaml, block_list_and_flow_list_02) --- sstd/src/file/yaml.cpp | 20 ++++--- test/src_test/file/yaml.cpp | 93 ++++++++++++++++++++++++-------- tests_list_for_build_and_run.txt | 4 +- 3 files changed, 81 insertions(+), 36 deletions(-) diff --git a/sstd/src/file/yaml.cpp b/sstd/src/file/yaml.cpp index 6755d11a..68aa73df 100644 --- a/sstd/src/file/yaml.cpp +++ b/sstd/src/file/yaml.cpp @@ -555,9 +555,6 @@ bool sstd_yaml::_token2cmd(std::vector& ret_vCmd, con //----------------------------------------------------------------------------------------------------------------------------------------------- // str2token section -bool _is_flow(const std::string& s){ - return (s.starts_with('[') || s.starts_with('{')); -} bool _is_end_marker(const std::string& s){ return s.starts_with("..."); } @@ -570,6 +567,11 @@ bool _is_anchor(const std::string& s){ bool _is_alias(const std::string& s){ return s.starts_with("*"); } +bool _is_flow(const std::string& s_in){ + std::string s = sstd::lstrip(s_in); + bool is_anchor = _is_anchor(s); // for the '&' (anchor) + return (s.starts_with('[') || s.starts_with('{')); +} void _split_aa_val_and_val(std::string& out_aa_val, std::string& out_val, const std::string& in){ std::vector v_tmp = sstd::split(in, 1); if(v_tmp.size()==1){ @@ -1157,10 +1159,6 @@ bool _flow_style_str_to_obj(sstd::terp::var& var_out, const std::unordered_map v_cmd; if(!sstd_yaml::_token2cmd(v_cmd, v_token)){ return false; } - sstd::printn_all(v_cmd); +// sstd::printn_all(v_cmd); if(!_construct_var(ret_yml, v_cmd)){ return false; } @@ -1286,10 +1284,10 @@ bool sstd::yaml_load(sstd::terp::var& ret_yml, const char* s){ std::vector v_token; if(!sstd_yaml::_str2token(v_token, s)){ sstd::pdbg_err("single or double quatation is not closed\n"); return false; } // v: vector, ls: line string - sstd::printn_all(v_token); +// sstd::printn_all(v_token); if(!_yaml_load_base(ret_yml, v_token)){ sstd::pdbg_err("_yaml_load_base() is failed.\n"); return false; } - sstd::printn_all(ret_yml); +// sstd::printn_all(ret_yml); return true; } diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index 8deea036..d70ec960 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -3619,7 +3619,7 @@ TEST(yaml, multipul_list_indication_case08){ //--- //* -TEST(yaml, block_list_and_flow_list){ +TEST(yaml, block_list_and_flow_list_01){ std::string s=R"( - [a, b, c] )"; @@ -3640,6 +3640,27 @@ TEST(yaml, block_list_and_flow_list){ ASSERT_TRUE(yml==ans); } +TEST(yaml, block_list_and_flow_list_02){ + std::string s=R"( +- [a, b, c] +)"; + sstd::terp::var yml; ASSERT_TRUE(sstd::yaml_load(yml, s)); // TEST THIS LINE + //sstd::printn(yml); + + //--- + + sstd::terp::var ans; + ans = sstd::terp::list(1); + ans[0] = sstd::terp::list(3); + ans[0][0] = "a"; + ans[0][1] = "b"; + ans[0][2] = "c"; + //sstd::printn(ans); + + //--- + + ASSERT_TRUE(yml==ans); +} TEST(yaml, block_list_and_flow_hash){ std::string s=R"( - {k1:v1, k2:v2, k3:v3} @@ -4443,6 +4464,7 @@ TEST(yaml, anchor_and_alias__case02){ )"; sstd::terp::var yml; bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + ASSERT_TRUE(ret); // sstd::printn_all(yml); // sstd::printn_all(yml.size()); @@ -4506,7 +4528,7 @@ TEST(yaml, anchor_and_alias__case05_hash_key){ sstd::terp::var yml; bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE ASSERT_TRUE(ret); - sstd::printn_all(yml); +// sstd::printn_all(yml); //--- @@ -4526,12 +4548,7 @@ TEST(yaml, anchor_and_alias__case06_hash_value){ sstd::terp::var yml; bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE ASSERT_TRUE(ret); - sstd::printn_all(yml); - sstd::printn_all(yml.size()); - sstd::printn_all(yml[1]["key"].is_reference()); - sstd::printn_all(yml[1].size()); - sstd::printn_all(&yml[0]); - sstd::printn_all(yml[1]["key"].p()); +// sstd::printn_all(yml); //--- @@ -4540,27 +4557,57 @@ TEST(yaml, anchor_and_alias__case06_hash_value){ ans[0] = "a"; ans[1] = sstd::terp::hash(); ans[1]["key"] = &ans[0]; - sstd::printn_all(ans); - sstd::printn_all(ans.size()); - sstd::printn_all(ans[1]["key"].is_reference()); - sstd::printn_all(ans[1].size()); - sstd::printn_all(&ans[0]); - sstd::printn_all(ans[1]["key"].p()); - - sstd::terp::var a2; - a2 = sstd::terp::list(2); - a2[0] = "a"; - a2[1] = sstd::terp::hash(); - a2[1] = &a2[0]; - sstd::printn_all(&a2[0]); - sstd::printn_all(a2[1].p()); +// sstd::printn_all(ans); ASSERT_TRUE(yml == ans); }/* -TEST(yaml, anchor_and_alias__case06){ +TEST(yaml, anchor_and_alias__case07_list){ std::string s = R"( - &r [a, b, c] - *r +)"; + sstd::terp::var yml; + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + ASSERT_TRUE(ret); + sstd::printn_all(yml); + + //--- + + sstd::terp::var ans; + ans = sstd::terp::list(2); + ans[0] = sstd::terp::list(3); + ans[0][0] = "a"; + ans[0][1] = "b"; + ans[0][2] = "c"; + ans[1] = &ans[0]; + sstd::printn_all(ans); + + ASSERT_TRUE(yml == ans); +} +/* +TEST(yaml, anchor_and_alias__case08_hash){ + std::string s = R"( +- &r {k: v} +- *r +)"; + sstd::terp::var yml; + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + ASSERT_TRUE(ret); + sstd::printn_all(yml); + + //--- + + sstd::terp::var ans; + ans = sstd::terp::list(2); + ans[0] = sstd::terp::hash(); + ans[0]["k"] = "v"; + ans[1] = &ans[0]; + sstd::printn_all(ans); + + ASSERT_TRUE(yml == ans); +} +TEST(yaml, anchor_and_alias__case06){ + std::string s = R"( hh: &hh k1: v1 k2: v2 diff --git a/tests_list_for_build_and_run.txt b/tests_list_for_build_and_run.txt index 8d05fc5e..a8a61805 100644 --- a/tests_list_for_build_and_run.txt +++ b/tests_list_for_build_and_run.txt @@ -29,12 +29,12 @@ #../test/src_test/file/read_write.cpp #../test/src_test/file/rm.cpp #../test/src_test/file/tinyInterpreter.cpp -#../test/src_test/file/yaml.cpp +../test/src_test/file/yaml.cpp #../test/src_test/math/math.cpp #../test/src_test/math/signal.cpp #../test/src_test/math/hashFnc_of_MD5_SHA1_SHA2/hashSum.cpp #../test/src_test/math/hashFnc_of_MD5_SHA1_SHA2/sstd_md5_sha1_sha2_wrapper.cpp -../test/src_test/memory/terp/terp.cpp +#../test/src_test/memory/terp/terp.cpp #../test/src_test/memory/terp/terp_print.cpp #../test/src_test/memory/unique_void_ptr.cpp #../test/src_test/memory/void_ptr.cpp From 925e95ea57aecd7e5944707f710b0ed2e7c02514 Mon Sep 17 00:00:00 2001 From: admiswalker Date: Mon, 28 Apr 2025 09:16:50 +0900 Subject: [PATCH 23/47] add: TEST(memory_terp, hash_find_ref) --- sstd/src/file/yaml.cpp | 8 +++++++- sstd/src/memory/terp/terp.cpp | 16 ++++++++++++---- test/src_test/file/yaml.cpp | 7 +++---- test/src_test/memory/terp/terp.cpp | 20 ++++++++++++++++++++ tests_list_for_build_and_run.txt | 4 ++-- 5 files changed, 44 insertions(+), 11 deletions(-) diff --git a/sstd/src/file/yaml.cpp b/sstd/src/file/yaml.cpp index 68aa73df..862cbed1 100644 --- a/sstd/src/file/yaml.cpp +++ b/sstd/src/file/yaml.cpp @@ -568,8 +568,14 @@ bool _is_alias(const std::string& s){ return s.starts_with("*"); } bool _is_flow(const std::string& s_in){ - std::string s = sstd::lstrip(s_in); + std::string s = sstd::lstrip(s_in); // " [a, b, c]" -> "[a, b, c]" + bool is_anchor = _is_anchor(s); // for the '&' (anchor) + if(is_anchor){ + std::vector v_s = sstd::split(s); // "&ref [a, b, c]" -> ["&ref" "[a," "b," "c]"] + if(v_s.size()>=2){ s = v_s[1]; } + } + return (s.starts_with('[') || s.starts_with('{')); } void _split_aa_val_and_val(std::string& out_aa_val, std::string& out_val, const std::string& in){ diff --git a/sstd/src/memory/terp/terp.cpp b/sstd/src/memory/terp/terp.cpp index e898bc63..49777539 100644 --- a/sstd/src/memory/terp/terp.cpp +++ b/sstd/src/memory/terp/terp.cpp @@ -607,17 +607,20 @@ bool _is_equal_hash(const sstd::terp::var& lhs, const sstd::terp::var& rhs, std::unordered_map& tbl_lhsAds_to_rhsAds ){ if(lhs.size()!=rhs.size()){ return false; } + sstd::printn_all("in"); for(auto itr=lhs.begin(); itr!=lhs.end(); ++itr){ std::string key = itr.first_to(); + sstd::printn_all(key); auto itr_rhs = rhs.find(key.c_str()); - if(!(itr_rhs!=rhs.end())){ return false; } + if(!(itr_rhs!=rhs.end())){ sstd::printn_all("ex");return false; } + sstd::printn_all("m"); //if(!_is_equal(itr.second(), itr_rhs.second(), check_ref_flag, ref_addr_graph, check_ref_abs_addr, vStack_lhsP_and_rhsP, tbl_lhsAds_to_rhsAds)){ return false; } // This is invalid implimentation. Because the "itr.second()" makes the new temporal object and the address of `pSRCR_tbl()` changed. - if(!_is_equal(lhs[key.c_str()], rhs[key.c_str()], check_ref_flag, ref_addr_graph, check_ref_abs_addr, vStack_lhsP_and_rhsP, tbl_lhsAds_to_rhsAds)){ return false; } + if(!_is_equal(lhs[key.c_str()], rhs[key.c_str()], check_ref_flag, ref_addr_graph, check_ref_abs_addr, vStack_lhsP_and_rhsP, tbl_lhsAds_to_rhsAds)){ sstd::printn_all("ex");return false; } } - + sstd::printn_all("ex"); return true; } bool _is_equal(const sstd::terp::var& lhs, const sstd::terp::var& rhs, @@ -625,6 +628,7 @@ bool _is_equal(const sstd::terp::var& lhs, const sstd::terp::var& rhs, std::vector>& vStack_lhsP_and_rhsP, std::unordered_map& tbl_lhsAds_to_rhsAds ){ + sstd::printn_all(" in"); // Table. Parameter settings for the sstd::terp::var::equal(). // ┌────────────────────────────────┬───────────────────────────────────────────────┬──────────────┐ // │ │ Setting of the options (*1) │ │ @@ -677,6 +681,7 @@ bool _is_equal(const sstd::terp::var& lhs, const sstd::terp::var& rhs, default: { sstd::pdbg_err("ERROR\n"); } break; } + sstd::printn_all(" ex"); return false; } bool _check_internal_ref_graph(std::vector> vStack_lhsP_and_rhsP, @@ -841,7 +846,10 @@ uint sstd::terp::var::erase(const char* pKey){ sstd::terp::iterator sstd::terp::var::find(const char* pKey) const { switch(_type){ - case sstd::num_hash_terp_var: { return sstd::terp::iterator( _CAST2HASH(_p).find(pKey) ); } break; + case sstd::num_hash_terp_var: { + void* local_p = (! this->_is_reference) ? _p : (void*)((sstd::terp::var*)_p)->_p; + return sstd::terp::iterator( _CAST2HASH(local_p).find(pKey) ); + } break; case sstd::num_null: {} break; default: { sstd::pdbg_err("ERROR\n"); } } diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index d70ec960..4b80c5ff 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -4560,7 +4560,7 @@ TEST(yaml, anchor_and_alias__case06_hash_value){ // sstd::printn_all(ans); ASSERT_TRUE(yml == ans); -}/* +} TEST(yaml, anchor_and_alias__case07_list){ std::string s = R"( - &r [a, b, c] @@ -4583,8 +4583,7 @@ TEST(yaml, anchor_and_alias__case07_list){ sstd::printn_all(ans); ASSERT_TRUE(yml == ans); -} -/* +}/* TEST(yaml, anchor_and_alias__case08_hash){ std::string s = R"( - &r {k: v} @@ -4605,7 +4604,7 @@ TEST(yaml, anchor_and_alias__case08_hash){ sstd::printn_all(ans); ASSERT_TRUE(yml == ans); -} +}/* TEST(yaml, anchor_and_alias__case06){ std::string s = R"( hh: &hh diff --git a/test/src_test/memory/terp/terp.cpp b/test/src_test/memory/terp/terp.cpp index 7b11bba3..88aa3cab 100644 --- a/test/src_test/memory/terp/terp.cpp +++ b/test/src_test/memory/terp/terp.cpp @@ -551,6 +551,26 @@ TEST(memory_terp, hash_find_false){ auto itr = a.find("k0"); // TEST THIS LINE ASSERT_FALSE( itr!=a.end() ); } +TEST(memory_terp, hash_find_ref){ + sstd::terp::var a; + a = sstd::terp::list(2); + a[0] = sstd::terp::hash(); + a[0]["k0"] = "v0"; + a[1] = &a[0]; + + auto itr0 = a[0].find("k0"); // TEST THIS LINE + ASSERT_TRUE( itr0!=a[0].end() ); + ASSERT_STREQ(itr0.first_to().c_str(), "k0"); + ASSERT_STREQ(itr0.second_to().c_str(), "v0"); + + auto itr1 = a[1].find("k0"); // TEST THIS LINE + ASSERT_TRUE( itr1!=a[1].end() ); + ASSERT_STREQ(itr1.first_to().c_str(), "k0"); + ASSERT_STREQ(itr1.second_to().c_str(), "v0"); + + auto itr2 = a[1].find("non-existing-key"); // TEST THIS LINE + ASSERT_FALSE( itr2!=a[1].end() ); +} // size() TEST(memory_terp, hash_size_arg_null){ diff --git a/tests_list_for_build_and_run.txt b/tests_list_for_build_and_run.txt index a8a61805..8d05fc5e 100644 --- a/tests_list_for_build_and_run.txt +++ b/tests_list_for_build_and_run.txt @@ -29,12 +29,12 @@ #../test/src_test/file/read_write.cpp #../test/src_test/file/rm.cpp #../test/src_test/file/tinyInterpreter.cpp -../test/src_test/file/yaml.cpp +#../test/src_test/file/yaml.cpp #../test/src_test/math/math.cpp #../test/src_test/math/signal.cpp #../test/src_test/math/hashFnc_of_MD5_SHA1_SHA2/hashSum.cpp #../test/src_test/math/hashFnc_of_MD5_SHA1_SHA2/sstd_md5_sha1_sha2_wrapper.cpp -#../test/src_test/memory/terp/terp.cpp +../test/src_test/memory/terp/terp.cpp #../test/src_test/memory/terp/terp_print.cpp #../test/src_test/memory/unique_void_ptr.cpp #../test/src_test/memory/void_ptr.cpp From 87eb91d2a0aa4e98cb4aa71481c9f5b5c55015fe Mon Sep 17 00:00:00 2001 From: admiswalker Date: Tue, 29 Apr 2025 00:37:41 +0900 Subject: [PATCH 24/47] add: TEST(memory_terp, var_ope_square_brackets_hash_REF_02) --- sstd/src/memory/terp/terp.cpp | 13 ++++++++----- test/src_test/memory/terp/terp.cpp | 13 ++++++++++++- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/sstd/src/memory/terp/terp.cpp b/sstd/src/memory/terp/terp.cpp index 49777539..27ef16ef 100644 --- a/sstd/src/memory/terp/terp.cpp +++ b/sstd/src/memory/terp/terp.cpp @@ -614,6 +614,7 @@ bool _is_equal_hash(const sstd::terp::var& lhs, const sstd::terp::var& rhs, sstd::printn_all(key); auto itr_rhs = rhs.find(key.c_str()); + sstd::printn_all("find done"); if(!(itr_rhs!=rhs.end())){ sstd::printn_all("ex");return false; } sstd::printn_all("m"); @@ -628,7 +629,6 @@ bool _is_equal(const sstd::terp::var& lhs, const sstd::terp::var& rhs, std::vector>& vStack_lhsP_and_rhsP, std::unordered_map& tbl_lhsAds_to_rhsAds ){ - sstd::printn_all(" in"); // Table. Parameter settings for the sstd::terp::var::equal(). // ┌────────────────────────────────┬───────────────────────────────────────────────┬──────────────┐ // │ │ Setting of the options (*1) │ │ @@ -681,7 +681,6 @@ bool _is_equal(const sstd::terp::var& lhs, const sstd::terp::var& rhs, default: { sstd::pdbg_err("ERROR\n"); } break; } - sstd::printn_all(" ex"); return false; } bool _check_internal_ref_graph(std::vector> vStack_lhsP_and_rhsP, @@ -729,10 +728,12 @@ bool sstd::terp::var::operator!=(const sstd::terp::var& rhs){ return !sstd::terp } \ return *this; #define _OPE_SUBSCRIPT_KEY_BASE(pKey) \ + void* local_p = (! this->_is_reference) ? _p : (void*)((sstd::terp::var*)_p)->_p; \ + \ switch(_type){ \ case sstd::num_hash_terp_var: { \ - sstd::terp::var** ppVal = &(_CAST2HASH(_p)[pKey]); \ - if(*ppVal==NULL){ (*ppVal)=new sstd::terp::var(_pSRCR_tbl); } \ + sstd::terp::var** ppVal = &(_CAST2HASH(local_p)[pKey]); \ + if(*ppVal==NULL){ (*ppVal)=new sstd::terp::var(_pSRCR_tbl); } \ return **ppVal; \ } break; \ case sstd::num_null: { \ @@ -746,9 +747,11 @@ bool sstd::terp::var::operator!=(const sstd::terp::var& rhs){ return !sstd::terp } \ return *this; #define _OPE_SUBSCRIPT_KEY_BASE_CONST(pKey) \ + void* local_p = (! this->_is_reference) ? _p : (void*)((sstd::terp::var*)_p)->_p; \ + \ switch(_type){ \ case sstd::num_hash_terp_var: { \ - sstd::terp::var** ppVal = &(_CAST2HASH(_p)[pKey]); \ + sstd::terp::var** ppVal = &(_CAST2HASH(local_p)[pKey]); \ if(*ppVal==NULL){ sstd::pdbg_err("Ope[](char*) is failed. NULL pointer detection error. pKey: `%s` is NOT allocated.\n", pKey); return *this; } \ return **ppVal; \ } break; \ diff --git a/test/src_test/memory/terp/terp.cpp b/test/src_test/memory/terp/terp.cpp index 88aa3cab..0fc6e773 100644 --- a/test/src_test/memory/terp/terp.cpp +++ b/test/src_test/memory/terp/terp.cpp @@ -1107,7 +1107,7 @@ TEST(memory_terp, var_ope_square_brackets_list__REF){ ASSERT_EQ(x.ope_sb_c(0).is_reference(), false); // TEST Ope[] const ASSERT_EQ(x.ope_sb_c(1).is_reference(), true); // TEST Ope[] const } -TEST(memory_terp, var_ope_square_brackets_hash_REF){ +TEST(memory_terp, var_ope_square_brackets_hash_REF_01){ sstd::terp::var x; x = sstd::terp::hash(); x["key1"] = "val1"; @@ -1130,6 +1130,17 @@ TEST(memory_terp, var_ope_square_brackets_hash_REF){ ASSERT_EQ(x.ope_sb_c("key1").is_reference(), false); // TEST Ope[] const ASSERT_EQ(x.ope_sb_c("key2").is_reference(), true); // TEST Ope[] const } +TEST(memory_terp, var_ope_square_brackets_hash_REF_02){ + sstd::terp::var x; + x = sstd::terp::list(2); + x[0] = sstd::terp::hash(); + x[0]["k"] = "v"; + x[1] = &x[0]; + + ASSERT_STREQ(x[1]["k"].to().c_str(), "v"); // TEST Ope[] + ASSERT_STREQ(x[1].ope_sb ("k").to().c_str(), "v"); // TEST Ope[] + ASSERT_STREQ(x[1].ope_sb_c("k").to().c_str(), "v"); // TEST Ope[] const +} //----------------------------------------------------------------------------------------------------------------------------------------------- // For the Reference Type (Copy) From a4d31a31d2fd6e41a9a5e862297ac5bd1558890a Mon Sep 17 00:00:00 2001 From: admiswalker Date: Tue, 29 Apr 2025 22:28:24 +0900 Subject: [PATCH 25/47] add: TEST(yaml, anchor_and_alias__case09_hash) --- sstd/src/file/yaml.cpp | 26 ++++++++++++- sstd/src/file/yaml.hpp | 4 +- sstd/src/memory/terp/terp.cpp | 21 +++++------ test/src_test/file/yaml.cpp | 64 +++++++++++++++++++++++++++----- tests_list_for_build_and_run.txt | 4 +- 5 files changed, 92 insertions(+), 27 deletions(-) diff --git a/sstd/src/file/yaml.cpp b/sstd/src/file/yaml.cpp index 862cbed1..08dc23ca 100644 --- a/sstd/src/file/yaml.cpp +++ b/sstd/src/file/yaml.cpp @@ -400,6 +400,9 @@ bool sstd_yaml::_token2cmd(std::vector& ret_vCmd, con c.type = sstd_yaml::type_str; c.format = t.format; c.val = t.val; // t.key; + // --- anchor and alias --- + c.ref_type = sstd_yaml::ref_type_null; + c.aa_val = ""; ret_vCmd.push_back(c); } } break; @@ -414,6 +417,14 @@ bool sstd_yaml::_token2cmd(std::vector& ret_vCmd, con c.type = sstd_yaml::type_hash; //c.format = t.format; c.val = t.key; // t.val; // key + // --- anchor and alias --- + if(t.ref_type==sstd_yaml::ref_type_anchor){ + c.ref_type = t.ref_type; + c.aa_val = t.aa_val; + }else if(t.ref_type==sstd_yaml::ref_type_alias){ + c.ref_type = t.ref_type; + c.aa_val = t.aa_val; + } ret_vCmd.push_back(c); if(t.hasValue){ // check the value is NOT NULL @@ -427,6 +438,9 @@ bool sstd_yaml::_token2cmd(std::vector& ret_vCmd, con c.type = sstd_yaml::type_str; c.format = t.format; c.val = t.val; // t.key; // value + // --- anchor and alias --- + c.ref_type = sstd_yaml::ref_type_null; + c.aa_val = ""; ret_vCmd.push_back(c); } } break; @@ -543,6 +557,9 @@ bool sstd_yaml::_token2cmd(std::vector& ret_vCmd, con // --- construct info --- c.ope = sstd_yaml::ope_stack; c.hsc = hsc_next; + // --- anchor and alias --- + c.ref_type = sstd_yaml::ref_type_null; + c.aa_val = ""; ret_vCmd.push_back(c); } @@ -588,7 +605,7 @@ void _split_aa_val_and_val(std::string& out_aa_val, std::string& out_val, const std::swap(out_aa_val, v_tmp[0]); std::swap(out_val, v_tmp[1]); }else{ - sstd::pdbg_err("Unexpected data size\n"); + sstd::pdbg_err("Unexpected data size\n"); } return; } @@ -1262,6 +1279,13 @@ bool _construct_var(sstd::terp::var& ret_yml, const std::vectorsecond; + } } break; default: { sstd::pdbg_err("Unexpected data type\n"); return false; } break; } diff --git a/sstd/src/file/yaml.hpp b/sstd/src/file/yaml.hpp index 2ca66ae9..9ced726e 100644 --- a/sstd/src/file/yaml.hpp +++ b/sstd/src/file/yaml.hpp @@ -35,8 +35,8 @@ namespace sstd_yaml{ const static uint8 format_flow_style = 1; // list [] or {} const static uint8 ref_type_null = 255; - const static uint8 ref_type_anchor = 0; - const static uint8 ref_type_alias = 1; + const static uint8 ref_type_anchor = 0; // & + const static uint8 ref_type_alias = 1; // * //--- // token for proceed YAML parsing diff --git a/sstd/src/memory/terp/terp.cpp b/sstd/src/memory/terp/terp.cpp index 27ef16ef..135cb7a8 100644 --- a/sstd/src/memory/terp/terp.cpp +++ b/sstd/src/memory/terp/terp.cpp @@ -607,21 +607,17 @@ bool _is_equal_hash(const sstd::terp::var& lhs, const sstd::terp::var& rhs, std::unordered_map& tbl_lhsAds_to_rhsAds ){ if(lhs.size()!=rhs.size()){ return false; } - sstd::printn_all("in"); for(auto itr=lhs.begin(); itr!=lhs.end(); ++itr){ std::string key = itr.first_to(); - sstd::printn_all(key); auto itr_rhs = rhs.find(key.c_str()); - sstd::printn_all("find done"); - if(!(itr_rhs!=rhs.end())){ sstd::printn_all("ex");return false; } + if(!(itr_rhs!=rhs.end())){ return false; } - sstd::printn_all("m"); //if(!_is_equal(itr.second(), itr_rhs.second(), check_ref_flag, ref_addr_graph, check_ref_abs_addr, vStack_lhsP_and_rhsP, tbl_lhsAds_to_rhsAds)){ return false; } // This is invalid implimentation. Because the "itr.second()" makes the new temporal object and the address of `pSRCR_tbl()` changed. - if(!_is_equal(lhs[key.c_str()], rhs[key.c_str()], check_ref_flag, ref_addr_graph, check_ref_abs_addr, vStack_lhsP_and_rhsP, tbl_lhsAds_to_rhsAds)){ sstd::printn_all("ex");return false; } + if(!_is_equal(lhs[key.c_str()], rhs[key.c_str()], check_ref_flag, ref_addr_graph, check_ref_abs_addr, vStack_lhsP_and_rhsP, tbl_lhsAds_to_rhsAds)){ return false; } } - sstd::printn_all("ex"); + return true; } bool _is_equal(const sstd::terp::var& lhs, const sstd::terp::var& rhs, @@ -651,6 +647,11 @@ bool _is_equal(const sstd::terp::var& lhs, const sstd::terp::var& rhs, // ref_flag: 'true' | 'false' // ref_addr_graph: 'true' | 'false' + if(lhs.type()!=rhs.type()){ return false; } + + if(ref_addr_graph){ + tbl_lhsAds_to_rhsAds[ (sstd::terp::var*)&lhs ] = (sstd::terp::var*)&rhs; + } if(check_ref_flag){ if(lhs.is_reference()!=rhs.is_reference()){ return false; } if(lhs.is_reference()){ @@ -661,17 +662,13 @@ bool _is_equal(const sstd::terp::var& lhs, const sstd::terp::var& rhs, if(is_internal_ref_lhs){ // If the reference is `internal` reference. vStack_lhsP_and_rhsP.push_back( std::make_tuple((sstd::terp::var*)&lhs, (sstd::terp::var*)&rhs) ); + return true; // Check the `vStack_lhsP_and_rhsP` later. (Just confirm the address consistency is enough.) }else{ // If the reference is `external` reference. if(lhs.p() != rhs.p()){ return false; } } } } - if(lhs.type()!=rhs.type()){ return false; } - - if(ref_addr_graph){ - tbl_lhsAds_to_rhsAds[ (sstd::terp::var*)&lhs ] = (sstd::terp::var*)&rhs; - } switch(lhs.typeNum()){ case sstd::num_str: { return lhs.to()==rhs.to(); } break; diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index 4b80c5ff..393efde4 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -4569,7 +4569,7 @@ TEST(yaml, anchor_and_alias__case07_list){ sstd::terp::var yml; bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE ASSERT_TRUE(ret); - sstd::printn_all(yml); +// sstd::printn_all(yml); //--- @@ -4580,10 +4580,10 @@ TEST(yaml, anchor_and_alias__case07_list){ ans[0][1] = "b"; ans[0][2] = "c"; ans[1] = &ans[0]; - sstd::printn_all(ans); +// sstd::printn_all(ans); ASSERT_TRUE(yml == ans); -}/* +} TEST(yaml, anchor_and_alias__case08_hash){ std::string s = R"( - &r {k: v} @@ -4592,7 +4592,7 @@ TEST(yaml, anchor_and_alias__case08_hash){ sstd::terp::var yml; bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE ASSERT_TRUE(ret); - sstd::printn_all(yml); +// sstd::printn_all(yml); //--- @@ -4601,18 +4601,62 @@ TEST(yaml, anchor_and_alias__case08_hash){ ans[0] = sstd::terp::hash(); ans[0]["k"] = "v"; ans[1] = &ans[0]; - sstd::printn_all(ans); +// sstd::printn_all(ans); ASSERT_TRUE(yml == ans); -}/* -TEST(yaml, anchor_and_alias__case06){ +} +TEST(yaml, anchor_and_alias__case09_hash){ std::string s = R"( -hh: &hh +h1: &h1 k1: v1 - k2: v2 +h2: *h1 )"; + sstd::terp::var yml; + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + ASSERT_TRUE(ret); +// sstd::printn_all(yml); + + //--- + + sstd::terp::var ans; + ans = sstd::terp::hash(); + ans["h1"] = sstd::terp::hash(); + ans["h1"]["k1"] = "v1"; + ans["h2"] = &ans["h1"]; +// sstd::printn_all(ans); + + ASSERT_TRUE(yml == ans); } -//*/ +/* +- &r + [a, b, c] +- *r +*/ +/* + std::string s = R"( +h1: + &h1 + k1: v1 +h2: *h1 +)"; +*/ +/* + std::string s = R"( +- h1: &h1 + k1: v1 + k2: v2 +- h2: *h1 +)"; +*/ +/* + std::string s = R"( +hx: &hx + k1: v1 +h2: + <<: *hx + k2: v2 +)"; +*/ //----------------------------------------------------------------------------------------------------------------------------------------------- EXECUTE_TESTS(); diff --git a/tests_list_for_build_and_run.txt b/tests_list_for_build_and_run.txt index 8d05fc5e..a8a61805 100644 --- a/tests_list_for_build_and_run.txt +++ b/tests_list_for_build_and_run.txt @@ -29,12 +29,12 @@ #../test/src_test/file/read_write.cpp #../test/src_test/file/rm.cpp #../test/src_test/file/tinyInterpreter.cpp -#../test/src_test/file/yaml.cpp +../test/src_test/file/yaml.cpp #../test/src_test/math/math.cpp #../test/src_test/math/signal.cpp #../test/src_test/math/hashFnc_of_MD5_SHA1_SHA2/hashSum.cpp #../test/src_test/math/hashFnc_of_MD5_SHA1_SHA2/sstd_md5_sha1_sha2_wrapper.cpp -../test/src_test/memory/terp/terp.cpp +#../test/src_test/memory/terp/terp.cpp #../test/src_test/memory/terp/terp_print.cpp #../test/src_test/memory/unique_void_ptr.cpp #../test/src_test/memory/void_ptr.cpp From 97ce7f12ffe05cb68a11d276b87efba2358fa1a5 Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sun, 11 May 2025 20:22:02 +0900 Subject: [PATCH 26/47] add: TEST(yaml, anchor_and_alias__case09b_hash) --- sstd/src/file/yaml.cpp | 18 +++-- test/src_test/file/yaml.cpp | 134 ++++++++++++++++++++++++++++++++++++ 2 files changed, 148 insertions(+), 4 deletions(-) diff --git a/sstd/src/file/yaml.cpp b/sstd/src/file/yaml.cpp index 08dc23ca..6af8d2c4 100644 --- a/sstd/src/file/yaml.cpp +++ b/sstd/src/file/yaml.cpp @@ -898,7 +898,7 @@ bool sstd_yaml::_token2token_merge_multilines(std::vector& io) sstd_yaml::token tmp = (*pT); // Check criteria values (Defining criteria value as a base token like list, hash or list_and_hash type to merge) - bool start_with_string = (*pT).val.size()>=1 && (*pT).ref_type==sstd_yaml::ref_type_null; + bool start_with_string = (*pT).val.size()>=1; uint criteria_hsc = _get_criteria_hsc((*pT)); // criteria_hsc: criteria head space count for(uint merge_cnt=1;; ++merge_cnt){ @@ -935,6 +935,15 @@ bool sstd_yaml::_token2token_merge_multilines(std::vector& io) tmp.val += '\n' + (*pT).rawStr; // Needs to copy as row string in order to treat multi-line string as a raw data. Ex1: "k:\n x\n - a" is interpreted as `{k: "x - a"}`. Ex2: "k: |\n x # comment" is interpreted as `{k: "x # comment"}`. tmp.line_num_end = (*pT).line_num_end; tmp.mult_line_val = true; + + if( (*pT).ref_type!=sstd_yaml::ref_type_null ){ + if(tmp.ref_type!=sstd_yaml::ref_type_null){ sstd::pdbg_err("The Duplicated anchor (&) definition.\n"); return false; } + + tmp.ref_type = (*pT).ref_type; + tmp.aa_val = (*pT).aa_val; + ++i; + break; + } } ret.push_back(std::move(tmp)); @@ -1027,7 +1036,9 @@ bool sstd_yaml::_str2token(std::vector& ret, const char* str_i std::string str = std::regex_replace(str_in, std::regex("\r"), ""); // "\r\n" -> "\n" if(!sstd_yaml::_str2token_except_multilines(ret, str.c_str())){ sstd::pdbg_err("sstd_yaml::_str2token_except_multilines() was failed.\n"); return false; } + sstd::printn_all(ret); if(!sstd_yaml::_token2token_merge_multilines(ret)){ sstd::pdbg_err("sstd_yaml::_token2token_merge_multilines() was failed.\n"); return false; } + sstd::printn_all(ret); if(!sstd_yaml::_token2token_split_bv_list_type_cnt(ret)){ sstd::pdbg_err("sstd_yaml::_token2token_split_bv_list_type_cnt() was failed.\n"); return false; } if(!sstd_yaml::_token2token_postprocess(ret)){ sstd::pdbg_err("sstd_yaml::_token2token_postprocess() was failed.\n"); return false; } return true; @@ -1304,7 +1315,7 @@ bool _yaml_load_base(sstd::terp::var& ret_yml, const std::vector v_cmd; if(!sstd_yaml::_token2cmd(v_cmd, v_token)){ return false; } -// sstd::printn_all(v_cmd); + sstd::printn_all(v_cmd); if(!_construct_var(ret_yml, v_cmd)){ return false; } @@ -1314,10 +1325,9 @@ bool sstd::yaml_load(sstd::terp::var& ret_yml, const char* s){ std::vector v_token; if(!sstd_yaml::_str2token(v_token, s)){ sstd::pdbg_err("single or double quatation is not closed\n"); return false; } // v: vector, ls: line string -// sstd::printn_all(v_token); if(!_yaml_load_base(ret_yml, v_token)){ sstd::pdbg_err("_yaml_load_base() is failed.\n"); return false; } -// sstd::printn_all(ret_yml); + sstd::printn_all(ret_yml); return true; } diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index 393efde4..5f54e61c 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -4627,6 +4627,140 @@ h2: *h1 ASSERT_TRUE(yml == ans); } +TEST(yaml, anchor_and_alias__case09b_hash){ + std::string s = R"( +h1: + &h1 + k1: v1 +h2: *h1 +)"; + sstd::terp::var yml; + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + ASSERT_TRUE(ret); +// sstd::printn_all(yml); + + //--- + + sstd::terp::var ans; + ans = sstd::terp::hash(); + ans["h1"] = sstd::terp::hash(); + ans["h1"]["k1"] = "v1"; + ans["h2"] = &ans["h1"]; +// sstd::printn_all(ans); + + ASSERT_TRUE(yml == ans); +} +/* +TEST(yaml, anchor_and_alias__case09c_hash){ + std::string s = R"( +h1: + + &h1 + + k1: v1 +h2: *h1 +)"; + sstd::terp::var yml; + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + ASSERT_TRUE(ret); +// sstd::printn_all(yml); + + //--- + + sstd::terp::var ans; + ans = sstd::terp::hash(); + ans["h1"] = sstd::terp::hash(); + ans["h1"]["k1"] = "v1"; + ans["h2"] = &ans["h1"]; +// sstd::printn_all(ans); + + ASSERT_TRUE(yml == ans); +} +*/ +/* +TEST(yaml, anchor_and_alias__case09d_hash){ + std::string s = R"( +h1: &h1 + k1: v1 +h2: + *h1 +)"; + sstd::terp::var yml; + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + ASSERT_TRUE(ret); +// sstd::printn_all(yml); + + //--- + + sstd::terp::var ans; + ans = sstd::terp::hash(); + ans["h1"] = sstd::terp::hash(); + ans["h1"]["k1"] = "v1"; + ans["h2"] = &ans["h1"]; +// sstd::printn_all(ans); + + ASSERT_TRUE(yml == ans); +} +*/ +TEST(yaml, anchor_and_alias__case09error01_hash){ + std::string s = R"( +h1: &h1 + &h2 + k1: v1 +h2: *h2 +)"; + sstd::terp::var yml; + + testing::internal::CaptureStdout(); + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + std::string err_msg = testing::internal::GetCapturedStdout(); + ASSERT_TRUE(sstd::strIn("The Duplicated anchor (&) definition.", err_msg)); + + ASSERT_FALSE(ret); +}/* +TEST(yaml, anchor_and_alias__case09error02_hash){ + std::string s = R"( +h1: + &h2 + &h3 + k1: v1 +h2: *h2 +)"; + sstd::terp::var yml; + + testing::internal::CaptureStdout(); + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + std::string err_msg = testing::internal::GetCapturedStdout(); + ASSERT_TRUE(sstd::strIn("The Duplicated anchor (&) definition.", err_msg)); + + ASSERT_FALSE(ret); +}*/ +/* +TEST(yaml, anchor_and_alias__case09error02_hash){ + std::string s = R"( +h1: &h1 + &h2 + &h3 + k1: v1 +h2: *h2 +)"; + sstd::terp::var yml; + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + ASSERT_TRUE(ret); +// sstd::printn_all(yml); + + //--- + + sstd::terp::var ans; + ans = sstd::terp::hash(); + ans["h1"] = sstd::terp::hash(); + ans["h1"]["k1"] = "v1"; + ans["h2"] = &ans["h1"]; +// sstd::printn_all(ans); + + ASSERT_TRUE(yml == ans); +} +*/ /* - &r [a, b, c] From 1abf7a98dfd749767fd50b82ceaa10f0a8a5782d Mon Sep 17 00:00:00 2001 From: admiswalker Date: Mon, 26 May 2025 22:40:06 +0900 Subject: [PATCH 27/47] wip --- sstd/src/file/yaml.cpp | 38 ++++++++++++++-- test/src_test/file/yaml.cpp | 87 +++++++++++++++++++++++++++++-------- 2 files changed, 103 insertions(+), 22 deletions(-) diff --git a/sstd/src/file/yaml.cpp b/sstd/src/file/yaml.cpp index 6af8d2c4..b4fe9af1 100644 --- a/sstd/src/file/yaml.cpp +++ b/sstd/src/file/yaml.cpp @@ -908,7 +908,7 @@ bool sstd_yaml::_token2token_merge_multilines(std::vector& io) pT = &io[i]; bool is_control_types = _is_control_types((*pT).type); - + // Check break uint curr_hsc = _get_current_hsc((*pT)); // curr_hsc: current head space count if( merge_cnt==1 && is_control_types && (!start_with_string||(curr_hsc<=criteria_hsc)) ){ break; } @@ -927,15 +927,37 @@ bool sstd_yaml::_token2token_merge_multilines(std::vector& io) // - `(*pT).key.size()!=0||(*pT).val.size()!=0`: The line is NOT Empty. (If the line is empty, the parser needs to treat as a line break of multi-line string). // - `curr_hsc<=criteria_hsc`: The line is out of scope. if( start_with_string && (((*pT).key.size()!=0||(*pT).val.size()!=0||(*pT).key_is_dqed||(*pT).key_is_sqed||(*pT).val_is_dqed||(*pT).val_is_sqed) && curr_hsc<=criteria_hsc) ){ break; } - +/* sstd::printn_all((*pT).rawStr); + sstd::printn_all((*pT).key); + sstd::printn_all((*pT).val); + sstd::printn_all(start_with_string); + sstd::printn_all((*pT).key.size()!=0); + sstd::printn_all((*pT).val.size()!=0); + sstd::printn_all((*pT).key_is_dqed); + sstd::printn_all((*pT).key_is_sqed); + sstd::printn_all((*pT).val_is_dqed); + sstd::printn_all((*pT).val_is_sqed); + sstd::printn_all(curr_hsc<=criteria_hsc); + sstd::printn_all(""); +*/ +// // if( start_with_string && (((*pT).key.size()!=0||(*pT).val.size()!=0||(*pT).key_is_dqed||(*pT).key_is_sqed||(*pT).val_is_dqed||(*pT).val_is_sqed) && curr_hsc<=criteria_hsc) ){ break; } +// if( start_with_string && +// (((*pT).key.size()!=0||(*pT).val.size()!=0||(*pT).key_is_dqed||(*pT).key_is_sqed||(*pT).val_is_dqed||(*pT).val_is_sqed) && +// curr_hsc<=criteria_hsc) ){ break; } + if( start_with_string && (*pT).type==sstd_yaml::type_hash){ break; } + if( _is_separator((*pT).rawStr) ){ break; } +// if( !start_with_string ){ break; } // Copy values tmp.rawStr += '\n' + (*pT).rawStr; tmp.val += '\n' + (*pT).rawStr; // Needs to copy as row string in order to treat multi-line string as a raw data. Ex1: "k:\n x\n - a" is interpreted as `{k: "x - a"}`. Ex2: "k: |\n x # comment" is interpreted as `{k: "x # comment"}`. tmp.line_num_end = (*pT).line_num_end; tmp.mult_line_val = true; - + +// if((*pT).type!=sstd_yaml::type_str){ break; } +// if(){} + /* if( (*pT).ref_type!=sstd_yaml::ref_type_null ){ if(tmp.ref_type!=sstd_yaml::ref_type_null){ sstd::pdbg_err("The Duplicated anchor (&) definition.\n"); return false; } @@ -944,6 +966,16 @@ bool sstd_yaml::_token2token_merge_multilines(std::vector& io) ++i; break; } + */ + } + + if(tmp.val.size()!=0){ + std::string s_val = sstd::stripAll(tmp.val, " \n"); // sstd::lstripAll(tmp.val, " \n"); + if(s_val.starts_with('&')){ + tmp.ref_type = sstd_yaml::ref_type_anchor; + tmp.aa_val = sstd::stripAll(tmp.val, "& \n"); + tmp.val.clear(); + } } ret.push_back(std::move(tmp)); diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index 5f54e61c..cb4614a4 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -4650,7 +4650,22 @@ h2: *h1 ASSERT_TRUE(yml == ans); } -/* +TEST(yaml, anchor_and_alias__case09error01_hash){ + std::string s = R"( +h1: &h1 + &h2 + k1: v1 +h2: *h2 +)"; + sstd::terp::var yml; + + testing::internal::CaptureStdout(); + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + std::string err_msg = testing::internal::GetCapturedStdout(); + ASSERT_TRUE(sstd::strIn("The Duplicated anchor (&) definition.", err_msg)); + + ASSERT_FALSE(ret); +} TEST(yaml, anchor_and_alias__case09c_hash){ std::string s = R"( h1: @@ -4675,8 +4690,34 @@ h2: *h1 // sstd::printn_all(ans); ASSERT_TRUE(yml == ans); -} -*/ +}/* +TEST(yaml, anchor_and_alias__case09c_hash__aaa){ + std::string s = R"( +h1: + + a + + b + + c + +)"; + sstd::terp::var yml; + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + ASSERT_TRUE(ret); + sstd::printn_all(yml); + + //--- + + sstd::terp::var ans; + ans = sstd::terp::hash(); + ans["h1"] = sstd::terp::hash(); + ans["h1"]["k1"] = "v1"; + ans["h2"] = &ans["h1"]; +// sstd::printn_all(ans); + + ASSERT_TRUE(yml == ans); +}*/ /* TEST(yaml, anchor_and_alias__case09d_hash){ std::string s = R"( @@ -4702,22 +4743,7 @@ h1: &h1 ASSERT_TRUE(yml == ans); } */ -TEST(yaml, anchor_and_alias__case09error01_hash){ - std::string s = R"( -h1: &h1 - &h2 - k1: v1 -h2: *h2 -)"; - sstd::terp::var yml; - - testing::internal::CaptureStdout(); - bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE - std::string err_msg = testing::internal::GetCapturedStdout(); - ASSERT_TRUE(sstd::strIn("The Duplicated anchor (&) definition.", err_msg)); - - ASSERT_FALSE(ret); -}/* +/* TEST(yaml, anchor_and_alias__case09error02_hash){ std::string s = R"( h1: @@ -4762,6 +4788,29 @@ h2: *h2 } */ /* +TEST(yaml, hash__conor_cases){ + std::string s = R"( +h1: + + k1: v1 +)"; + sstd::terp::var yml; + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + ASSERT_TRUE(ret); + sstd::printn_all(yml); + + //--- + + sstd::terp::var ans; + ans = sstd::terp::hash(); + ans["h1"] = sstd::terp::hash(); + ans["h1"]["k1"] = "v1"; + sstd::printn_all(ans); + + ASSERT_TRUE(yml == ans); +} +*/ +/* - &r [a, b, c] - *r From a66ba6e78b5ea28773bca51009f3e8ae6d622e7c Mon Sep 17 00:00:00 2001 From: admiswalker Date: Mon, 9 Jun 2025 23:42:45 +0900 Subject: [PATCH 28/47] WIP: add: TEST(strEdit, splitAll_CC) --- sstd/src/string/strEdit.cpp | 22 ++++++++++++++++++++++ sstd/src/string/strEdit.hpp | 5 +++++ test/src_test/string/strEdit.cpp | 16 +++++++++++++++- tests_list_for_build_and_run.txt | 4 ++-- 4 files changed, 44 insertions(+), 3 deletions(-) diff --git a/sstd/src/string/strEdit.cpp b/sstd/src/string/strEdit.cpp index 75421013..068ae3b5 100755 --- a/sstd/src/string/strEdit.cpp +++ b/sstd/src/string/strEdit.cpp @@ -193,6 +193,28 @@ std::vector sstd::split(const std::string& str, const std::string& //--- +std::vector _split_all_base(const char* str, const uint str_len, const char* X, const uint X_len){ + if(str_len<=1){ return std::vector({str}); } + if(X_len ==0){ return std::vector({str}); } + + std::vector splitList; + std::string buf; + for(uint i=0; str[i]!='\0'; ++i){ + if(sstd::charIn(str[i], X)){ + splitList.push_back(buf); + buf.clear(); + }else{ + buf += str[i]; + } + } + if(buf.size()!=0){ splitList.push_back(buf); } + return splitList; +} +std::vector sstd::splitAll(const char* str, const char* X){ return _split_all_base(str, ::strlen(str), X, ::strlen(X)); } +//std::vector sstd::splitAll(const std::string& str, const std::string& X){} + +//--- + std::vector sstd::split_rmSpace(const char* str ){ return _asAX_rmSpace(str, ' ', -1); } std::vector sstd::split_rmSpace(const std::string& str ){ return _asAX_rmSpace(str.c_str(), ' ', -1); } std::vector sstd::split_rmSpace(const char* str, const char X){ return _asAX_rmSpace(str , X , -1); } diff --git a/sstd/src/string/strEdit.hpp b/sstd/src/string/strEdit.hpp index 099d6688..21672d1b 100755 --- a/sstd/src/string/strEdit.hpp +++ b/sstd/src/string/strEdit.hpp @@ -32,6 +32,11 @@ namespace sstd{ // std::vector split(const char* str, const char* X, int maxsplit); // TODO // std::vector split(const std::string& str, const std::string& X, int maxsplit); // TODO + std::vector splitAll (const char* str, const char* X); + std::vector splitAll (const std::string& str, const std::string& X); +// std::vector splitAll_tight(const char* str, const char* X); +// std::vector splitAll_tight(const std::string& str, const std::string& X); + std::vector split_rmSpace(const char* str); // rm: remove std::vector split_rmSpace(const std::string& str); // rm: remove std::vector split_rmSpace(const char* str, const char X); // rm: remove diff --git a/test/src_test/string/strEdit.cpp b/test/src_test/string/strEdit.cpp index 99c1c5ae..705f1c50 100644 --- a/test/src_test/string/strEdit.cpp +++ b/test/src_test/string/strEdit.cpp @@ -157,7 +157,6 @@ TEST(strEdit, extract_unquoted__false){ } //----------------------------------------------------------------------------------------------------------------------------------------------- - //splitByLine //TEST(strEdit, splitByLine){} @@ -186,6 +185,7 @@ R"()"}) ); } //----------------------------------------------------------------------------------------------------------------------------------------------- +// sstd::split(), sstd::splitAll(), sstd::split_rmSpace() #define TEST_SPLIT_CS(S_IN, ...) \ std::vector ret_v = sstd::split(S_IN); /* TEST THIS LINE */ \ @@ -249,6 +249,20 @@ TEST(strEdit, split_s_s){ TEST_SPLIT_SS_X(std::string("abc"), std::string("123ab #undef TEST_SPLIT_SS_X //--- +// sstd::splitAll() + +#define TEST_SPLIT_ALL(X_IN, S_IN, ...) \ + std::vector ret_v = sstd::splitAll(S_IN, X_IN); /* TEST THIS LINE */ \ + /* sstd::printn(ret_v); */ \ + ASSERT_TRUE(ret_v == std::vector({__VA_ARGS__}) ); + +TEST(strEdit, splitAll_CC){ TEST_SPLIT_ALL(" ,\n", " a b, c", "", "a", "", "b", "", "c"); } +//TEST(strEdit, splitAll_CS){ TEST_SPLIT_ALL(" ,\n", std::string(" a b, c"), "a", "b,", "c"); } + +#undef TEST_SPLITALL_CS + +//--- +// sstd::split_rmSpace() #define TEST_SPLIT_RMSPACE_CS(S_IN, ...) \ std::vector ret_v = sstd::split_rmSpace(S_IN); /* TEST THIS LINE */ \ diff --git a/tests_list_for_build_and_run.txt b/tests_list_for_build_and_run.txt index a8a61805..512f474a 100644 --- a/tests_list_for_build_and_run.txt +++ b/tests_list_for_build_and_run.txt @@ -29,7 +29,7 @@ #../test/src_test/file/read_write.cpp #../test/src_test/file/rm.cpp #../test/src_test/file/tinyInterpreter.cpp -../test/src_test/file/yaml.cpp +#../test/src_test/file/yaml.cpp #../test/src_test/math/math.cpp #../test/src_test/math/signal.cpp #../test/src_test/math/hashFnc_of_MD5_SHA1_SHA2/hashSum.cpp @@ -42,7 +42,7 @@ #../test/src_test/print/print_printn_printn_all.cpp #../test/src_test/python/c2py.cpp #../test/src_test/string/encode_decode.cpp -#../test/src_test/string/strEdit.cpp +../test/src_test/string/strEdit.cpp #../test/src_test/string/strmatch.cpp #../test/src_test/string/utf8.cpp #../test/src_test/sys/status.cpp From 39eb64e87929a38ef33800ba7bec59ee4c547f30 Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sat, 14 Jun 2025 16:23:30 +0900 Subject: [PATCH 29/47] Bug fix (breaking change): sstd::split(c/s), sstd::split(c/s,c/s). Add: sstd::splitAll() --- sstd/src/string/strEdit.cpp | 22 +++++++++++----------- sstd/src/string/strEdit.hpp | 2 ++ test/src_test/string/strEdit.cpp | 16 +++++++++++++--- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/sstd/src/string/strEdit.cpp b/sstd/src/string/strEdit.cpp index 068ae3b5..3a958ed3 100755 --- a/sstd/src/string/strEdit.cpp +++ b/sstd/src/string/strEdit.cpp @@ -168,9 +168,8 @@ std::vector sstd::split(const char* str, const char X){ retu std::vector sstd::split(const std::string& str, const char X){ return _asAX(str.c_str(), X ); } std::vector _split_ss_base(const char* str, const uint str_len, const char* X, const uint X_len){ - if(str_len<=1){ return std::vector({str}); } - if(X_len ==0){ return std::vector({str}); } - if(X_len ==1){ return sstd::split(str, X[0]); } + if(X_len==0){ return std::vector({str}); } + if(X_len==1){ return sstd::split(str, X[0]); } std::vector splitList; std::string buf; @@ -194,24 +193,25 @@ std::vector sstd::split(const std::string& str, const std::string& //--- std::vector _split_all_base(const char* str, const uint str_len, const char* X, const uint X_len){ - if(str_len<=1){ return std::vector({str}); } - if(X_len ==0){ return std::vector({str}); } + if(X_len==0){ return std::vector({str}); } std::vector splitList; std::string buf; for(uint i=0; str[i]!='\0'; ++i){ - if(sstd::charIn(str[i], X)){ + if(!sstd::charIn(str[i], X)){ + buf += str[i]; + }else{ splitList.push_back(buf); buf.clear(); - }else{ - buf += str[i]; } } - if(buf.size()!=0){ splitList.push_back(buf); } + if((str_len>=1 && sstd::charIn(str[str_len-1], X)) || buf.size()!=0){ splitList.push_back(buf); } return splitList; } -std::vector sstd::splitAll(const char* str, const char* X){ return _split_all_base(str, ::strlen(str), X, ::strlen(X)); } -//std::vector sstd::splitAll(const std::string& str, const std::string& X){} +std::vector sstd::splitAll(const char* str, const char* X){ return _split_all_base(str, ::strlen(str), X, ::strlen(X)); } +std::vector sstd::splitAll(const std::string& str, const char* X){ return _split_all_base(str.c_str(), str.size(), X, ::strlen(X)); } +std::vector sstd::splitAll(const char* str, const std::string& X){ return _split_all_base(str, ::strlen(str), X.c_str(), X.size()); } +std::vector sstd::splitAll(const std::string& str, const std::string& X){ return _split_all_base(str.c_str(), str.size(), X.c_str(), X.size()); } //--- diff --git a/sstd/src/string/strEdit.hpp b/sstd/src/string/strEdit.hpp index 21672d1b..92db6ebf 100755 --- a/sstd/src/string/strEdit.hpp +++ b/sstd/src/string/strEdit.hpp @@ -33,6 +33,8 @@ namespace sstd{ // std::vector split(const std::string& str, const std::string& X, int maxsplit); // TODO std::vector splitAll (const char* str, const char* X); + std::vector splitAll (const std::string& str, const char* X); + std::vector splitAll (const char* str, const std::string& X); std::vector splitAll (const std::string& str, const std::string& X); // std::vector splitAll_tight(const char* str, const char* X); // std::vector splitAll_tight(const std::string& str, const std::string& X); diff --git a/test/src_test/string/strEdit.cpp b/test/src_test/string/strEdit.cpp index 705f1c50..1a041da2 100644 --- a/test/src_test/string/strEdit.cpp +++ b/test/src_test/string/strEdit.cpp @@ -195,6 +195,8 @@ R"()"}) ); TEST(strEdit, split_c_0){ TEST_SPLIT_CS(" a b, c", "a", "b,", "c"); } TEST(strEdit, split_c_1){ TEST_SPLIT_CS(" a b, c ", "a", "b,", "c"); } TEST(strEdit, split_c_2){ TEST_SPLIT_CS(" a b, c ", "a", "b,", "c"); } +TEST(strEdit, split_c_3){ TEST_SPLIT_CS(" "); } +TEST(strEdit, split_c_4){ TEST_SPLIT_CS(" "); } TEST(strEdit, split_s){ TEST_SPLIT_CS(std::string(" a b, c"), "a", "b,", "c"); } #undef TEST_SPLIT_CS @@ -243,6 +245,7 @@ TEST(strEdit, split_s_s_space_m_0){ TEST_SPLIT_SS_X("xxx", "123abcabs456", "123a TEST(strEdit, split_s_s_space_m_1){ TEST_SPLIT_SS_X("abc", "123abcabs456", "123", "abs456"); } TEST(strEdit, split_s_s_space_m_2a){ TEST_SPLIT_SS_X("abc", "123abc456abc789", "123", "456", "789"); } TEST(strEdit, split_s_s_space_m_2b){ TEST_SPLIT_SS_X("abc", "123abc456abc789abc", "123", "456", "789", ""); } +TEST(strEdit, split_s_s_space_m_3){ TEST_SPLIT_SS_X(" ", " ", "", ""); } TEST(strEdit, split_s_s){ TEST_SPLIT_SS_X(std::string("abc"), std::string("123abc456abc789"), std::string("123"), std::string("456"), std::string("789")); } @@ -253,11 +256,18 @@ TEST(strEdit, split_s_s){ TEST_SPLIT_SS_X(std::string("abc"), std::string("123ab #define TEST_SPLIT_ALL(X_IN, S_IN, ...) \ std::vector ret_v = sstd::splitAll(S_IN, X_IN); /* TEST THIS LINE */ \ - /* sstd::printn(ret_v); */ \ + sstd::printn(ret_v); \ ASSERT_TRUE(ret_v == std::vector({__VA_ARGS__}) ); -TEST(strEdit, splitAll_CC){ TEST_SPLIT_ALL(" ,\n", " a b, c", "", "a", "", "b", "", "c"); } -//TEST(strEdit, splitAll_CS){ TEST_SPLIT_ALL(" ,\n", std::string(" a b, c"), "a", "b,", "c"); } +TEST(strEdit, splitAll_CC_interface_test){ TEST_SPLIT_ALL( " ,\n", " a b, c", "", "a", "", "b", "", "c"); } +TEST(strEdit, splitAll_SC_interface_test){ TEST_SPLIT_ALL(std::string(" ,\n"), " a b, c" , "", "a", "", "b", "", "c"); } +TEST(strEdit, splitAll_CS_interface_test){ TEST_SPLIT_ALL( " ,\n" , std::string(" a b, c"), "", "a", "", "b", "", "c"); } +TEST(strEdit, splitAll_SS_interface_test){ TEST_SPLIT_ALL(std::string(" ,\n"), std::string(" a b, c"), "", "a", "", "b", "", "c"); } + +TEST(strEdit, splitAll_01){ TEST_SPLIT_ALL("", " ", " "); } +TEST(strEdit, splitAll_02){ TEST_SPLIT_ALL("", "", ""); } +TEST(strEdit, splitAll_03){ TEST_SPLIT_ALL(" ", " ", "", ""); } +TEST(strEdit, splitAll_04){ TEST_SPLIT_ALL(" \n", "&h abc\n def\n &x", "&h", "abc", "", "def", "", "&x"); } #undef TEST_SPLITALL_CS From 442551db22820e765bd05a44c0136419627ba44b Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sat, 14 Jun 2025 18:29:32 +0900 Subject: [PATCH 30/47] wip --- sstd/src/string/strEdit.cpp | 31 +++++++++++++++++++++++++++++++ sstd/src/string/strEdit.hpp | 6 ++++-- test/src_test/string/strEdit.cpp | 22 +++++++++++++++++++++- 3 files changed, 56 insertions(+), 3 deletions(-) diff --git a/sstd/src/string/strEdit.cpp b/sstd/src/string/strEdit.cpp index 3a958ed3..991297d0 100755 --- a/sstd/src/string/strEdit.cpp +++ b/sstd/src/string/strEdit.cpp @@ -215,6 +215,37 @@ std::vector sstd::splitAll(const std::string& str, const std::strin //--- +std::vector _split_all_tight_base(const char* str, const uint str_len, const char* X, const uint X_len){ + if(X_len==0){ return std::vector({str}); } + + std::vector splitList; + std::string buf; + bool is_separator=false; + for(uint i=0;;){ + for(; str[i]!='\0' && sstd::charIn(str[i], X);){ is_separator=true; ++i; } // skip separator + if(str[i]=='\0'){ break; } + + if(is_separator){ + if(buf.size()!=0){ + splitList.push_back(buf); + buf.clear(); + } + }else{ + buf += str[i]; ++i; + } + + is_separator=false; + } + if(buf.size()!=0){ splitList.push_back(buf); } + return splitList; +} +std::vector sstd::splitAll_tight(const char* str, const char* X){ return _split_all_tight_base(str, ::strlen(str), X, ::strlen(X)); } +std::vector sstd::splitAll_tight(const std::string& str, const char* X){ return _split_all_tight_base(str.c_str(), str.size(), X, ::strlen(X)); } +std::vector sstd::splitAll_tight(const char* str, const std::string& X){ return _split_all_tight_base(str, ::strlen(str), X.c_str(), X.size()); } +std::vector sstd::splitAll_tight(const std::string& str, const std::string& X){ return _split_all_tight_base(str.c_str(), str.size(), X.c_str(), X.size()); } + +//--- + std::vector sstd::split_rmSpace(const char* str ){ return _asAX_rmSpace(str, ' ', -1); } std::vector sstd::split_rmSpace(const std::string& str ){ return _asAX_rmSpace(str.c_str(), ' ', -1); } std::vector sstd::split_rmSpace(const char* str, const char X){ return _asAX_rmSpace(str , X , -1); } diff --git a/sstd/src/string/strEdit.hpp b/sstd/src/string/strEdit.hpp index 92db6ebf..665b155c 100755 --- a/sstd/src/string/strEdit.hpp +++ b/sstd/src/string/strEdit.hpp @@ -36,8 +36,10 @@ namespace sstd{ std::vector splitAll (const std::string& str, const char* X); std::vector splitAll (const char* str, const std::string& X); std::vector splitAll (const std::string& str, const std::string& X); -// std::vector splitAll_tight(const char* str, const char* X); -// std::vector splitAll_tight(const std::string& str, const std::string& X); + std::vector splitAll_tight(const char* str, const char* X); + std::vector splitAll_tight(const std::string& str, const char* X); + std::vector splitAll_tight(const char* str, const std::string& X); + std::vector splitAll_tight(const std::string& str, const std::string& X); std::vector split_rmSpace(const char* str); // rm: remove std::vector split_rmSpace(const std::string& str); // rm: remove diff --git a/test/src_test/string/strEdit.cpp b/test/src_test/string/strEdit.cpp index 1a041da2..75d996f0 100644 --- a/test/src_test/string/strEdit.cpp +++ b/test/src_test/string/strEdit.cpp @@ -256,7 +256,7 @@ TEST(strEdit, split_s_s){ TEST_SPLIT_SS_X(std::string("abc"), std::string("123ab #define TEST_SPLIT_ALL(X_IN, S_IN, ...) \ std::vector ret_v = sstd::splitAll(S_IN, X_IN); /* TEST THIS LINE */ \ - sstd::printn(ret_v); \ + /* sstd::printn(ret_v); */ \ ASSERT_TRUE(ret_v == std::vector({__VA_ARGS__}) ); TEST(strEdit, splitAll_CC_interface_test){ TEST_SPLIT_ALL( " ,\n", " a b, c", "", "a", "", "b", "", "c"); } @@ -271,6 +271,26 @@ TEST(strEdit, splitAll_04){ TEST_SPLIT_ALL(" \n", "&h abc\n def\n &x", "&h", "ab #undef TEST_SPLITALL_CS +//--- +// sstd::splitAll_tight() + +#define TEST_SPLIT_ALL_TIGHT(X_IN, S_IN, ...) \ + std::vector ret_v = sstd::splitAll_tight(S_IN, X_IN); /* TEST THIS LINE */ \ + sstd::printn(ret_v); \ + ASSERT_TRUE(ret_v == std::vector({__VA_ARGS__}) ); + +TEST(strEdit, splitAll_tight_CC_interface_test){ TEST_SPLIT_ALL_TIGHT( " ,\n", " a b, c", "a", "b", "c"); } +TEST(strEdit, splitAll_tight_SC_interface_test){ TEST_SPLIT_ALL_TIGHT(std::string(" ,\n"), " a b, c" , "a", "b", "c"); } +TEST(strEdit, splitAll_tight_CS_interface_test){ TEST_SPLIT_ALL_TIGHT( " ,\n" , std::string(" a b, c"), "a", "b", "c"); } +TEST(strEdit, splitAll_tight_SS_interface_test){ TEST_SPLIT_ALL_TIGHT(std::string(" ,\n"), std::string(" a b, c"), "a", "b", "c"); } + +TEST(strEdit, splitAll_tight_01){ TEST_SPLIT_ALL_TIGHT("", " ", " "); } +TEST(strEdit, splitAll_tight_02){ TEST_SPLIT_ALL_TIGHT("", "", ""); } +TEST(strEdit, splitAll_tight_03){ TEST_SPLIT_ALL_TIGHT(" ", " "); } +TEST(strEdit, splitAll_tight_04){ TEST_SPLIT_ALL_TIGHT(" \n", "&h abc\n def\n &x", "&h", "abc", "def", "&x"); } + +#undef TEST_SPLITALL_CS + //--- // sstd::split_rmSpace() From a861179480b82501204b857568dc8ca5e129b5eb Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sat, 14 Jun 2025 18:38:15 +0900 Subject: [PATCH 31/47] add: sstd::splitAll_tight(c/s,c/s) --- sstd/src/string/strEdit.cpp | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/sstd/src/string/strEdit.cpp b/sstd/src/string/strEdit.cpp index 991297d0..9cee7f95 100755 --- a/sstd/src/string/strEdit.cpp +++ b/sstd/src/string/strEdit.cpp @@ -220,21 +220,13 @@ std::vector _split_all_tight_base(const char* str, const uint str_l std::vector splitList; std::string buf; - bool is_separator=false; - for(uint i=0;;){ - for(; str[i]!='\0' && sstd::charIn(str[i], X);){ is_separator=true; ++i; } // skip separator - if(str[i]=='\0'){ break; } - - if(is_separator){ - if(buf.size()!=0){ - splitList.push_back(buf); - buf.clear(); - } - }else{ - buf += str[i]; ++i; + for(uint i=0; str[i]!='\0'; ++i){ + if(!sstd::charIn(str[i], X)){ + buf += str[i]; + }else if(buf.size()!=0){ + splitList.push_back(buf); + buf.clear(); } - - is_separator=false; } if(buf.size()!=0){ splitList.push_back(buf); } return splitList; From c138d9b4676792cf4dae2e444da082dbad6ae78f Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sat, 14 Jun 2025 23:57:57 +0900 Subject: [PATCH 32/47] add: TEST(yaml, anchor_and_alias__case09error01_hash) --- sstd/src/file/yaml.cpp | 24 ++++++++++++++++++++---- test/src_test/file/yaml.cpp | 6 +++--- tests_list_for_build_and_run.txt | 4 ++-- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/sstd/src/file/yaml.cpp b/sstd/src/file/yaml.cpp index b4fe9af1..9d7272a1 100644 --- a/sstd/src/file/yaml.cpp +++ b/sstd/src/file/yaml.cpp @@ -874,6 +874,7 @@ bool sstd_yaml::_token2token_split_bv_list_type_cnt(std::vector& io){ std::vector ret; + std::vector aa_val_stack; bool is_all_the_data_flowStyle = _is_all_the_data_flowStyle(io); if(is_all_the_data_flowStyle){ @@ -900,6 +901,9 @@ bool sstd_yaml::_token2token_merge_multilines(std::vector& io) // Check criteria values (Defining criteria value as a base token like list, hash or list_and_hash type to merge) bool start_with_string = (*pT).val.size()>=1; uint criteria_hsc = _get_criteria_hsc((*pT)); // criteria_hsc: criteria head space count + if((*pT).ref_type==sstd_yaml::ref_type_anchor){ + aa_val_stack.push_back((*pT).aa_val); + } for(uint merge_cnt=1;; ++merge_cnt){ // Update @@ -908,7 +912,7 @@ bool sstd_yaml::_token2token_merge_multilines(std::vector& io) pT = &io[i]; bool is_control_types = _is_control_types((*pT).type); - + // Check break uint curr_hsc = _get_current_hsc((*pT)); // curr_hsc: current head space count if( merge_cnt==1 && is_control_types && (!start_with_string||(curr_hsc<=criteria_hsc)) ){ break; } @@ -954,7 +958,10 @@ bool sstd_yaml::_token2token_merge_multilines(std::vector& io) tmp.val += '\n' + (*pT).rawStr; // Needs to copy as row string in order to treat multi-line string as a raw data. Ex1: "k:\n x\n - a" is interpreted as `{k: "x - a"}`. Ex2: "k: |\n x # comment" is interpreted as `{k: "x # comment"}`. tmp.line_num_end = (*pT).line_num_end; tmp.mult_line_val = true; - + + if((*pT).ref_type==sstd_yaml::ref_type_anchor){ + aa_val_stack.push_back((*pT).aa_val); + } // if((*pT).type!=sstd_yaml::type_str){ break; } // if(){} /* @@ -968,7 +975,16 @@ bool sstd_yaml::_token2token_merge_multilines(std::vector& io) } */ } - + + if(aa_val_stack.size()>=2){ sstd::pdbg_err("Duplicated anchor (&) definition. Troubled definition names: "); sstd::print_base(aa_val_stack); printf(".\n"); return false; } + if(aa_val_stack.size()==1){ + tmp.ref_type = sstd_yaml::ref_type_anchor; + tmp.aa_val = aa_val_stack[0]; +// tmp.val.clear(); + + aa_val_stack.clear(); + } + /* if(tmp.val.size()!=0){ std::string s_val = sstd::stripAll(tmp.val, " \n"); // sstd::lstripAll(tmp.val, " \n"); if(s_val.starts_with('&')){ @@ -977,7 +993,7 @@ bool sstd_yaml::_token2token_merge_multilines(std::vector& io) tmp.val.clear(); } } - + */ ret.push_back(std::move(tmp)); }while( i Date: Sun, 15 Jun 2025 00:00:43 +0900 Subject: [PATCH 33/47] rm unused lines --- sstd/src/file/yaml.cpp | 42 +------------------------------------ test/src_test/file/yaml.cpp | 6 +++--- 2 files changed, 4 insertions(+), 44 deletions(-) diff --git a/sstd/src/file/yaml.cpp b/sstd/src/file/yaml.cpp index 9d7272a1..34d2911d 100644 --- a/sstd/src/file/yaml.cpp +++ b/sstd/src/file/yaml.cpp @@ -931,27 +931,9 @@ bool sstd_yaml::_token2token_merge_multilines(std::vector& io) // - `(*pT).key.size()!=0||(*pT).val.size()!=0`: The line is NOT Empty. (If the line is empty, the parser needs to treat as a line break of multi-line string). // - `curr_hsc<=criteria_hsc`: The line is out of scope. if( start_with_string && (((*pT).key.size()!=0||(*pT).val.size()!=0||(*pT).key_is_dqed||(*pT).key_is_sqed||(*pT).val_is_dqed||(*pT).val_is_sqed) && curr_hsc<=criteria_hsc) ){ break; } -/* sstd::printn_all((*pT).rawStr); - sstd::printn_all((*pT).key); - sstd::printn_all((*pT).val); - sstd::printn_all(start_with_string); - sstd::printn_all((*pT).key.size()!=0); - sstd::printn_all((*pT).val.size()!=0); - sstd::printn_all((*pT).key_is_dqed); - sstd::printn_all((*pT).key_is_sqed); - sstd::printn_all((*pT).val_is_dqed); - sstd::printn_all((*pT).val_is_sqed); - sstd::printn_all(curr_hsc<=criteria_hsc); - sstd::printn_all(""); -*/ -// // if( start_with_string && (((*pT).key.size()!=0||(*pT).val.size()!=0||(*pT).key_is_dqed||(*pT).key_is_sqed||(*pT).val_is_dqed||(*pT).val_is_sqed) && curr_hsc<=criteria_hsc) ){ break; } -// if( start_with_string && -// (((*pT).key.size()!=0||(*pT).val.size()!=0||(*pT).key_is_dqed||(*pT).key_is_sqed||(*pT).val_is_dqed||(*pT).val_is_sqed) && -// curr_hsc<=criteria_hsc) ){ break; } if( start_with_string && (*pT).type==sstd_yaml::type_hash){ break; } if( _is_separator((*pT).rawStr) ){ break; } -// if( !start_with_string ){ break; } // Copy values tmp.rawStr += '\n' + (*pT).rawStr; @@ -962,38 +944,16 @@ bool sstd_yaml::_token2token_merge_multilines(std::vector& io) if((*pT).ref_type==sstd_yaml::ref_type_anchor){ aa_val_stack.push_back((*pT).aa_val); } -// if((*pT).type!=sstd_yaml::type_str){ break; } -// if(){} - /* - if( (*pT).ref_type!=sstd_yaml::ref_type_null ){ - if(tmp.ref_type!=sstd_yaml::ref_type_null){ sstd::pdbg_err("The Duplicated anchor (&) definition.\n"); return false; } - - tmp.ref_type = (*pT).ref_type; - tmp.aa_val = (*pT).aa_val; - ++i; - break; - } - */ } if(aa_val_stack.size()>=2){ sstd::pdbg_err("Duplicated anchor (&) definition. Troubled definition names: "); sstd::print_base(aa_val_stack); printf(".\n"); return false; } if(aa_val_stack.size()==1){ tmp.ref_type = sstd_yaml::ref_type_anchor; tmp.aa_val = aa_val_stack[0]; -// tmp.val.clear(); aa_val_stack.clear(); } - /* - if(tmp.val.size()!=0){ - std::string s_val = sstd::stripAll(tmp.val, " \n"); // sstd::lstripAll(tmp.val, " \n"); - if(s_val.starts_with('&')){ - tmp.ref_type = sstd_yaml::ref_type_anchor; - tmp.aa_val = sstd::stripAll(tmp.val, "& \n"); - tmp.val.clear(); - } - } - */ + ret.push_back(std::move(tmp)); }while( i Date: Sun, 15 Jun 2025 01:11:04 +0900 Subject: [PATCH 34/47] add TEST(yaml, hash_multiple_line) --- sstd/src/file/yaml.cpp | 4 ++- test/src_test/file/yaml.cpp | 56 ++++++++++++++++++------------------- 2 files changed, 31 insertions(+), 29 deletions(-) diff --git a/sstd/src/file/yaml.cpp b/sstd/src/file/yaml.cpp index 34d2911d..487b76f8 100644 --- a/sstd/src/file/yaml.cpp +++ b/sstd/src/file/yaml.cpp @@ -940,6 +940,9 @@ bool sstd_yaml::_token2token_merge_multilines(std::vector& io) tmp.val += '\n' + (*pT).rawStr; // Needs to copy as row string in order to treat multi-line string as a raw data. Ex1: "k:\n x\n - a" is interpreted as `{k: "x - a"}`. Ex2: "k: |\n x # comment" is interpreted as `{k: "x # comment"}`. tmp.line_num_end = (*pT).line_num_end; tmp.mult_line_val = true; + + tmp.hasValue |= (*pT).hasValue; + tmp.line_num_end = (*pT).line_num_end; if((*pT).ref_type==sstd_yaml::ref_type_anchor){ aa_val_stack.push_back((*pT).aa_val); @@ -1335,7 +1338,6 @@ bool sstd::yaml_load(sstd::terp::var& ret_yml, const char* s){ if(!sstd_yaml::_str2token(v_token, s)){ sstd::pdbg_err("single or double quatation is not closed\n"); return false; } // v: vector, ls: line string if(!_yaml_load_base(ret_yml, v_token)){ sstd::pdbg_err("_yaml_load_base() is failed.\n"); return false; } - sstd::printn_all(ret_yml); return true; } diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index 1022a7df..0511cd89 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -1455,6 +1455,34 @@ k[]{}: v[]{} # OK //--- +TEST(yaml, hash_multiple_line){ + std::string s = R"( +h1: + + a + + b + + c + +)"; + sstd::terp::var yml; + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + ASSERT_TRUE(ret); +// sstd::printn_all(yml); + + //--- + + sstd::terp::var ans; + ans = sstd::terp::hash(); + ans["h1"] = "a\nb\nc"; +// sstd::printn_all(ans); + + ASSERT_TRUE(yml == ans); +} + +//--- + TEST(yaml, hash_duplicated_err){ // TODO: ここの仕様を直す std::string s=R"( k1: val1 @@ -4691,34 +4719,6 @@ h2: *h1 ASSERT_TRUE(yml == ans); }/* -TEST(yaml, anchor_and_alias__case09c_hash__aaa){ - std::string s = R"( -h1: - - a - - b - - c - -)"; - sstd::terp::var yml; - bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE - ASSERT_TRUE(ret); - sstd::printn_all(yml); - - //--- - - sstd::terp::var ans; - ans = sstd::terp::hash(); - ans["h1"] = sstd::terp::hash(); - ans["h1"]["k1"] = "v1"; - ans["h2"] = &ans["h1"]; -// sstd::printn_all(ans); - - ASSERT_TRUE(yml == ans); -}*/ -/* TEST(yaml, anchor_and_alias__case09d_hash){ std::string s = R"( h1: &h1 From f6a64776ad6fe49f6d85e9195581097be55a5590 Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sun, 15 Jun 2025 21:30:28 +0900 Subject: [PATCH 35/47] add: TEST(yaml, anchor_and_alias__case09d_hash) --- sstd/src/file/yaml.cpp | 15 ++++++++------- test/src_test/file/yaml.cpp | 15 ++++++++++++--- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/sstd/src/file/yaml.cpp b/sstd/src/file/yaml.cpp index 487b76f8..8abef96c 100644 --- a/sstd/src/file/yaml.cpp +++ b/sstd/src/file/yaml.cpp @@ -874,6 +874,7 @@ bool sstd_yaml::_token2token_split_bv_list_type_cnt(std::vector& io){ std::vector ret; + std::vector ref_type_stack; std::vector aa_val_stack; bool is_all_the_data_flowStyle = _is_all_the_data_flowStyle(io); @@ -901,7 +902,8 @@ bool sstd_yaml::_token2token_merge_multilines(std::vector& io) // Check criteria values (Defining criteria value as a base token like list, hash or list_and_hash type to merge) bool start_with_string = (*pT).val.size()>=1; uint criteria_hsc = _get_criteria_hsc((*pT)); // criteria_hsc: criteria head space count - if((*pT).ref_type==sstd_yaml::ref_type_anchor){ + if((*pT).ref_type!=sstd_yaml::ref_type_null){ + ref_type_stack.push_back((*pT).ref_type); aa_val_stack.push_back((*pT).aa_val); } @@ -940,21 +942,20 @@ bool sstd_yaml::_token2token_merge_multilines(std::vector& io) tmp.val += '\n' + (*pT).rawStr; // Needs to copy as row string in order to treat multi-line string as a raw data. Ex1: "k:\n x\n - a" is interpreted as `{k: "x - a"}`. Ex2: "k: |\n x # comment" is interpreted as `{k: "x # comment"}`. tmp.line_num_end = (*pT).line_num_end; tmp.mult_line_val = true; - + tmp.hasValue |= (*pT).hasValue; tmp.line_num_end = (*pT).line_num_end; - if((*pT).ref_type==sstd_yaml::ref_type_anchor){ + if((*pT).ref_type!=sstd_yaml::ref_type_null){ + ref_type_stack.push_back((*pT).ref_type); aa_val_stack.push_back((*pT).aa_val); } } if(aa_val_stack.size()>=2){ sstd::pdbg_err("Duplicated anchor (&) definition. Troubled definition names: "); sstd::print_base(aa_val_stack); printf(".\n"); return false; } if(aa_val_stack.size()==1){ - tmp.ref_type = sstd_yaml::ref_type_anchor; - tmp.aa_val = aa_val_stack[0]; - - aa_val_stack.clear(); + tmp.ref_type = ref_type_stack[0]; ref_type_stack.clear(); + tmp.aa_val = aa_val_stack [0]; aa_val_stack.clear(); } ret.push_back(std::move(tmp)); diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index 0511cd89..1a4e5933 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -4718,7 +4718,7 @@ h2: *h1 // sstd::printn_all(ans); ASSERT_TRUE(yml == ans); -}/* +} TEST(yaml, anchor_and_alias__case09d_hash){ std::string s = R"( h1: &h1 @@ -4729,7 +4729,7 @@ h1: &h1 sstd::terp::var yml; bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE ASSERT_TRUE(ret); -// sstd::printn_all(yml); + sstd::printn_all(yml); //--- @@ -4738,10 +4738,19 @@ h1: &h1 ans["h1"] = sstd::terp::hash(); ans["h1"]["k1"] = "v1"; ans["h2"] = &ans["h1"]; -// sstd::printn_all(ans); + sstd::printn_all(ans); ASSERT_TRUE(yml == ans); } +/* + +h1: &h1 + k1: v1 +h2: &h2 + *h1 +h3: + *h2 + */ /* TEST(yaml, anchor_and_alias__case09error02_hash){ From 89be3ff9371a6f90e2d80416774436e80f0b890a Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sun, 15 Jun 2025 21:42:04 +0900 Subject: [PATCH 36/47] add: TEST(yaml, anchor_and_alias__case09error03_hash) --- test/src_test/file/yaml.cpp | 78 ++++++++++++++++--------------------- 1 file changed, 34 insertions(+), 44 deletions(-) diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index 1a4e5933..f73bfcc6 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -4694,6 +4694,40 @@ h2: *h2 ASSERT_FALSE(ret); } +TEST(yaml, anchor_and_alias__case09error02_hash){ + std::string s = R"( +h1: + &h2 + &h3 + k1: v1 +h2: *h2 +)"; + sstd::terp::var yml; + + testing::internal::CaptureStdout(); + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + std::string err_msg = testing::internal::GetCapturedStdout(); + ASSERT_TRUE(sstd::strIn("Duplicated anchor (&) definition.", err_msg)); + + ASSERT_FALSE(ret); +} +TEST(yaml, anchor_and_alias__case09error03_hash){ + std::string s = R"( +h1: &h1 + &h2 + &h3 + k1: v1 +h2: *h2 +)"; + sstd::terp::var yml; + + testing::internal::CaptureStdout(); + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + std::string err_msg = testing::internal::GetCapturedStdout(); + ASSERT_TRUE(sstd::strIn("Duplicated anchor (&) definition.", err_msg)); + + ASSERT_FALSE(ret); +} TEST(yaml, anchor_and_alias__case09c_hash){ std::string s = R"( h1: @@ -4751,50 +4785,6 @@ h2: &h2 h3: *h2 -*/ -/* -TEST(yaml, anchor_and_alias__case09error02_hash){ - std::string s = R"( -h1: - &h2 - &h3 - k1: v1 -h2: *h2 -)"; - sstd::terp::var yml; - - testing::internal::CaptureStdout(); - bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE - std::string err_msg = testing::internal::GetCapturedStdout(); - ASSERT_TRUE(sstd::strIn("The Duplicated anchor (&) definition.", err_msg)); - - ASSERT_FALSE(ret); -}*/ -/* -TEST(yaml, anchor_and_alias__case09error02_hash){ - std::string s = R"( -h1: &h1 - &h2 - &h3 - k1: v1 -h2: *h2 -)"; - sstd::terp::var yml; - bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE - ASSERT_TRUE(ret); -// sstd::printn_all(yml); - - //--- - - sstd::terp::var ans; - ans = sstd::terp::hash(); - ans["h1"] = sstd::terp::hash(); - ans["h1"]["k1"] = "v1"; - ans["h2"] = &ans["h1"]; -// sstd::printn_all(ans); - - ASSERT_TRUE(yml == ans); -} */ /* TEST(yaml, hash__conor_cases){ From 879746c9025daf3c45d476ffae15c2e26abee838 Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sun, 15 Jun 2025 22:58:57 +0900 Subject: [PATCH 37/47] add: TEST(yaml, hash_multiple_line_02) --- test/src_test/file/yaml.cpp | 46 ++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index f73bfcc6..2b5e1aa6 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -1455,7 +1455,7 @@ k[]{}: v[]{} # OK //--- -TEST(yaml, hash_multiple_line){ +TEST(yaml, hash_multiple_line_01){ std::string s = R"( h1: @@ -1480,6 +1480,27 @@ TEST(yaml, hash_multiple_line){ ASSERT_TRUE(yml == ans); } +TEST(yaml, hash_multiple_line_02){ + std::string s = R"( +h1: + + k1: v1 +)"; + sstd::terp::var yml; + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + ASSERT_TRUE(ret); +// sstd::printn_all(yml); + + //--- + + sstd::terp::var ans; + ans = sstd::terp::hash(); + ans["h1"] = sstd::terp::hash(); + ans["h1"]["k1"] = "v1"; + sstd::printn_all(ans); + + ASSERT_TRUE(yml == ans); +} //--- @@ -4785,29 +4806,6 @@ h2: &h2 h3: *h2 -*/ -/* -TEST(yaml, hash__conor_cases){ - std::string s = R"( -h1: - - k1: v1 -)"; - sstd::terp::var yml; - bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE - ASSERT_TRUE(ret); - sstd::printn_all(yml); - - //--- - - sstd::terp::var ans; - ans = sstd::terp::hash(); - ans["h1"] = sstd::terp::hash(); - ans["h1"]["k1"] = "v1"; - sstd::printn_all(ans); - - ASSERT_TRUE(yml == ans); -} */ /* - &r From ec46ca5916a58115f2c432c63e5ec099d2ba911e Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sun, 15 Jun 2025 23:08:09 +0900 Subject: [PATCH 38/47] add: TEST(yaml, anchor_and_alias__case09d_hash) --- test/src_test/file/yaml.cpp | 38 +++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index 2b5e1aa6..b06a962c 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -4776,6 +4776,31 @@ h2: *h1 } TEST(yaml, anchor_and_alias__case09d_hash){ std::string s = R"( +h1: + + &h1 + k1: v1 + +h2: *h1 +)"; + sstd::terp::var yml; + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + ASSERT_TRUE(ret); +// sstd::printn_all(yml); + + //--- + + sstd::terp::var ans; + ans = sstd::terp::hash(); + ans["h1"] = sstd::terp::hash(); + ans["h1"]["k1"] = "v1"; + ans["h2"] = &ans["h1"]; +// sstd::printn_all(ans); + + ASSERT_TRUE(yml == ans); +} +TEST(yaml, anchor_and_alias__case09e_hash){ + std::string s = R"( h1: &h1 k1: v1 h2: @@ -4784,7 +4809,7 @@ h1: &h1 sstd::terp::var yml; bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE ASSERT_TRUE(ret); - sstd::printn_all(yml); +// sstd::printn_all(yml); //--- @@ -4793,19 +4818,24 @@ h1: &h1 ans["h1"] = sstd::terp::hash(); ans["h1"]["k1"] = "v1"; ans["h2"] = &ans["h1"]; - sstd::printn_all(ans); +// sstd::printn_all(ans); ASSERT_TRUE(yml == ans); } /* - h1: &h1 k1: v1 h2: &h2 *h1 h3: *h2 - +*/ +/* +h1: + &h1 + &k1 k1: v1 +h2: *h1 +h3: *k1 */ /* - &r From 5d894742b7d862ca53a92eff2f52d7149f0a5dba Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sun, 15 Jun 2025 23:58:49 +0900 Subject: [PATCH 39/47] add: TEST(yaml, anchor_and_alias__case10_hash_list) --- sstd/src/file/yaml.cpp | 3 ++- test/src_test/file/yaml.cpp | 47 +++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/sstd/src/file/yaml.cpp b/sstd/src/file/yaml.cpp index 8abef96c..71f1acc7 100644 --- a/sstd/src/file/yaml.cpp +++ b/sstd/src/file/yaml.cpp @@ -933,7 +933,8 @@ bool sstd_yaml::_token2token_merge_multilines(std::vector& io) // - `(*pT).key.size()!=0||(*pT).val.size()!=0`: The line is NOT Empty. (If the line is empty, the parser needs to treat as a line break of multi-line string). // - `curr_hsc<=criteria_hsc`: The line is out of scope. if( start_with_string && (((*pT).key.size()!=0||(*pT).val.size()!=0||(*pT).key_is_dqed||(*pT).key_is_sqed||(*pT).val_is_dqed||(*pT).val_is_sqed) && curr_hsc<=criteria_hsc) ){ break; } - if( start_with_string && (*pT).type==sstd_yaml::type_hash){ break; } + if( start_with_string && (*pT).type==sstd_yaml::type_hash ){ break; } + if( start_with_string && (*pT).type==sstd_yaml::type_list && aa_val_stack.size()!=0){ break; } if( _is_separator((*pT).rawStr) ){ break; } diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index b06a962c..44617601 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -4822,6 +4822,53 @@ h1: &h1 ASSERT_TRUE(yml == ans); } +TEST(yaml, anchor_and_alias__case10_hash_list){ + std::string s = R"( +h1: + + &h1_val + + - v1 +h2: *h1_val +)"; + sstd::terp::var yml; + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + ASSERT_TRUE(ret); + sstd::printn_all(yml); + + //--- + + sstd::terp::var ans; + ans = sstd::terp::hash(); + ans["h1"] = sstd::terp::list(1); + ans["h1"][0] = "v1"; + ans["h2"] = &ans["h1"]; + sstd::printn_all(ans); + + ASSERT_TRUE(yml == ans); +} +TEST(yaml, _str2token_multi_list_case10_tmpppppppppppppppppp){ + std::string s=R"( +- a + - a +)"; + std::vector v_ret; + bool ret = sstd_yaml::_str2token(v_ret, s); + sstd::printn(v_ret); + + ASSERT_TRUE(ret); + ASSERT_EQ(v_ret.size(), (uint)1); +// sstd::printn(v_ret[0].rawStr.c_str()); +// ASSERT_STREQ(v_ret[0].rawStr.c_str(), R"()"); +// sstd::printn(v_ret[0].val.c_str()); + ASSERT_STREQ(v_ret[0].val.c_str(), "a - a"); // "a\n - a" +} +/* +- &a + - a +- *a +*/ + /* h1: &h1 k1: v1 From bf88f7a55968325e1b80e8c14fef4a412eb7f6fb Mon Sep 17 00:00:00 2001 From: admiswalker Date: Mon, 16 Jun 2025 00:07:44 +0900 Subject: [PATCH 40/47] add: TEST(yaml, anchor_and_alias__case11_list) --- test/src_test/file/yaml.cpp | 44 +++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index 44617601..a852c975 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -4822,6 +4822,9 @@ h1: &h1 ASSERT_TRUE(yml == ans); } + +//--- + TEST(yaml, anchor_and_alias__case10_hash_list){ std::string s = R"( h1: @@ -4834,7 +4837,7 @@ h2: *h1_val sstd::terp::var yml; bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE ASSERT_TRUE(ret); - sstd::printn_all(yml); +// sstd::printn_all(yml); //--- @@ -4843,31 +4846,34 @@ h2: *h1_val ans["h1"] = sstd::terp::list(1); ans["h1"][0] = "v1"; ans["h2"] = &ans["h1"]; - sstd::printn_all(ans); +// sstd::printn_all(ans); ASSERT_TRUE(yml == ans); } -TEST(yaml, _str2token_multi_list_case10_tmpppppppppppppppppp){ - std::string s=R"( -- a +TEST(yaml, anchor_and_alias__case11_list){ // For more comfirmation of the case, "TEST(yaml, _str2token_multi_list_case10)". + std::string s = R"( +- &a - a +- *a )"; - std::vector v_ret; - bool ret = sstd_yaml::_str2token(v_ret, s); - sstd::printn(v_ret); - + sstd::terp::var yml; + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE ASSERT_TRUE(ret); - ASSERT_EQ(v_ret.size(), (uint)1); -// sstd::printn(v_ret[0].rawStr.c_str()); -// ASSERT_STREQ(v_ret[0].rawStr.c_str(), R"()"); -// sstd::printn(v_ret[0].val.c_str()); - ASSERT_STREQ(v_ret[0].val.c_str(), "a - a"); // "a\n - a" +// sstd::printn_all(yml); + + //--- + + sstd::terp::var ans; + ans = sstd::terp::list(2); + ans[0] = sstd::terp::list(1); + ans[0][0] = "a"; + ans[1] = &ans[0]; +// sstd::printn_all(ans); + + ASSERT_TRUE(yml == ans); } -/* -- &a - - a -- *a -*/ + +//--- /* h1: &h1 From 32e617157336f9dc70ebcffc3f23b0b00cca8f20 Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sun, 29 Jun 2025 18:48:11 +0900 Subject: [PATCH 41/47] add: TEST(yaml, anchor_and_alias__case07b_list) --- sstd/src/file/yaml.cpp | 3 +- test/src_test/file/yaml.cpp | 85 ++++++++++++++++++++++++++++++++++--- 2 files changed, 80 insertions(+), 8 deletions(-) diff --git a/sstd/src/file/yaml.cpp b/sstd/src/file/yaml.cpp index 71f1acc7..16968b26 100644 --- a/sstd/src/file/yaml.cpp +++ b/sstd/src/file/yaml.cpp @@ -943,9 +943,10 @@ bool sstd_yaml::_token2token_merge_multilines(std::vector& io) tmp.val += '\n' + (*pT).rawStr; // Needs to copy as row string in order to treat multi-line string as a raw data. Ex1: "k:\n x\n - a" is interpreted as `{k: "x - a"}`. Ex2: "k: |\n x # comment" is interpreted as `{k: "x # comment"}`. tmp.line_num_end = (*pT).line_num_end; tmp.mult_line_val = true; - + tmp.hasValue |= (*pT).hasValue; tmp.line_num_end = (*pT).line_num_end; + if((*pT).hasValue){ tmp.format = (*pT).format; } if((*pT).ref_type!=sstd_yaml::ref_type_null){ ref_type_stack.push_back((*pT).ref_type); diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index a852c975..0e33c182 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -4610,7 +4610,7 @@ TEST(yaml, anchor_and_alias__case06_hash_value){ ASSERT_TRUE(yml == ans); } -TEST(yaml, anchor_and_alias__case07_list){ +TEST(yaml, anchor_and_alias__case07a_list){ std::string s = R"( - &r [a, b, c] - *r @@ -4633,6 +4633,30 @@ TEST(yaml, anchor_and_alias__case07_list){ ASSERT_TRUE(yml == ans); } +TEST(yaml, anchor_and_alias__case07b_list){ + std::string s = R"( +- &r + [a, b, c] +- *r +)"; + sstd::terp::var yml; + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + ASSERT_TRUE(ret); + sstd::printn_all(yml); + + //--- + + sstd::terp::var ans; + ans = sstd::terp::list(2); + ans[0] = sstd::terp::list(3); + ans[0][0] = "a"; + ans[0][1] = "b"; + ans[0][2] = "c"; + ans[1] = &ans[0]; + sstd::printn_all(ans); + + ASSERT_TRUE(yml == ans); +} TEST(yaml, anchor_and_alias__case08_hash){ std::string s = R"( - &r {k: v} @@ -4678,6 +4702,29 @@ h2: *h1 } TEST(yaml, anchor_and_alias__case09b_hash){ std::string s = R"( +h1: + &h1 + k1: v1 +h2: *h1 +)"; + sstd::terp::var yml; + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + ASSERT_TRUE(ret); +// sstd::printn_all(yml); + + //--- + + sstd::terp::var ans; + ans = sstd::terp::hash(); + ans["h1"] = sstd::terp::hash(); + ans["h1"]["k1"] = "v1"; + ans["h2"] = &ans["h1"]; +// sstd::printn_all(ans); + + ASSERT_TRUE(yml == ans); +} +TEST(yaml, anchor_and_alias__case09b2_hash){ + std::string s = R"( h1: &h1 k1: v1 @@ -4874,11 +4921,40 @@ TEST(yaml, anchor_and_alias__case11_list){ // For more comfirmation of the case, } //--- +/* +TEST(yaml, anchor_and_alias__case12_hash_key){ + std::string s = R"( +&h1_key h1: v1 +h2: *h1_key +)"; + sstd::terp::var yml; + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + ASSERT_TRUE(ret); +// sstd::printn_all(yml); + + //--- + + sstd::terp::var ans; + ans = sstd::terp::hash(); + ans["h1"] = sstd::terp::list(1); + ans[0][0] = "a"; + auto itr = ans.find("h1"); + ans[1] = itr.first; +// sstd::printn_all(ans); + + ASSERT_TRUE(yml == ans); +} +*/ +//--- +/* +&h1_key h1: v1 +h2: *h1_key +*/ /* h1: &h1 k1: v1 -h2: &h2 +h2: &h2 // よく考えると、h1 を使えばよいだけでは? *h1 h3: *h2 @@ -4890,11 +4966,6 @@ h2: &h2 h2: *h1 h3: *k1 */ -/* -- &r - [a, b, c] -- *r -*/ /* std::string s = R"( h1: From e0d74238ae108ea9aa6408c196971037c5c10ab3 Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sun, 29 Jun 2025 18:53:46 +0900 Subject: [PATCH 42/47] add: TEST(yaml, anchor_and_alias__case08b_hash) --- test/src_test/file/yaml.cpp | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index 0e33c182..069afeee 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -4657,7 +4657,7 @@ TEST(yaml, anchor_and_alias__case07b_list){ ASSERT_TRUE(yml == ans); } -TEST(yaml, anchor_and_alias__case08_hash){ +TEST(yaml, anchor_and_alias__case08a_hash){ std::string s = R"( - &r {k: v} - *r @@ -4678,6 +4678,28 @@ TEST(yaml, anchor_and_alias__case08_hash){ ASSERT_TRUE(yml == ans); } +TEST(yaml, anchor_and_alias__case08b_hash){ + std::string s = R"( +- &r + {k: v} +- *r +)"; + sstd::terp::var yml; + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + ASSERT_TRUE(ret); +// sstd::printn_all(yml); + + //--- + + sstd::terp::var ans; + ans = sstd::terp::list(2); + ans[0] = sstd::terp::hash(); + ans[0]["k"] = "v"; + ans[1] = &ans[0]; +// sstd::printn_all(ans); + + ASSERT_TRUE(yml == ans); +} TEST(yaml, anchor_and_alias__case09_hash){ std::string s = R"( h1: &h1 From 87c4ee02fd06540ca8b79012e50497d1ca32e7ff Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sun, 29 Jun 2025 19:01:01 +0900 Subject: [PATCH 43/47] rm unused lines --- test/src_test/file/yaml.cpp | 73 +++++++++++-------------------------- 1 file changed, 21 insertions(+), 52 deletions(-) diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index 069afeee..57db1822 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -4944,42 +4944,28 @@ TEST(yaml, anchor_and_alias__case11_list){ // For more comfirmation of the case, //--- /* -TEST(yaml, anchor_and_alias__case12_hash_key){ std::string s = R"( -&h1_key h1: v1 -h2: *h1_key +- h1: &h1 + k1: v1 + k2: v2 +- h2: *h1 )"; - sstd::terp::var yml; - bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE - ASSERT_TRUE(ret); -// sstd::printn_all(yml); - - //--- - - sstd::terp::var ans; - ans = sstd::terp::hash(); - ans["h1"] = sstd::terp::list(1); - ans[0][0] = "a"; - - auto itr = ans.find("h1"); - ans[1] = itr.first; -// sstd::printn_all(ans); - - ASSERT_TRUE(yml == ans); -} */ -//--- /* -&h1_key h1: v1 -h2: *h1_key + std::string s = R"( +hx: &hx + k1: v1 +h2: + <<: *hx + k2: v2 +)"; */ + +//-- +// TODO /* -h1: &h1 - k1: v1 -h2: &h2 // よく考えると、h1 を使えばよいだけでは? - *h1 -h3: - *h2 +&h1_key h1: v1 +h2: *h1_key */ /* h1: @@ -4989,29 +4975,12 @@ h2: *h1 h3: *k1 */ /* - std::string s = R"( -h1: - &h1 - k1: v1 -h2: *h1 -)"; -*/ -/* - std::string s = R"( -- h1: &h1 - k1: v1 - k2: v2 -- h2: *h1 -)"; -*/ -/* - std::string s = R"( -hx: &hx +h1: &h1 k1: v1 -h2: - <<: *hx - k2: v2 -)"; +h2: &h2 // よく考えると、h1 を使えばよいだけでは? + *h1 +h3: + *h2 */ //----------------------------------------------------------------------------------------------------------------------------------------------- From 3241e9f3af833183fdf7fc893266921de62dbc68 Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sun, 29 Jun 2025 19:32:51 +0900 Subject: [PATCH 44/47] add: TEST(yaml, anchor_and_alias__case12_list_hash) --- sstd/src/file/yaml.cpp | 8 ++++++++ test/src_test/file/yaml.cpp | 26 ++++++++++++++++++++++---- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/sstd/src/file/yaml.cpp b/sstd/src/file/yaml.cpp index 16968b26..4454fc55 100644 --- a/sstd/src/file/yaml.cpp +++ b/sstd/src/file/yaml.cpp @@ -457,6 +457,14 @@ bool sstd_yaml::_token2cmd(std::vector& ret_vCmd, con //c.format = t.format; //c.val = t.val; // t.key; ret_vCmd.push_back(c); + // --- anchor and alias --- + if(t.ref_type==sstd_yaml::ref_type_anchor){ + c.ref_type = t.ref_type; + c.aa_val = t.aa_val; + }else if(t.ref_type==sstd_yaml::ref_type_alias){ + c.ref_type = t.ref_type; + c.aa_val = t.aa_val; + } } { diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index 57db1822..05907b04 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -4941,16 +4941,34 @@ TEST(yaml, anchor_and_alias__case11_list){ // For more comfirmation of the case, ASSERT_TRUE(yml == ans); } - -//--- -/* +TEST(yaml, anchor_and_alias__case12_list_hash){ std::string s = R"( - h1: &h1 k1: v1 k2: v2 - h2: *h1 )"; -*/ + sstd::terp::var yml; + bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE + ASSERT_TRUE(ret); + sstd::printn_all(yml); + + //--- + + sstd::terp::var ans; + ans = sstd::terp::list(2); + ans[0] = sstd::terp::hash(); + ans[0]["h1"] = sstd::terp::hash(); + ans[0]["h1"]["k1"] = "v1"; + ans[0]["h1"]["k2"] = "v2"; + ans[1] = sstd::terp::hash(); + ans[1]["h2"] = &ans[0]["h1"]; + sstd::printn_all(ans); + + ASSERT_TRUE(yml == ans); +} + +//--- /* std::string s = R"( hx: &hx From 13c75bb6ca6e13ddbbef7e5d857c5d80c34a5aee Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sun, 29 Jun 2025 20:59:20 +0900 Subject: [PATCH 45/47] rm debugging prints --- sstd/src/file/yaml.cpp | 3 --- test/src_test/file/yaml.cpp | 10 +++++----- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/sstd/src/file/yaml.cpp b/sstd/src/file/yaml.cpp index 4454fc55..bd042d28 100644 --- a/sstd/src/file/yaml.cpp +++ b/sstd/src/file/yaml.cpp @@ -1058,9 +1058,7 @@ bool sstd_yaml::_str2token(std::vector& ret, const char* str_i std::string str = std::regex_replace(str_in, std::regex("\r"), ""); // "\r\n" -> "\n" if(!sstd_yaml::_str2token_except_multilines(ret, str.c_str())){ sstd::pdbg_err("sstd_yaml::_str2token_except_multilines() was failed.\n"); return false; } - sstd::printn_all(ret); if(!sstd_yaml::_token2token_merge_multilines(ret)){ sstd::pdbg_err("sstd_yaml::_token2token_merge_multilines() was failed.\n"); return false; } - sstd::printn_all(ret); if(!sstd_yaml::_token2token_split_bv_list_type_cnt(ret)){ sstd::pdbg_err("sstd_yaml::_token2token_split_bv_list_type_cnt() was failed.\n"); return false; } if(!sstd_yaml::_token2token_postprocess(ret)){ sstd::pdbg_err("sstd_yaml::_token2token_postprocess() was failed.\n"); return false; } return true; @@ -1337,7 +1335,6 @@ bool _yaml_load_base(sstd::terp::var& ret_yml, const std::vector v_cmd; if(!sstd_yaml::_token2cmd(v_cmd, v_token)){ return false; } - sstd::printn_all(v_cmd); if(!_construct_var(ret_yml, v_cmd)){ return false; } diff --git a/test/src_test/file/yaml.cpp b/test/src_test/file/yaml.cpp index 05907b04..e5a211d5 100644 --- a/test/src_test/file/yaml.cpp +++ b/test/src_test/file/yaml.cpp @@ -1497,7 +1497,7 @@ TEST(yaml, hash_multiple_line_02){ ans = sstd::terp::hash(); ans["h1"] = sstd::terp::hash(); ans["h1"]["k1"] = "v1"; - sstd::printn_all(ans); +// sstd::printn_all(ans); ASSERT_TRUE(yml == ans); } @@ -4642,7 +4642,7 @@ TEST(yaml, anchor_and_alias__case07b_list){ sstd::terp::var yml; bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE ASSERT_TRUE(ret); - sstd::printn_all(yml); +// sstd::printn_all(yml); //--- @@ -4653,7 +4653,7 @@ TEST(yaml, anchor_and_alias__case07b_list){ ans[0][1] = "b"; ans[0][2] = "c"; ans[1] = &ans[0]; - sstd::printn_all(ans); +// sstd::printn_all(ans); ASSERT_TRUE(yml == ans); } @@ -4951,7 +4951,7 @@ TEST(yaml, anchor_and_alias__case12_list_hash){ sstd::terp::var yml; bool ret = sstd::yaml_load(yml, s); // TEST THIS LINE ASSERT_TRUE(ret); - sstd::printn_all(yml); +// sstd::printn_all(yml); //--- @@ -4963,7 +4963,7 @@ TEST(yaml, anchor_and_alias__case12_list_hash){ ans[0]["h1"]["k2"] = "v2"; ans[1] = sstd::terp::hash(); ans[1]["h2"] = &ans[0]["h1"]; - sstd::printn_all(ans); +// sstd::printn_all(ans); ASSERT_TRUE(yml == ans); } From 819da8081d3df9991830261fcb7a709ab25ffaba Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sun, 29 Jun 2025 21:08:53 +0900 Subject: [PATCH 46/47] rm debugging prints --- test/src_test/string/strEdit.cpp | 2 +- tests_list_for_build_and_run.txt | 84 ++++++++++++++++---------------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/test/src_test/string/strEdit.cpp b/test/src_test/string/strEdit.cpp index 75d996f0..04ddbcce 100644 --- a/test/src_test/string/strEdit.cpp +++ b/test/src_test/string/strEdit.cpp @@ -276,7 +276,7 @@ TEST(strEdit, splitAll_04){ TEST_SPLIT_ALL(" \n", "&h abc\n def\n &x", "&h", "ab #define TEST_SPLIT_ALL_TIGHT(X_IN, S_IN, ...) \ std::vector ret_v = sstd::splitAll_tight(S_IN, X_IN); /* TEST THIS LINE */ \ - sstd::printn(ret_v); \ + /* sstd::printn(ret_v); */ \ ASSERT_TRUE(ret_v == std::vector({__VA_ARGS__}) ); TEST(strEdit, splitAll_tight_CC_interface_test){ TEST_SPLIT_ALL_TIGHT( " ,\n", " a b, c", "a", "b", "c"); } diff --git a/tests_list_for_build_and_run.txt b/tests_list_for_build_and_run.txt index a8a61805..04185d55 100644 --- a/tests_list_for_build_and_run.txt +++ b/tests_list_for_build_and_run.txt @@ -6,46 +6,46 @@ # このファイルに記載されたテストコードは "$ make" コマンドでビルドされます. # また,テスト実行は,実行対象として判定されます. -#../test/src_test/cast/typeConversion.cpp -#../test/src_test/container/matrixContainer_binary/bmat.cpp -#../test/src_test/container/matrixContainer_colMajor/mat_c.cpp -#../test/src_test/container/matrixContainer_colMajor/ope.cpp -#../test/src_test/container/matrixContainer_rowMajor/mat_r.cpp -#../test/src_test/container/vector/slice.cpp -#../test/src_test/container/vector/stdVector_expansion.cpp -#../test/src_test/container/vector/vec_manipulation.cpp -#../test/src_test/container/vector/vvec.cpp -#../test/src_test/definitions/typeDef.cpp -#../test/src_test/definitions/typeNum.cpp -#../test/src_test/file/cp.cpp -#../test/src_test/file/csv.cpp -#../test/src_test/file/file.cpp -#../test/src_test/file/file_c.cpp -#../test/src_test/file/file_operations.cpp -#../test/src_test/file/glob.cpp -#../test/src_test/file/mkdir.cpp -#../test/src_test/file/mv.cpp -#../test/src_test/file/path.cpp -#../test/src_test/file/read_write.cpp -#../test/src_test/file/rm.cpp -#../test/src_test/file/tinyInterpreter.cpp +../test/src_test/cast/typeConversion.cpp +../test/src_test/container/matrixContainer_binary/bmat.cpp +../test/src_test/container/matrixContainer_colMajor/mat_c.cpp +../test/src_test/container/matrixContainer_colMajor/ope.cpp +../test/src_test/container/matrixContainer_rowMajor/mat_r.cpp +../test/src_test/container/vector/slice.cpp +../test/src_test/container/vector/stdVector_expansion.cpp +../test/src_test/container/vector/vec_manipulation.cpp +../test/src_test/container/vector/vvec.cpp +../test/src_test/definitions/typeDef.cpp +../test/src_test/definitions/typeNum.cpp +../test/src_test/file/cp.cpp +../test/src_test/file/csv.cpp +../test/src_test/file/file.cpp +../test/src_test/file/file_c.cpp +../test/src_test/file/file_operations.cpp +../test/src_test/file/glob.cpp +../test/src_test/file/mkdir.cpp +../test/src_test/file/mv.cpp +../test/src_test/file/path.cpp +../test/src_test/file/read_write.cpp +../test/src_test/file/rm.cpp +../test/src_test/file/tinyInterpreter.cpp ../test/src_test/file/yaml.cpp -#../test/src_test/math/math.cpp -#../test/src_test/math/signal.cpp -#../test/src_test/math/hashFnc_of_MD5_SHA1_SHA2/hashSum.cpp -#../test/src_test/math/hashFnc_of_MD5_SHA1_SHA2/sstd_md5_sha1_sha2_wrapper.cpp -#../test/src_test/memory/terp/terp.cpp -#../test/src_test/memory/terp/terp_print.cpp -#../test/src_test/memory/unique_void_ptr.cpp -#../test/src_test/memory/void_ptr.cpp -#../test/src_test/print/pdbg.cpp -#../test/src_test/print/print_printn_printn_all.cpp -#../test/src_test/python/c2py.cpp -#../test/src_test/string/encode_decode.cpp -#../test/src_test/string/strEdit.cpp -#../test/src_test/string/strmatch.cpp -#../test/src_test/string/utf8.cpp -#../test/src_test/sys/status.cpp -#../test/src_test/sys/system.cpp -#../test/src_test/time/measureTime.cpp -#../test/src_test/time/time.cpp +../test/src_test/math/math.cpp +../test/src_test/math/signal.cpp +../test/src_test/math/hashFnc_of_MD5_SHA1_SHA2/hashSum.cpp +../test/src_test/math/hashFnc_of_MD5_SHA1_SHA2/sstd_md5_sha1_sha2_wrapper.cpp +../test/src_test/memory/terp/terp.cpp +../test/src_test/memory/terp/terp_print.cpp +../test/src_test/memory/unique_void_ptr.cpp +../test/src_test/memory/void_ptr.cpp +../test/src_test/print/pdbg.cpp +../test/src_test/print/print_printn_printn_all.cpp +../test/src_test/python/c2py.cpp +../test/src_test/string/encode_decode.cpp +../test/src_test/string/strEdit.cpp +../test/src_test/string/strmatch.cpp +../test/src_test/string/utf8.cpp +../test/src_test/sys/status.cpp +../test/src_test/sys/system.cpp +../test/src_test/time/measureTime.cpp +../test/src_test/time/time.cpp From 91cd0ca78cac14c3fd11b7c397b4ab49dc643ee8 Mon Sep 17 00:00:00 2001 From: admiswalker Date: Sun, 6 Jul 2025 01:26:48 +0900 Subject: [PATCH 47/47] change ubuntu-24.04 to ubuntu-24.040-arm at main_tests_on_raspberry_pi_os_arm64.yml --- .github/workflows/main_tests_on_raspberry_pi_os_arm64.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main_tests_on_raspberry_pi_os_arm64.yml b/.github/workflows/main_tests_on_raspberry_pi_os_arm64.yml index a7e08853..479f7b6e 100755 --- a/.github/workflows/main_tests_on_raspberry_pi_os_arm64.yml +++ b/.github/workflows/main_tests_on_raspberry_pi_os_arm64.yml @@ -8,14 +8,15 @@ on: jobs: Build-and-Test: - runs-on: ubuntu-24.04 +# runs-on: ubuntu-24.04 + runs-on: ubuntu-24.04-arm steps: - name: checkout repository uses: actions/checkout@v4 - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 +# - name: Set up QEMU +# uses: docker/setup-qemu-action@v3 - name: Install build tools run: |