ATLAS Offline Software
Loading...
Searching...
No Matches
SbStringHelpers.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5// this :
6
7#include <Inventor/C/errors/debugerror.h>
8#include <Inventor/SbPList.h>//hack to work around numitems not initialised in coin
9#include "SbStringHelpers.h"
10
11#include <Inventor/SbString.h>
12
13#include <stdlib.h>
14#include <string.h>
15
16#define SbMinimum(a,b) ((a)<(b)?(a):(b))
17
18static SbString* SbStringCreateV(int,const char*,va_list);
19
23char*
24SbSTRDUP(const char* aString){
25 char* p = (char*)::malloc((unsigned)::strlen(aString)+1);
26 if(p==NULL) return 0;
27 //cppcheck-suppress returnDanglingLifetime
28 return ::strcpy(p,aString);
29}
30
31void
32SbSTRDEL(char*& aString){
33 ::free(aString);
34 aString = NULL;
35}
36
37SbPList
38SbStringGetWords (const SbString& aString ,const char* aLimiter ){
39 SbPList list(16);
40
41 if(aString.getLength()<=0) return list;
42
43 SbString string = aString;
44
45 char* token = (char*)string.getString();
46
47 while(1) {
48 char* pos = ::strstr (token,aLimiter);
49 if(pos!=NULL) {
50 *pos = '\0';
51 if(*token!='\0') {
52 list.append(token);
53 }
54 token = pos + ::strlen(aLimiter);
55 } else {
56 //last word
57 if(*token!='\0') {
58 list.append(token);
59 }
60 break;
61 }
62 }
63
64 int wordn = list.getLength();
65 char* word;
66 for(int count=0;count<wordn;count++) {
67 word = (char*)list[count];
68 list[count] = new SbString(word);
69 }
70
71 return list;
72}
73
76 SbPList& aList
77)
80{
81 int linen = aList.getLength();
82 for(int count=0;count<linen;count++) delete ((SbString*)aList[count]);
83 //aList.Clear();
84}
85
87 const SbString& aString
88,SbBool& aValue
89)
92{
93 if( (aString=="true") || (aString=="TRUE") ||
94 (aString=="yes") || (aString=="YES") ) {
95 aValue = TRUE;
96 return TRUE;
97 } else if( (aString=="false") || (aString=="FALSE") ||
98 (aString=="no") || (aString=="NO") ) {
99 aValue = FALSE;
100 return TRUE;
101 } else {
102 aValue = FALSE;
103 return FALSE;
104 }
105}
106
107SbBool
108SbStringConvertToInt (const SbString& aString,int& aValue){
109 const char* string = aString.getString();
110 char* s;
111 long value = ::strtol(string,&s,10);
112 if(s==string) {
113 aValue = 0L;
114 return FALSE;
115 }
116 aValue = (int)value;
117 return TRUE;
118}
119
120SbBool
121SbStringConvertToFloat (const SbString& aString,float& aValue){
122 const char* string = aString.getString();
123 char* s;
124 double value = ::strtod(string,&s);
125 if(s==string) {
126 aValue = 0;
127 return FALSE;
128 }
129 aValue = (float)value;
130 return TRUE;
131}
132
133SbBool
134SbStringConvertToUnsignedLong(const SbString& aString,unsigned long& aValue
135){
136 aValue = 0L;
137 if(::sscanf(aString.getString(),"%lx",&aValue)!=1) {
138 if(::sscanf(aString.getString(),"%lu",&aValue)!=1) {
139 aValue = 0L;
140 return FALSE;
141 }
142 }
143 return TRUE;
144}
145
146SbBool
147SbStringPrintF (SbString& aString,int aNumber,const char* aFormat,...){
148 va_list args;
149 va_start(args,aFormat);
150 SbString* sbString = SbStringCreateV(aNumber,aFormat,args);
151 va_end(args);
152 if(sbString==NULL) {
153 aString = "";
154 return FALSE;
155 }
156 aString = *sbString;
157 delete sbString;
158 return TRUE;
159}
160
161SbString
162SbStringPrintF (int aNumber,const char* aFormat,...){
163 va_list args;
164 va_start(args,aFormat);
165 SbString* sbString = SbStringCreateV(aNumber,aFormat,args);
166 va_end(args);
167 if(sbString==NULL) return "";
168 SbString s(*sbString);
169 delete sbString;
170 return s;
171}
172
173int
174SbStringFind (const SbString& aString,const SbString& aSearch){
175 int lsearch = aSearch.getLength();
176 if(lsearch<=0) return SbStringNotFound;
177 int number = aString.getLength();
178 for(int index=0;index<=(number-lsearch);index++) {
179 if(aString.getSubString(index,index+lsearch-1)==aSearch) return index;
180 }
181 return SbStringNotFound;
182}
183
184int
185SbStringReverseFind (const SbString& aString,const SbString& aSearch){
186 int lsearch = aSearch.getLength();
187 if(lsearch<=0) return SbStringNotFound;
188 int number = aString.getLength();
189 for(int index=number-lsearch;index>=0;index--) {
190 if(aString.getSubString(index,index+lsearch-1)==aSearch) return index;
191 }
192 return SbStringNotFound;
193}
194
195SbString
196SbStringSuffix (const SbString& aString){
197 int index = SbStringReverseFind(aString,".");
198 if(index==SbStringNotFound) return SbString("");
199 return aString.getSubString(index+1);
200}
201
204SbString*
206 if(aLength<=0) aLength = 0;
207 char* string = (char*)::malloc((aLength+1)*sizeof(char));
208 if(string==NULL) return NULL;
209 string[aLength] = '\0';
210 for(int count=0;count<aLength;count++) string[count] = ' ';
211 SbString* sbString = new SbString(string);
212 free(string);
213 return sbString;
214}
215
217SbString*
218SbStringCreateV (int aNumber,const char* aFormat,va_list aArgs){
219 if(aNumber<0) return NULL;
220 SbString* sbString = SbStringCreateEmpty(aNumber);
221 if(sbString==NULL) return NULL;
222 const char* string = sbString->getString();
223 ::vsprintf((char*)string,aFormat,aArgs);
224 if(string[aNumber]!='\0') {
225 ::printf("SbStringCreateV : buffer overflow \n");
226 delete sbString;
227 return NULL;
228 }
229 return sbString;
230}
231
232SbBool
233SbStringIsTTF(const SbString& aString){
234 if(aString.getLength()<4) return FALSE;
235 if(aString.getSubString(0,3)!="TTF/") return FALSE;
236 return TRUE;
237}
238#include <string>
240SbBool
241SbStringGetenv(SbString& aString){
242 std::string a_String(aString.getString());
243 std::string::size_type dollar;
244 while((dollar=a_String.find('$'))!=std::string::npos){
245 std::string::size_type slash = a_String.find('/',dollar+1);
246 std::string::size_type back_slash = a_String.find('\\',dollar+1);
247 std::string::size_type pos = std::string::npos;
248 if(slash!=std::string::npos) {
249 if(back_slash!=std::string::npos) {
250 pos = SbMinimum(slash,back_slash);
251 } else {
252 pos = slash;
253 }
254 } else {
255 if(back_slash!=std::string::npos) {
256 pos = back_slash;
257 } else {
258 pos = std::string::npos;
259 }
260 }
261 std::string env;
262 if(pos==std::string::npos) {
263 env = a_String.substr(dollar+1,a_String.length()-(dollar+1));
264 } else {
265 // abc$xxx/ef
266 // 0 3 7 9
267 env = a_String.substr(dollar+1,pos-(dollar+1));
268 }
269 char* val = ::getenv(env.c_str());
270 if(val) {
271 std::string value = a_String.substr(0,dollar);
272 value += val;
273 if(pos!=std::string::npos)
274 value += a_String.substr(pos,a_String.length()-pos);
275 a_String = std::move(value);
276 }
277 if(!val) {
278 aString = SbString(a_String.c_str());
279 return FALSE; // Stop looping if env variable not found.
280 }
281 }
282 aString = SbString(a_String.c_str());
283 return TRUE;
284}
285
286SbBool
287SbString_isenv(const SbString& aString){
288 const char* env = ::getenv(aString.getString());
289 return (env?TRUE:FALSE);
290}
291
292// From bool Lib::System::getenv(
293
294SbBool
295SbString_getenv(const SbString& aString,SbString& aValue){
296 const char* env = ::getenv(aString.getString());
297 if(env) {
298 aValue = SbString(env);
299 return TRUE;
300 } else {
301 aValue = "";
302 return FALSE;
303 }
304}
305
306SbBool
307SbStringReplace(SbString& aString,const SbString& aOld ,const SbString& aNew ){
308 std::string a_Old(aOld.getString());
309 std::string a_New(aNew.getString());
310 if(a_Old=="") return FALSE;
311 std::string snew;
312 std::string::size_type lold = a_Old.length();
313 bool status = FALSE;
314 std::string stmp(aString.getString());
315 while(true) {
316 std::string::size_type pos = stmp.find(a_Old);
317 if(pos==std::string::npos){
318 snew += stmp;
319 break;
320 } else {
321 snew += stmp.substr(0,pos);
322 snew += a_New;
323 stmp = stmp.substr(pos+lold,stmp.length()-(pos+lold));
324 status = TRUE;
325 }
326 }
327 aString = SbString(snew.c_str());
328 return status;
329}
SbBool SbString_isenv(const SbString &aString)
char * SbSTRDUP(const char *aString)
SbBool SbString_getenv(const SbString &aString, SbString &aValue)
SbBool SbStringPrintF(SbString &aString, int aNumber, const char *aFormat,...)
SbPList SbStringGetWords(const SbString &aString, const char *aLimiter)
int SbStringFind(const SbString &aString, const SbString &aSearch)
static SbString * SbStringCreateV(int, const char *, va_list)
int SbStringReverseFind(const SbString &aString, const SbString &aSearch)
void SbSTRDEL(char *&aString)
SbBool SbStringIsTTF(const SbString &aString)
SbString * SbStringCreateEmpty(int aLength)
SbBool SbStringConvertToBool(const SbString &aString, SbBool &aValue)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
SbBool SbStringReplace(SbString &aString, const SbString &aOld, const SbString &aNew)
SbBool SbStringConvertToUnsignedLong(const SbString &aString, unsigned long &aValue)
SbBool SbStringConvertToFloat(const SbString &aString, float &aValue)
#define SbMinimum(a, b)
SbBool SbStringConvertToInt(const SbString &aString, int &aValue)
void SbStringDelete(SbPList &aList)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
SbString SbStringSuffix(const SbString &aString)
SbBool SbStringGetenv(SbString &aString)
#define SbStringNotFound
int count(std::string s, const std::string &regx)
count how many occurances of a regx are in a string
Definition hcg.cxx:146
Definition index.py:1
std::string number(const double &d, const std::string &s)
Definition utils.cxx:186