/xmlbench/trunk

To get this branch, use:
bzr branch http://darksoft.org/webbzr/xmlbench/trunk
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);
}