Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
xDataExtras.cc
Go to the documentation of this file.
1/*
2# <<BEGIN-copyright>>
3# Copyright (c) 2010, Lawrence Livermore National Security, LLC.
4# Produced at the Lawrence Livermore National Laboratory
5# Written by Bret R. Beck, beck6@llnl.gov.
6# CODE-461393
7# All rights reserved.
8#
9# This file is part of GIDI. For details, see nuclear.llnl.gov.
10# Please also read the "Additional BSD Notice" at nuclear.llnl.gov.
11#
12# Redistribution and use in source and binary forms, with or without modification,
13# are permitted provided that the following conditions are met:
14#
15# 1) Redistributions of source code must retain the above copyright notice,
16# this list of conditions and the disclaimer below.
17# 2) Redistributions in binary form must reproduce the above copyright notice,
18# this list of conditions and the disclaimer (as noted below) in the
19# documentation and/or other materials provided with the distribution.
20# 3) Neither the name of the LLNS/LLNL nor the names of its contributors may be
21# used to endorse or promote products derived from this software without
22# specific prior written permission.
23#
24# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
25# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
26# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
27# SHALL LAWRENCE LIVERMORE NATIONAL SECURITY, LLC, THE U.S. DEPARTMENT OF ENERGY OR
28# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
31# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
33# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34# <<END-copyright>>
35*/
36#include <stdio.h>
37#include <stdlib.h>
38#include <string.h>
39
40#include "xData.h"
41
42#if defined __cplusplus
43namespace GIDI {
44using namespace GIDI;
45#endif
46
47typedef struct xmlTextStruct_s {
49 long length;
50 char *text;
52
53static int xData_parseReconstructXML2( xData_rootElement *root, xmlTextStruct *XML, char *text, long textLength );
54static int addStringToXML( xmlTextStruct *XML, char *s, long len );
55static void xData_parseOutlinePrintRoot( FILE *f, xData_rootElement *root, int outputText );
56/*
57************************************************************
58*/
60
61 int err;
62 xmlTextStruct XML = { 0, 0, NULL };
63
64 err = xData_parseReconstructXML2( &(xData_doc->root), &XML, NULL, 0 );
65 //if( err == 0 ) addStringToXML( &XML, "\n", -1 );
66 if( err == 0 ) addStringToXML( &XML, (char*) "\n", -1 );
67 return( XML.text );
68}
69/*
70************************************************************
71*/
72static int xData_parseReconstructXML2( xData_rootElement *root, xmlTextStruct *XML, char *text, long textLength ) {
73
74 long i, textOffset = 0;
75 xData_element *child;
76
77 for( child = root->children; child != NULL; child = child->next ) {
78 //if( textOffset < child->textOffset ) {
79 if( textOffset < (int) child->textOffset ) {
80 if( addStringToXML( XML, &(text[textOffset]), child->textOffset - textOffset ) ) return( 1 );
81 textOffset = child->textOffset;
82 }
83 //if( addStringToXML( XML, "<", -1 ) != 0 ) return( 1 );
84 if( addStringToXML( XML, (char*) "<", -1 ) != 0 ) return( 1 );
85 if( addStringToXML( XML, child->name, -1 ) != 0 ) return( 1 );
86 for( i = 0; i < child->attributes.number; i++ ) {
87 //if( addStringToXML( XML, " ", -1 ) != 0 ) return( 1 );
88 if( addStringToXML( XML, (char*) " ", -1 ) != 0 ) return( 1 );
89 if( addStringToXML( XML, child->attributes.attributes[i].name, -1 ) != 0 ) return( 1 );
90 //if( addStringToXML( XML, "=\"", -1 ) != 0 ) return( 1 );
91 if( addStringToXML( XML, (char*) "=\"", -1 ) != 0 ) return( 1 );
92 if( addStringToXML( XML, child->attributes.attributes[i].value, -1 ) != 0 ) return( 1 );
93 //if( addStringToXML( XML, "\"", -1 ) != 0 ) return( 1 );
94 if( addStringToXML( XML, (char*) "\"", -1 ) != 0 ) return( 1 );
95 }
96 //if( addStringToXML( XML, ">", -1 ) != 0 ) return( 1 );
97 if( addStringToXML( XML, (char*) ">", -1 ) != 0 ) return( 1 );
98 if( xData_parseReconstructXML2( &(child->childrenRoot), XML, child->text.text, child->text.length ) != 0 ) return( 1 );
99 //if( addStringToXML( XML, "</", -1 ) != 0 ) return( 1 );
100 if( addStringToXML( XML, (char*) "</", -1 ) != 0 ) return( 1 );
101 if( addStringToXML( XML, child->name, -1 ) != 0 ) return( 1 );
102 //if( addStringToXML( XML, ">", -1 ) != 0 ) return( 1 );
103 if( addStringToXML( XML, (char*) ">", -1 ) != 0 ) return( 1 );
104 }
105 if( textOffset < textLength ) if( addStringToXML( XML, &(text[textOffset]), textLength - textOffset ) ) return( 1 );
106 return( 0 );
107}
108/*
109************************************************************
110*/
111static int addStringToXML( xmlTextStruct *XML, char *s, long len ) {
112
113 long lenS, length, inc;
114 char *p;
115
116 if( len >= 0 ) {
117 lenS = len; }
118 else {
119 lenS = strlen( s );
120 }
121 length = XML->length + lenS + 1;
122 if( XML->allocated < length ) {
123 inc = ( 140 * XML->allocated ) / 100;
124 if( inc < 10000 ) inc = 10000;
125 if( length < inc ) length = inc;
126 XML->text = (char *) realloc( XML->text, length );
127 XML->allocated = length;
128 if( XML->text == NULL ) return( 1 );
129 }
130 p = &(XML->text[XML->length]);
131 if( len >= 0 ) {
132 strncpy( p, s, len ); }
133 else {
134 strcpy( p, s );
135 }
136 XML->length += lenS;
137 return( 0 );
138}
139/*
140************************************************************
141*/
142int xData_parseOutline( FILE *f, xData_document *xData_doc, int outputText ) {
143
144 xData_parseOutlinePrintRoot( f, &(xData_doc->root), outputText );
145 return( 0 );
146}
147/*
148************************************************************
149*/
150static void xData_parseOutlinePrintRoot( FILE *f, xData_rootElement *root, int outputText ) {
151
152 int i, depth = root->depth;
153 xData_element *child;
154
155 for( child = root->children; child != NULL; child = child->next ) {
156 for( i = 0; i < depth; i++ ) fprintf( f, " " );
157 fprintf( f, "name = %s at line = %ld column = %ld textOffset = %ld; attris:",
158 //child->name, child->docInfo.line, child->docInfo.column, child->textOffset );
159 child->name, (long int)child->docInfo.line, (long int)child->docInfo.column, (long int)child->textOffset );
160 for( i = 0; i < child->attributes.number; i++ ) {
161 fprintf( f, " %s = \"%s\"", child->attributes.attributes[i].name, child->attributes.attributes[i].value );
162 }
163 if( outputText && child->text.text != NULL ) fprintf( f, "; text: %s", child->text.text );
164 fprintf( f, "\n" );
165 xData_parseOutlinePrintRoot( f, &(child->childrenRoot), outputText );
166 }
167}
168
169#if defined __cplusplus
170}
171#endif
char * name
Definition: xData.h:122
char * value
Definition: xData.h:123
xData_attribute * attributes
Definition: xData.h:129
size_t line
Definition: xData.h:117
size_t column
Definition: xData.h:118
xData_rootElement root
Definition: xData.h:208
xData_docInfo docInfo
Definition: xData.h:177
xData_attributionList attributes
Definition: xData.h:186
xData_element * next
Definition: xData.h:183
xData_text text
Definition: xData.h:189
char * name
Definition: xData.h:184
size_t textOffset
Definition: xData.h:188
xData_rootElement childrenRoot
Definition: xData.h:182
xData_element * children
Definition: xData.h:172
char * text
Definition: xData.h:136
size_t length
Definition: xData.h:135
struct xmlTextStruct_s xmlTextStruct
int xData_parseOutline(FILE *f, xData_document *xData_doc, int outputText)
Definition: xDataExtras.cc:142
char * xData_parseReconstructXML(xData_document *xData_doc)
Definition: xDataExtras.cc:59