// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-#ifdef __GNUG__
-# pragma implementation "acell.h"
-#endif
-
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
// statics used by inline'ed C helper-functions
static char* _gSrcStart = 0;
static char* _gSrcEnd = 0;
-static char* _gLastSuppresedComment = 0;
+static wxChar* _gLastSuppresedComment = 0;
static int _gLineNo = 0;
// FOR NOW:: comments queue is static
return true;
}
-static inline void skip_preprocessor_dir( char*& cur )
+static inline void skip_preprocessor_dir( wxChar*& cur )
{
do
{
skip_to_eol(cur);
- if ( *(cur-1) != '\\' )
+ if ( *(cur-1) != _T('\\') )
break;
if ( cur < _gSrcEnd )
++cur; // position after the trailing charcter of the prev token
}
-static string get_token_str( char* cur )
+static wxString get_token_str( char* cur )
{
- return string( cur, get_token_len( cur ) );
+ return wxString( cur, get_token_len( cur ) );
}
// skips token or whole expression which may have
// moves tokens like '*' '**', '***', '&' from the name
// to the type
-static void arrange_indirection_tokens_between( string& type,
- string& identifier )
+static void arrange_indirection_tokens_between( wxString& type,
+ wxString& identifier )
{
// TBD:: FIXME:: return value of operators !
- while ( identifier[0u] == '*' ||
- identifier[0u] == '&'
+ while ( identifier[0u] == _T('*') ||
+ identifier[0u] == _T('&')
)
{
type += identifier[0u];
return i == __gMultiLangMap.end() ? false : true;
}
-static inline void get_string_between( char* start, char* end,
- string* pStr )
+static inline void get_string_between( wxChar* start, wxChar* end,
+ wxString* pStr )
{
char saved = *end;
- *end = '\0';
+ *end = _T('\0');
*pStr = start;
*end = saved;
}
-static char* set_comment_text( string& text, char* start )
+static wxChar* set_comment_text( wxString& text, wxChar* start )
{
- char* end = start;
+ wxChar* end = start;
// to avoid poluting the queue with this comment
_gLastSuppresedComment = start;
skip_comments( end );
- if ( *(end-1) == '/' )
+ if ( *(end-1) == _T('/') )
end -= 2;
start += 2;
// skip multiple leading '/''s or '*''s
- while( *start == '/' && start < end ) ++start;
- while( *start == '*' && start < end ) ++start;
+ while( *start == _T('/') && start < end ) ++start;
+ while( *start == _T('*') && start < end ) ++start;
get_string_between( start, end, &text );
mIsTemplate = 0;
mNestingLevel = 0;
- cur = start;
+ m_cur = start;
mpStart = start;
mpEnd = end;
do
{
- if ( !get_next_token( cur ) )
+ if ( !get_next_token( m_cur ) )
// end of source reached
return pTopCtx;
- if ( memcmp( cur, "ScriptSection( const string&",
+ if ( memcmp( m_cur, "ScriptSection( const string&",
strlen( "ScriptSection( const string&" )
) == 0
)
// ++o;
}
- switch (*cur)
+ switch (*m_cur)
{
case '#' :
{
- AddMacroNode( cur );
+ AddMacroNode( m_cur );
continue;
}
case ':' :
{
- skip_token( cur );
+ skip_token( m_cur );
continue;
}
case ';' :
{
- skip_token( cur );
+ skip_token( m_cur );
continue;
}
case ')' :
{
- skip_token( cur );
+ skip_token( m_cur );
continue;
}
case '=' :
{
- skip_token( cur );
+ skip_token( m_cur );
continue;
}
}
// 'const' is a part of the return type, not a keyword here
- if ( strncmp(cur, "const", 5) != 0 && is_keyword( cur ) )
+ if ( strncmp(m_cur, "const", 5) != 0 && is_keyword( m_cur ) )
{
// parses, token, if token identifies
// the container context (e.g. class/namespace)
// the corresponding context object is created
// and set as current context
- ParseKeyword( cur );
+ ParseKeyword( m_cur );
continue;
}
- if ( *cur >= '0' && *cur <= '9' )
+ if ( *m_cur >= _T('0') && *m_cur <= _T('9') )
{
- skip_token( cur );
+ skip_token( m_cur );
continue;
}
- if ( *cur == '}' )
+ if ( *m_cur == _T('}') )
{
if ( mCurCtxType != SP_CTX_CLASS )
{
// DBG:: unexpected closing-bracket found
//ASSERT(0);
- skip_token( cur ); // just skip it
+ skip_token( m_cur ); // just skip it
continue;
}
if ( mpCurCtx->GetType() == SP_CTX_CLASS )
{
- int curOfs = ( (cur+1) - _gSrcStart );
+ int curOfs = ( (m_cur+1) - _gSrcStart );
mpCurCtx->mContextLength = ( curOfs - mpCurCtx->mSrcOffset );
}
mIsTemplate = 0;
}
- skip_token( cur );
+ skip_token( m_cur );
continue;
}
bool isAMacro = false;
- if ( is_function( cur, isAMacro ) )
+ if ( is_function( m_cur, isAMacro ) )
{
if ( isAMacro )
{
- skip_token( cur );
+ skip_token( m_cur );
continue;
}
- char* savedPos = cur;
+ char* savedPos = m_cur;
int tmpLnNo;
store_line_no( tmpLnNo );
isAMacro = false;
- if ( !ParseNameAndRetVal( cur, isAMacro ) )
+ if ( !ParseNameAndRetVal( m_cur, isAMacro ) )
{
if ( !isAMacro )
{
- cur = savedPos;
- SkipFunction( cur );
+ m_cur = savedPos;
+ SkipFunction( m_cur );
}
continue;
}
- if ( !ParseArguments( cur ) )
+ if ( !ParseArguments( m_cur ) )
{
// failure while parsing arguments,
// remove enclosing operation context
mpCurCtx = mpCurCtx->GetOutterContext();
mpCurCtx->RemoveChild( pFailed );
- skip_to_eol( cur );
- //cur = savedPos;
+ skip_to_eol( m_cur );
+ //m_cur = savedPos;
}
else
{
clear_commets_queue();
- SkipFunctionBody( cur );
+ SkipFunctionBody( m_cur );
mpCurCtx = mpCurCtx->GetOutterContext();
{
// non-class members are ignored
- skip_token( cur ); // skip the end of statement
+ skip_token( m_cur ); // skip the end of statement
continue;
}
- ParseMemberVar( cur );
+ ParseMemberVar( m_cur );
}
} while( 1 );
}
-void CJSourceParser::AttachComments( spContext& ctx, char* cur )
+void CJSourceParser::AttachComments( spContext& ctx, wxChar* cur )
{
if ( !mCommentsOn ) return;
MCommentListT& lst = ctx.GetCommentList();
- char* prevComEnd = 0;
+ wxChar* prevComEnd = 0;
int tmpLnNo;
store_line_no( tmpLnNo );
lst.push_back( pComment );
// find the end of comment
- char* start = _gCommentsQueue[i];
+ wxChar* start = _gCommentsQueue[i];
- pComment->mIsMultiline = ( *(start+1) == '*' );
+ pComment->mIsMultiline = ( *(start+1) == _T('*') );
// first comment in the queue and multiline
// comments are always treated as a begining
// of the new paragraph in the comment text
if ( i == 0 )
-
+ {
pComment->mStartsPar = true;
- else
- if ( pComment->mIsMultiline )
-
+ }
+ else if ( pComment->mIsMultiline )
+ {
pComment->mStartsPar = true;
+ }
else
{
// find out wheather there is a new-line
// between to adjecent comments
-
- char* prevLine = start;
+ wxChar* prevLine = start;
skip_to_prev_line(prevLine);
if ( prevLine >= prevComEnd )
-
pComment->mStartsPar = true;
else
pComment->mStartsPar = false;
}
- prevComEnd = set_comment_text( pComment->mText, start );
+ prevComEnd = set_comment_text( pComment->m_Text, start );
}
-
// attach comments which are at the end of the line
// of the given context (if any)
spComment* pComment = new spComment();
lst.push_back( pComment );
- set_comment_text( pComment->mText, cur );
+ set_comment_text( pComment->m_Text, cur );
pComment->mStartsPar = 1;
- pComment->mIsMultiline = ( *(cur+1) == '*' );
+ pComment->mIsMultiline = ( *(cur+1) == _T('*') );
// mark this comment, so that it would not
// get in the comments list of the next context
clear_commets_queue();
}
-void CJSourceParser::AddMacroNode( char*& cur )
+void CJSourceParser::AddMacroNode( wxChar*& cur )
{
- char* start = cur;
+ wxChar* start = cur;
int lineNo = get_line_no();
AttachComments( *pPL, cur );
- get_string_between( start, cur, &pPL->mLine );
+ get_string_between( start, cur, &pPL->m_Line );
++start; // skip '#'
get_next_token( start );
// determine the type exactly and assign
// a name to the context
- if ( *start == 'd' )
+ if ( *start == _T('d') )
{
- if ( cmp_tokens_fast( start, "define", 6 ) )
+ if ( cmp_tokens_fast( start, _T("define"), 6 ) )
{
char* tok = start+6;
pPL->mDefType = SP_PREP_DEF_REDEFINE_SYMBOL;
}
}
- else if ( *start == 'i' )
+ else if ( *start == _T('i') )
{
- if ( cmp_tokens_fast( start, "include", 7 ) )
+ if ( cmp_tokens_fast( start, _T("include"), 7 ) )
{
pPL->mDefType = SP_PREP_DEF_INCLUDE_FILE;
}
- else if ( *++start == 'f' )
+ else if ( *++start == _T('f') )
{
// either "#if" or "#ifdef"
cur = start;
skip_token( cur );
get_next_token( cur );
- string condition = get_token_str( cur );
+ wxString condition = get_token_str( cur );
// currently, everything except '0' is true
- if ( condition == "0" ) {
+ if ( condition == _T("0") ) {
// skip until the following else or enif
while ( cur < _gSrcEnd ) {
skip_to_eol( cur );
skip_eol( cur );
get_next_token( cur );
- if ( *cur++ == '#' && *cur == 'e' )
+ if ( *cur++ == _T('#') && *cur == _T('e') )
break;
}
}
// TODO parse the condition...
}
}
- else if ( cmp_tokens_fast( start, "else", 4 ) )
+ else if ( cmp_tokens_fast( start, _T("else"), 4 ) )
{
// skip until "#endif"
while ( cur < _gSrcEnd ) {
skip_eol( cur );
get_next_token( cur );
- if ( *cur++ == '#' && cmp_tokens_fast( cur, "endif", 5 ) )
+ if ( *cur++ == _T('#') && cmp_tokens_fast( cur, "endif", 5 ) )
break;
}
}
skip_next_token_back( cur );
skip_token_back( cur );
- string lastToken = get_token_str( cur );
+ wxString lastToken = get_token_str( cur );
if ( lastToken == "operator" ) {
lastToken += pOp->m_Name;
pOp->m_Name = lastToken;
else if ( pOp->m_Name == "operator" ) {
skip_token( cur );
get_next_token( cur );
- string oper = get_token_str( cur );
+ wxString oper = get_token_str( cur );
pOp->m_Name += oper;
}
if ( cur >= start )
{
- string rettype = string( start, size_t( cur-start ) );
+ wxString rettype = wxString( start, size_t( cur-start ) );
// FIXME just for now...
- string::size_type pos = 0;
- string toerase("WXDLLEXPORT ");
- while((pos = rettype.find(toerase, pos)) != string::npos)
+ wxString::size_type pos = 0;
+ wxString toerase("WXDLLEXPORT ");
+ while((pos = rettype.find(toerase, pos)) != wxString::npos)
rettype.erase(pos, toerase.length());
- pOp->mRetType = rettype;
+ pOp->m_RetType = rettype;
}
- arrange_indirection_tokens_between( pOp->mRetType, pOp->m_Name );
+ arrange_indirection_tokens_between( pOp->m_RetType, pOp->m_Name );
cur = savedPos;
restore_line_no( tmpLnNo );
continue;
}
- pPar->mInitVal = string( blocks[nameBlock], blockSizes[nameBlock] );
+ pPar->m_InitVal = wxString( blocks[nameBlock], blockSizes[nameBlock] );
nameBlock = nameBlock - 2; // skip '=' token and default value block
typeBlock = nameBlock - 1;
AttachComments( *pPar, blocks[nameBlock] );
// retrieve argument name
- pPar->m_Name = string( blocks[nameBlock], blockSizes[nameBlock] );
+ pPar->m_Name = wxString( blocks[nameBlock], blockSizes[nameBlock] );
// retreive argument type
size_t len = blockSizes[ typeBlock ];
len = size_t ( (blocks[ typeBlock ] + len) - blocks[ 0 ] );
- pPar->mType = string( blocks[0], len );
+ pPar->m_Type = wxString( blocks[0], len );
- arrange_indirection_tokens_between( pPar->mType, pPar->m_Name );
+ arrange_indirection_tokens_between( pPar->m_Type, pPar->m_Name );
if ( *cur == ')' )
{
bool firstMember = true;
- string type;
+ wxString type;
// jump to the end of statement
// and start collecting same-type varibles
skip_next_token_back( cur );
skip_token_back( cur );
- pAttr->mType = get_token_str( cur );
+ pAttr->m_Type = get_token_str( cur );
// if comma, than variable list continues
// otherwise the variable type reached - stop
- if ( *cur == '=' )
+ if ( *cur == _T('=') )
{
// yes, we've mistaken, it was not a identifier,
// but it's default value
- pAttr->mInitVal =
- pAttr->m_Name;
+ pAttr->m_InitVal = pAttr->m_Name;
// skip default value and '=' symbol
skip_next_token_back( cur );
if ( !pAttr )
continue;
- if ( pAttr->mType.empty() )
- pAttr->mType = type;
+ if ( pAttr->m_Type.empty() )
+ pAttr->m_Type = type;
pAttr->mVisibility = mCurVis;
if ( !pAttr->m_Name.empty() )
- arrange_indirection_tokens_between( pAttr->mType, pAttr->m_Name );
+ arrange_indirection_tokens_between( pAttr->m_Type, pAttr->m_Name );
}
cur = savedPos;
{
if ( op.m_Name[i] == ':' && op.m_Name[i+1] == ':' )
{
- string unscoped( op.m_Name, i+2, op.m_Name.length() - ( i + 2 ) );
+ wxString unscoped( op.m_Name, i+2, op.m_Name.length() - ( i + 2 ) );
- op.mScope = string( op.m_Name, 0, i );
+ op.mScope = wxString( op.m_Name, 0, i );
op.m_Name = unscoped;
{
char* ctxStart = cur;
- string classkeyword = get_token_str( cur );
+ wxString classkeyword = get_token_str( cur );
skip_token( cur ); // skip 'class' keyword
if ( !get_next_token( cur ) ) return;
if ( *tok != ':' && *cur != ':' )
- pClass->mSuperClassNames.push_back( string( cur, len ) );
+ pClass->m_SuperClassNames.push_back( wxString( cur, len ) );
} while(1);
int tmpLn;
store_line_no( tmpLn );
- while ( pClass->mSuperClassNames.size() )
+ while ( pClass->m_SuperClassNames.size() )
- pClass->mSuperClassNames.erase( &pClass->mSuperClassNames[0] );
+ pClass->m_SuperClassNames.erase( &pClass->m_SuperClassNames[0] );
char* tok = cur;
clear_commets_queue();
}
-void CJSourceParser::AddEnumNode( char*& cur )
+void CJSourceParser::AddEnumNode( wxChar*& cur )
{
// now the cursor is at "enum" keyword
- char* start = cur;
+ wxChar* start = cur;
spEnumeration* pEnum = new spEnumeration();
mpCurCtx->AddMember( pEnum );
if ( !skip_imp_block( cur ) ) return;
- get_string_between( start, cur, &pEnum->mEnumContent );
+ get_string_between( start, cur, &pEnum->m_EnumContent );
if ( get_next_token(cur) )
{
clear_commets_queue();
}
-void CJSourceParser::AddTypeDefNode( char*& cur )
+void CJSourceParser::AddTypeDefNode( wxChar*& cur )
{
// now the cursor at the token next to "typedef" keyword
if ( !get_next_token(cur) ) return;
- char* start = cur;
+ wxChar* start = cur;
spTypeDef* pTDef = new spTypeDef();
mpCurCtx->AddMember( pTDef );
int tmpLnNo;
store_line_no( tmpLnNo );
- char* tok = cur-1;
+ wxChar* tok = cur-1;
skip_next_token_back( tok );
- char* nameEnd = tok;
+ wxChar* nameEnd = tok;
skip_token_back( tok );
- char* nameStart = tok;
+ wxChar* nameStart = tok;
skip_next_token_back( tok );
- char* typeEnd = tok;
+ wxChar* typeEnd = tok;
// check if it's function prototype
if ( *nameStart == ')' )
if ( *nameStart == '*' ) ++nameStart;
}
- get_string_between( start, typeEnd, &pTDef->mOriginalType );
+ get_string_between( start, typeEnd, &pTDef->m_OriginalType );
get_string_between( nameStart, nameEnd, &pTDef->m_Name );