D:/Zythum/DinoKod/Common/Parser.cpp

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 }

Generated on Sun Mar 25 20:02:11 2007 for Zythum Project by  doxygen 1.5.1-p1