-/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
-\r
- Header: FGConfigFile.h\r
- Author: Jon Berndt\r
- Date started: 03/29/00\r
- Purpose: Config file read-in class\r
- Called by: FGAircraft\r
-\r
-FUNCTIONAL DESCRIPTION\r
---------------------------------------------------------------------------------\r
-\r
-HISTORY\r
---------------------------------------------------------------------------------\r
-03/16/2000 JSB Created\r
-\r
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
-INCLUDES\r
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
-\r
-#include "FGConfigFile.h"\r
-#include <stdlib.h>\r
-#include <math.h>\r
-\r
-static const char *IdSrc = "$Id$";\r
-static const char *IdHdr = ID_CONFIGFILE;\r
-\r
-/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
-CLASS IMPLEMENTATION\r
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
-\r
-FGConfigFile::FGConfigFile(string cfgFileName)\r
-{\r
-#if defined ( sgi ) && !defined( __GNUC__ )\r
- cfgfile.open(cfgFileName.c_str(), ios::in );\r
-#else\r
- cfgfile.open(cfgFileName.c_str(), ios::in | ios::binary );\r
-#endif\r
- CommentsOn = false;\r
- CurrentIndex = 0;\r
- Opened = true;\r
-#if defined ( sgi ) && !defined( __GNUC__ )\r
- if (!cfgfile.fail() && !cfgfile.eof()) GetNextConfigLine();\r
-#else\r
- if (cfgfile.is_open()) GetNextConfigLine();\r
-#endif\r
- else Opened = false;\r
-\r
- if (debug_lvl & 2) cout << "Instantiated: FGConfigFile" << endl;\r
-}\r
-\r
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
-\r
-FGConfigFile::~FGConfigFile()\r
-{\r
- cfgfile.close();\r
- if (debug_lvl & 2) cout << "Destroyed: FGConfigFile" << endl;\r
-}\r
-\r
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
-\r
-string FGConfigFile::GetNextConfigLine(void)\r
-{\r
- int deblank, not_found = string::npos;\r
- int comment_starts_at;\r
- int comment_ends_at;\r
- int comment_length;\r
- int line_length;\r
- bool start_comment, end_comment;\r
- string CommentStringTemp;\r
-\r
- do {\r
- CurrentLine = GetLine();\r
- line_length = CurrentLine.length();\r
- comment_starts_at = CurrentLine.find("<!--");\r
- \r
- if (comment_starts_at >= 0) start_comment = true;\r
- else start_comment = false;\r
- \r
- comment_ends_at = CurrentLine.find("-->");\r
- \r
- if (comment_ends_at >= 0) end_comment = true;\r
- else end_comment = false;\r
-\r
- if (!start_comment && !end_comment) { // command comment\r
- if (CommentsOn) CommentStringTemp = CurrentLine;\r
- CommentString += CommentStringTemp + "\r\n";\r
- } else if (start_comment && comment_ends_at > comment_starts_at) { // <!-- ... -->\r
- CommentsOn = false;\r
- comment_length = comment_ends_at + 2 - comment_starts_at + 1;\r
- LineComment = CurrentLine.substr(comment_starts_at+4, comment_length-4-3);\r
- CurrentLine.erase(comment_starts_at, comment_length);\r
- } else if ( start_comment && !end_comment) { // <!-- ...\r
- CommentsOn = true;\r
- comment_length = line_length - comment_starts_at;\r
- CommentStringTemp = CurrentLine.substr(comment_starts_at+4, comment_length-4);\r
- CommentString = CommentStringTemp + "\r\n";\r
- CurrentLine.erase(comment_starts_at, comment_length);\r
- } else if (!start_comment && end_comment) { // ... -->\r
- CommentsOn = false;\r
- comment_length = comment_ends_at + 2 + 1;\r
- CommentStringTemp = CurrentLine.substr(0, comment_length-4);\r
- CommentString += CommentStringTemp + "\r\n";\r
- CurrentLine.erase(0, comment_length);\r
- } else if (start_comment && comment_ends_at < comment_starts_at) { // --> command <!--\r
- cerr << "Old comment ends and new one starts - bad JSBSim config file form." << endl;\r
- CommentsOn = false;\r
- comment_length = comment_ends_at + 2 + 1;\r
- CommentStringTemp = CurrentLine.substr(0, comment_length-4);\r
- CommentString += CommentStringTemp + "\r\n";\r
- CurrentLine.erase(0, comment_length);\r
- }\r
- \r
- } while (CommentsOn);\r
-\r
- if (CurrentLine.length() == 0) GetNextConfigLine();\r
- CurrentIndex = 0;\r
- return CurrentLine;\r
-}\r
-\r
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
-\r
-string FGConfigFile::GetValue(string val)\r
-{\r
- unsigned int pos, p1, p2, ptest;\r
-\r
- if (val == "") { // this call is to return the tag value\r
- pos = CurrentLine.find("<");\r
- if (pos != CurrentLine.npos) { // beginning brace found "<"\r
- p1 = CurrentLine.find_first_not_of(" ",pos+1);\r
- if (p1 != CurrentLine.npos) { // found first character of tag\r
- p2 = CurrentLine.find_first_of(" >",p1+1);\r
- if (p2 == CurrentLine.npos) p2 = p1+1;\r
- return CurrentLine.substr(p1,p2-p1);\r
- }\r
- } else { // beginning brace "<" not found; this is a regular data line\r
- pos = CurrentLine.find_first_not_of(" ");\r
- if (pos != CurrentLine.npos) { // first character in line found\r
- p2 = CurrentLine.find_first_of(" ",pos+1);\r
- if (p2 != CurrentLine.npos) {\r
- return CurrentLine.substr(pos,p2-pos);\r
- } else {\r
- return CurrentLine.substr(pos,CurrentLine.length()-pos);\r
- }\r
- }\r
- }\r
- } else { // return a value for a specific tag\r
- pos = CurrentLine.find(val);\r
- if (pos != CurrentLine.npos) {\r
- pos = CurrentLine.find("=",pos);\r
- if (pos != CurrentLine.npos) {\r
- ptest = CurrentLine.find_first_not_of(" ",pos+1);\r
- if (ptest != CurrentLine.npos) {\r
- p1 = ptest + 1;\r
- if (CurrentLine[ptest] == '"') { // quoted\r
- p2 = CurrentLine.find_first_of("\"",p1);\r
- } else { // not quoted\r
- p2 = CurrentLine.find_first_of(" ",p1);\r
- }\r
- if (p2 != CurrentLine.npos) {\r
- return CurrentLine.substr(p1,p2-p1);\r
- }\r
- }\r
- } else { // "=" not found\r
- pos = CurrentLine.find(val);\r
- pos = CurrentLine.find_first_of(" ",pos+1);\r
- ptest = CurrentLine.find_first_not_of(" ",pos+1);\r
- if (ptest != CurrentLine.npos) {\r
- if (CurrentLine[ptest] == '"') { // quoted\r
- p1 = ptest + 1;\r
- p2 = CurrentLine.find_first_of("\"",p1);\r
- } else { // not quoted\r
- p1 = ptest;\r
- p2 = CurrentLine.find_first_of(" ",p1);\r
- }\r
- if (p2 != CurrentLine.npos) {\r
- return CurrentLine.substr(p1,p2-p1);\r
- } else {\r
- p2 = CurrentLine.length();\r
- return CurrentLine.substr(p1,p2-p1);\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
- return string("");\r
-}\r
-\r
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
-\r
-string FGConfigFile::GetValue(void)\r
-{\r
- return GetValue("");\r
-}\r
-\r
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
-\r
-string FGConfigFile::GetLine(void)\r
-{\r
- string scratch = "";\r
- int test;\r
-\r
- while ((test = cfgfile.get()) != EOF) {\r
- if (test >= 0x20 || test == 0x09) {\r
- if (test == 0x09) {\r
- scratch += (char)0x20;\r
- } else {\r
- scratch += (char)test;\r
- }\r
- } else {\r
- if ((test = cfgfile.get()) != EOF) { // get *next* character\r
-#if defined ( sgi ) && !defined( __GNUC__ )\r
- if (test >= 0x20 || test == 0x09) cfgfile.putback(test);\r
-#else\r
- if (test >= 0x20 || test == 0x09) cfgfile.unget();\r
-#endif\r
- break;\r
- }\r
- }\r
- }\r
- if (cfgfile.eof()) return string("EOF");\r
- return scratch;\r
-}\r
-\r
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
-/*\r
-FGConfigFile& FGConfigFile::operator>>(double& val)\r
-{\r
- unsigned int pos, end;\r
-\r
- pos = CurrentLine.find_first_not_of(", ",CurrentIndex);\r
- if (pos == CurrentLine.npos) pos = CurrentLine.length();\r
- end = CurrentLine.find_first_of(", ",pos+1);\r
- if (end == CurrentLine.npos) end = CurrentLine.length();\r
- string str = CurrentLine.substr(pos, end - pos);\r
- val = strtod(str.c_str(),NULL);\r
- CurrentIndex = end+1;\r
- if (CurrentIndex >= CurrentLine.length()) GetNextConfigLine();\r
- return *this;\r
-}\r
-*/\r
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
-\r
-FGConfigFile& FGConfigFile::operator>>(double& val)\r
-{\r
- unsigned int pos, end;\r
-\r
- pos = CurrentLine.find_first_not_of(", ",CurrentIndex);\r
- if (pos == CurrentLine.npos) pos = CurrentLine.length();\r
- end = CurrentLine.find_first_of(", ",pos+1);\r
- if (end == CurrentLine.npos) end = CurrentLine.length();\r
- string str = CurrentLine.substr(pos, end - pos);\r
- val = strtod(str.c_str(),NULL);\r
- CurrentIndex = end+1;\r
- if (CurrentIndex >= CurrentLine.length()) GetNextConfigLine();\r
- return *this;\r
-}\r
-\r
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
-\r
-FGConfigFile& FGConfigFile::operator>>(int& val)\r
-{\r
- unsigned int pos, end;\r
-\r
- pos = CurrentLine.find_first_not_of(", ",CurrentIndex);\r
- if (pos == CurrentLine.npos) pos = CurrentLine.length();\r
- end = CurrentLine.find_first_of(", ",pos+1);\r
- if (end == CurrentLine.npos) end = CurrentLine.length();\r
- string str = CurrentLine.substr(pos, end - pos);\r
- val = atoi(str.c_str());\r
- CurrentIndex = end+1;\r
- if (CurrentIndex >= CurrentLine.length()) GetNextConfigLine();\r
- return *this;\r
-}\r
-\r
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
-\r
-FGConfigFile& FGConfigFile::operator>>(eParam& val)\r
-{\r
- unsigned int pos, end;\r
-\r
- pos = CurrentLine.find_first_not_of(", ",CurrentIndex);\r
- if (pos == CurrentLine.npos) pos = CurrentLine.length();\r
- end = CurrentLine.find_first_of(", ",pos+1);\r
- if (end == CurrentLine.npos) end = CurrentLine.length();\r
- string str = CurrentLine.substr(pos, end - pos);\r
- val = (eParam)atoi(str.c_str());\r
- CurrentIndex = end+1;\r
- if (CurrentIndex >= CurrentLine.length()) GetNextConfigLine();\r
- return *this;\r
-}\r
-\r
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
-\r
-FGConfigFile& FGConfigFile::operator>>(string& str)\r
-{\r
- unsigned int pos, end;\r
-\r
- pos = CurrentLine.find_first_not_of(", ",CurrentIndex);\r
- if (pos == CurrentLine.npos) pos = CurrentLine.length();\r
- end = CurrentLine.find_first_of(", ",pos+1);\r
- if (end == CurrentLine.npos) end = CurrentLine.length();\r
- str = CurrentLine.substr(pos, end - pos);\r
- CurrentIndex = end+1;\r
- if (CurrentIndex >= CurrentLine.length()) GetNextConfigLine();\r
- return *this;\r
-}\r
-\r
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
-\r
-void FGConfigFile::ResetLineIndexToZero(void)\r
-{\r
- CurrentIndex = 0;\r
-}\r
-\r
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
-\r
-void FGConfigFile::Debug(void)\r
-{\r
- //TODO: Add your source code here\r
-}\r
-\r
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Header: FGConfigFile.h
+ Author: Jon Berndt
+ Date started: 03/29/00
+ Purpose: Config file read-in class
+ Called by: FGAircraft
+
+FUNCTIONAL DESCRIPTION
+--------------------------------------------------------------------------------
+
+HISTORY
+--------------------------------------------------------------------------------
+03/16/2000 JSB Created
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+INCLUDES
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+#include "FGConfigFile.h"
+#include <stdlib.h>
+#include <math.h>
+
+static const char *IdSrc = "$Id$";
+static const char *IdHdr = ID_CONFIGFILE;
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+CLASS IMPLEMENTATION
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+FGConfigFile::FGConfigFile(string cfgFileName)
+{
+#if defined ( sgi ) && !defined( __GNUC__ )
+ cfgfile.open(cfgFileName.c_str(), ios::in );
+#else
+ cfgfile.open(cfgFileName.c_str(), ios::in | ios::binary );
+#endif
+ CommentsOn = false;
+ CurrentIndex = 0;
+ Opened = true;
+#if defined ( sgi ) && !defined( __GNUC__ )
+ if (!cfgfile.fail() && !cfgfile.eof()) GetNextConfigLine();
+#else
+ if (cfgfile.is_open()) GetNextConfigLine();
+#endif
+ else Opened = false;
+
+ Debug(0);
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+FGConfigFile::~FGConfigFile()
+{
+ cfgfile.close();
+ Debug(1);
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+string FGConfigFile::GetNextConfigLine(void)
+{
+ int comment_starts_at;
+ int comment_ends_at;
+ int comment_length;
+ int line_length;
+ bool start_comment, end_comment;
+ string CommentStringTemp;
+
+ do {
+ CurrentLine = GetLine();
+ line_length = CurrentLine.length();
+ comment_starts_at = CurrentLine.find("<!--");
+
+ if (comment_starts_at >= 0) start_comment = true;
+ else start_comment = false;
+
+ comment_ends_at = CurrentLine.find("-->");
+
+ if (comment_ends_at >= 0) end_comment = true;
+ else end_comment = false;
+
+ if (!start_comment && !end_comment) { // command comment
+ if (CommentsOn) CommentStringTemp = CurrentLine;
+ CommentString += CommentStringTemp + "\r\n";
+ } else if (start_comment && comment_ends_at > comment_starts_at) { // <!-- ... -->
+ CommentsOn = false;
+ comment_length = comment_ends_at + 2 - comment_starts_at + 1;
+ LineComment = CurrentLine.substr(comment_starts_at+4, comment_length-4-3);
+ CurrentLine.erase(comment_starts_at, comment_length);
+ if (CurrentLine.find_first_not_of(" ") == string::npos) {
+ CurrentLine.erase();
+ }
+ } else if ( start_comment && !end_comment) { // <!-- ...
+ CommentsOn = true;
+ comment_length = line_length - comment_starts_at;
+ CommentStringTemp = CurrentLine.substr(comment_starts_at+4, comment_length-4);
+ CommentString = CommentStringTemp + "\r\n";
+ CurrentLine.erase(comment_starts_at, comment_length);
+ } else if (!start_comment && end_comment) { // ... -->
+ CommentsOn = false;
+ comment_length = comment_ends_at + 2 + 1;
+ CommentStringTemp = CurrentLine.substr(0, comment_length-4);
+ CommentString += CommentStringTemp + "\r\n";
+ CurrentLine.erase(0, comment_length);
+ } else if (start_comment && comment_ends_at < comment_starts_at) { // --> command <!--
+ cerr << "Old comment ends and new one starts - bad JSBSim config file form." << endl;
+ CommentsOn = false;
+ comment_length = comment_ends_at + 2 + 1;
+ CommentStringTemp = CurrentLine.substr(0, comment_length-4);
+ CommentString += CommentStringTemp + "\r\n";
+ CurrentLine.erase(0, comment_length);
+ }
+ } while (CommentsOn);
+
+ CurrentIndex = 0;
+ if (CurrentLine.length() == 0) {
+ GetNextConfigLine();
+ }
+ return CurrentLine;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+string FGConfigFile::GetValue(string val)
+{
+ unsigned int pos, p1, p2, ptest;
+
+ if (val == "") { // this call is to return the tag value
+ pos = CurrentLine.find("<");
+ if (pos != CurrentLine.npos) { // beginning brace found "<"
+ p1 = CurrentLine.find_first_not_of(" ",pos+1);
+ if (p1 != CurrentLine.npos) { // found first character of tag
+ p2 = CurrentLine.find_first_of(" >",p1+1);
+ if (p2 == CurrentLine.npos) p2 = p1+1;
+ return CurrentLine.substr(p1,p2-p1);
+ }
+ } else { // beginning brace "<" not found; this is a regular data line
+ pos = CurrentLine.find_first_not_of(" ");
+ if (pos != CurrentLine.npos) { // first character in line found
+ p2 = CurrentLine.find_first_of(" ",pos+1);
+ if (p2 != CurrentLine.npos) {
+ return CurrentLine.substr(pos,p2-pos);
+ } else {
+ return CurrentLine.substr(pos,CurrentLine.length()-pos);
+ }
+ }
+ }
+ } else { // return a value for a specific tag
+ pos = CurrentLine.find(val);
+ if (pos != CurrentLine.npos) {
+ pos = CurrentLine.find("=",pos);
+ if (pos != CurrentLine.npos) {
+ ptest = CurrentLine.find_first_not_of(" ",pos+1);
+ if (ptest != CurrentLine.npos) {
+ p1 = ptest + 1;
+ if (CurrentLine[ptest] == '"') { // quoted
+ p2 = CurrentLine.find_first_of("\"",p1);
+ } else { // not quoted
+ p2 = CurrentLine.find_first_of(" ",p1);
+ }
+ if (p2 != CurrentLine.npos) {
+ return CurrentLine.substr(p1,p2-p1);
+ }
+ }
+ } else { // "=" not found
+ pos = CurrentLine.find(val);
+ pos = CurrentLine.find_first_of(" ",pos+1);
+ ptest = CurrentLine.find_first_not_of(" ",pos+1);
+ if (ptest != CurrentLine.npos) {
+ if (CurrentLine[ptest] == '"') { // quoted
+ p1 = ptest + 1;
+ p2 = CurrentLine.find_first_of("\"",p1);
+ } else { // not quoted
+ p1 = ptest;
+ p2 = CurrentLine.find_first_of(" ",p1);
+ }
+ if (p2 != CurrentLine.npos) {
+ return CurrentLine.substr(p1,p2-p1);
+ } else {
+ p2 = CurrentLine.length();
+ return CurrentLine.substr(p1,p2-p1);
+ }
+ }
+ }
+ }
+ }
+
+ return string("");
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+string FGConfigFile::GetValue(void)
+{
+ return GetValue("");
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+string FGConfigFile::GetLine(void)
+{
+ string scratch = "";
+ int test;
+
+ while ((test = cfgfile.get()) != EOF) {
+ if (test >= 0x20 || test == 0x09) {
+ if (test == 0x09) {
+ scratch += (char)0x20;
+ } else {
+ scratch += (char)test;
+ }
+ } else {
+ if ((test = cfgfile.get()) != EOF) { // get *next* character
+#if defined ( sgi ) && !defined( __GNUC__ )
+ if (test >= 0x20 || test == 0x09) cfgfile.putback(test);
+#else
+ if (test >= 0x20 || test == 0x09) cfgfile.unget();
+#endif
+ break;
+ }
+ }
+ }
+ if (cfgfile.eof() && scratch.empty()) return string("EOF");
+ return scratch;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+FGConfigFile& FGConfigFile::operator>>(double& val)
+{
+ unsigned int pos, end;
+
+ pos = CurrentLine.find_first_not_of(", ",CurrentIndex);
+ if (pos == CurrentLine.npos) pos = CurrentLine.length();
+ end = CurrentLine.find_first_of(", ",pos+1);
+ if (end == CurrentLine.npos) end = CurrentLine.length();
+ string str = CurrentLine.substr(pos, end - pos);
+ val = strtod(str.c_str(),NULL);
+ CurrentIndex = end+1;
+ if (end == pos) {
+ GetNextConfigLine();
+ *this >> val;
+ } else {
+ if (CurrentIndex >= CurrentLine.length()) GetNextConfigLine();
+ }
+ return *this;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+FGConfigFile& FGConfigFile::operator>>(int& val)
+{
+ unsigned int pos, end;
+
+ pos = CurrentLine.find_first_not_of(", ",CurrentIndex);
+ if (pos == CurrentLine.npos) pos = CurrentLine.length();
+ end = CurrentLine.find_first_of(", ",pos+1);
+ if (end == CurrentLine.npos) end = CurrentLine.length();
+ string str = CurrentLine.substr(pos, end - pos);
+ val = atoi(str.c_str());
+ CurrentIndex = end+1;
+ if (end == pos) {
+ GetNextConfigLine();
+ *this >> val;
+ } else {
+ if (CurrentIndex >= CurrentLine.length()) GetNextConfigLine();
+ }
+ return *this;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+FGConfigFile& FGConfigFile::operator>>(eParam& val)
+{
+ unsigned int pos, end;
+
+ pos = CurrentLine.find_first_not_of(", ",CurrentIndex);
+ if (pos == CurrentLine.npos) pos = CurrentLine.length();
+ end = CurrentLine.find_first_of(", ",pos+1);
+ if (end == CurrentLine.npos) end = CurrentLine.length();
+ string str = CurrentLine.substr(pos, end - pos);
+ val = (eParam)atoi(str.c_str());
+ CurrentIndex = end+1;
+ if (end == pos) {
+ GetNextConfigLine();
+ *this >> val;
+ } else {
+ if (CurrentIndex >= CurrentLine.length()) GetNextConfigLine();
+ }
+ return *this;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+FGConfigFile& FGConfigFile::operator>>(string& str)
+{
+ unsigned int pos, end;
+
+ pos = CurrentLine.find_first_not_of(", ",CurrentIndex);
+ if (pos == CurrentLine.npos) pos = CurrentLine.length();
+ end = CurrentLine.find_first_of(", ",pos+1);
+ if (end == CurrentLine.npos) end = CurrentLine.length();
+ str = CurrentLine.substr(pos, end - pos);
+ CurrentIndex = end+1;
+ if (end == pos) {
+ GetNextConfigLine();
+ *this >> str;
+ } else {
+ if (CurrentIndex >= CurrentLine.length()) GetNextConfigLine();
+ }
+ return *this;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+void FGConfigFile::ResetLineIndexToZero(void)
+{
+ CurrentIndex = 0;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+// The bitmasked value choices are as follows:
+// unset: In this case (the default) JSBSim would only print
+// out the normally expected messages, essentially echoing
+// the config files as they are read. If the environment
+// variable is not set, debug_lvl is set to 1 internally
+// 0: This requests JSBSim not to output any messages
+// whatsoever.
+// 1: This value explicity requests the normal JSBSim
+// startup messages
+// 2: This value asks for a message to be printed out when
+// a class is instantiated
+// 4: When this value is set, a message is displayed when a
+// FGModel object executes its Run() method
+// 8: When this value is set, various runtime state variables
+// are printed out periodically
+// 16: When set various parameters are sanity checked and
+// a message is printed out when they go out of bounds
+
+void FGConfigFile::Debug(int from)
+{
+ if (debug_lvl <= 0) return;
+
+ if (debug_lvl & 1) { // Standard console startup message output
+ }
+ if (debug_lvl & 2 ) { // Instantiation/Destruction notification
+ if (from == 0) cout << "Instantiated: FGConfigFile" << endl;
+ if (from == 1) cout << "Destroyed: FGConfigFile" << endl;
+ }
+ if (debug_lvl & 4 ) { // Run() method entry print for FGModel-derived objects
+ }
+ if (debug_lvl & 8 ) { // Runtime state variables
+ }
+ if (debug_lvl & 16) { // Sanity checking
+ }
+ if (debug_lvl & 64) {
+ if (from == 0) { // Constructor
+ cout << IdSrc << endl;
+ cout << IdHdr << endl;
+ }
+ }
+}
+