/xmlbench/trunk

To get this branch, use:
bzr branch http://darksoft.org/webbzr/xmlbench/trunk
3 by Suren A. Chilingaryan
Parsing tests for mono, vtd-xml, lisp, scripting languages
1
#include <stdio.h>
2
#include <sys/time.h>
3
4
#include <vtdGen.h>
5
#include <vtdNav.h>
6
#include <autoPilot.h>
7
8
9
#define PREPARE_XML
10
#include "tools.h"
11
9 by Suren A. Chilingaryan
Implement DOM walking mode for parsing benchmark in fast parsers
12
13
inline double walker_process_node(VTDNav *vn, AutoPilot *ap, char *xml) {
14
    int i;
15
    double res;
16
    char *value;
17
    
18
    i = getText(vn);
19
//    printf("%i %i %i\n", getCurrentIndex(vn), i, getAttrCount(vn));
20
    if (i >= 0) {
21
	res = parseDouble(vn, i);
22
	if ((res)&&(!isnan(res))) {
23
	    return res;
24
	}
25
    }
26
27
    int idx;
28
    int e_idx = getCurrentIndex(vn);
29
    int attrs = getAttrCount(vn);
30
    size_t offset,len;
31
32
    for (i=0,idx=e_idx+1; i<attrs;i++) {
33
	while (getTokenType(vn,idx) !=2) idx++;	// skipping to attribute
34
35
	if (getTokenType(vn,idx+1)==4) {	// if attribute value 
36
	    idx++;
37
	    len = getTokenLength(vn, idx);
38
	    offset = getTokenOffset(vn, idx);
39
	    res = parseDouble(vn, idx);
40
	    if ((res)&&(!isnan(res))) {
41
//	        fwrite((char *)(xml+offset),sizeof(UByte),len,stdout);
42
//		printf("\n");
43
		return res;
44
	    }
45
	}
46
    }
47
/*    
48
    size_t l,offset,len;
49
    if (selectXPath(ap,L"./@*")) {
50
	while (evalXPath(ap)) {
51
	    if (getCurrentIndex(vn)==e_idx) return 0;
52
	    idx = getCurrentIndex(vn);
53
	    len = getTokenLength(vn, idx+1);
54
	    offset = getTokenOffset(vn, idx+1);
55
	    fwrite((char *)(xml+offset),sizeof(UByte),len,stdout);
56
	    
57
	    printf(" - %i %i\n", getCurrentIndex(vn), getTokenType(vn,  getCurrentIndex(vn)+1));
58
	}
59
    }
60
    */
61
    
62
    return 0;
63
}
64
65
double walker(VTDNav *vn, AutoPilot *ap, char *xml) {
66
    int i = 0;
67
    double res = 0;
68
    Boolean ok;
69
70
    push(vn);
71
    for (ok = 1; ok; ok = toElement(vn, NEXT_SIBLING)) {
72
	if (++i>3) break;
73
    }
74
    pop(vn);
75
    
76
    if (i<=3) i = 0;
77
78
    for (ok = 1; ok; ok = toElement(vn, NEXT_SIBLING)) {
79
	if (i) {
80
	    res += walker_process_node(vn,ap,xml);
81
	}
82
83
	push(vn);
84
	if (toElement(vn, FIRST_CHILD)) {
85
	    res+=walker(vn,ap,xml);
86
	}
87
	pop(vn);
88
    }
89
    return res;
90
}
91
92
93
3 by Suren A. Chilingaryan
Parsing tests for mono, vtd-xml, lisp, scripting languages
94
struct exception_context the_exception_context[1];
95
96
int pre_mode = 0;
97
VTDGen *vg = NULL;
98
char *idxbuf;
99
int idxlen;
100
101
void initXML(struct TestData *td) {
102
//    if (getenv("allow_deferring")) deferring_mode = 1;
103
    if (getenv("allow_preprocessing")) pre_mode = 1;
104
105
    vg = createVTDGen();
106
}
107
108
void releaseXML(struct TestData *td) {
109
    freeVTDGen(vg);
110
}
111
112
void preparseXML(struct TestData *td, unsigned long iter) {
113
    FILE *f;
114
    if (pre_mode) {
115
	setDoc(vg,td->xml,td->xmllen);
116
	parse(vg,1);
117
	
118
	f = fopen("/tmp/vtdxml.test", "w");
119
	if (!f) {
120
	    printf("Can't write temporary file\n");
121
	    exit(1);
122
	}
123
	writeIndex(vg, f);
124
	fclose(f);
125
	idxbuf = ReadFile("/tmp/vtdxml.test");
126
	clear(vg);
127
    }
128
}
129
130
void postparseXML(struct TestData *td, unsigned long iter) {
131
    if (pre_mode) {
132
	free(idxbuf);
133
    }
134
}
135
136
137
void parseXML(struct TestData *td, unsigned long iter) {
138
    VTDNav *vn;
139
140
    if (pre_mode) {
141
	vn = loadIndex2(vg, idxbuf + sizeof(unsigned long), (*(unsigned long*)idxbuf));
142
    } else {
143
	// This destructs original string
144
	setDoc(vg,td->xml,td->xmllen);
145
	parse(vg,1);
146
	vn = getNav(vg);
147
    }
148
    
9 by Suren A. Chilingaryan
Implement DOM walking mode for parsing benchmark in fast parsers
149
    if (walk_tree) {
150
	AutoPilot *ap = NULL;//createAutoPilot2();
151
	double res;
152
//	bind (ap, vn);
153
	toElement(vn, ROOT);
154
	toElement(vn, FIRST_CHILD);
155
	res = walker(vn,ap,td->xml);
156
//	freeAutoPilot(ap);
13 by Suren A. Chilingaryan
LibXML Pull Parser, FAXPP Parser, Mono security benchmark, multiple fixes
157
//	printf("Sum: %lf\n", res);
9 by Suren A. Chilingaryan
Implement DOM walking mode for parsing benchmark in fast parsers
158
    }
159
    
3 by Suren A. Chilingaryan
Parsing tests for mono, vtd-xml, lisp, scripting languages
160
    freeVTDNav(vn);
161
    //clear(vg); 	// done by getNav
162
163
}
164
165
166
int main(int argc, char *argv[]) {
167
    return Test(argc,argv);
168
}