source: proto/gml2svg/C/xerces/gml2svg.cpp @ 2855

Last change on this file since 2855 was 2855, checked in by ksherdy, 7 years ago

Modified gml2svg app to support fine-grained application PMC events.

File size: 8.9 KB
Line 
1/*
2    gml2svg.cpp
3    Copyright (C) 2007, 2008, 2011, 2012
4                Ken Herdy
5    Version 0.9
6    Licensed to the public under the Open Software License 3.0.
7*/
8
9#include <xercesc/sax2/SAX2XMLReader.hpp>
10#include <xercesc/sax2/XMLReaderFactory.hpp>
11#include <xercesc/sax2/DefaultHandler.hpp>
12#include <xercesc/util/XMLString.hpp>
13#include <sstream>
14#include <perfsec.h>
15
16#include <cc.h>
17//#include <cc.cxx>
18
19
20#include "gml2svg_handler.hpp"
21#include <gml2svg/vancouver_constants.h>
22#include <gml2svg/util.h>
23#include <sys/stat.h>
24#include <stdio.h>
25#include <float.h>
26#include <unistd.h>
27#include <errno.h>
28#include <linux/errno.h>
29extern int errno;
30
31
32
33#include <iostream>
34using namespace std;
35
36#ifdef BUFFER_PROFILING
37    BOM_Table * timer;
38#elif PAPI
39    CC * timer;
40#else
41    void * timer;
42#endif
43
44const int ITERATIONS = 1;
45const bool SHOW_ITERATION_RESULTS = false;
46
47XERCES_CPP_NAMESPACE_USE
48
49int main (int argc, char* argv[]) {
50
51//       PERF_SEC_BIND(3);
52
53        char * gml_src_dir_path = NULL;
54        char * svg_dest_dir_path = NULL;
55
56        int papi_event;
57
58        if (argc > 2)
59        {
60                /* test GML src dir ends with FILE_SEPARATOR and exists */
61                gml_src_dir_path = new char[strlen(argv[1]) +1 +1];
62                if(gml_src_dir_path == NULL) {fprintf(stderr, "Out of memory. Terminating the process ...\n"); exit(-1);}
63                strcpy(gml_src_dir_path,argv[1]);
64
65                if(gml_src_dir_path[strlen(gml_src_dir_path)-1] != FILE_SEPARATOR)
66                {
67                        gml_src_dir_path[strlen(gml_src_dir_path)] = FILE_SEPARATOR;
68                        gml_src_dir_path[strlen(gml_src_dir_path)] = '\0';
69                        if(!fopen(gml_src_dir_path,"r"))
70                        {
71                                fprintf(stderr, "GML source directory '%s' does not exist. Terminating the process ...\n", gml_src_dir_path); exit(-1);
72                        }
73                }
74
75                /* test SVG dest dir ends with FILE_SEPARATOR and exists */
76                svg_dest_dir_path = new char[strlen(argv[2]) +1 +1];
77                if(svg_dest_dir_path == NULL) {fprintf(stderr, "Out of memory. Terminating the process ...\n"); exit(-1);}
78                strcpy(svg_dest_dir_path,argv[2]);
79
80                if(svg_dest_dir_path[strlen(svg_dest_dir_path)-1] != FILE_SEPARATOR)
81                {
82                        svg_dest_dir_path[strlen(svg_dest_dir_path)] = FILE_SEPARATOR;
83                        svg_dest_dir_path[strlen(svg_dest_dir_path)] = '\0';
84                        if(!fopen(svg_dest_dir_path,"r"))
85                        {
86                                errno = 0;
87                                static mode_t mode = 0755;
88                                if(mkdir(svg_dest_dir_path,mode)<0)
89                                {
90                                        fprintf(stderr,"Cannot create SVG destination directory '%s'. Terminating the proecess ...\n",svg_dest_dir_path);
91                                }
92                        }
93                }
94               
95                #if defined (PAPI) 
96
97                if(argc == 4) {
98                        /* Convert hex string PAPI code to unsigned integer */ 
99                        unsigned int temp;
100                        std::stringstream ss;
101                        ss << std::hex << argv[3];
102                        ss >> temp;
103                        papi_event = temp;
104                }
105                else
106                {
107                        fprintf(stderr, "gml2svg <GML SRC DIR> <SVG DEST DIR> [PAPI_EVENT]\n"); exit(-1);
108                }
109
110                #endif
111
112        }
113        else
114        {
115                fprintf(stderr, "gml2svg <GML SRC DIR> <SVG DEST DIR> [PAPI_EVENT]\n"); exit(-1);
116        }
117
118        /* Initialize parser */
119        try {
120            XMLPlatformUtils::Initialize();
121        }
122        catch (const XMLException& toCatch) {
123
124            char* message = XMLString::transcode(toCatch.getMessage());
125            cout << "Error during initialization! :\n";
126            cout << "Exception message is: \n"
127                 << message << "\n";
128            XMLString::release(&message);
129            return 1;
130        }
131
132        /* allocate memory for gml, svg, csv file paths */
133        char * gml_filename = new char[strlen(gml_src_dir_path) + FEATURE_LOCAL_NAMES_MAX_LENGTH_EST + strlen(GML_DOT_EXT) +1];
134        char * svg_filename = new char[strlen(svg_dest_dir_path) + FEATURE_LOCAL_NAMES_MAX_LENGTH_EST + strlen(SVG_DOT_EXT) +1];
135        if(gml_filename == NULL ||  svg_filename == NULL) {fprintf(stderr, "function: main, out of memory. Terminating the process ...\n"); exit(-1);}
136
137        #if defined (PAPI) 
138                #define PAPI_EVENTS_COUNT 1
139                // int papi_event = PAPI_TOT_CYC;
140                int PAPI_EVENTS[1]; 
141                PAPI_EVENTS[0] = papi_event;   
142        #endif
143       
144        PERF_SEC_INIT(timer);
145
146        string cmd_line;
147        for(int i=0;i<argc;i++)
148        {
149                cmd_line += argv[i];
150                cmd_line += " ";
151        }
152
153//      timer->set_cmd(cmd_line);
154
155        int layer_count = FEATURE_LAYER_COUNT; /* ignore point geometries */
156
157        /* Output IO Type */
158        #if !defined(NAIVE_FORMATTED_IO) && !defined(FORMATTED_IO) && !defined(MEMCPY_IO)
159                fprintf(stderr, "IO preprocessor directive '%s' not defined. Terminating the process ...", "NAIVE_FORMATTED_IO | FORMATTERD_IO | MEMCPY_IO"); exit(-1);
160        #endif
161
162        #if defined(NAIVE_FORMATTED_IO)
163                fprintf(stdout,"IO = NAIVE_FORMATTED_IO\n");
164                PERF_SEC_ADD_PARAM(timer, "IO", "NAIVE_FORMATTED_IO");
165        #elif defined(FORMATTED_IO)
166                fprintf(stdout,"IO = FORMATTED_IO\n");
167                PERF_SEC_ADD_PARAM(timer, "IO", "FORMATTED_IO");
168        #elif defined(MEMCPY_IO)
169                fprintf(stdout,"IO = MEMCPY_IO\n");
170                PERF_SEC_ADD_PARAM(timer, "IO", "MEMCPY_IO");
171        #endif
172
173        /* Output World2Screen information */
174        #if defined(WORLD2SCREEN)
175                fprintf(stdout, "World2Screen transformations = true.\n");
176                PERF_SEC_ADD_PARAM(timer, "WORLD2SCREEN", "true");
177        #else
178                fprintf(stdout, "World2Screen transformations = false.\n");
179                PERF_SEC_ADD_PARAM(timer, "WORLD2SCREEN", "false");
180        #endif
181
182        /* Set up Timing */
183        #if defined(NAIVE_FORMATTED_IO) || defined(FORMATTED_IO) || defined(MEMCPY_IO)
184                FILE * stats_file;
185                struct stat fileinfo;
186        #endif
187
188        SAX2XMLReader* parser = XMLReaderFactory::createXMLReader();
189        parser->setFeature(XMLUni::fgSAX2CoreNameSpacePrefixes,true);   // Report the original prefixed names and attributes used for Namespace declarations.
190        parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true);                 // Perform Namespace processing.
191        parser->setFeature(XMLUni::fgSAX2CoreValidation, false);                // Do not report validation errors.
192
193        GML2SVGHandler* defaultHandler = new GML2SVGHandler();
194        parser->setContentHandler(defaultHandler);
195        parser->setErrorHandler(defaultHandler);
196
197        FILE * out_file = NULL;
198        char * out_buf = NULL;
199
200        for(int i=0;i<layer_count;i++)
201        //for(int i=0;i<1;i++)
202        {               
203               
204                /* Set layer specific GML and SVG file paths */
205                strcpy(gml_filename, gml_src_dir_path);
206                strcat(gml_filename, feature_layers[i].lname);
207                strcat(gml_filename,GML_DOT_EXT);
208
209                fprintf(stdout, "Processing GML file: %s.\n", gml_filename);
210                fflush(stdout);
211
212                strcpy(svg_filename,svg_dest_dir_path);
213                strcat(svg_filename,feature_layers[i].lname);
214                strcat(svg_filename,SVG_DOT_EXT);
215
216    PERF_SEC_ADD_PARAM(timer, "Layer", feature_layers[i].lname);
217
218                if(!(out_file = fopen(svg_filename, "w")))
219                {
220                        fprintf(stderr, "Failed to open '%s' for output.  Terminating the process ...\n", svg_filename); exit(-1);
221                }
222
223                for(int j=0;j<ITERATIONS;j++)
224                {
225
226
227
228
229                        #ifdef CC_APP
230                              defaultHandler->SetPerfTimer(timer);
231                        #else
232                              PERF_SEC_START(timer);
233                        #endif
234
235
236                        /* parse */
237                        try {
238
239                                /* Initialize output buffer */
240                                #if defined(NAIVE_FORMATTED_IO) || defined(FORMATTED_IO) || defined(MEMCPY_IO) // BUFFERED_IO
241                                    /* allocate file sized output buffer */
242
243                                        stats_file = fopen(gml_filename, "rb");
244                                        if(stats_file == NULL) {
245                                                fprintf(stderr, "Cannot open '%s'. Terminating the process ...\n", gml_filename); exit(-1);
246                                        }
247
248                                        if(fstat(fileno(stats_file), &fileinfo)!=0) {
249                                                fprintf(stderr, "Error: cannot fstat '%s'. Terminating the process ...\n", gml_filename); exit(-1);
250                                        }
251                                        /* allocate global output buffer memory */
252                                        out_buf = new char[(fileinfo.st_size * 2)];
253                                        fclose(stats_file);
254                                #endif
255
256                                defaultHandler->setOutputBuffer(out_buf);
257
258                                                        defaultHandler->setParameters ( SCREEN_WIDTH,
259                                                                                SCREEN_HEIGHT,
260                                                                                BBOX,
261                                                                                                                        feature_layers[i].lname,
262                                                                                FEATURE_ID_LNAME,
263                                                                                                                        feature_layers[i].lgeometry,
264                                                                                                                        feature_layers[i].style);
265
266                                parser->parse(gml_filename);
267
268                        }
269                        catch (const XMLException& toCatch) {
270                            char* message = XMLString::transcode(toCatch.getMessage());
271                            cerr << "Exception: " << message << ".\n";
272                            XMLString::release(&message);
273                            return -1;
274                        }
275                        catch (const SAXParseException& toCatch) {
276                            char* message = XMLString::transcode(toCatch.getMessage());
277                            cerr << "Exception: " << message << ".\n";
278                            XMLString::release(&message);
279                            return -1;
280                        }
281                        catch (...) {
282                                cerr << "Exception: Unhandled exception.\n";
283                            return -1;
284                        }
285
286                        #ifdef CC_APP
287                                defaultHandler->SetPerfElems(fileinfo.st_size);
288                        #else
289                                PERF_SEC_END(timer, fileinfo.st_size);
290                        #endif
291
292
293                        if(SHOW_ITERATION_RESULTS)
294                        {
295                                fprintf(stdout, "'%s' complete.\n\n",feature_layers[i].lname);
296                        }
297
298                }
299
300                /* Write SVG file */
301                #if defined(NAIVE_FORMATTED_IO) || defined(FORMATTED_IO) || defined(MEMCPY_IO) // BUFFERED_IO
302
303                        fprintf(out_file, "%s", out_buf);
304                        fflush(out_file);
305
306                        if(!out_buf)
307                        {
308                                delete [] out_buf;
309                                out_buf = NULL;
310                        }
311       
312                #endif
313
314                fclose(out_file);
315
316                memset(gml_filename,'\0',strlen(gml_filename));
317                memset(svg_filename,'\0',strlen(svg_filename));
318
319        }
320
321        fprintf(stdout,"\nProcessing complete.\n\n");
322
323        //PERF_SEC_DUMP(timer);
324       
325        PERF_SEC_WRITE(timer);
326
327        if(gml_src_dir_path) {delete [] gml_src_dir_path;}
328        if(gml_filename) {delete [] gml_filename;}
329        if(svg_dest_dir_path) {delete [] svg_dest_dir_path;}
330        if(svg_filename) {delete [] svg_filename;}
331
332        delete parser;
333        delete defaultHandler;
334
335        XMLPlatformUtils::Terminate();
336        return 0;
337}
338
Note: See TracBrowser for help on using the repository browser.