Go to the documentation of this file.00001
00009 #include "Parser.h"
00010
00011 using namespace MeshLib;
00012
00016 CParser::~CParser()
00017 {
00018
00019
00020 for( std::list<CToken*>::iterator titer = m_tokens.begin(); titer != m_tokens.end(); titer ++ )
00021 {
00022 CToken * pT = *titer;
00023 delete pT;
00024 }
00025 m_tokens.clear();
00026 };
00027
00031 CParser::CParser( const std::string & str )
00032 {
00033
00034
00035 unsigned int i;
00036 for( i = 0; i < str.length(); i ++ )
00037 {
00038 m_line[i] = str.c_str()[i];
00039 }
00040 m_line[i] = 0;
00041
00042 m_pt = m_line;
00043
00044
00045 while( !end() )
00046 {
00047 skip_blank();
00048 if( end() ) break;
00049
00050
00051
00052 char * pkey = m_key;
00053 char ch = next_char();
00054
00055 while( ch != ' ' && ch != '=' && !end() )
00056 {
00057 *pkey ++ = ch;
00058 ch = next_char();
00059 }
00060 if( ch != '=' && ch != ' ')
00061 *pkey++ = ch;
00062
00063 *pkey = 0;
00064
00065 if( ch == ' ' )
00066 {
00067 skip_blank();
00068 }
00069
00070 if( ch != '=' )
00071 {
00072 CToken * tk = new CToken;
00073 assert(tk);
00074 tk->m_key = std::string( m_key );
00075
00076 m_tokens.push_back( tk );
00077 continue;
00078 }
00079
00080 if( end() ) break;
00081
00082 ch = next_char();
00083
00084 while( ch != '(' ) ch = next_char();
00085
00086 char * pvalue = m_value;
00087
00088 while( ch != ')' && !end() )
00089 {
00090 *pvalue ++ = ch;
00091 ch = next_char();
00092 }
00093 *pvalue++ = ch;
00094 *pvalue = 0;
00095
00096 CToken * tk = new CToken;
00097 assert(tk);
00098 tk->m_key = std::string( m_key );
00099 tk->m_value = std::string( m_value );
00100
00101 m_tokens.push_back( tk );
00102
00103 }
00104
00105 };
00106
00110 char CParser::next_char()
00111 {
00112 char ch= *m_pt;
00113 m_pt++;
00114 return ch;
00115 };
00116
00120 void CParser::skip_blank()
00121 {
00122 while( *m_pt == ' ' ) m_pt++;
00123 };
00124
00128 bool CParser::end()
00129 {
00130 return ( (*m_pt) == 0 );
00131 };
00132
00136 void CParser::_toString( std::string & str )
00137 {
00138 std::stringstream iss;
00139
00140 for( std::list<CToken*>::iterator iter = m_tokens.begin() ; iter != m_tokens.end(); ++ iter )
00141 {
00142 CToken * token = *iter;
00143 if( iss.str().length() > 0 ) iss << " ";
00144 iss << token->m_key << "=" << token->m_value;
00145 }
00146
00147 str = iss.str();
00148 }
00149
00153 void CParser::_removeToken( const std::string & key )
00154 {
00155 for( std::list<CToken*>::iterator iter = m_tokens.begin() ; iter != m_tokens.end(); ++ iter )
00156 {
00157 CToken * token = *iter;
00158 if( token->m_key == key )
00159 {
00160 m_tokens.erase( iter );
00161 return;
00162 }
00163 }
00164 }