1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
module tango_dom;
import tango.io.Stdout;
import tango.text.xml.PullParser;
import Float = tango.text.convert.Float;
import tools;
char types[][] = ["Done", "StartElement", "Attribute", "EndElement", "EndEmptyElement", "Data", "Comment", "CData", "Doctype", "PI", "None"];
extern(C) void initXML(TestData *td) {
}
extern(C) void releaseXML(TestData *td) {
}
void walkXML(TestData *td, uint iter) {
double res_total = 0;
double res_attr[MAX_LEVELS+1];
double res_sum[MAX_LEVELS+1];
int res_count[MAX_LEVELS+1];
int level = 0;
res_count[0] = 0;
XmlTokenType type;
auto parser = new PullParser!(char) (td.xml[0..td.xmllen]);
do {
type = parser.next;
switch(type) {
case XmlTokenType.StartElement:
res_attr[level] = 0;
if (++level == MAX_LEVELS) {
Stdout.formatln("XML structure is too deep, only {} levels are supported\n", MAX_LEVELS);
throw new Exception("XML structure is too deep");
}
res_count[level]=0;
break;
case XmlTokenType.Attribute:
if ((!res_attr[level-1])&&(parser.value)) {
try {
double res = Float.toFloat(parser.value);
if (res) res_attr[level-1] = res;
} catch {
}
}
break;
case XmlTokenType.EndElement:
case XmlTokenType.EndEmptyElement:
if (res_count[level] > 3) {
res_total += res_sum[level];
}
--level;
if (res_count[level]) {
res_sum[level]+=res_attr[level];
} else {
res_sum[level]=res_attr[level];
}
++res_count[level];
break;
case XmlTokenType.Data:
if (parser.value) {
try {
double res = Float.toFloat(parser.value);
if (res) res_attr[level-1] = res;
} catch {
}
}
break;
default:
}
} while (type);
// Stdout.formatln("Sum {}", res_total);
}
extern(C) void parseXML(TestData *td, uint iter) {
XmlTokenType type;
if (get_walk_mode()) {
return walkXML(td, iter);
}
auto parser = new PullParser!(char) (td.xml[0..td.xmllen]);
do {
type = parser.next;
// Stdout.format("{}: {} {}\n", types[type], parser.name, parser.value);
} while (type);
}
void main(char[][] args)
{
DTest(args);
}
|