00001 #include "Common/Assert.h" 00002 #include "Common/File.h" 00003 00004 #include "Common/Parser.h" 00005 00006 //--------------------------------------------------------------------------------------------------------------------- 00007 KParser::KParser() 00008 { 00009 m_pBuffer = NULL; 00010 m_nSize = 0; 00011 m_nCurrentPos = 0; 00012 m_bIsNewLine = false; 00013 m_pToken[0] = '\0'; 00014 m_nLine = 0; 00015 } 00016 00017 //--------------------------------------------------------------------------------------------------------------------- 00018 KParser::KParser( char* pFileName ) 00019 { 00020 m_pBuffer = NULL; 00021 m_nSize = 0; 00022 m_nCurrentPos = 0; 00023 m_pToken[0] = '\0'; 00024 m_nLine = 0; 00025 00026 LoadASE( pFileName ); 00027 } 00028 00029 //--------------------------------------------------------------------------------------------------------------------- 00030 KParser::~KParser() 00031 { 00032 Clean(); 00033 } 00034 00035 00036 //--------------------------------------------------------------------------------------------------------------------- 00037 void KParser::Clean() 00038 { 00039 m_nSize = 0; 00040 m_nCurrentPos = 0; 00041 if( m_pBuffer ) 00042 Deletev( m_pBuffer ); 00043 m_pBuffer = NULL; 00044 m_pToken[0] = '\0'; 00045 } 00046 00047 //--------------------------------------------------------------------------------------------------------------------- 00048 bool KParser::LoadASE( char* pFileName ) 00049 { 00050 KFile File; 00051 00052 Clean(); 00053 00054 // Load le fichier ASCII 00055 if( !File.Open( pFileName ) ) 00056 return false; 00057 00058 m_nSize = File.GetSize(); 00059 if( !m_nSize ) 00060 { 00061 File.Close(); 00062 return false; 00063 } 00064 00065 m_pBuffer = new char[m_nSize]; 00066 if( !File.Read( (unsigned char*)m_pBuffer, m_nSize ) ) 00067 { 00068 Deletev( m_pBuffer ); 00069 m_pBuffer = NULL; 00070 m_nSize = 0; 00071 return false; 00072 } 00073 00074 File.Close(); 00075 00076 return true; 00077 } 00078 00079 //--------------------------------------------------------------------------------------------------------------------- 00080 void KParser::SearchToken( char* pToken ) 00081 { 00082 KASSERT( m_pBuffer ); 00083 00084 // TODO 00085 } 00086 00087 // Cherche le prochain token 00088 //--------------------------------------------------------------------------------------------------------------------- 00089 void KParser::FindToken() 00090 { 00091 KASSERT( m_pBuffer ); 00092 00093 u32 nPos; 00094 u32 nTokenPos = 0; 00095 00096 m_pToken[0] = '\0'; 00097 00098 for( nPos = m_nCurrentPos; nPos < m_nSize; nPos ++ ) 00099 { 00100 m_bIsNewLine = false; 00101 switch( m_pBuffer[nPos] ) 00102 { 00103 case '\n': 00104 case '\r': 00105 m_bIsNewLine = true; 00106 case ' ': 00107 case '\t': 00108 if( nTokenPos ) 00109 { 00110 m_pToken[nTokenPos++] = '\0'; 00111 m_nCurrentPos = nPos; 00112 return; 00113 } 00114 break; 00115 case '#': 00116 case ';': 00117 // "#" ";" Commentaire : Passe la ligne 00118 while( ( m_pBuffer[++nPos] != '\n' ) && nPos < m_nSize ); 00119 break; 00120 case '/': 00121 // "//" "/*" Commentaire ? 00122 if(nPos + 1 < m_nSize ) 00123 { 00124 if( m_pBuffer[nPos+1] == '/' ) 00125 { 00126 // Passe la ligne 00127 while( ( m_pBuffer[++nPos] != '\n' ) && nPos < m_nSize ); 00128 break; 00129 } 00130 else 00131 if( m_pBuffer[nPos+1] == '*' ) 00132 { 00133 // Cherche la fin du commentaire 00134 while( nPos + 1 < m_nSize ) 00135 { 00136 nPos ++; 00137 if( ( m_pBuffer[nPos] == '*' ) && ( m_pBuffer[nPos + 1] == '/' ) ) 00138 { 00139 nPos += 2; 00140 break; 00141 } 00142 } 00143 break; 00144 } 00145 } 00146 default: 00147 m_pToken[nTokenPos++] = m_pBuffer[nPos]; 00148 break; 00149 } 00150 00151 if( m_bIsNewLine ) 00152 m_nLine ++; 00153 } 00154 m_nCurrentPos = nPos; 00155 } 00156 00157 //--------------------------------------------------------------------------------------------------------------------- 00158 char* KParser::GetToken() 00159 { 00160 return m_pToken; 00161 }
1.5.1-p1