mconfig.cpp

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C++ 代码 · 共 578 行 · 第 1/2 页

CPP
578
字号
    WObject::writeSelf( p );
    p.writeObject( &_tools );
    p.writeObject( &_rules );
    p.writeObject( &_actions );
    p.writeObject( &_editor );
    p.writeObject( &_browse );
    p.writeObject( &_browseMerge );
}
#endif

void MConfig::configMsgLog( WTokenFile& fil, WString& tok )
{
    fil.token( tok );
    for(;;) {
        if( tok == "Scan" ) {
            _logScanPatterns.add( new WString( fil.token( tok ) ) );
            fil.token( tok );
        } else if( tok == "BatchServer" ) {
            fil.token( _batserv );
            fil.token( tok );
        } else if( tok == "Help" ) {
            _logHelpFiles.add( new WString( fil.token( tok ) ) );
            _logHelpFiles.add( new WString( fil.token( tok ) ) );
            if( !fil.eol() ) {
                _logHelpFiles.add( new WString( fil.token( tok ) ) );
            } else {
                _logHelpFiles.add( new WString( "0" ) );
            }
            fil.token( tok );
        } else if( tok == "rem" ) {
            fil.flushLine( tok );
            fil.token( tok );
        } else {
            break;
        }
    }
}

void MConfig::expandMacroes( WString &str ) {
    WString     tok( str );
    WString     envvar;
    unsigned    i;

    str = "";
    for( i=0; tok[i] != '\0'; i++ ) {
        if( tok[i] == '$' && tok[i+1] == '(' && tok[i+2] == '%' ) {
            envvar = "";
            i += 3;
            for( ;; i++ ) {
                if( tok[i] == '\0' ) {
                    str.concat( "$%(" );
                    str.concat( envvar );
                    str.concat( tok[i] );
                    i--; // don't let the outside loop go past the NULLCHAR
                    break;
                } else if( tok[i] == ')' ) {
                    str.concat( getenv( envvar ) );
                    break;
                } else {
                    envvar.concat( tok[i] );
                }
            }
        } else {
            str.concat( tok[i] );
        }
    }
}

void MConfig::configProject( WTokenFile& fil, WString& tok )
{
    WString     target_os( "" );

    fil.token( tok );
    for(;;) {
        if( tok == "Editor" ) {
            // just ignore this and set things to the defaults
            // read all the stuff
            fil.flushLine( tok );
            fil.token( tok );

            #if defined( __WINDOWS__ ) || defined( __NT__ )
                if( __IsDBCS ) {
                    _editor = DBCS_DEFAULT_EDITOR_NAME;
                    _editorIsDLL = DBCS_DEFAULT_EDITOR_IS_DLL;
                    _editorParms = DBCS_DEFAULT_EDITOR_PARMS;
                } else {
                    _editor = DEFAULT_EDITOR_NAME;
                    _editorIsDLL = DEFAULT_EDITOR_IS_DLL;
                    _editorParms = DEFAULT_EDITOR_PARMS;
                }
            #elif defined( __OS2__ )
                _editor = OS2_DEFAULT_EDITOR_NAME;
                _editorIsDLL = OS2_DEFAULT_EDITOR_IS_DLL;
                _editorParms = OS2_DEFAULT_EDITOR_PARMS;
            #endif

        } else if( tok == "Browse" ) {
            fil.token( _browseMerge );
            expandMacroes( _browseMerge );
            fil.token( _browse );
            expandMacroes( _browse );
            fil.token( tok );
        } else if( tok == "Help" ) {
            fil.token( _helpFile );
            fil.token( tok );
        } else if( tok == "TargetGroup" ) {
            fil.token( target_os );
            fil.token( tok );
        } else if( tok == "Target" ) {
            _targets.add( new MTarget( fil, tok, target_os ) );
        } else if( tok == "ToolItem" ) {
            _toolItems.add( new MToolItem( fil, tok ) );
        } else if( tok == "Action" ) {
            _actions.add( new MAction( fil, tok ) );
        } else if( tok == "HelpAction" ) {
            _helpactions.add( new MAction( fil, tok ) );
        } else if( tok == "Before" ) {
            fil.token( tok );
            while( tok == "Command" ) {
                _before.concat( fil.token( tok ) );
                _before.concat( "\n" );
                fil.token( tok );
            }
        } else if( tok == "After" ) {
            fil.token( tok );
            while( tok == "Command" ) {
                _after.concat( fil.token( tok ) );
                _after.concat( "\n" );
            }
        } else if( tok == "Filter" ) {
            fil.token( tok );
            int size = _fileFilterSize;
            for( int i=0; i<2; i++ ) {
                _fileFilters = REALLOC( _fileFilters, size + (tok.size() + 1) + 1 );
                if( _fileFilters ) {
                    strcpy( &_fileFilters[ size ], tok );
                    size += tok.size() + 1;
                    _fileFilters[ size ] = '\0';
                }
                fil.token( tok );
            }
            _fileFilterSize = size;
        } else if( tok == "rem" ) {
            fil.flushLine( tok );
            fil.token( tok );
        } else {
            break;
        }
    }
}

