44 if(number>= std::numeric_limits<long int>::max())
return "inf";
45 if(number<= std::numeric_limits<long int>::min()+1)
return "-inf";
47 std::stringstream sstr;
56 std::stringstream sstr;
57 sstr <<
"0x" << std::setbase(16) << number;
65 if(number == (
long int) number)
68 std::stringstream sstr;
76 std::string
ExpandString(
const std::string& rString,
unsigned int len) {
79 std::string::size_type xtra = (std::string::size_type) len - rString.length();
80 if ((xtra > 0) && (xtra < 10000)) {
81 res.append(xtra,
' ');
87 std::string
CollapsString(
const std::string& rString,
unsigned int len) {
88 if(len <=1)
return rString;
89 if(rString.length() <= len)
return rString;
91 int ctail = len-chead;
92 return rString.substr(0,chead) +
"..." + rString.substr(rString.length()-ctail,ctail);
98 unsigned long ul = strtoul (rString.c_str(), &end, 0);
99 unsigned long idxmax = std::numeric_limits<Idx>::max();
101 throw Exception(
"atoidx",
"Idx overflow", 600);
107 std::string
StringSubstitute(
const std::string& rString,
const std::string& rFrom,
const std::string& rTo) {
112 while(pos<rString.length()) {
113 std::size_t next=rString.find(rFrom,pos);
114 if(next==std::string::npos)
break;
115 res.append(rString.substr(pos, next-pos));
117 pos=next+rFrom.length();
120 if(pos<rString.length())
121 res.append(rString.substr(pos));
128 return std::string(FAUDES_VERSION);
133 return std::string(FAUDES_PLUGINS);
139 "Ruediger Berndt, Christian Breindl, Christine Baier, Tobias Barthel, Christoph Doerr, Marc Duevel, Norman Franchi, Rainer Hartmann, Jochen Hellenschmidt, Stefan Jacobi, Matthias Leinfelder, Tomas Masopust, Andreas Mohr, Thomas Moor, Mihai Musunoi, Bernd Opitz, Irmgard Petzoldt, Sebastian Perk, Thomas Rempel, Daniel Ritter, Berno Schlein, Ece Schmidt, Klaus Schmidt, Anne-Kathrin Schmuck, Sven Schneider, Matthias Singer, Ulas Turan, Christian Wamser, Zhengying Wang, Thomas Wittmann, Shi Xiaoxun, Jorgos Zaddach, et al";
145 const std::string& rOutFile,
const std::string& rOutFormat,
const std::string& rDotExec)
147 std::string format=rOutFormat;
150 if(rOutFile.rfind(
'.')+1 < rOutFile.size()) {
151 format=rOutFile.substr(rOutFile.rfind(
'.')+1);
155 if (format ==
"canon");
156 else if (format ==
"dot");
157 else if (format ==
"xdot");
158 else if (format ==
"cmap");
159 else if (format ==
"dia");
160 else if (format ==
"fig");
161 else if (format ==
"gd");
162 else if (format ==
"gd2");
163 else if (format ==
"gif");
164 else if (format ==
"hpgl");
165 else if (format ==
"imap");
166 else if (format ==
"cmapx");
167 else if (format ==
"ismap");
168 else if (format ==
"jpg");
169 else if (format ==
"jpeg");
170 else if (format ==
"mif");
171 else if (format ==
"mp");
172 else if (format ==
"pcl");
173 else if (format ==
"pic");
174 else if (format ==
"plain");
175 else if (format ==
"plain-ext");
176 else if (format ==
"png");
177 else if (format ==
"ps");
178 else if (format ==
"ps2");
179 else if (format ==
"svg");
180 else if (format ==
"svgz");
181 else if (format ==
"vrml");
182 else if (format ==
"vtx");
183 else if (format ==
"wbmp");
184 else if (format ==
"eps");
185 else if (format ==
"pdf");
187 std::stringstream errstr;
188 errstr <<
"Dot output format \"" << format <<
"\" unknown";
189 throw Exception(
"faudes::ProcessDot", errstr.str(), 3);
191 std::string dotcommand = rDotExec +
" -T"+format+
" \""+rDotFile+
"\" -o \""+rOutFile+
"\"";
192 if(system(dotcommand.c_str()) != 0) {
194 "Error in running " + dotcommand, 3);
202 char filename[]=
"faudes_temp_XXXXXX";
207 filedes= mkstemp(filename);
209 FD_DF(
"faudes::CreateTempFile(): error");
213 res=std::string(filename);
215 #ifdef FAUDES_WINDOWS
231 char* tmpname = _mktemp(filename);
234 FD_DF(
"faudes::CreateTempFile(): error");
237 fopen_s(&file,tmpname,
"w");
239 FD_DF(
"faudes::CreateTempFile(): error");
243 res=std::string(tmpname);
245 FD_DF(
"faudes::CreateTempFile(): " << res);
253 return std::remove(rFileName.c_str()) == 0;
261 if(seppos==std::string::npos)
return res;
262 res=rFullPath.substr(0,seppos+1);
268 std::string res=rFullPath;
270 if(seppos==std::string::npos)
return res;
271 res=rFullPath.substr(seppos+1);
277 std::string res=rFullPath;
279 if(seppos!=std::string::npos) {
280 res=res.substr(seppos+1);
282 std::size_t dotpos = res.find_last_of(
".");
283 if(dotpos!=std::string::npos) {
284 res=res.substr(0,dotpos);
291 std::string res=rFullPath;
293 if(seppos!=std::string::npos) {
294 res=res.substr(seppos+1);
296 std::size_t dotpos = res.find_last_of(
".");
297 if(dotpos!=std::string::npos)
298 if(dotpos +1 < res.size()) {
299 return res.substr(dotpos+1,res.size()-dotpos-1);
301 return std::string();
305 std::string
PrependDirectory(
const std::string& rDirectory,
const std::string& rFileName) {
306 std::string res=rDirectory;
309 if(res.at(res.length()-1)!=sepchar)
310 res.append(1,sepchar);
311 res.append(rFileName);
319 thedir=opendir(rDirectory.c_str());
320 if(thedir) closedir(thedir);
323 #ifdef FAUDES_WINDOWS
324 DWORD fattr = GetFileAttributesA(rDirectory.c_str());
326 (fattr!=INVALID_FILE_ATTRIBUTES) && (fattr & FILE_ATTRIBUTE_DIRECTORY);
333 std::set< std::string > res;
336 struct dirent *theent;
337 thedir=opendir(rDirectory.c_str());
338 if(!thedir)
return res;
339 while((theent=readdir(thedir))) {
340 std::string fname(theent->d_name);
341 if(fname==
".")
continue;
342 if(fname==
"..")
continue;
347 #ifdef FAUDES_WINDOWS
349 WIN32_FIND_DATA data;
350 hf = FindFirstFile((rDirectory+
"\\*.*").c_str(), &data);
351 if (hf != INVALID_HANDLE_VALUE) {
353 std::string fname(data.cFileName);
354 if(fname==
".")
continue;
355 if(fname==
"..")
continue;
357 }
while (FindNextFile(hf, &data));
371 fp.open(rFilename.c_str(), std::ios::in | std::ios::binary);
377 return remove(rFilename.c_str()) == 0;
381 bool FileCopy(
const std::string& rFromFile,
const std::string& rToFile) {
382 std::ifstream froms(rFromFile.c_str(), std::ios::binary);
383 std::ofstream tos(rToFile.c_str(), std::ios::binary);
384 tos << froms.rdbuf();
386 return !(froms.fail() || tos.fail());
420 DoWrite(message,cntnow,cntdone);
423 (void) cntnow; (void) cntdone;
425 if(!sout) sout=&std::cout;
440 mspCount=
new std::map<std::string,long int>();
441 mspMax=
new std::map<std::string,long int>();
449 long int cnt = ((*mspCount)[rTypeName]+=1);
454 (*mspCount)[rTypeName]-=1;
460 #ifdef FAUDES_DEBUG_CODE
468 std::map<std::string,long int>::iterator cit;
478 #ifdef FAUDES_DEBUG_CODE
480 class ExitFunctionInstall {
483 static ExitFunctionInstall mInstance;
484 ExitFunctionInstall(
void) {
492 bool ExitFunctionInstall::mDone=
false;
493 ExitFunctionInstall ExitFunctionInstall::mInstance;
504 std::string filename=rSource;
506 if(filename==
"") filename=
"faudes_dump";
510 std::string::size_type pos=0;
511 for(;pos<filename.length();pos++)
512 if(filename.at(pos)==
'.') filename.at(pos)=
'_';
514 filename.append(
".prot");
518 filename.insert(0,
"tmp_");
544 void TestProtocol(
const std::string& rMessage,
const std::string& rData) {
559 fp.open(prot.c_str(), std::ios::in | std::ios::binary);
567 fr.open(ref.c_str(), std::ios::in | std::ios::binary);
571 fr.open(ref.c_str(), std::ios::in | std::ios::binary);
586 if(fp.eof() && fr.eof()) {
break; }
587 if(!fp.good() || !fr.good()) { dline=cline;
break;}
589 if( cp==
'\r' && cr ==
'\r')
continue;
590 if( cp==
'\r' && fp.eof()){ dline=cline;
break;}
591 if( cp==
'\r') cp = fp.get();
592 if( cr==
'\r' && fr.eof()){ dline=cline;
break;}
593 if( cr==
'\r') cr = fr.get();
595 if( cr==
'\n') cline++;
597 if( cp!= cr ){dline=cline;
break;}
599 }
catch(std::ios::failure&) {
626 throw Exception(
"LoopCallback",
"break on application request", 110);