Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
xDataTOM_Misc.cc
Go to the documentation of this file.
1/*
2# <<BEGIN-copyright>>
3# <<END-copyright>>
4*/
5
6#include <stdlib.h>
7#include <string.h>
8#include <ctype.h>
9#ifdef WIN32
10#include <direct.h>
11#else
12#include <unistd.h>
13#endif
14
15#include "xDataTOM_private.h"
16
17#if defined __cplusplus
18namespace GIDI {
19using namespace GIDI;
20#endif
21
22#define nameValueLength 1024
23
24static xDataTOM_element *xDataTOM_getLinksElement2( statusMessageReporting *smr, xDataTOM_element *element, char const *link, char const *fullLink );
25static int xDataTOM_getLinksElement3( statusMessageReporting *smr, char const *nameValue, char *name, char *value, char const *fullLink );
26/*
27************************************************************
28*/
29char *xDataTOMMisc_getAbsPath( statusMessageReporting *smr, const char *fileName ) {
30/*
31* User must free returned string.
32*/
33 int n = (int) strlen( fileName ) + 1, nCwd = 0;
34 char *absPath, cwd[4 * 1024] = "", *p, *needle;
35
36 if( fileName[0] != '/' ) {
37 //if( getcwd( cwd, sizeof( cwd ) + 1 ) == NULL ) {
38 //TK modified above line for compiler(gcc.4.8) warning message
39 if( getcwd( cwd, sizeof( cwd ) ) == NULL ) {
40 smr_setReportError2p( smr, xDataTOM_smrLibraryID, -1, "hardwired cwd too small" );
41 return( NULL );
42 }
43 nCwd = (int) strlen( cwd );
44 n += nCwd + 1; /* cwd + '/'. */
45 }
46 if( ( absPath = (char *) smr_malloc2( smr, n, 0, "absPath" ) ) == NULL ) return( NULL );
47 if( fileName[0] != '/' ) {
48 strcpy( absPath, cwd );
49 strcat( absPath, "/" );
50 strcat( absPath, fileName ); }
51 else {
52 strcpy( absPath, fileName );
53 }
54
55 while( 1 ) { /* Remove all ./ from path. */
56 if( ( needle = strstr( absPath, "/./" ) ) == NULL ) break;
57 p = needle;
58 for( needle += 2; *needle; p++, needle++ ) *p = *needle;
59 *p = 0;
60 } // Loop checking, 11.06.2015, T. Koi
61
62 while( 1 ) { /* Remove all ../ from path. */
63 if( ( needle = strstr( absPath, "/../" ) ) == NULL ) break;
64 p = needle - 1;
65 while( ( p > absPath ) && ( *p != '/' ) ) p--; // Loop checking, 11.06.2015, T. Koi
66 if( *p != '/' ) break; /* This should not happen if path is legit, I think, and I do not know what to do so will leave it. */
67 if( p == absPath ) break; /* Ditto. */
68 for( needle += 3; *needle; p++, needle++ ) *p = *needle;
69 *p = 0;
70 } // Loop checking, 11.06.2015, T. Koi
71 return( absPath );
72}
73/*
74************************************************************
75*/
76int xDataTOM_setMessageError_ReturnInt( int value, statusMessageReporting *smr, void *userInterface, const char *packageName, int lineNumber, int code,
77 const char *fmt, ... ) {
78
79 va_list args;
80
81 va_start( args, fmt );
82 smr_setReportError( smr, userInterface, packageName, lineNumber, __func__, xDataTOM_smrLibraryID, code, fmt, args );
83 va_end( args );
84 return( value );
85}
86/*
87************************************************************
88*/
90
91 xDataTOM_element *linkedElement = NULL;
92
93 if( link[0] == '/' ) {
94 for( linkedElement = element; linkedElement->parent != NULL; ) linkedElement = linkedElement->parent;
95 linkedElement = xDataTOM_getLinksElement2( smr, linkedElement, &(link[1]), link ); }
96 else {
97 smr_setReportError2( smr, smr_unknownID, 1, "Only absolute link currently supported: requested link = '%s'", link );
98 }
99 return( linkedElement );
100}
101/*
102************************************************************
103*/
104static xDataTOM_element *xDataTOM_getLinksElement2( statusMessageReporting *smr, xDataTOM_element *element, char const *link, char const *fullLink ) {
105
106 int n = (int) strlen( link );
107 char const *slash = strchr( link, '/' ), *bracket = strchr( link, '[' ), *attributesValue;
109 xDataTOM_element *child;
110
111 if( bracket != NULL ) n = (int) ( bracket - link );
112 if( slash != NULL ) {
113 if( (int) ( slash - link ) < n ) {
114 n = (int) ( slash - link );
115 bracket = NULL;
116 }
117 }
118 for( child = element->children; child != NULL; child = child->next ) {
119 if( strncmp( link, child->name, n ) == 0 ) {
120 if( bracket != NULL ) {
121 if( bracket[1] != '@' ) {
122 smr_setReportError2( smr, smr_unknownID, 1, "bad link info at '%s' of '%s'", bracket, fullLink );
123 return( NULL );
124 }
125 if( xDataTOM_getLinksElement3( smr, &(bracket[2]), name, value, fullLink ) ) return( NULL );
126 if( ( attributesValue = xDataTOM_getAttributesValueInElement( child, name ) ) == NULL ) continue;
127 if( strcmp( value, attributesValue ) ) continue;
128 }
129 if( slash == NULL ) return( child );
130 return( xDataTOM_getLinksElement2( smr, child, &(slash[1]), fullLink ) );
131 }
132 }
133 return( NULL );
134}
135/*
136************************************************************
137*/
138static int xDataTOM_getLinksElement3( statusMessageReporting *smr, char const *nameValue, char *name, char *value, char const *fullLink ) {
139
140 int n;
141 char const *equal = strchr( nameValue, '=' ), *p;
142 char quote = '\'';
143
144 if( equal == NULL ) {
145 smr_setReportError2( smr, smr_unknownID, 1, "link qualifier missing '=' character at '%s' of '%s'", nameValue, fullLink );
146 return( 1 );
147 }
148 n = (int) ( equal - nameValue );
149 if( n >= ( nameValueLength - 1 ) ) {
150 smr_setReportError2( smr, smr_unknownID, 1, "link's name qualifier too long at '%s' of '%s'", nameValue, fullLink );
151 return( 1 );
152 }
153 strncpy( name, nameValue, n );
154 name[n] = 0;
155
156 equal++;
157 if( *equal != quote ) quote = '"';
158 if( *equal != quote ) {
159 smr_setReportError2( smr, smr_unknownID, 1, "link's name qualifier missing quote at '%s' of '%s'", nameValue, fullLink );
160 return( 1 );
161 }
162
163 equal++;
164 p = strchr( equal, quote );
165 if( p == NULL ) {
166 smr_setReportError2( smr, smr_unknownID, 1, "link's name qualifier missing end quote at '%s' of '%s'", nameValue, fullLink );
167 return( 1 );
168 }
169
170 n = (int) ( p - equal );
171 if( n >= ( nameValueLength - 1 ) ) {
172 smr_setReportError2( smr, smr_unknownID, 1, "link's value qualifier too long at '%s' of '%s'", nameValue, fullLink );
173 return( 1 );
174 }
175 strncpy( value, equal, n );
176 value[n] = 0;
177
178 return( 0 );
179}
180
181#if defined __cplusplus
182}
183#endif
const char * name(G4int ptype)
#define smr_setReportError2(smr, libraryID, code, fmt,...)
#define smr_setReportError2p(smr, libraryID, code, fmt)
int smr_setReportError(statusMessageReporting *smr, void *userInterface, char const *file, int line, char const *function, int libraryID, int code, char const *fmt,...)
#define smr_malloc2(smr, size, zero, forItem)
#define smr_unknownID
Definition: inftrees.h:24
xDataTOM_element * children
Definition: xDataTOM.h:186
xDataTOM_element * next
Definition: xDataTOM.h:182
xDataTOM_element * parent
Definition: xDataTOM.h:181
xDataTOM_element * xDataTOM_getLinksElement(statusMessageReporting *smr, xDataTOM_element *element, char const *link)
int xDataTOM_setMessageError_ReturnInt(int value, statusMessageReporting *smr, void *userData, const char *file, int line, int code, const char *fmt,...)
char const * xDataTOM_getAttributesValueInElement(xDataTOM_element *element, char const *name)
Definition: xDataTOM.cc:286
char * xDataTOMMisc_getAbsPath(statusMessageReporting *smr, const char *fileName)
#define nameValueLength
int xDataTOM_smrLibraryID
Definition: xDataTOM.cc:34