source: trunk/PerfTest/xerces_markup_stats/xerces_markup_stats.cpp @ 150

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

Include 'fgSAX2CoreNameSpacePrefixes' flag to report namespace prefixes with qnames.

File size: 4.9 KB
Line 
1#include "xerces_markup_stats.hpp"
2
3#include <xercesc/sax2/SAX2XMLReader.hpp>
4#include <xercesc/sax2/XMLReaderFactory.hpp>
5#include <xercesc/sax2/DefaultHandler.hpp>
6#include <xercesc/framework/MemBufInputSource.hpp>
7#include <xercesc/util/OutOfMemoryException.hpp>
8#include <xercesc/util/PlatformUtils.hpp>
9#include <iostream>
10
11#ifndef REPEAT_RUNS
12#define REPEAT_RUNS 1
13#endif
14
15#ifdef PAPI
16#include "../../../code_clocker/clocker/cc.h"
17#include "../../../code_clocker/clocker/cc.cxx"
18
19CC * c;
20#endif
21
22XERCES_CPP_NAMESPACE_USE
23 
24int main(int argc, char* argv[])
25{
26        if (argc != 2) {
27        printf("Usage: %s <filename>\n", argv[0]);
28                exit(-1);
29        }
30       
31        // read the source file name
32        char * src_filename = argv[1]; 
33        char * cmdline = new char[strlen(argv[0]) + strlen(argv[1]) +1 +1]; 
34        strcat(cmdline, argv[0]);
35        strcat(cmdline," ");
36        strcat(cmdline,argv[1]);
37               
38        // read the entire file into a memory buffer   
39        FILE * src_file;
40        struct stat fileinfo;
41        int src_filesize;
42        char * src_buf = NULL;
43        size_t result;
44       
45        // open file and fstat
46        src_file = fopen ( src_filename , "rb" );
47        if(fstat(fileno(src_file), &fileinfo)!=0) {
48                fprintf(stderr, "Cannot fstat '%s'. Terminating the process ...\n", src_filename); 
49                exit(-1);
50        }
51       
52        // allocate memory to contain the whole file
53        src_filesize = fileinfo.st_size;
54        src_buf = (char*) new char[src_filesize];
55        if (src_buf == NULL) 
56        {
57                fprintf(stderr, "Out of memory. Terminating the process ...\n");
58                exit(-1);
59        }
60       
61        // copy the file into the buffer:
62        result = fread (src_buf,1,src_filesize,src_file);
63        if (result != src_filesize) 
64        {
65                fprintf(stderr, "Error reading '%s'. Terminating the process ...\n", src_filename);
66                exit(-1);
67        }
68       
69        // close file
70        fclose (src_file);             
71               
72        try {
73          XMLPlatformUtils::Initialize();
74        }
75        catch (const XMLException& toCatch) {
76                char* message = XMLString::transcode(toCatch.getMessage());
77                std::cout << "Error during initialization! :\n";
78                std::cout << "Exception message is: \n"
79                         << message << "\n";
80                XMLString::release(&message);
81                return 1;
82        }
83
84        // fill the source buffer
85        static const char*  src_buf_id = "XMLData";
86    MemBufInputSource* mem_buf = new MemBufInputSource
87    (
88        (const XMLByte*)src_buf
89        , strlen(src_buf)
90        , src_buf_id
91        , false
92    ); 
93   
94    SAX2XMLReader* parser = XMLReaderFactory::createXMLReader();
95   
96    // Do not perform Namespace processing.
97    parser->setFeature(XMLUni::fgSAX2CoreNameSpacePrefixes, true);
98    parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true);
99
100    MarkupStats* defaultHandler = new MarkupStats();
101    parser->setContentHandler(defaultHandler);
102    parser->setErrorHandler(defaultHandler);
103
104    try {
105   
106        // Parse the file
107                #ifdef PAPI
108                        #define NUM_EVENTS 2
109                        int Events[NUM_EVENTS] = {PAPI_TOT_CYC, PAPI_BR_MSP};
110                        int cal_size = 100;
111                        c = new CC(Events,NUM_EVENTS,cal_size);
112                        c->cc_set_cmd(cmdline);
113                #endif         
114       
115                for (int run = 0; run < REPEAT_RUNS; run++) 
116                {               
117                        #ifdef PAPI
118                                c->cc_start_interval();
119                        #endif         
120               
121                parser->parse(*mem_buf);
122                       
123                        #ifdef PAPI
124                                int elems = src_filesize;
125                                c->cc_end_interval(elems);                     
126                        #endif
127                }
128
129                #ifdef PAPI
130                        c->cc_write_xml_file();
131                        c->cc_display();
132                        delete c;
133                #endif 
134
135                std::cout << std::endl;
136
137                // Display statistics
138                print_stats("comment", comment_count, comment_length);
139                print_stats("CDATA section", CDATA_end_count, CDATA_length);
140                print_stats("processing instruction", PI_count, PI_length);
141                //print_stats("empty element", empty_elem_count, empty_elem_length);
142                print_stats("start tag + empty element", start_tag_count, start_tag_length);
143                printf("%i total attributes\n", attribute_count);
144                print_stats("attribute names + namespace name", total_attribute_count, total_att_name_length);
145                print_stats("attribute values + namespace URI", total_attribute_count, total_att_value_length);
146                //print_stats("namespace name", namespace_count, total_namespace_name_length);
147                //print_stats("namespace URI", namespace_count, total_namespace_URI_length);
148                print_stats("end tag", end_tag_count, end_tag_length);
149                print_stats("text item", text_item_count, text_item_length);
150                print_stats("reference", reference_count, reference_length);
151                print_stats("error item", error_item_count, error_item_length);
152                printf("Maximum nesting depth = %i\n", max_nesting_depth);
153   
154    }
155    catch (const XMLException& toCatch) {
156        char* message = XMLString::transcode(toCatch.getMessage());
157        std::cout << "Exception message is: \n"
158             << message << "\n";
159        XMLString::release(&message);
160        return -1;
161    }
162    catch (const SAXParseException& toCatch) {
163        char* message = XMLString::transcode(toCatch.getMessage());
164        std::cout << "Exception message is: \n"
165             << message << "\n";
166        XMLString::release(&message);
167        return -1;
168    }
169    catch (...) {
170        std::cout << "Unexpected Exception \n" ;
171        return -1;
172    }
173       
174        delete parser;
175    delete defaultHandler;
176       
177        XMLPlatformUtils::Terminate();
178       
179        return 0;
180}
181
Note: See TracBrowser for help on using the repository browser.