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_ */
 | 
