source: branches/parabix-svgopen-2008/gml2svg.cxx @ 217

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

Add to version control.

File size: 57.9 KB
Line 
1/*  gml2svg.cxx - Parabix based GML2SVG microbenchmark.
2    Copyright (c) 2008, Ken Herdy.
3    Licensed to the public under the Open Software License 3.0.
4    Licensed to International Characters, Inc., under the Academic
5    Free License 3.0.
6*/
7/*
8        ==========================
9        GML2SVG Preprocessor Flags
10        ==========================
11
12        WORLD2SCREEN            - perform explicit GML world to SVG screen coordinates conversions, otherwise
13                                                  write raw source GML coordinate string to the output buffer with conversion performed
14                                                  at the client side via the SVG scale() and translate() methods.
15
16        NAIVE_FORMATTED_IO      - sprintf formatted IO, const char * constants written to output char * memory buffer (character array)
17
18        FORMATTED_IO            - sprintf formatted IO, cstring literals intermixed with per run values written to output
19                              char * memory buffer (character array),
20
21        MEMCPY_IO                       - memcpy, direct copy of memory from one block to output char * memory buffer (character array),
22                              output buffer flushed once at the end of each iteration
23
24        SIMD_IO                         - SIMD based IO
25
26        BUFFERED_MEMCPY_IO  - memcpy, direct copy of memory from one block to output char * memory buffer (character array),
27                              output buffer flushed with each call to FinalizeBuffer_action and at DocumentEnd_action
28
29        DIGIT_AND_HEX_ITEMS - generate Parabix digit and hex streams to allow the use of Parabix engine based GML2SVG coordinate conversion
30
31        TIME                            - instrument gml2svg code
32
33        SYSTEM_TIME             - CPU based (clock_t) timing, results written to CSV,
34                              see http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_19.html#SEC310,
35
36                              approximate resolution 10000 microseconds,
37                              see http://www.ncsa.uiuc.edu/UserInfo/Resources/Hardware/IBMp690/Doc/Timing_Profiling.html
38
39        PAPI                            - CPU based (RDTSC, non-serializing), results written to CSV or XML
40
41        -------------------------------
42        Additional Implementation Notes
43        -------------------------------
44
45        An output char * buffer of size equal to double the input file size is allocated at the beginning of
46        each of run for each of the following IO preprocessor flags: NAIVE_FORMATTED_IO, FORMATTED_IO, MEMCPY_IO, SIMD_IO
47        The output buffer is flushed at the end of each run and the results are written to file.
48
49        File input is timed. File output is not timed.
50
51        An output char * buffer for BUFFER_SIZE as defined by the Parabix engine is allocated by the engine and
52        results are written to file as described above.
53
54        File input is timed. File output in this case is also timed.
55
56        See style_ext.h for additional information on SVG2GML coordinate conversion assumptions, grammar breakdown, etc...
57
58        =====================================
59        GML2SVG Translation Control Constants
60        =====================================
61
62    ITERATIONS                                  - number GML2SVG translations performed
63
64        SHOW_ITERATION_RESULTS          - show per iteration timing results
65
66        ILAX_COORDS_TO_PATH                     - BUFFERED_MEMCPY_IO, MEMCPY_IO, SIMD_IO use the ilax_coords_to_path method to perform
67                                                                  coordinate conversion within the StartTag_action routine matching gml:coordinates since
68                                                                  the internal buffer position in the engine correctly points to the next text nodes in the
69                                                                  source GML document to begin conversion. The ilax_coords_to_path method parses and validates
70                                                                  source GML coordinate stream and writes the SVG coordinate result stream with a single leading M
71                                                                  moveto command letter and single L line to command letter.
72
73                                                                  NAIVE_FORMATTED_IO, FORMATTED_IO use style_ext.h conversion methods.
74
75                                                                  Important: coords_to_path (no WORLD2SCREEN conversion) has the option to
76                                                                                         memcpy all text past the initial coordinate pair (M 1st coordinate pair L
77                                                                                         remainder of coordinate pairs). This optimization expects valid GML
78                                                                                         coordinate string input to produce valid destination SVG path text.
79
80                                                                  Important: Decimal digits.
81
82
83                                                                  coords_to_path_strtod outputs a number of decimal digits equivalent to the original
84                                                                  FreeStyler application.
85
86                                                                  gml2svg outputs scale values to match the StyleExt.java implementation and to allow
87                                                                  direct comparison of file sizes.
88
89                                                                  Reduced IO cost can be acheived via reducing the number of decimal digits reported as
90                                                                  suggested by Sony Erikson.
91
92*/
93
94unsigned long coordinates_count = 0ul;
95
96#include <stdio.h>
97#include <stdlib.h>
98#include <string.h>
99#include <errno.h>
100#include <sys/types.h>
101#include <sys/stat.h>
102#include <unistd.h>
103#include <string>
104#include <iostream>
105using namespace std;
106
107#include "src/engine.h"
108
109/* Internals */
110#include "src/xmlmodel.h"
111#include "src/xml_error.h"
112#include "src/bitplex.h"
113#include "src/byteplex.h"
114#include "src/xmldecl.h"
115#include "src/bitlex.h"
116#include "src/xmlmodel.c"
117#include "src/xml_error.c"
118#include "src/bitplex.c"
119#include "src/byteplex.c"
120#include "src/xmldecl.c"
121#include "src/bitlex.c"
122#include "src/engine.c"
123#include "src/symtab.c"
124
125#include "vancouver_constants.h"
126#include "gml2svg_constants.h"
127#include "gml2svg_util.h"
128#include "style_ext.h"
129#include <string.h>
130#include <float.h>
131#include <linux/errno.h>
132#include <vector>
133
134#if defined(PAPI)
135        #include "cc.h"
136        CC * code_clocker;
137#endif
138
139extern int errno;
140
141/* Runtime mode flags */
142const int ITERATIONS = 1;
143const bool SHOW_ITERATION_RESULTS = false;
144
145/* Global variable declarations */
146Parser_Interface * parser;
147
148/* SVG destination file handle */
149FILE * _out_file = NULL;
150
151/* SVG output buffer */
152char * _out_buf = NULL;
153char * _out_buf_start = NULL;
154unsigned long int _out_buf_pos = 0;
155unsigned long int _out_buf_size = 0;
156
157// TEMP FIX - buffered characters
158char * _coords_buf = NULL;
159unsigned int _coords_buf_size = 0;
160unsigned int _total_mallocs = 0;
161unsigned int _total_reallocs = 0;
162
163unsigned int _gml_coords_byte_count = 0;
164
165/* gml2svg transformation variables */
166char * _width = NULL;
167char * _height = NULL;
168double _sum_y = 0.0;
169double _scale_x = 0.0;
170double _scale_y = 0.0;
171double _x1 = 0.0;
172double _y1 = 0.0;
173double _x2 = 0.0;
174double _y2 = 0.0;
175
176// Namespace support variables
177char * _APP_NS_URI = NULL;
178char * _GML_NS_URI = NULL;
179char * _feature_qname = NULL;
180char * _feature_id_qname = NULL;
181char * _geometry_qname = NULL;
182char * _style_string = NULL;
183char * _feature_id = NULL;
184
185char _crt_decimal = DEFAULT_DECIMAL;
186char _crt_cs = DEFAULT_CS;
187char _crt_ts = DEFAULT_TS;
188
189bool _in_feature = false;
190bool _in_geometry = false;
191bool _in_gml_coordinates = false;
192
193/* Helper method declarations */
194
195/* free_globals: De-allocates global variables. */
196static void free_globals();
197
198static void init();
199
200/* set_parameters: Initializes GML layer specific parsing variables.
201 * returns 0 on success
202 */
203static int set_parameters (  const char * screen_width,
204                                                         const char * screen_height,
205                                                         const char * bbox,
206                                                         const char * feature_lname,
207                                                         const char * feature_id_lname,
208                                                         const char * geometry_lname,
209                                                         const char * style_string);
210
211static inline int emit_str(char ** dest, unsigned long int * dest_size, const char * src, size_t src_size);
212
213static void print_error(const char * file, const char * function, const int line, const char * msg);
214
215/* Parsing Event Handlers */
216template <class B>
217inline void ParsingEngine<B>::DocumentStart_action()
218{
219        ::_in_feature = false;
220        ::_in_geometry = false;
221        ::_in_gml_coordinates = false;
222
223        //::_gml_coords_byte_count = 0;
224
225        // emit SVG top level element
226        #if defined(NAIVE_FORMATTED_IO)
227
228        ::_out_buf_pos += sprintf(&(::_out_buf[::_out_buf_pos]),"%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"
229                                                                                                                  ,SVG_START_ELEMENT
230                                                                                                                  ,SPACE
231                                                                                                                  ,XML_NAMESPACE_ATTR
232                                                                                                                  ,EQUALS
233                                                                                                                  ,DQUOTE
234                                                                                                                  ,SVG_NAMESPACE_VALUE
235                                                                                                                  ,DQUOTE
236                                                                                                                  ,SPACE
237                                                                                                                  ,SVG_WIDTH_ATTR
238                                                                                                                  ,EQUALS
239                                                                                                                  ,DQUOTE
240                                                                                                                  ,::_width
241                                                                                                                  ,DQUOTE
242                                                                                                                  ,SPACE
243                                                                                                                  ,SVG_HEIGHT_ATTR
244                                                                                                                  ,EQUALS
245                                                                                                                  ,DQUOTE
246                                                                                                                  ,::_height
247                                                                                                                  ,DQUOTE
248                                                                                                                  ,RANGLE);
249
250        #elif defined(FORMATTED_IO)
251
252                ::_out_buf_pos += sprintf(&(::_out_buf[::_out_buf_pos]),"<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"%s\" height=\"%s\">",::_width, ::_height);
253
254        #elif defined(MEMCPY_IO) || defined(BUFFERED_MEMCPY_IO) || defined(SIMD_IO)
255
256                ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"",sizeof("<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"")-1);
257                ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, ::_width, strlen(::_width));
258                ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, "\" height=\"", sizeof("\" height=\"")-1);
259                ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, ::_height, strlen(::_height));
260                ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, "\">", sizeof("\">")-1);
261
262        #endif
263
264        #if defined(WORLD2SCREEN)
265
266                // emit SVG group element without SVG based translation and scaling
267        #if defined(NAIVE_FORMATTED_IO)
268
269                        ::_out_buf_pos += sprintf(&(::_out_buf[::_out_buf_pos]),"%s%s%s%s%s%s%s%s"
270                                                                                                                      ,G_START_ELEMENT
271                                                                                                                          ,SPACE
272                                                                                                                  ,PATH_STYLE_ATTR
273                                                                                                                  ,EQUALS
274                                                                                                                  ,DQUOTE
275                                                                                                                  ,::_style_string
276                                                                                                                  ,DQUOTE
277                                                                                                                          ,RANGLE);
278
279        #elif defined(FORMATTED_IO)
280
281                        ::_out_buf_pos += sprintf(&(::_out_buf[::_out_buf_pos]),"<g style=\"%s\">",::_style_string);
282
283        #elif defined(MEMCPY_IO) || defined(BUFFERED_MEMCPY_IO) || defined(SIMD_IO)
284
285                        ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, "<g style=\"", sizeof("<g style=\"")-1);
286                ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, ::_style_string, strlen(::_style_string));
287                ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, "\">", sizeof("\">")-1);
288
289        #endif
290
291                #if defined(BUFFERED_MEMCPY_IO)
292
293                fwrite(::_out_buf_start, 1, ::_out_buf_pos, ::_out_file);
294                fflush(::_out_file);
295                ::_out_buf = ::_out_buf_start;
296                ::_out_buf_pos = 0;
297                ::_out_buf_size = BUFFER_SIZE;
298
299        #endif
300
301        #else
302
303        // emit SVG group element with SVG based translation and scaling
304        char * scale_x = new char [DBL_DIG + DBL_MANT_DIG + 1];
305        char * scale_y = new char [DBL_DIG + DBL_MANT_DIG + 1];
306        char * x1 = new char [DBL_DIG + DBL_MANT_DIG + 1];
307        char * y2 = new char [DBL_DIG + DBL_MANT_DIG + 1];
308
309                #if defined(NAIVE_FORMATTED_IO)
310
311                        sprintf(scale_x, ::SCALE_FORMAT, ::_scale_x);
312                        sprintf(scale_y, ::SCALE_FORMAT, ::_scale_y * -1.0);
313                        sprintf(x1,"%f", ::_x1 * -1.0);
314                        sprintf(y2,"%f", ::_y2 * -1.0);
315
316                        ::_out_buf_pos += sprintf(&(::_out_buf[::_out_buf_pos]),"%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"
317                                                                                                                              ,G_START_ELEMENT
318                                                                                                                                  ,SPACE
319                                                                                                                                  ,G_TRANSFORM_ATTR
320                                                                                                                                  ,EQUALS
321                                                                                                                                  ,DQUOTE
322                                                                                                                                  ,SCALE
323                                                                                                                                  ,LROUND
324                                                                                                                                  ,scale_x
325                                                                                                                              ,COMMA
326                                                                                                                              ,scale_y
327                                                                                                                              ,RROUND
328                                                                                                                              ,SPACE
329                                                                                                                                  ,TRANSLATE
330                                                                                                                                  ,LROUND
331                                                                                                                                  ,x1
332                                                                                                                                  ,COMMA
333                                                                                                                              ,y2
334                                                                                                                                  ,RROUND
335                                                                                                                                  ,DQUOTE
336                                                                                                                                  ,SPACE
337                                                                                                                          ,PATH_STYLE_ATTR
338                                                                                                                          ,EQUALS
339                                                                                                                          ,DQUOTE
340                                                                                                                          ,::_style_string
341                                                                                                                          ,DQUOTE
342                                                                                                                                  ,RANGLE);
343
344                #elif defined(FORMATTED_IO)
345
346                        // Reduce %5.17f to %5.5f to optimize
347                sprintf(scale_x, ::SCALE_FORMAT, ::_scale_x);
348                sprintf(scale_y, ::SCALE_FORMAT, ::_scale_y * -1.0);
349                sprintf(x1,"%f", ::_x1 * -1.0);
350                sprintf(y2,"%f", ::_y2 * -1.0);
351
352                ::_out_buf_pos += sprintf(&(::_out_buf[::_out_buf_pos]),"<g transform=\"scale(%s,%s) translate(%s,%s)\" style=\"%s\">",scale_x,scale_y,x1,y2,::_style_string);
353
354                #elif defined(MEMCPY_IO) || defined(BUFFERED_MEMCPY_IO) || defined(SIMD_IO)
355
356                sprintf(scale_x, ::SCALE_FORMAT, ::_scale_x);
357                sprintf(scale_y, ::SCALE_FORMAT, ::_scale_y * -1.0);
358                sprintf(x1,"%f", ::_x1 * -1.0);
359                sprintf(y2,"%f", ::_y2 * -1.0);
360
361                ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, "<g transform=\"scale(", sizeof("<g transform=\"scale(")-1);
362                ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, scale_x, strlen(scale_x));
363                ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, ",", sizeof(",")-1);
364                ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, scale_y, strlen(scale_y));
365                        ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, ") translate(", sizeof(") translate(")-1);
366                ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, x1, strlen(x1));
367                ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, ",", sizeof(",")-1);
368                        ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, y2, strlen(y2));
369                        ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, ")\" style=\"", sizeof(")\" style=\"")-1);
370                        ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, ::_style_string, strlen(::_style_string));
371                ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, "\">", sizeof("\">")-1);
372
373                #endif
374
375            #if defined(BUFFERED_MEMCPY_IO)
376
377                fwrite(::_out_buf_start, 1, ::_out_buf_pos, ::_out_file);
378                fflush(::_out_file);
379                ::_out_buf = ::_out_buf_start;
380                ::_out_buf_pos = 0;
381                ::_out_buf_size = BUFFER_SIZE;
382
383            #endif
384
385                delete [] scale_x;
386                delete [] scale_y;
387                delete [] x1;
388                delete [] y2;
389
390        #endif
391
392}
393
394template <class B>
395inline void ParsingEngine<B>::DocumentEnd_action()
396{
397        #if defined(NAIVE_FORMATTED_IO)
398
399                ::_out_buf_pos += sprintf(&(::_out_buf[::_out_buf_pos]),"%s%s",G_END_ELEMENT
400                                                                                                                 ,SVG_END_ELEMENT);
401
402        #elif defined(FORMATTED_IO)
403
404                ::_out_buf_pos += sprintf(&(::_out_buf[::_out_buf_pos]),"</g></svg>");
405
406        #elif defined(MEMCPY_IO) || defined(BUFFERED_MEMCPY_IO) || defined(SIMD_IO)
407
408                ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, "</g></svg>", sizeof("</g></svg>")-1);
409                *::_out_buf = '\0';
410
411        #endif
412
413        #if defined(BUFFERED_MEMCPY_IO)
414
415                fwrite(::_out_buf_start,1,::_out_buf_pos,::_out_file);
416                fflush(::_out_file);
417                ::_out_buf = ::_out_buf_start;
418                ::_out_buf_pos = 0;
419                ::_out_buf_size = BUFFER_SIZE;
420
421        #endif
422}
423
424/* Action routine for an XML comment in "<!--"  "-->" brackets. */
425template <class B>
426inline void ParsingEngine<B>::Comment_action(unsigned char * item, int lgth)
427{
428
429}
430
431/* Action routine for a CDATA section enclosed in "<![CDATA[" and "]]>" brackets. */
432template <class B>
433inline void ParsingEngine<B>::CDATA_start_action(unsigned char * CDATA_ptr)
434{
435
436}
437
438/* Action routine for an XML processing instruction enclosed in "<?" and "?>" brackets. */
439template <class B>
440inline void ParsingEngine<B>::CDATA_end_action(unsigned char * CDATA_end_ptr)
441{
442
443}
444
445/* Action routine for an empty element enclosed in "<" and "/>" brackets. */
446template <class B>
447inline void ParsingEngine<B>::EmptyElement_action(unsigned char * item, int lgth)
448{
449
450}
451
452/* Action routine for an XML processing instruction enclosed in "<?" and "?>" brackets. */
453template <class B>
454inline void ParsingEngine<B>::PI_action(unsigned char * item, int lgth)
455{
456
457}
458
459/* Action routine for a start tag enclosed in "<" and ">" brackets. */
460template <class B>
461inline void ParsingEngine<B>::StartTag_action(unsigned char * item, int lgth)
462{
463        #if defined (ILAX_COORDS_TO_PATH)
464
465                #if defined(FORMATTED_IO)
466                        //TODO - Add FORMATTED_IO Parabix implememtation.
467                #endif
468
469                #if defined(MEMCPY_IO) || defined(BUFFERED_MEMCPY_IO) || defined(SIMD_IO)
470
471                        if(::_in_gml_coordinates)
472                        {
473                                ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, "<path id=\"",sizeof("<path id=\"")-1);
474                                ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, ::_feature_id, strlen(::_feature_id));
475                                ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, "\" d=\"", sizeof("\" d=\"")-1);
476                                ParsingEngine<B>::ilax_coords_to_path(::_crt_ts, ::_crt_cs, ::_crt_decimal);
477                                ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, "\" onmouseover=\"showTooltip(evt)\" onmouseout=\"hideTooltip(evt)\"/>", sizeof("\" onmouseover=\"showTooltip(evt)\" onmouseout=\"hideTooltip(evt)\"/>")-1);
478                        }
479
480                #endif
481
482        #endif
483}
484
485/* Action routine for an end tag enclosed in "</" and ">" brackets. */
486template <class B>
487inline void ParsingEngine<B>::EndTag_action(unsigned char * item, int lgth)
488{
489        #if defined(MORE)
490
491                ::_in_gml_coordinates = false;
492
493        #else
494
495                if(::_in_gml_coordinates)
496                {
497
498                        #if !defined(ILAX_COORDS_TO_PATH)
499
500                                // START TEMP FIX buffered characters
501                                #if defined(NAIVE_FORMATTED_IO)
502                                        ::_out_buf_pos += sprintf(&(::_out_buf[::_out_buf_pos]), "%s%s%s%s%s%s%s%s%s%s%s"
503                                                                                                                                                  ,PATH_START_ELEMENT
504                                                                                                                                                  ,SPACE
505                                                                                                                                                  ,PATH_ID_ATTR
506                                                                                                                                                  ,EQUALS
507                                                                                                                                                  ,DQUOTE
508                                                                                                                                                  ,::_feature_id
509                                                                                                                                                  ,DQUOTE
510                                                                                                                                                  ,SPACE
511                                                                                                                                                  ,PATH_D_ATTR
512                                                                                                                                                  ,EQUALS
513                                                                                                                                                  ,DQUOTE);
514                                        char * svg_path = NULL;
515                                        #if defined(WORLD2SCREEN)
516
517                                                coord_to_path_strtod(&::_sum_y, &::_scale_x, &::_scale_y, &::_x1, &::_y1, ::_crt_cs, ::_coords_buf, ::_coords_buf_size, &svg_path);
518
519                                        #else
520
521                                                coords_to_path(::_crt_ts, ::_crt_cs, ::_coords_buf, ::_coords_buf_size, &svg_path, 0);
522
523                                        #endif
524
525                                        ::_out_buf_pos += sprintf(&(::_out_buf[::_out_buf_pos]),svg_path);
526                                        delete [] svg_path;
527                                        svg_path = NULL;
528
529                                        free(::_coords_buf);
530                                        ::_coords_buf = NULL;
531                                        ::_coords_buf_size = 0;
532
533                                        ::_out_buf_pos += sprintf(&(::_out_buf[::_out_buf_pos]), "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"
534                                                                                                                                                                                                          ,DQUOTE
535                                                                                                                                                                                                          ,SPACE
536                                                                                                                                                                                                          ,PATH_ONMOUSEOVER_ATTR
537                                                                                                                                                                                                          ,EQUALS
538                                                                                                                                                                                                          ,DQUOTE
539                                                                                                                                                                                                          ,PATH_ONMOUSEOVER_VALUE
540                                                                                                                                                                                                          ,DQUOTE
541                                                                                                                                                                                                          ,SPACE
542                                                                                                                                                                                                          ,PATH_ONMOUSEOUT_ATTR
543                                                                                                                                                                                                          ,EQUALS
544                                                                                                                                                                                                          ,DQUOTE
545                                                                                                                                                                                                          ,PATH_ONMOUSEOUT_VALUE
546                                                                                                                                                                                                          ,DQUOTE
547                                                                                                                                                                                                          ,FSLASH
548                                                                                                                                                                                                          ,RANGLE);
549
550                                #elif defined(FORMATTED_IO)
551
552                                        char * svg_path = NULL;
553                                        #if defined(WORLD2SCREEN)
554
555                                                coord_to_path_strtod(&::_sum_y, &::_scale_x, &::_scale_y, &::_x1, &::_y1, ::_crt_cs, ::_coords_buf, ::_coords_buf_size, &svg_path);
556
557                                        #else
558
559                                                coords_to_path(::_crt_ts, ::_crt_cs, ::_coords_buf, ::_coords_buf_size, &svg_path, 0);
560
561                                        #endif
562
563                                        ::_out_buf_pos += sprintf(&(::_out_buf[::_out_buf_pos]), "<path id=\"%s\" d=\"%s\" onmouseover=\"showTooltip(evt)\" onmouseout=\"hideTooltip(evt)\"/>",::_feature_id,svg_path);
564
565                                        delete [] svg_path;
566                                        svg_path = NULL;
567
568                                        free(::_coords_buf);
569                                        ::_coords_buf = NULL;
570                                        ::_coords_buf_size = 0;
571
572
573                                #elif defined(MEMCPY_IO) || defined(BUFFERED_MEMCPY_IO) || defined(SIMD_IO)
574
575                                        char * svg_path = NULL;
576                                        #if defined(WORLD2SCREEN)
577
578                                                coord_to_path_strtod(&::_sum_y, &::_scale_x, &::_scale_y, &::_x1, &::_y1, ::_crt_cs, ::_coords_buf, ::_coords_buf_size, &svg_path);
579
580                                        #else
581
582                                                coords_to_path(::_crt_ts, ::_crt_cs, ::_coords_buf, ::_coords_buf_size, &svg_path, 0);
583
584                                        #endif
585
586                                        ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, "<path id=\"",sizeof("<path id=\"")-1);
587                                        ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, ::_feature_id, strlen(::_feature_id));
588                                        ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, "\" d=\"", sizeof("\" d=\"")-1);
589                                        ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, svg_path, strlen(svg_path));
590                                        ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, "\" onmouseover=\"showTooltip(evt)\" onmouseout=\"hideTooltip(evt)\"/>", sizeof("\" onmouseover=\"showTooltip(evt)\" onmouseout=\"hideTooltip(evt)\"/>")-1);
591
592                                        delete [] svg_path;
593                                        svg_path = NULL;
594
595                                        free(::_coords_buf);
596                                        ::_coords_buf = NULL;
597                                        ::_coords_buf_size = 0;
598
599                                #endif
600                #endif
601
602                        // END TEMP FIX
603
604                        ::_crt_decimal = DEFAULT_DECIMAL;
605                        ::_crt_cs = DEFAULT_CS;
606                        ::_crt_ts = DEFAULT_TS;
607                        ::_in_gml_coordinates = false;
608                }
609                else
610                {
611                        if(::_in_geometry)
612                        {
613                                //NS
614                                //if(memcmp(::_geometry_lname,(item+2)+4,(lgth-3)-4)==0)
615                                if(memcmp(::_geometry_qname,(item+2),(lgth-3))==0)
616                                {
617                                        ::_in_geometry = false;
618                                }
619                        }
620                        else
621                        {
622                                if(::_in_feature)
623                                {
624                                        //if(this._applicationNS == namespaceURI && this._featureLocalName == localName){
625
626                                        //NS
627                                        //if(memcmp(::_feature_lname,(item+2)+4,(lgth-3)-4)==0)
628                                        if(memcmp(::_feature_qname,(item+2),(lgth-3))==0)
629                                        {
630                                                ::_in_feature = false;
631                                                memset(::_feature_id,'\0',strlen(::_feature_id)); // clear feature id
632                                        }
633                                }
634                        }
635                }
636        #endif
637}
638
639/* Action routine for an error item */
640template <class B>
641inline void ParsingEngine<B>::Error_action(unsigned char * item, int lgth)
642{
643        printf("Error: illegal markup at positions %i of length %i.\n", AbsPos()-lgth, lgth);
644        cout << string((char *) item, lgth) << endl;
645}
646
647/* Action routine for a text item */
648template <class B>
649inline void ParsingEngine<B>::Text_action(unsigned char * item, int lgth, bool more)
650{
651
652        //::_gml_coords_byte_count += lgth;
653
654        // START TEMP FIX buffered characters
655        #if !defined(ILAX_COORDS_TO_PATH)
656
657                #if defined(MORE)
658
659                        if(::_in_gml_coordinates)
660                        {
661                                if(!more)
662                                {
663                                        if(::_coords_buf == NULL)
664                                        {
665                                                #if defined(NAIVE_FORMATTED_IO)
666                                                        ::_out_buf_pos += sprintf(&(::_out_buf[::_out_buf_pos]), "%s%s%s%s%s%s%s%s%s%s%s"
667                                                                                                                                                                  ,PATH_START_ELEMENT
668                                                                                                                                                                  ,SPACE
669                                                                                                                                                                  ,PATH_ID_ATTR
670                                                                                                                                                                  ,EQUALS
671                                                                                                                                                                  ,DQUOTE
672                                                                                                                                                                  ,::_feature_id
673                                                                                                                                                                  ,DQUOTE
674                                                                                                                                                                  ,SPACE
675                                                                                                                                                                  ,PATH_D_ATTR
676                                                                                                                                                                  ,EQUALS
677                                                                                                                                                                  ,DQUOTE);
678                                                        char * svg_path = NULL;
679                                                        #if defined(WORLD2SCREEN)
680
681                                                                coord_to_path_strtod(&::_sum_y, &::_scale_x, &::_scale_y, &::_x1, &::_y1, ::_crt_cs, (char *) item, lgth, &svg_path);
682
683                                                        #else
684
685                                                                coords_to_path(::_crt_ts, ::_crt_cs, (char *) item, lgth, &svg_path, 0);
686
687                                                        #endif
688
689                                                        ::_out_buf_pos += sprintf(&(::_out_buf[::_out_buf_pos]),svg_path);
690                                                        delete [] svg_path;
691                                                        svg_path = NULL;
692
693                                                        free(::_coords_buf);
694                                                        ::_coords_buf = NULL;
695                                                        ::_coords_buf_size = 0;
696
697                                                        ::_out_buf_pos += sprintf(&(::_out_buf[::_out_buf_pos]), "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"
698                                                                                                                                                                                                                          ,DQUOTE
699                                                                                                                                                                                                                          ,SPACE
700                                                                                                                                                                                                                          ,PATH_ONMOUSEOVER_ATTR
701                                                                                                                                                                                                                          ,EQUALS
702                                                                                                                                                                                                                          ,DQUOTE
703                                                                                                                                                                                                                          ,PATH_ONMOUSEOVER_VALUE
704                                                                                                                                                                                                                          ,DQUOTE
705                                                                                                                                                                                                                          ,SPACE
706                                                                                                                                                                                                                          ,PATH_ONMOUSEOUT_ATTR
707                                                                                                                                                                                                                          ,EQUALS
708                                                                                                                                                                                                                          ,DQUOTE
709                                                                                                                                                                                                                          ,PATH_ONMOUSEOUT_VALUE
710                                                                                                                                                                                                                          ,DQUOTE
711                                                                                                                                                                                                                          ,FSLASH
712                                                                                                                                                                                                                          ,RANGLE);
713
714                                                #elif defined(FORMATTED_IO)
715
716                                                        char * svg_path = NULL;
717                                                        #if defined(WORLD2SCREEN)
718
719                                                                coord_to_path_strtod(&::_sum_y, &::_scale_x, &::_scale_y, &::_x1, &::_y1, ::_crt_cs, (char *) item, lgth, &svg_path);
720
721                                                        #else
722
723                                                                coords_to_path(::_crt_ts, ::_crt_cs, (char *) item, lgth, &svg_path, 0);
724
725                                                        #endif
726
727                                                        ::_out_buf_pos += sprintf(&(::_out_buf[::_out_buf_pos]), "<path id=\"%s\" d=\"%s\" onmouseover=\"showTooltip(evt)\" onmouseout=\"hideTooltip(evt)\"/>",::_feature_id,svg_path);
728
729                                                        delete [] svg_path;
730                                                        svg_path = NULL;
731
732                                                        free(::_coords_buf);
733                                                        ::_coords_buf = NULL;
734                                                        ::_coords_buf_size = 0;
735
736
737                                                #elif defined(MEMCPY_IO) || defined(BUFFERED_MEMCPY_IO) || defined(SIMD_IO)
738
739                                                        char * svg_path = NULL;
740                                                        #if defined(WORLD2SCREEN)
741
742                                                                coord_to_path_strtod(&::_sum_y, &::_scale_x, &::_scale_y, &::_x1, &::_y1, ::_crt_cs, (char *) item, lgth, &svg_path);
743
744                                                        #else
745
746                                                                coords_to_path(::_crt_ts, ::_crt_cs, (char *) item, lgth, &svg_path, 0);
747
748                                                        #endif
749
750                                                        ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, "<path id=\"",sizeof("<path id=\"")-1);
751                                                        ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, ::_feature_id, strlen(::_feature_id));
752                                                        ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, "\" d=\"", sizeof("\" d=\"")-1);
753                                                        ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, svg_path, strlen(svg_path));
754                                                        ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, "\" onmouseover=\"showTooltip(evt)\" onmouseout=\"hideTooltip(evt)\"/>", sizeof("\" onmouseover=\"showTooltip(evt)\" onmouseout=\"hideTooltip(evt)\"/>")-1);
755
756                                                        delete [] svg_path;
757                                                        svg_path = NULL;
758
759                                                        free(::_coords_buf);
760                                                        ::_coords_buf = NULL;
761                                                        ::_coords_buf_size = 0;
762
763                                                #endif
764
765                                        }
766                                        else // more
767                                        {
768                                                ::_coords_buf = (char *) realloc(::_coords_buf, ::_coords_buf_size + lgth);
769                                                if(::_coords_buf == NULL)
770                                                {
771                                                        print_error(__FILE__, __FUNCTION__, __LINE__, "Out of memory. Terminating the process ...");
772                                                        exit(-1);
773                                                }
774                                                memcpy(::_coords_buf + ::_coords_buf_size, item, lgth);
775                                                ::_coords_buf_size += lgth;
776
777                                                ::_total_reallocs++;
778
779                                                // START TEMP FIX buffered characters
780                                                #if defined(NAIVE_FORMATTED_IO)
781                                                        ::_out_buf_pos += sprintf(&(::_out_buf[::_out_buf_pos]), "%s%s%s%s%s%s%s%s%s%s%s"
782                                                                                                                                                                  ,PATH_START_ELEMENT
783                                                                                                                                                                  ,SPACE
784                                                                                                                                                                  ,PATH_ID_ATTR
785                                                                                                                                                                  ,EQUALS
786                                                                                                                                                                  ,DQUOTE
787                                                                                                                                                                  ,::_feature_id
788                                                                                                                                                                  ,DQUOTE
789                                                                                                                                                                  ,SPACE
790                                                                                                                                                                  ,PATH_D_ATTR
791                                                                                                                                                                  ,EQUALS
792                                                                                                                                                                  ,DQUOTE);
793                                                        char * svg_path = NULL;
794                                                        #if defined(WORLD2SCREEN)
795
796                                                                coord_to_path_strtod(&::_sum_y, &::_scale_x, &::_scale_y, &::_x1, &::_y1, ::_crt_cs, ::_coords_buf, ::_coords_buf_size, &svg_path);
797
798                                                        #else
799
800                                                                coords_to_path(::_crt_ts, ::_crt_cs, ::_coords_buf, ::_coords_buf_size, &svg_path, 0);
801
802                                                        #endif
803
804                                                        ::_out_buf_pos += sprintf(&(::_out_buf[::_out_buf_pos]),svg_path);
805                                                        delete [] svg_path;
806                                                        svg_path = NULL;
807
808                                                        free(::_coords_buf);
809                                                        ::_coords_buf = NULL;
810                                                        ::_coords_buf_size = 0;
811
812                                                        ::_out_buf_pos += sprintf(&(::_out_buf[::_out_buf_pos]), "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"
813                                                                                                                                                                                                                          ,DQUOTE
814                                                                                                                                                                                                                          ,SPACE
815                                                                                                                                                                                                                          ,PATH_ONMOUSEOVER_ATTR
816                                                                                                                                                                                                                          ,EQUALS
817                                                                                                                                                                                                                          ,DQUOTE
818                                                                                                                                                                                                                          ,PATH_ONMOUSEOVER_VALUE
819                                                                                                                                                                                                                          ,DQUOTE
820                                                                                                                                                                                                                          ,SPACE
821                                                                                                                                                                                                                          ,PATH_ONMOUSEOUT_ATTR
822                                                                                                                                                                                                                          ,EQUALS
823                                                                                                                                                                                                                          ,DQUOTE
824                                                                                                                                                                                                                          ,PATH_ONMOUSEOUT_VALUE
825                                                                                                                                                                                                                          ,DQUOTE
826                                                                                                                                                                                                                          ,FSLASH
827                                                                                                                                                                                                                          ,RANGLE);
828
829                                                #elif defined(FORMATTED_IO)
830
831                                                        char * svg_path = NULL;
832                                                        #if defined(WORLD2SCREEN)
833
834                                                                coord_to_path_strtod(&::_sum_y, &::_scale_x, &::_scale_y, &::_x1, &::_y1, ::_crt_cs, ::_coords_buf, ::_coords_buf_size, &svg_path);
835
836                                                        #else
837
838                                                                coords_to_path(::_crt_ts, ::_crt_cs, ::_coords_buf, ::_coords_buf_size, &svg_path, 0);
839
840                                                        #endif
841
842                                                        ::_out_buf_pos += sprintf(&(::_out_buf[::_out_buf_pos]), "<path id=\"%s\" d=\"%s\" onmouseover=\"showTooltip(evt)\" onmouseout=\"hideTooltip(evt)\"/>",::_feature_id,svg_path);
843
844                                                        delete [] svg_path;
845                                                        svg_path = NULL;
846
847                                                        free(::_coords_buf);
848                                                        ::_coords_buf = NULL;
849                                                        ::_coords_buf_size = 0;
850
851
852                                                #elif defined(MEMCPY_IO) || defined(BUFFERED_MEMCPY_IO) || defined(SIMD_IO)
853
854                                                        char * svg_path = NULL;
855                                                        #if defined(WORLD2SCREEN)
856
857                                                                coord_to_path_strtod(&::_sum_y, &::_scale_x, &::_scale_y, &::_x1, &::_y1, ::_crt_cs, ::_coords_buf, ::_coords_buf_size, &svg_path);
858
859                                                        #else
860
861                                                                coords_to_path(::_crt_ts, ::_crt_cs, ::_coords_buf, ::_coords_buf_size, &svg_path, 0);
862
863                                                        #endif
864
865                                                        ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, "<path id=\"",sizeof("<path id=\"")-1);
866                                                        ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, ::_feature_id, strlen(::_feature_id));
867                                                        ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, "\" d=\"", sizeof("\" d=\"")-1);
868                                                        ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, svg_path, strlen(svg_path));
869                                                        ::_out_buf_pos += emit_str(&::_out_buf, &::_out_buf_size, "\" onmouseover=\"showTooltip(evt)\" onmouseout=\"hideTooltip(evt)\"/>", sizeof("\" onmouseover=\"showTooltip(evt)\" onmouseout=\"hideTooltip(evt)\"/>")-1);
870
871                                                        delete [] svg_path;
872                                                        svg_path = NULL;
873
874                                                        free(::_coords_buf);
875                                                        ::_coords_buf = NULL;
876                                                        ::_coords_buf_size = 0;
877
878                                                #endif
879
880                                        }
881
882                                        ::_crt_decimal = DEFAULT_DECIMAL;
883                                        ::_crt_cs = DEFAULT_CS;
884                                        ::_crt_ts = DEFAULT_TS;
885                                }
886                                else // buffer the characters
887                                {
888                                        if(::_coords_buf == NULL)
889                                        {
890                                                ::_coords_buf = (char *) malloc(lgth);
891                                                if(::_coords_buf == NULL)
892                                                {
893                                                        print_error(__FILE__, __FUNCTION__, __LINE__, "Out of memory. Terminating the process ...");
894                                                        exit(-1);
895                                                }
896
897                                                memcpy(::_coords_buf,item,lgth);
898                                                ::_coords_buf_size = lgth;
899
900                                                ::_total_mallocs++;
901                                        }
902                                        else
903                                        {
904                                                ::_coords_buf = (char *) realloc(::_coords_buf, ::_coords_buf_size + lgth);
905                                                if(::_coords_buf == NULL)
906                                                {
907                                                        print_error(__FILE__, __FUNCTION__, __LINE__, "Out of memory. Terminating the process ...");
908                                                        exit(-1);
909                                                }
910                                                memcpy(::_coords_buf + ::_coords_buf_size,item,lgth);
911                                                ::_coords_buf_size += lgth;
912
913                                                ::_total_reallocs++;
914                                        }
915                                }
916                        }
917
918                #else // not MORE
919
920                        if(::_in_gml_coordinates)
921                        {
922
923                                if(::_coords_buf==NULL)
924                                {
925                                        ::_coords_buf = (char *) malloc(lgth);
926                                        if(::_coords_buf == NULL)
927                                        {
928                                                print_error(__FILE__, __FUNCTION__, __LINE__, "Out of memory. Terminating the process ...");
929                                                exit(-1);
930                                        }
931
932                                        memcpy(::_coords_buf,item,lgth);
933                                        ::_coords_buf_size = lgth;
934
935                                        ::_total_mallocs++;
936                                }
937                                else
938                                {
939                                        ::_coords_buf = (char *) realloc(::_coords_buf, ::_coords_buf_size + lgth);
940                                        if(::_coords_buf == NULL)
941                                        {
942                                                print_error(__FILE__, __FUNCTION__, __LINE__, "Out of memory. Terminating the process ...");
943                                                exit(-1);
944                                        }
945                                        memcpy(::_coords_buf + ::_coords_buf_size, item, lgth);
946                                        ::_coords_buf_size += lgth;
947
948                                        ::_total_reallocs++;
949                                }
950                        }
951
952                #endif // end MORE
953
954        #endif  // END TEMP FIX
955
956
957                /* START ORIGINAL WORLD2SCREEN CODE
958
959                #if defined(NAIVE_FORMATTED_IO)
960                        ::_out_buf_pos += sprintf(&(::_out_buf[::_out_buf_pos]), "%s%s%s%s%s%s%s%s%s%s%s"
961                                                                                                                                  ,PATH_START_ELEMENT
962                                                                                                                                  ,SPACE
963                                                                                                                                  ,PATH_ID_ATTR
964                                                                                                                                  ,EQUALS
965                                                                                                                                  ,DQUOTE
966                                                                                                                                  ,::_feature_id
967                                                                                                                                  ,DQUOTE
968                                                                                                                                  ,SPACE
969                                                                                                                                  ,PATH_D_ATTR
970                                                                                                                                  ,EQUALS
971                                                                                                                                  ,DQUOTE);
972                        char * svg_path = NULL;
973                        #if defined(WORLD2SCREEN)
974
975                                                                coord_to_path_strtod(&::_sum_y, &::_scale_x, &::_scale_y, &::_x1, &::_y1, ::_crt_cs, ::_coords_buf, ::_coords_buf_size, &svg_path);
976
977                        #else
978
979                                coords_to_path(::_crt_ts, ::_crt_cs, (char *)item, lgth, &svg_path);
980
981                        #endif
982
983                        ::_out_buf_pos += sprintf(&(::_out_buf[::_out_buf_pos]),svg_path);
984                        delete [] svg_path;
985                        svg_path = NULL;
986
987                        ::_out_buf_pos += sprintf(&(::_out_buf[::_out_buf_pos]), "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"
988                                                                                                                                                                                          ,DQUOTE
989                                                                                                                                                                                          ,SPACE
990                                                                                                                                                                                          ,PATH_ONMOUSEOVER_ATTR
991                                                                                                                                                                                          ,EQUALS
992                                                                                                                                                                                          ,DQUOTE
993                                                                                                                                                                                          ,PATH_ONMOUSEOVER_VALUE
994                                                                                                                                                                                          ,DQUOTE
995                                                                                                                                                                                          ,SPACE
996                                                                                                                                                                                          ,PATH_ONMOUSEOUT_ATTR
997                                                                                                                                                                                          ,EQUALS
998                                                                                                                                                                                          ,DQUOTE
999                                                                                                                                                                                          ,PATH_ONMOUSEOUT_VALUE
1000                                                                                                                                                                                          ,DQUOTE
1001                                                                                                                                                                                          ,FSLASH
1002                                                                                                                                                                                          ,RANGLE);
1003
1004                #elif defined(FORMATTED_IO)
1005
1006                        char * svg_path = NULL;
1007                        #if defined(WORLD2SCREEN)
1008
1009                                                                coord_to_path_strtod(&::_sum_y, &::_scale_x, &::_scale_y, &::_x1, &::_y1, ::_crt_cs, ::_coords_buf, ::_coords_buf_size, &svg_path);
1010
1011                        #else
1012
1013                                coords_to_path(::_crt_ts, ::_crt_cs, (char *)item, lgth, &svg_path, 0);
1014
1015                        #endif
1016
1017
1018                        ::_out_buf_pos += sprintf(&(::_out_buf[::_out_buf_pos]), "<path id=\"%s\" d=\"%s\" onmouseover=\"showTooltip(evt)\" onmouseout=\"hideTooltip(evt)\"/>",::_feature_id,svg_path);
1019
1020                        delete [] svg_path;
1021                        svg_path = NULL;
1022
1023                #endif
1024
1025
1026                END ORIGINAL WORLD2SCREEN CODE */
1027
1028}
1029
1030template <class B>
1031inline void ParsingEngine<B>::Reference_action(unsigned char * item, int lgth)
1032{
1033
1034}
1035
1036/* Three action routines for markup components are defined as follows.
1037|ElementName_action| is the action routine called upon recognition of
1038an element name immediately after the opening angle bracket of a start
1039tag or empty element tag.  {\bf OR MAYBE THIS SHOULD BE DEFERRED UNTIL
1040AFTER ATTRIBUTE PROCESSING SO THAT NAMESPACES ARE SET?}
1041It is called with two parameters identifying the
1042first and last character positions of the expected XML_name.
1043Similarly, |PI_Target_action| is the action routine called upon recognition
1044of the XML Name that occurs immediately after the opening "<?"
1045delimiter of a processing instruction.
1046
1047 The third action routine for markup components is Attribute_Value_action,
1048which takes three parameters rather than two.  {\bf OR POSSIBLY JUST
1049THE QUOTE MARK ITEMS, RELYING ON THE END OF THE LAST COMPONENT PROCESSED
1050TO MARK THE SPACE BEFORE THE ATT NAME.- REQUIRES ELEMENT_NAME_ACTION}
1051*/
1052
1053/* Semantic action routines for markup components. */
1054/* Action routine for an element name occurring immediately after the
1055   opening "<" of a start tag or empty element tag. */
1056template <class B>
1057inline void ParsingEngine<B>::ElementName_action(unsigned char * item, int lgth) {
1058
1059        if(::_in_feature) //featureLocalName//geometry//gml:coordinates
1060        {
1061                if(::_in_geometry)
1062                {
1063                        //NS
1064                        //if(memcmp(GML_COORDINATES_LNAME,item+4,lgth-4)==0)
1065                        if(memcmp(GML_COORDINATES_QNAME,item,lgth)==0)
1066                        {
1067                                #if defined(GML2SVG_DEBUG)
1068                                        cout << "in_coordinates" << endl;
1069                                #endif
1070                                ::_in_gml_coordinates = true;
1071                        }
1072                }
1073                else
1074                {
1075                        //NS
1076                        //if(memcmp(::_geometry_lname,item+4,lgth-4)==0)
1077                        if(memcmp(::_geometry_qname,item,lgth)==0)
1078                        {
1079                                #if defined(GML2SVG_DEBUG)
1080                                        cout << "in_geometry" << endl;
1081                                #endif
1082                                ::_in_geometry = true;
1083                        }
1084                }
1085        }
1086        else
1087        {
1088                //if(this._applicationNS == namespaceURI) {
1089                        //if(this._featureLocalName == localName){
1090
1091                        //NS
1092                        //if(memcmp(::_feature_lname,item+4,lgth-4)==0)
1093                    if(memcmp(::_feature_qname,item,lgth)==0)
1094                        {
1095                                #if defined(GML2SVG_DEBUG)
1096                                cout << "in_feature" << endl;
1097                                #endif
1098                        ::_in_feature = true;
1099                    }
1100                        //}
1101                //}
1102        }
1103}
1104
1105/* Action routine for a processing instruction target name occurring immediately
1106   after the opening "<?" of a processing instruction. */
1107template <class B>
1108inline void ParsingEngine<B>::PI_Target_action(unsigned char * item, int lgth)
1109{
1110}
1111
1112/* Action routine for an individual attribute/value pair occurring in
1113   a element start tag or an empty element tag. */
1114template <class B>
1115inline void ParsingEngine<B>::AttributeValue_action(unsigned char * name, int name_lgth,
1116                                 unsigned char * val, int val_lgth)
1117{
1118        if(::_in_gml_coordinates)
1119        {
1120                /* set current cs, ts, decimal delimeter */
1121                if(memcmp(DECIMAL_LOCAL_NAME,name,name_lgth)==0)
1122                {
1123                        #if defined(GML2SVG_DEBUG)
1124                                cout << "in_decimal" << endl;
1125                        #endif
1126                        ::_crt_decimal = (char)*(val);
1127                }
1128
1129                if(memcmp(CS_LOCAL_NAME,name,name_lgth)==0)
1130                {
1131                        #if defined(GML2SVG_DEBUG)
1132                                cout << "in_cs" << endl;
1133                        #endif
1134                        ::_crt_cs = (char)*(val);
1135                }
1136
1137                if(memcmp(TS_LOCAL_NAME,name,name_lgth)==0)
1138                {
1139                        #if defined(GML2SVG_DEBUG)
1140                                cout << "in_ts" << endl;
1141                        #endif
1142                        ::_crt_ts = (char)*(val);
1143                }
1144
1145        }
1146        else if(::_in_geometry)
1147        {
1148                // do nothing
1149        }
1150        else if(::_in_feature)
1151        {
1152                //NS
1153                //if(memcmp(::_feature_id_lname,name+4,name_lgth-4)==0)
1154                if(memcmp(::_feature_id_qname,name,name_lgth)==0)
1155                {
1156                        /* do not perform overflow test
1157                        if(FEATURE_ID_MAX_LENGTH_EST < (val_lgth))
1158                        {
1159                                delete [] ::_feature_id;
1160                                ::_feature_id = new char [(val_lgth)*2];
1161                        }
1162                        */
1163                        #if defined(GML2SVG_DEBUG)
1164                                cout << "in_id" << endl;
1165                        #endif
1166                        memcpy(::_feature_id,val,val_lgth);
1167                }
1168        }
1169}
1170
1171/* Action routine for an individual attribute/value pair occurring in
1172   a element start tag or an empty element tag. */
1173template <class B>
1174inline void ParsingEngine<B>::Namespace_action(unsigned char * name, int name_lgth,
1175                             unsigned char * URI, int URI_lgth)
1176{
1177
1178}
1179
1180template <class B>
1181inline void ParsingEngine<B>::FinalizeBuffer_action()
1182{
1183        #if defined(BUFFERED_MEMCPY_IO)
1184
1185                fwrite(::_out_buf_start,1,::_out_buf_pos,::_out_file);
1186                fflush(::_out_file);
1187                ::_out_buf = ::_out_buf_start;
1188                ::_out_buf_pos = 0;
1189                ::_out_buf_size = BUFFER_SIZE;
1190
1191        #endif
1192}
1193
1194template <class B>
1195inline void ParsingEngine<B>::Doctype_action(unsigned char * item, int lgth) {
1196        #ifdef SHOW_DTD_ACTIONS
1197
1198                printf("Document Type:\n");
1199                cout << string((char *) item, lgth) << endl;
1200
1201        #endif
1202}
1203
1204template <class B>
1205inline void ParsingEngine<B>::PEReference_action(unsigned char * item, int lgth) {
1206}
1207
1208template <class B>
1209inline void ParsingEngine<B>::Prolog_action(unsigned char * item, int lgth) {
1210        #ifdef SHOW_DTD_ACTIONS
1211
1212                printf("Prolog:\n");
1213                cout << string((char *) item, lgth) << endl;
1214
1215        #endif
1216}
1217
1218template <class B>
1219void ParsingEngine<B>::ExtSubsetDecl_action(unsigned char * item, int lgth) {
1220
1221}
1222
1223template <class B>
1224inline void ParsingEngine<B>::ilax_coords_to_path(char ts, char cs, char decimal)
1225{
1226        unsigned long int x_start,x_end;
1227        unsigned long int y_start,y_end;
1228
1229        // Skip leading whitespace
1230        ScanTo(NonWS);
1231        if (at_EndTag_Start<B::Base>(cur()))            // empty coordinate, exit
1232        {
1233                return;
1234        }
1235        else
1236        {
1237                x_start = (AbsPos());                   // assume digit, mark x coordinate start position
1238        }
1239
1240        ScanTo(NonDigit);                                       // parse x coordinate
1241        if (*cur() == decimal)
1242        {
1243                Advance(1);
1244                ScanTo(NonDigit);
1245                x_end = (AbsPos()-1);                   // mark x coordinate end position
1246                ScanTo(NonWS);
1247                if (*cur() == cs)
1248                {
1249                        Advance(1);
1250                        ScanTo(NonWS);
1251                        y_start = (AbsPos());       // mark y coordinate start position
1252                }
1253                else
1254                {
1255                        print_error(__FILE__, __FUNCTION__, __LINE__, "Mismatched coordinates pair. Terminating the process ..."); exit(-1);
1256                }
1257        }
1258        else if (*cur() == cs)                          // handle non floating point values
1259        {
1260                Advance(1);
1261                ScanTo(NonWS);
1262                y_start = (AbsPos());
1263        }
1264        else
1265        {
1266                print_error(__FILE__, __FUNCTION__, __LINE__, "Mismatched coordinates pair. Terminating the process ..."); exit(-1);
1267        }
1268
1269        ScanTo(NonDigit);                                       // parse y coordinate
1270        if (*cur() == decimal)
1271        {
1272                Advance(1);
1273                ScanTo(NonDigit);
1274
1275                if((*cur() == ts) || (*cur() == Ord<B::Base,' '>::value) || (*cur() == 0x0A) || (*cur() == 0x0D) || (*cur() == 0x09))
1276                {
1277                        y_end = (AbsPos()-1);           // mark y coordinate end position
1278                        ScanTo(NonWS);
1279                }
1280                else
1281                {
1282                        print_error(__FILE__, __FUNCTION__, __LINE__, "Invalid gml coordinates. Terminating the process ..."); exit(-1);
1283                }
1284        }
1285        else if((*cur() == ts) || (*cur() == Ord<B::Base,' '>::value) || (*cur() == 0x0A) || (*cur() == 0x0D) || (*cur() == 0x09))
1286        {
1287                y_end = (AbsPos()-1);
1288                ScanTo(NonWS);
1289        }
1290        else
1291        {
1292                print_error(__FILE__, __FUNCTION__, __LINE__, "Invalid gml coordinates. Terminating the process ..."); exit(-1);
1293        }
1294        #if defined(MEMCPY_IO) || defined(BUFFERED_MEMCPY_IO) || defined(SIMD_IO)
1295
1296                ::_out_buf_pos += emit_str(&::_out_buf,&::_out_buf_size,"M",1);
1297                ::_out_buf_pos += emit_str(&::_out_buf,&::_out_buf_size,(char *) GetCodeUnitPtr(x_start), (x_end + 1 - x_start));
1298                ::_out_buf_pos += emit_str(&::_out_buf,&::_out_buf_size,",",1);
1299                ::_out_buf_pos += emit_str(&::_out_buf,&::_out_buf_size,(char *) GetCodeUnitPtr(y_start), (y_end + 1 - y_start));
1300
1301        #endif
1302
1303        bool is_first_coordinate_pair = true;
1304
1305        ScanTo(NonWS);
1306        while(!at_EndTag_Start<B::Base>(cur())) // parse next x coordinate
1307        {
1308                x_start = (AbsPos());                           // mark next x coordinate start position
1309                ScanTo(NonDigit);
1310                x_end = (AbsPos()-1);
1311                if (*cur() == decimal)
1312                {
1313                        Advance(1);
1314                        ScanTo(NonDigit);
1315                        x_end = (AbsPos()-1);                   // mark next x coordinate end position
1316
1317                        ScanTo(NonWS);
1318                        if (*cur() == cs)
1319                        {
1320                                Advance(1);
1321                                ScanTo(NonWS);
1322                                y_start = (AbsPos());           // mark next y coordinate start position
1323                        }
1324                        else
1325                        {
1326                                print_error(__FILE__, __FUNCTION__, __LINE__, "Mismatched coordinates pair. Terminating the process ..."); exit(-1);
1327                        }
1328                }
1329                else if (*cur() == cs)                          // handle non floating point values
1330                {
1331                        Advance(1);
1332                        ScanTo(NonWS);
1333                        y_start = (AbsPos());
1334                }
1335                else
1336                {
1337                        print_error(__FILE__, __FUNCTION__, __LINE__, "Mismatched coordinates pair. Terminating the process ..."); exit(-1);
1338                }
1339
1340                // RDC Start  - The following would simplify.
1341//              ScanTo(NonDigit);                                       // parse y coordinate
1342//              if (*cur() == decimal)
1343//              {
1344//                      Advance(1);
1345//                      ScanTo(NonDigit);
1346//              }
1347//              y_end = AbsPos()-1;
1348//              ScanTo(NonWS);
1349//              if ((*cur() != ts) && !at_EndTag_Start<B::Base>(cur()) && (y_end == AbsPos() - 1))
1350//                      {
1351//                              print_error(__FILE__, __FUNCTION__, __LINE__, "Invalid gml coordinates. Terminating the process ..."); exit(-1);
1352//                      }
1353                // RDC End
1354                ScanTo(NonDigit);                                       // parse y coordinate
1355                if (*cur() == decimal)
1356                {
1357                        Advance(1);
1358                        ScanTo(NonDigit);
1359                        if((*cur() == ts) || (*cur() == Ord<B::Base,' '>::value) || (*cur() == 0x0A) || (*cur() == 0x0D) || (*cur() == 0x09))
1360                        {
1361                                y_end = (AbsPos()-1);           // mark y coordinate end position
1362                                ScanTo(NonWS);
1363                        }
1364
1365                        else if(at_EndTag_Start<B::Base>(cur()))
1366                        {
1367                                // do not advance past '<'
1368                                y_end = (AbsPos()-1);           // mark y coordinate end position
1369                        }
1370                        else
1371                        {
1372                                print_error(__FILE__, __FUNCTION__, __LINE__, "Invalid gml coordinates. Terminating the process ..."); exit(-1);
1373                        }
1374                }
1375                else if((*cur() == ts) || (*cur() == Ord<B::Base,' '>::value) || (*cur() == 0x0A) || (*cur() == 0x0D) || (*cur() == 0x09))
1376                {
1377                        y_end = (AbsPos()-1);
1378                        ScanTo(NonWS);
1379                }
1380                else if(at_EndTag_Start<B::Base>(cur()))
1381                {
1382                        // do not advance past '<'
1383                        y_end = (AbsPos()-1);                   // mark y coordinate end position
1384                }
1385                else
1386                {
1387                        print_error(__FILE__, __FUNCTION__, __LINE__, "Invalid gml coordinates. Terminating the process ..."); exit(-1);
1388                }
1389
1390                #if defined(MEMCPY_IO) || defined(BUFFERED_MEMCPY_IO) || defined(SIMD_IO)
1391
1392                        ::_out_buf_pos += emit_str(&::_out_buf,&::_out_buf_size," ",1);
1393
1394                #endif
1395
1396                if(is_first_coordinate_pair)
1397                {
1398
1399                        #if defined(FORMATTED_IO)
1400
1401                                ::_out_buf_pos += sprintf(&(::_out_buf[::_out_buf_pos]),"L");
1402
1403                        #endif
1404
1405                        #if defined(MEMCPY_IO) || defined(BUFFERED_MEMCPY_IO) || defined(SIMD_IO)
1406
1407                                ::_out_buf_pos += emit_str(&::_out_buf,&::_out_buf_size,"L",1);
1408
1409                        #endif
1410
1411                        is_first_coordinate_pair = false;
1412                }
1413
1414                #if defined(MEMCPY_IO) || defined(BUFFERED_MEMCPY_IO) || defined(SIMD_IO)
1415
1416                        ::_out_buf_pos += emit_str(&::_out_buf,&::_out_buf_size, (char *) GetCodeUnitPtr(x_start), (x_end + 1 - x_start));
1417                        ::_out_buf_pos += emit_str(&::_out_buf,&::_out_buf_size,",",1);
1418                        ::_out_buf_pos += emit_str(&::_out_buf,&::_out_buf_size, (char *) GetCodeUnitPtr(y_start), (y_end + 1 - y_start));
1419
1420                #endif
1421        }
1422}
1423
1424int
1425main(int argc, char * argv[]) {
1426
1427        char * gml_src_dir_path = NULL;
1428        char * svg_dest_dir_path = NULL;
1429
1430        if (argc > 2)
1431        {
1432                /* test GML src dir ends with FILE_SEPARATOR and exists */
1433                gml_src_dir_path = new char[strlen(argv[1]) +1 +1];
1434                if(gml_src_dir_path == NULL) {fprintf(stderr, "Out of memory. Terminating the process ...\n"); exit(-1);}
1435                strcpy(gml_src_dir_path,argv[1]);
1436
1437                if(gml_src_dir_path[strlen(gml_src_dir_path)] != FILE_SEPARATOR)
1438                {
1439                        gml_src_dir_path[strlen(gml_src_dir_path)] = FILE_SEPARATOR;
1440                        gml_src_dir_path[strlen(gml_src_dir_path)+1] = '\0';
1441                        if(!fopen(gml_src_dir_path,"r"))
1442                        {
1443                                fprintf(stderr, "GML source directory '%s' does not exist. Terminating the process ...\n", gml_src_dir_path); exit(-1);
1444                        }
1445                }
1446
1447                /* test SVG dest dir ends with FILE_SEPARATOR and exists */
1448                svg_dest_dir_path = new char[strlen(argv[2]) +1 +1];
1449                if(svg_dest_dir_path == NULL) {fprintf(stderr, "Out of memory. Terminating the process ...\n"); exit(-1);}
1450                strcpy(svg_dest_dir_path,argv[2]);
1451
1452                if(svg_dest_dir_path[strlen(svg_dest_dir_path)] != FILE_SEPARATOR)
1453                {
1454                        svg_dest_dir_path[strlen(svg_dest_dir_path)] = FILE_SEPARATOR;
1455                        svg_dest_dir_path[strlen(svg_dest_dir_path)+1] = '\0';
1456                        if(!fopen(svg_dest_dir_path,"r"))
1457                        {
1458                                errno = 0;
1459                                static mode_t mode = 0755;
1460                                if(mkdir(svg_dest_dir_path,mode)<0)
1461                                {
1462                                        fprintf(stderr,"Cannot create SVG destination directory '%s'. Terminating the process ...\n",svg_dest_dir_path);
1463                                }
1464                        }
1465                }
1466        }
1467        else
1468        {
1469                fprintf(stderr, "Missing command line arguments. ");
1470                fprintf(stderr, "Usage: %s <GML directory> <SVG directory>\n", argv[0]); exit(-1);
1471        }
1472
1473        /* allocate memory for gml, svg, csv file paths */
1474        char * gml_filename = new char[strlen(gml_src_dir_path) + FEATURE_LOCAL_NAMES_MAX_LENGTH_EST + strlen(GML_DOT_EXT) +1];
1475        char * svg_filename = new char[strlen(svg_dest_dir_path) + FEATURE_LOCAL_NAMES_MAX_LENGTH_EST + strlen(SVG_DOT_EXT) +1];
1476        if(gml_filename == NULL ||  svg_filename == NULL) {fprintf(stderr, "function: main, out of memory. Terminating the process ...\n"); exit(-1);}
1477
1478        #if defined(SYSTEM_TIME)
1479
1480                char * csv_filename = new char[strlen(svg_dest_dir_path) + strlen("yyyy-mm-ddThh-mm-ss") + strlen(CSV_DOT_EXT) + 1];
1481                char * csv_basename = new char[strlen("yyyy-mm-ddThh-mm-ss") +1];
1482                if(csv_filename == NULL || csv_basename == NULL) {fprintf(stderr, "function: main, out of memory. Terminating the process ...\n"); exit(-1);}
1483
1484                /* create csv file */
1485                strcpy(csv_filename,svg_dest_dir_path);
1486                csv_basename = create_timestamp_filename();
1487                strcat(csv_filename,csv_basename);
1488                strcat(csv_filename,CSV_DOT_EXT);
1489
1490                FILE * csv_out;
1491                if(!(csv_out = fopen(csv_filename, "w")))
1492                {
1493                        fprintf(stderr, "Failed to open CSV file '%s' for output. Terminating the process ...\n", csv_filename); exit(-1);
1494                }
1495
1496        #endif
1497
1498        #if defined(PAPI)
1499
1500//  RDC Start
1501//              int retval = PAPI_library_init(PAPI_VER_CURRENT);
1502//              if (retval != PAPI_VER_CURRENT) {
1503//                      fprintf(stderr, "PAPI library init error!\n");
1504//                      exit(1);
1505//              }
1506//
1507//              #define NUM_EVENTS 2
1508//              #define SIMD_Int_Plog_Exec      0x4000009b
1509//              #define SIMD_Int_Pck_Exec 0x40000099
1510//              #define SIMD_Int_Psft_Exec  0x40000098
1511//              int Events[NUM_EVENTS] = {PAPI_TOT_INS,SIMD_Int_Psft_Exec};
1512//
1513// RDC Stop
1514                #define NUM_EVENTS 1
1515                int Events[NUM_EVENTS] = {PAPI_TOT_CYC};
1516
1517                        int cal_size = 5;
1518                        code_clocker = new CC(Events,NUM_EVENTS,cal_size);
1519
1520                        string cmd_line;
1521                        for(int i=0;i<argc;i++)
1522                        {
1523                                cmd_line += argv[i];
1524                                cmd_line += " ";
1525                        }
1526                        code_clocker->set_cmd(cmd_line);
1527        #endif
1528
1529        int layer_count = NUM_FEATURE_COLLECTIONS; /* ignore point geometries, for now */
1530
1531        fprintf(stdout, "GML layers ...\n\n");
1532        char * layers = layers_2_string(FEATURE_LNAMES, layer_count);
1533        fprintf(stdout, "%s\n\n",layers);
1534
1535        #if defined(SYSTEM_TIME)
1536                fprintf(csv_out,"%s, \n", "Parabix (ilax)");
1537        #endif
1538
1539        #if defined(PAPI)
1540                code_clocker->set_param("Parser", "Parabix (ilax)");
1541        #endif
1542
1543        /* Output IO and World2Screen info */
1544        #if !defined(NAIVE_FORMATTED_IO) && !defined(FORMATTED_IO) && !defined(MEMCPY_IO) && !defined(BUFFERED_MEMCPY_IO) && !defined(SIMD_IO)
1545                fprintf(stderr, "IO preprocessor directive '%s' not defined. Terminating the process ...", "NAIVE_FORMATTED_IO | FORMATTERD_IO | MEMCPY_IO | BUFFERED_MEMCPY_IO | SIMD_IO"); exit(-1);
1546        #endif
1547
1548        #if defined(NAIVE_FORMATTED_IO)
1549
1550                fprintf(stdout,"IO = NAIVE_FORMATTED_IO\n");
1551
1552                #if defined(SYSTEM_TIME)
1553                        fprintf(csv_out,"\n%s,%s", "IO", "NAIVE_FORMATTED_IO");
1554                #endif
1555
1556                #if defined(PAPI)
1557                        code_clocker->set_param("IO", "NAIVE_FORMATTED_IO");
1558                #endif
1559
1560        #elif defined(FORMATTED_IO)
1561
1562                fprintf(stdout,"IO = FORMATTED_IO\n");
1563
1564                #if defined(SYSTEM_TIME)
1565                        fprintf(csv_out,"\n%s,%s", "IO", "FORMATTED_IO");
1566                #endif
1567
1568                #if defined(PAPI)
1569                        code_clocker->set_param("IO", "FORMATTED_IO");
1570                #endif
1571
1572        #elif defined(MEMCPY_IO)
1573
1574                fprintf(stdout,"IO = MEMCPY_IO\n");
1575
1576                #if defined(SYSTEM_TIME)
1577                        fprintf(csv_out,"\n%s,%s", "IO", "MEMCPY_IO");
1578                #endif
1579
1580                #if defined(PAPI)
1581                        code_clocker->set_param("IO", "MEMCPY_IO");
1582                #endif
1583
1584        #elif defined(BUFFERED_MEMCPY_IO)
1585
1586                        fprintf(stdout,"IO = BUFFERED_MEMCPY_IO\n");
1587
1588                        #if defined(SYSTEM_TIME)
1589                                fprintf(csv_out,"\n%s,%s", "IO", "BUFFERED_MEMCPY_IO");
1590                        #endif
1591
1592                        #if defined(PAPI)
1593                                code_clocker->set_param("IO", "BUFFERED_MEMCPY_IO");
1594                        #endif
1595
1596        #elif defined(SIMD_IO)
1597
1598                        fprintf(stdout,"IO = SIMD_IO\n");
1599
1600                        #if defined(SYSTEM_TIME)
1601                                fprintf(csv_out,"\n%s,%s", "IO", "SIMD_IO");
1602                        #endif
1603
1604                        #if defined(PAPI)
1605                                code_clocker->set_param("IO", "SIMD_IO");
1606                        #endif
1607
1608        #endif
1609
1610        #if defined(WORLD2SCREEN) && defined(ILAX_COORDS_TO_PATH)
1611
1612                        fprintf(stderr,"'WORLD2SCREEN' and 'ILAX_COORDS_TO_PATH' conflict. Terminating the process ...\n"); exit(-1);
1613
1614        #endif
1615
1616        #if defined(ILAX_COORDS_TO_PATH)
1617
1618                #if defined(SYSTEM_TIME)
1619                        fprintf(csv_out,"\n%s,%s", "ILAX_COORDS_TO_PATH", "true");
1620                #endif
1621
1622                #if defined(PAPI)
1623                        code_clocker->set_param("ILAX_COORDS_TO_PATH", "true");
1624                #endif
1625
1626                fprintf(stdout, "ilax coords to path = true.\n");
1627
1628        #endif
1629
1630        #if defined(WORLD2SCREEN)
1631
1632                #if defined(SYSTEM_TIME)
1633                        fprintf(csv_out,"\n%s,%s", "WORLD2SCREEN", "true");
1634                #endif
1635
1636                #if defined(PAPI)
1637                        code_clocker->set_param("WORLD2SCREEN", "true");
1638                #endif
1639
1640                fprintf(stdout, "World2Screen transformations = true.\n");
1641
1642    #else
1643
1644                #if defined(SYSTEM_TIME)
1645                        fprintf(csv_out,"\n%s,%s", "WORLD2SCREEN", "false");
1646                #endif
1647
1648                #if defined(PAPI)
1649                        code_clocker->set_param("WORLD2SCREEN", "false");
1650                #endif
1651
1652                fprintf(stdout, "World2Screen transformations = false.\n");
1653
1654        #endif
1655
1656        /* Set Up Timing */
1657        #if defined(SYSTEM_TIME)
1658                fprintf(csv_out,"\n\n%s,%s", "Layers", "Duration (ms)");
1659                fprintf(csv_out,"\n%s,%s","GML Directory",gml_src_dir_path);
1660
1661                double duration = 0.0;
1662                clock_t start;
1663                double clocks_per_sec = (double)CLOCKS_PER_SEC;
1664    #endif
1665
1666        /* Determine file stats to determine buffer size allocation */
1667        #if defined(NAIVE_FORMATTED_IO) || defined(FORMATTED_IO) || defined(MEMCPY_IO) || defined(SIMD_IO)
1668                FILE * stats_file;
1669                struct stat fileinfo;
1670        #endif
1671
1672        /* Transform GML2SVG */
1673
1674        fprintf(stdout, "\nProcessing layers ...\n\n");
1675        for(int i=0;i<layer_count;i++)
1676        {
1677                /* Build layer specific GML and SVG file paths */
1678                strcpy(gml_filename,gml_src_dir_path);
1679                strcat(gml_filename,FEATURE_LNAMES[i]);
1680                strcat(gml_filename,GML_DOT_EXT);
1681
1682                strcpy(svg_filename,svg_dest_dir_path);
1683                strcat(svg_filename,FEATURE_LNAMES[i]);
1684                strcat(svg_filename,SVG_DOT_EXT);
1685
1686                #if defined(SYSTEM_TIME)
1687                        fprintf(csv_out,"\n%s",FEATURE_LNAMES[i]);
1688                #endif
1689
1690                #if defined(PAPI)
1691                        code_clocker->set_param("Layer", FEATURE_LNAMES[i]);
1692                #endif
1693
1694                if(!(::_out_file = fopen(svg_filename, "w")))
1695                {
1696                        fprintf(stderr, "Failed to open '%s' for output.  Terminating the process ...\n", svg_filename); exit(-1);
1697                }
1698
1699                for(int j=0;j<ITERATIONS;j++)
1700                {
1701                        //TODO - READ FILE INTO MEMORY
1702
1703                        #if defined(SYSTEM_TIME)
1704                                start = clock();
1705                        #endif
1706
1707                        #if defined(PAPI)
1708                                code_clocker->start_interval();
1709                        #endif
1710
1711                        /* Create parser */
1712                        parser = Parser_Interface::ParserFactory(gml_filename);
1713
1714                        /* Init constants */
1715                        init();
1716
1717                        /* Set layer specific transformation parameters */
1718                        set_parameters ( SCREEN_WIDTH,
1719                                         SCREEN_HEIGHT,
1720                                         BBOX,
1721                                         FEATURE_QNAMES[i],     //NS FEATURE_LNAMES[i]
1722                                         FEATURE_ID_QNAME,              //NS FEATURE_ID_LNAME
1723                                         FEATURE_QGEOMETRY[i],  //NS FEATURE_LGEOMETRY[i]
1724                                         FEATURE_STYLES[i]);
1725
1726                        /* allocate output buffer memory */
1727                        ::_out_buf_pos = 0;
1728
1729                        #if defined(NAIVE_FORMATTED_IO) || defined(FORMATTED_IO) || defined(MEMCPY_IO) || defined(SIMD_IO)
1730                            /* allocate file sized output buffer */
1731                                stats_file = fopen(gml_filename, "rb");
1732                                if(stats_file == NULL) {
1733                                        fprintf(stderr, "Cannot open '%s'. Terminating the process ...\n", gml_filename); exit(-1);
1734                                }
1735
1736                                if(fstat(fileno(stats_file), &fileinfo)!=0) {
1737                                        fprintf(stderr, "Cannot fstat '%s'. Terminating the process ...\n", gml_filename); exit(-1);
1738                                }
1739                                ::_out_buf_size = fileinfo.st_size * 2;
1740                                try {
1741                                        ::_out_buf = new char[::_out_buf_size];
1742                                } catch(std::bad_alloc) {
1743                                        cout << "Out of Memory. Terminating the process ...\n" << endl; exit(-1);
1744                                }
1745
1746
1747                        #elif defined(BUFFERED_MEMCPY_IO)
1748                                ::_out_buf_size = BUFFER_SIZE;
1749                                try {
1750                                        ::_out_buf = new char[::_out_buf_size];
1751                                } catch(...) {
1752                                        cout << "Out of Memory. Terminating the process ...\n" << endl; exit(-1);
1753                                }
1754                        #endif
1755
1756                        ::_out_buf_start = ::_out_buf;
1757
1758                        /* convert GML2SVG */
1759                        parser->Parse_Prolog();
1760                        parser->ParseContent();
1761                        parser->~Parser_Interface();
1762                        parser = NULL;
1763
1764                        #if defined(SYSTEM_TIME)
1765                                duration = ((clock() - start)/clocks_per_sec) * 1000;
1766                                fprintf(csv_out,",%5.10f", duration);
1767
1768                                if(SHOW_ITERATION_RESULTS)
1769                                {
1770                                        fprintf(stdout, "'%s' interval time ~%5.10f ms.\n",FEATURE_LNAMES[i], duration);
1771                                }
1772                        #endif
1773
1774                        #if defined(PAPI)
1775                                code_clocker->end_interval(0);
1776
1777                                if(SHOW_ITERATION_RESULTS)
1778                                {
1779                                        fprintf(stdout, "'%s' complete.\n",FEATURE_LNAMES[i]);
1780                                }
1781                        #endif
1782
1783                }
1784
1785                /* Write SVG file */
1786                #if defined(NAIVE_FORMATTED_IO) || defined(FORMATTED_IO) || defined(MEMCPY_IO) || defined(SIMD_IO)
1787                        fprintf(::_out_file, "%s", ::_out_buf_start);
1788                        fflush(::_out_file);
1789                #endif
1790
1791                if(!::_out_buf)
1792                {
1793                        delete [] ::_out_buf_start;
1794                        ::_out_buf = NULL;
1795                        ::_out_buf_start = NULL;
1796                }
1797
1798                fclose(::_out_file);
1799
1800                /* reset filenames */
1801                memset(gml_filename,'\0',strlen(gml_filename));
1802                memset(svg_filename,'\0',strlen(svg_filename));
1803
1804                #if defined(SYSTEM_TIME)
1805                        memset(csv_filename,'\0',strlen(csv_filename));
1806                #endif
1807        }
1808
1809        fprintf(stdout,"\nProcessing complete.\n");
1810
1811        #if defined(PAPI)
1812                code_clocker->display_system_info();
1813                code_clocker->display_raw_event_data();
1814                code_clocker->write_xml_file();
1815        #endif
1816
1817        fprintf(stdout,"\nMallocs:%d\n",::_total_mallocs);
1818        fprintf(stdout,"Reallocs:%d\n",::_total_reallocs);
1819
1820        /* free globally allocated memory */
1821        free_globals();
1822
1823        if(::_APP_NS_URI) {delete [] ::_APP_NS_URI;}
1824        if(::_GML_NS_URI) {delete [] ::_GML_NS_URI;}
1825
1826        if(layers) {delete layers;}
1827        if(gml_src_dir_path) {delete [] gml_src_dir_path;}
1828        if(gml_filename) {delete [] gml_filename;}
1829        if(svg_dest_dir_path) {delete [] svg_dest_dir_path;}
1830        if(svg_filename) {delete [] svg_filename;}
1831
1832        #if defined(SYSTEM_TIME)
1833                fclose(csv_out);
1834                if(csv_filename) {delete [] csv_filename;}
1835                if(csv_basename) {delete [] csv_basename;}
1836        #endif
1837}
1838
1839/* Helper Method Definitions */
1840static void free_globals()
1841{
1842        if(::_width) {delete [] ::_width;}
1843        if(::_height) {delete [] ::_height;}
1844        if(::_feature_qname) {delete [] ::_feature_qname;} //NS
1845        if(::_feature_id_qname) {delete [] ::_feature_id_qname;} //NS
1846        if(::_geometry_qname) {delete [] ::_geometry_qname;} //NS
1847        if(::_style_string) {delete [] ::_style_string;}
1848        if(::_feature_id) {delete [] ::_feature_id;}
1849}
1850
1851static void init()
1852{
1853        ::_crt_decimal = DECIMAL;
1854        ::_crt_cs = CS;
1855        ::_crt_ts = TS;
1856        ::_APP_NS_URI = new char[strlen(APP_NS_URI)+1];
1857        strcpy(::_APP_NS_URI,APP_NS_URI);
1858        ::_GML_NS_URI = new char[strlen(GML_NS_URI)+1];
1859        strcpy(::_GML_NS_URI,GML_NS_URI);
1860}
1861
1862static int set_parameters ( const char * screen_width,
1863                                                const char * screen_height,
1864                                                const char * bbox,
1865                                                const char * feature_qname,
1866                                                const char * feature_id_qname,
1867                                                const char * geometry_qname,
1868                                                const char * style_string)
1869{
1870        int error_flag = 0;
1871
1872        free_globals();
1873
1874        ::_width = new char [strlen(screen_width)+1];
1875        ::_height = new char [strlen(screen_height)+1];
1876        //::_application_ns = new char [strlen(application_ns)+1];
1877        ::_feature_qname = new char [strlen(feature_qname)+1]; //NS
1878        ::_feature_id_qname = new char [strlen(feature_id_qname)+1]; //NS
1879        ::_geometry_qname = new char [strlen(geometry_qname)+1]; //NS
1880        ::_style_string = new char [strlen(style_string)+1];
1881        ::_feature_id = new char [FEATURE_ID_MAX_LENGTH_EST+1];
1882        memset(::_feature_id,'\0',FEATURE_ID_MAX_LENGTH_EST);
1883
1884        strcpy(::_width,screen_width);
1885        strcpy(::_height,screen_height);
1886
1887        //strcpy(::_application_ns,application_ns);
1888        strcpy(::_feature_qname,feature_qname); //NS
1889        strcpy(::_feature_id_qname,feature_id_qname); //NS
1890        strcpy(::_geometry_qname,geometry_qname); //NS
1891
1892        double temp_screen_width;
1893        double temp_screen_height;
1894        error_flag = strtod_wrapper(::_width, &temp_screen_width);
1895        error_flag = strtod_wrapper(::_height, &temp_screen_height);
1896        error_flag = bbox_strtod(bbox, ::_crt_cs, &::_x1, &::_y1, &::_x2, &::_y2);
1897        ::_sum_y = ::_y1 + ::_y2;
1898        ::_scale_x = (temp_screen_width)/(::_x2 - ::_x1);
1899        ::_scale_y= (temp_screen_height)/(::_y2 - ::_y1);
1900
1901    #if defined(WORLD2SCREEN) // scale style string values
1902
1903                strcpy(::_style_string,style_string);
1904
1905        #else
1906
1907                char * temp_style_string = strdup(style_string);
1908                error_flag = scale_x_style_string_parameter(temp_style_string, STROKE_WIDTH, ::_scale_x, &::_style_string);
1909                free(temp_style_string);
1910
1911        #endif
1912
1913        return error_flag;
1914};
1915
1916
1917/* Define compile time IO type */
1918#if defined(MEMCPY_IO) || defined(BUFFERED_MEMCPY_IO)
1919
1920        static inline int emit_str(char ** dest, unsigned long int * dest_size, const char * src, size_t src_size)
1921        {
1922                // handle size error
1923                if(src_size > *dest_size)
1924                {
1925
1926                        print_error(__FILE__, __FUNCTION__, __LINE__, "Exceeded destination buffer capacity. Terminating the process ...");
1927                        exit(-1);
1928                        //return -1;
1929                }
1930
1931                // copy to output buffer
1932                memcpy(*dest, src, src_size);
1933
1934                // update output buffer pointer
1935                *dest = *dest + src_size;
1936
1937                // set remaining output buffer length
1938                *dest_size = *dest_size - src_size;
1939
1940                return src_size;
1941        }
1942
1943#elif defined(SIMD_IO)
1944
1945        static inline int emit_str(char ** dest, unsigned long int * dest_size, const char * src, size_t src_size)
1946        {
1947                // add error handling
1948                // handle size error
1949                if(src_size > *dest_size)
1950                {
1951                        print_error(__FILE__, __FUNCTION__, __LINE__, "Exceeded destination buffer capacity ...");
1952                        return -1;
1953                }
1954
1955                int src_remain = src_size;
1956                const char * src_ptr = src;
1957                do {
1958                        sisd_store_unaligned(sisd_load_unaligned((SIMD_type *) src_ptr), (SIMD_type *) *dest);
1959                        src_ptr += sizeof(SIMD_type);
1960                        *dest += sizeof(SIMD_type);
1961                        src_remain -= sizeof(SIMD_type);
1962                } while (src_remain > 0);
1963                *dest += src_remain;
1964                *dest_size = *dest_size - src_size;
1965
1966                return src_size;
1967        }
1968
1969#endif
1970
1971void print_error(const char * file, const char * function, const int line, const char * msg)
1972{
1973        fprintf(stderr, "%s:%s:%d: error: %s\n", file, function, line, msg);
1974}
1975
Note: See TracBrowser for help on using the repository browser.