MTool* MConfig::findTool( WString& tooltag )
{
    int icount = _tools.count();
    for( int i=0; i<icount; i++ ) {
        if( tooltag == ((MTool*)_tools[i])->tag() ) {
            return (MTool*)_tools[i];
        }
    }
    return NULL;
}

void MConfig::addRules( WFileName& srcMask, WFileName& tgtMask, WVList& list, WString& tagMask )
{
    int icount = _rules.count();
    for( int i=0; i<icount; i++ ) {
        MRule* rule = (MRule*)_rules[i];
        if( rule->match( tagMask, srcMask, tgtMask ) ) {
            list.add( rule );
        }
    }
}

MRule* MConfig::findRule( WString& ruletag )
{
    int icount = _rules.count();
    for( int i=0; i<icount; i++ ) {
        MRule* rule = (MRule*)_rules[i];
        if( ruletag == rule->tag() ) {
            return rule;
        }
    }
    return NULL;
}

MRule* MConfig::findMatchingRule( WFileName& fn, MRule* tgtRule, WString& mask )
{
    WVList list;
    WVList& symbols = tgtRule->symbols();
    int icount = symbols.count();
    for( int i=0; i<icount; i++ ) {
        MSymbol& sym = *(MSymbol*)symbols[i];
        addRules( fn, sym.mask(), list, mask );
        if( list.count() > 0 ) {
            return (MRule*)list[0];
        }
    }
    return nilRule();
}

int MConfig::findMatchingRules( WFileName& fn, WString& mask, WVList& list )
{
    int icount = _rules.count();
    for( int i=0; i<icount; i++ ) {
        MRule* rule = (MRule*)_rules[i];
        if( rule->match( mask, fn ) ) {
            list.add( rule );
        }
    }
    return list.count();
}

MRule* MConfig::findMatchingRule( WFileName& fn, WString& mask )
{
    int icount = _rules.count();
    for( int i=0; i<icount; i++ ) {
        MRule* rule = (MRule*)_rules[i];
        if( rule->match( mask, fn ) ) {
            return rule;
        }
    }
    return nilRule();
}

void MConfig::zapMask( WString& mask )
{
    for( int i=0; i<_hostMask.size(); i++ ) {
        if( _hostMask[i] != '?' ) {
            mask.setChar( i, _hostMask[i] );
        }
    }
}

void MConfig::kludgeString( WString& str )
{
    if( _kludge ) {
        WString temp;
        for( int i=0; i<str.size(); i++ ) {
            temp.concat( str[ i ] );
            if( _kludge == 3 && i == 0 ) temp.concat( '?' );
            if( _version > 1 && _kludge == 3 && i == 2 ) temp.concat( '?' );
            if( _version > 1 && _kludge == 4 && i == 3 ) temp.concat( '?' );
        }
        str = temp;
    }
}

void MConfig::buildTargetOSList() {

    int         icount;
    MTarget     *target;
    WString     *os;

    icount = _targets.count();
    os = new WString;
    for( int i=0; i < icount; i++ ) {
        target = (MTarget *)_targets[i];
        *os = target->targetOS();
        if( _targetOSs.find( (WObject *)os ) == NULL ) {
            _targetOSs.add( (WObject *)os );
            os = new WString;
        }
    }
    delete os;
}

void MConfig::enumAccel( WObject *obj, bcbk fn )
{
    int         icount;
    WKeyCode    key;
    int         i;

    icount = _actions.count();
    for( i=0; i < icount; i++ ) {
        MAction *action;
        action = (MAction *)_actions[i];
        key = action->menuAccel();
        if( key != WKeyNone ) {
            if( (obj->*fn)( key ) ) return;
        }
    }
    icount = _rules.count();
    for( i=0; i < icount; i++ ) {
        MRule   *rule;
        rule = (MRule *)_rules[i];
        if( rule->enumAccel( obj, fn ) ) return;
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?