]> matita.cs.unibo.it Git - helm.git/blob - helm/papers/use_case/stats/stats.cc
* snapshot
[helm.git] / helm / papers / use_case / stats / stats.cc
1
2 #include <vector>
3 #include <cassert>
4 #include <GdomeSmartDOM.hh>
5
6 #include <ext/hash_map>
7
8 namespace DOM = GdomeSmartDOM;
9
10 unsigned n_elements;
11 unsigned n_leaf_elements;
12 unsigned n_text_nodes;
13 unsigned n_blank_text_nodes;
14 unsigned n_attributes;
15 unsigned max_attributes;
16 unsigned max_depth;
17 unsigned max_children;
18 std::hash_map<unsigned,unsigned> depths;
19 std::vector<unsigned> widths;
20
21 bool
22 is_blank(const std::string& s)
23 {
24   for (int i = 0; i < s.length(); i++)
25     if (!isblank(s[i])) return false;
26   return true;
27 }
28
29 void
30 add_depth(unsigned depth)
31 {
32         std::hash_map<unsigned,unsigned>::iterator p = depths.find(depth);
33         if (p != depths.end())
34                 p->end++;
35         else
36                 depths[depth] = 1;
37 }
38
39 void
40 visit(DOM::Node node, unsigned depth)
41 {
42   assert(node);
43
44   max_depth = std::max(max_depth, depth);
45
46   switch (node.get_nodeType())
47     {
48     case DOM::Node::ELEMENT_NODE:
49       {
50         n_elements++;
51         const unsigned n_attrs = node.get_attributes().get_length();
52         n_attributes += n_attrs;
53         max_attributes = std::max(max_attributes, n_attrs);
54         if (!node.get_firstChild()) n_leaf_elements++;
55       }
56       break;
57     case DOM::Node::TEXT_NODE:
58       n_text_nodes++;
59       if (is_blank(node.get_nodeValue())) n_blank_text_nodes++;
60       break;
61     case DOM::Node::ATTRIBUTE_NODE:
62       break;
63     }
64
65   unsigned n_children = 0;
66   for (DOM::Node p = node.get_firstChild(); p; p = p.get_nextSibling())
67     {
68       visit(p, depth + 1);
69       n_children++;
70     }
71   max_children = std::max(max_children, n_children);
72
73   if (!node.get_firstChild())
74     depths.push_back(depth);
75   else
76     widths.push_back(n_children);
77 }
78
79 void
80 print_results(const std::string& URI)
81 {
82   unsigned tot_depth = 0;
83   for (std::vector<unsigned>::const_iterator p = depths.begin(); p != depths.end(); p++)
84           tot_depth += *p;
85   
86   unsigned tot_width = 0;
87   for (std::vector<unsigned>::const_iterator p = widths.begin(); p != widths.end(); p++)
88           tot_width += *p;
89
90   std::cout << "<stats for=\"" << URI << "\">" << std::endl;
91   std::cout << "  <depth>" << std::endl;
92   std::cout << "    <max>" << max_depth << "</max>" << std::endl;
93   std::cout << "    <leaf-avg>" << tot_depth / ((double) depths.size()) << "</leaf-avg>" << std::endl;
94   std::cout << "  </depth>" << std::endl;
95   std::cout << "  <width>" << std::endl;
96   std::cout << "    <max>" << max_children << "</max>" << std::endl;
97   std::cout << "    <inner-avg>" << tot_width / ((double) widths.size()) << "</inner-avg>" << std::endl;
98   std::cout << "  </width>" << std::endl;  
99   std::cout << "  <elements>" << std::endl;
100   std::cout << "    <total>" << n_elements << "</total>" << std::endl;
101   std::cout << "    <leaf>" << n_leaf_elements << "</leaf>" << std::endl;
102   std::cout << "  </elements>" << std::endl;
103   std::cout << "  <text-nodes>" << std::endl;
104   std::cout << "    <total>" << n_text_nodes << "</total>" << std::endl;
105   std::cout << "    <blank>" << n_blank_text_nodes << "</blank>" << std::endl;
106   std::cout << "  </text-nodes>" << std::endl;
107   std::cout << "  <attributes>" << std::endl;
108   std::cout << "    <total>" << n_attributes << "</total>" << std::endl;
109   std::cout << "    <max>" << max_attributes << "</max>" << std::endl;
110   std::cout << "  </attributes>" << std::endl;
111   std::cout << "</stats>" << std::endl;
112 }
113
114 int
115 main(int argc, char* argv[])
116 {
117   if (argc != 2) {
118     std::cerr << "Usage: stats <URI>" << std::endl;
119     return -1;
120   }
121
122   DOM::DOMImplementation di;
123   DOM::Document doc = di.createDocumentFromURI(argv[1]);
124   visit(doc, 0);
125   print_results(argv[1]);
126 }