mirror of
				https://github.com/RetroDECK/Duckstation.git
				synced 2025-04-10 19:15:14 +00:00 
			
		
		
		
	
		
			
	
	
		
			131 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			131 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|   | #ifndef C4_YML_DETAIL_PRINT_HPP_
 | ||
|  | #define C4_YML_DETAIL_PRINT_HPP_
 | ||
|  | 
 | ||
|  | #include "c4/yml/tree.hpp"
 | ||
|  | #include "c4/yml/node.hpp"
 | ||
|  | 
 | ||
|  | 
 | ||
|  | namespace c4 { | ||
|  | namespace yml { | ||
|  | 
 | ||
|  | C4_SUPPRESS_WARNING_GCC_CLANG_WITH_PUSH("-Wold-style-cast") | ||
|  | 
 | ||
|  | inline size_t print_node(Tree const& p, size_t node, int level, size_t count, bool print_children) | ||
|  | { | ||
|  |     printf("[%zd]%*s[%zd] %p", count, (2*level), "", node, (void const*)p.get(node)); | ||
|  |     if(p.is_root(node)) | ||
|  |     { | ||
|  |         printf(" [ROOT]"); | ||
|  |     } | ||
|  |     printf(" %s:", p.type_str(node)); | ||
|  |     if(p.has_key(node)) | ||
|  |     { | ||
|  |         if(p.has_key_anchor(node)) | ||
|  |         { | ||
|  |             csubstr ka = p.key_anchor(node); | ||
|  |             printf(" &%.*s", (int)ka.len, ka.str); | ||
|  |         } | ||
|  |         if(p.has_key_tag(node)) | ||
|  |         { | ||
|  |             csubstr kt = p.key_tag(node); | ||
|  |             csubstr k  = p.key(node); | ||
|  |             printf(" %.*s '%.*s'", (int)kt.len, kt.str, (int)k.len, k.str); | ||
|  |         } | ||
|  |         else | ||
|  |         { | ||
|  |             csubstr k  = p.key(node); | ||
|  |             printf(" '%.*s'", (int)k.len, k.str); | ||
|  |         } | ||
|  |     } | ||
|  |     else | ||
|  |     { | ||
|  |         RYML_ASSERT( ! p.has_key_tag(node)); | ||
|  |     } | ||
|  |     if(p.has_val(node)) | ||
|  |     { | ||
|  |         if(p.has_val_tag(node)) | ||
|  |         { | ||
|  |             csubstr vt = p.val_tag(node); | ||
|  |             csubstr v  = p.val(node); | ||
|  |             printf(" %.*s '%.*s'", (int)vt.len, vt.str, (int)v.len, v.str); | ||
|  |         } | ||
|  |         else | ||
|  |         { | ||
|  |             csubstr v  = p.val(node); | ||
|  |             printf(" '%.*s'", (int)v.len, v.str); | ||
|  |         } | ||
|  |     } | ||
|  |     else | ||
|  |     { | ||
|  |         if(p.has_val_tag(node)) | ||
|  |         { | ||
|  |             csubstr vt = p.val_tag(node); | ||
|  |             printf(" %.*s", (int)vt.len, vt.str); | ||
|  |         } | ||
|  |     } | ||
|  |     if(p.has_val_anchor(node)) | ||
|  |     { | ||
|  |         auto &a = p.val_anchor(node); | ||
|  |         printf(" valanchor='&%.*s'", (int)a.len, a.str); | ||
|  |     } | ||
|  |     printf(" (%zd sibs)", p.num_siblings(node)); | ||
|  | 
 | ||
|  |     ++count; | ||
|  | 
 | ||
|  |     if(p.is_container(node)) | ||
|  |     { | ||
|  |         printf(" %zd children:\n", p.num_children(node)); | ||
|  |         if(print_children) | ||
|  |         { | ||
|  |             for(size_t i = p.first_child(node); i != NONE; i = p.next_sibling(i)) | ||
|  |             { | ||
|  |                 count = print_node(p, i, level+1, count, print_children); | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  |     else | ||
|  |     { | ||
|  |         printf("\n"); | ||
|  |     } | ||
|  | 
 | ||
|  |     return count; | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | //-----------------------------------------------------------------------------
 | ||
|  | //-----------------------------------------------------------------------------
 | ||
|  | //-----------------------------------------------------------------------------
 | ||
|  | 
 | ||
|  | inline void print_node(ConstNodeRef const& p, int level=0) | ||
|  | { | ||
|  |     print_node(*p.tree(), p.id(), level, 0, true); | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | //-----------------------------------------------------------------------------
 | ||
|  | //-----------------------------------------------------------------------------
 | ||
|  | //-----------------------------------------------------------------------------
 | ||
|  | 
 | ||
|  | inline size_t print_tree(Tree const& p, size_t node=NONE) | ||
|  | { | ||
|  |     printf("--------------------------------------\n"); | ||
|  |     size_t ret = 0; | ||
|  |     if(!p.empty()) | ||
|  |     { | ||
|  |         if(node == NONE) | ||
|  |             node = p.root_id(); | ||
|  |         ret = print_node(p, node, 0, 0, true); | ||
|  |     } | ||
|  |     printf("#nodes=%zd vs #printed=%zd\n", p.size(), ret); | ||
|  |     printf("--------------------------------------\n"); | ||
|  |     return ret; | ||
|  | } | ||
|  | 
 | ||
|  | C4_SUPPRESS_WARNING_GCC_CLANG_POP | ||
|  | 
 | ||
|  | } /* namespace yml */ | ||
|  | } /* namespace c4 */ | ||
|  | 
 | ||
|  | 
 | ||
|  | #endif /* C4_YML_DETAIL_PRINT_HPP_ */
 |