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 + -
显示快捷键?