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

Last change on this file since 2827 was 2827, checked in by ksherdy, 6 years ago

Updated test script.

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