source: trunk/PerfTest/expat_markup_stats/expat_markup_stats.c @ 144

Last change on this file since 144 was 144, checked in by ksherdy, 11 years ago

Create PerfTest? directory. Add Expat and Xerces-C based markup_stats applications.

File size: 5.8 KB
Line 
1#include <expat.h>
2#include <sys/stat.h>
3#include <unistd.h>
4#include <stdlib.h>
5#include <stdio.h>
6#include <iostream>
7using namespace std;
8
9#ifndef REPEAT_RUNS
10#define REPEAT_RUNS 3
11#endif
12
13#ifdef PAPI
14#include "../../code_clocker/clocker/cc.h"
15#include "../../code_clocker/clocker/cc.cxx"
16
17CC * code_clocker;
18
19#endif
20
21int comment_count = 0;
22int comment_length = 0;
23int CDATA_start_count = 0;
24int CDATA_start_pos = 0;
25int CDATA_length = 0;
26int CDATA_end_count = 0;
27int PI_count = 0;
28int PI_length = 0;
29//int empty_elem_count = 0;
30//int empty_elem_length = 0;
31int start_tag_count = 0;
32int start_tag_length = 0;
33int attribute_count = 0;
34int end_tag_count = 0;
35int end_tag_length = 0;
36int reference_count = 0;
37int reference_length = 0;
38int text_item_count = 0;
39int text_item_length = 0;
40//int error_item_count = 0;
41//int error_item_length = 0;
42int nesting_depth = 0;
43int max_nesting_depth = 0;
44int total_attribute_count = 0;
45int total_att_name_length = 0;
46int total_att_value_length = 0;
47//int namespace_count = 0;
48int total_namespace_name_length = 0;
49//int total_namespace_URI_length = 0;
50
51void startElementHandler(void *data, const char *el, const char **attr) 
52{
53        start_tag_count += 1;
54       
55        #if defined(CALC_AVG)
56                start_tag_length += strlen(el);
57        #endif
58       
59       
60        nesting_depth += 1;
61        if (nesting_depth > max_nesting_depth) max_nesting_depth = nesting_depth;       
62
63        for (int i = 0; attr[i]; i += 2) 
64        {
65                total_attribute_count += 1;
66               
67                #if defined(CALC_AVG)
68                        total_att_name_length += strlen(attr[i]);
69                        total_att_value_length += strlen(attr[i+1]);
70                #endif         
71               
72        }       
73       
74} 
75
76void endElementHandler(void *data, const char *name) 
77{
78        end_tag_count +=1;
79        nesting_depth -= 1;
80       
81        #if defined(CALC_AVG)
82                end_tag_length += strlen(name);
83        #endif
84} 
85
86void CharacterDataHandler(void *userData, const XML_Char *s, int len)
87{
88        text_item_count +=1;
89       
90        #if defined(CALC_AVG)
91                text_item_length += len;
92        #endif
93}
94
95void CommentHandler(void *userData, const XML_Char *data)
96{
97        comment_count +=1;
98       
99        #if defined(CALC_AVG)
100                comment_length += strlen(data);
101        #endif
102}
103
104void ProcessingInstructionHandler(void *userData, const XML_Char *target, const XML_Char *data)
105{
106        PI_count +=1;
107       
108        #if defined(CALC_AVG)
109                PI_length += strlen(data);
110        #endif
111}
112
113void StartCdataSectionHandler(void *userData)
114{
115        CDATA_start_count +=1;
116}
117
118void EndCdataSectionHandler(void *userData)
119{
120        CDATA_end_count +=1;
121}
122
123
124#define print_stats(stat_string, count, total_lgth) \
125        printf("%i %s", count, stat_string);\
126        if (count == 0) printf("s.\n");\
127        else if (count == 1) printf(" of length %i.\n", total_lgth);\
128        else printf("s of avg. lgth %i.\n", total_lgth/count);
129
130int main(int argc, char * argv[])
131{
132
133        if (argc != 2) {
134        printf("Usage: %s <filename>\n", argv[0]);
135                exit(-1);
136        }
137        char * src_filename = argv[1];
138        char * cmdline = new char[strlen(argv[0]) + strlen(argv[1]) +1 +1]; 
139        strcat(cmdline, argv[0]);
140        strcat(cmdline," ");
141        strcat(cmdline,argv[1]);
142       
143        #ifdef PAPI
144                #define NUM_EVENTS 2
145                int Events[NUM_EVENTS] = {PAPI_TOT_CYC, PAPI_BR_MSP};
146                int cal_size = 1000;
147                code_clocker = new CC(Events,NUM_EVENTS,cal_size);
148                code_clocker->cc_set_cmd(cmdline);
149        #endif 
150       
151        // read the entire file into a memory buffer   
152        FILE * src_file;
153        struct stat fileinfo;
154        int src_filesize;
155        char * src_buf = NULL;
156        size_t result;
157       
158        // open file and fstat
159        src_file = fopen ( src_filename , "rb" );
160        if(fstat(fileno(src_file), &fileinfo)!=0) {
161                fprintf(stderr, "Cannot fstat '%s'. Terminating the process ...\n", src_filename); 
162                exit(-1);
163        }
164       
165        // allocate memory to contain the whole file
166        src_filesize = fileinfo.st_size;
167        src_buf = (char*) new char[src_filesize];
168        if (src_buf == NULL) 
169        {
170                fprintf(stderr, "Out of memory. Terminating the process ...\n");
171                exit(-1);
172        }
173       
174        // copy the file into the buffer:
175        result = fread (src_buf,1,src_filesize,src_file);
176        if (result != src_filesize) 
177        {
178                fprintf(stderr, "Error reading '%s'. Terminating the process ...\n", src_filename);
179                exit(-1);
180        }
181       
182        // close file
183        fclose (src_file);
184
185        for (int run = 0; run < REPEAT_RUNS; run++) 
186        {       
187                const XML_Char * encoding = "UTF-8";   
188                XML_Parser parser = XML_ParserCreate(encoding);
189         
190                XML_SetElementHandler(parser, startElementHandler, endElementHandler);
191                XML_SetCharacterDataHandler(parser, CharacterDataHandler);     
192                XML_SetProcessingInstructionHandler(parser, ProcessingInstructionHandler);
193                XML_SetCommentHandler(parser, CommentHandler);
194                XML_SetCdataSectionHandler(parser, StartCdataSectionHandler, EndCdataSectionHandler);
195       
196                #ifdef PAPI
197                        code_clocker->cc_start_interval();
198                #endif
199               
200                int done = 1;
201                XML_Parse(parser, src_buf, src_filesize, done); 
202       
203                #ifdef PAPI
204                        int elems = src_filesize;
205                        code_clocker->cc_end_interval(elems);
206                #endif
207       
208                XML_ParserFree(parser);
209                printf("Run %i complete.\n", run);     
210        }
211       
212        #ifdef PAPI
213                code_clocker->cc_write_xml_file();
214                code_clocker->cc_display();
215                delete code_clocker;
216        #endif         
217
218        // clean up
219        delete [] src_buf;
220               
221        // print stats
222        print_stats("comment", comment_count, comment_length);
223        print_stats("CDATA section", CDATA_end_count, CDATA_length);
224        print_stats("processing instruction", PI_count, PI_length);
225        //print_stats("empty element", empty_elem_count, empty_elem_length);
226        print_stats("start tag + empty element", start_tag_count, start_tag_length);
227        printf("%i total attributes + namespaces\n", attribute_count);
228        print_stats("attribute name", total_attribute_count, total_att_name_length);
229        print_stats("attribute value", total_attribute_count, total_att_value_length);
230        //print_stats("namespace name", namespace_count, total_namespace_name_length);
231        //print_stats("namespace URI", namespace_count, total_namespace_URI_length);
232        print_stats("end tag", end_tag_count, end_tag_length);
233        print_stats("text item", text_item_count, text_item_length);
234        print_stats("reference", reference_count, reference_length);
235        //print_stats("error item", error_item_count, error_item_length);
236        printf("Maximum nesting depth = %i\n", max_nesting_depth);
237
238        return 0;
239}
Note: See TracBrowser for help on using the repository browser.