idedll.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 630 行 · 第 1/2 页
C
630 行
, "ProvideHelp -- handle mismatch" );
msg = msg;
return TRUE;
}
#if 0
// MESSAGE Parsing Interface
typedef struct // PARSE INFORMATION
{ char const *scan; // - scan position
char *tgt; // - target pointer
unsigned left; // - amount left
} SCAN_INFO;
static IDEBool collectChar // COLLECT A CHARACTER IF POSSIBLE
( SCAN_INFO* si ) // - scanning information
{
IDEBool retn; // - return: TRUE ==> scanned file name
if( si->left > 0 ) {
*si->tgt++ = *si->scan++;
-- si->left;
retn = TRUE;
} else {
retn = FALSE;
}
return retn;
}
static IDEBool collectIfChar // COLLECT A SPECIFIC CHARACTER
( SCAN_INFO* si // - scanning information
, char reqd ) // - specific character
{
IDEBool retn; // - return: TRUE ==> collected the character
if( reqd == *si->scan ) {
retn = collectChar( si );
} else {
retn = FALSE;
}
return retn;
}
static IDEBool collectNumber // COLLECT A NUMBER
( SCAN_INFO* si // - scanning information
, NUMBER_STR numb ) // - a number string
{
IDEBool retn; // - return: TRUE ==> have number
si->tgt = numb;
si->left = sizeof( NUMBER_STR ) - 1;
retn = FALSE;
for( ; ; ) {
if( ! isdigit( *si->scan ) ) break;
retn = collectChar( si );
if( ! retn ) break;
}
*si->tgt = '\0';
return retn;
}
static IDEBool mustBeChar // SCAN PAST REQ'D CHARACTER
( SCAN_INFO* si // - scanning information
, char reqd ) // - required character
{
IDEBool retn; // - return: TRUE ==> have number
if( *si->scan == reqd ) {
++ si->scan;
retn = TRUE;
} else {
retn = FALSE;
}
return retn;
}
static IDEBool mustBeText // SCAN PAST REQ'D TEXT
( SCAN_INFO* si // - scanning information
, char const * text ) // - the text
{
IDEBool retn; // - return: TRUE ==> have number
char const *scan; // - scan position
scan = si->scan;
for( ; ; ) {
if( *text == '\0' ) {
si->scan = scan;
retn = TRUE;
break;
} else if( *text++ != *scan++ ) {
retn = FALSE;
break;
}
}
return retn;
}
static IDEBool isFileNameChar // TEST IF CHAR IS IN FILE NAME
( char chr ) // - candidate character
{
IDEBool retn; // - return: TRUE ==> ok in file name
retn = isalnum( chr );
if( ! retn ) switch( chr ) {
default :
retn = FALSE;
break;
case '_' : // special chars taken from DOS 5.0 Manual
case '^' :
case '$' :
case '~' :
case '!' :
case '#' :
case '%' :
case '&' :
case '-' :
case '{' :
case '}' :
// case '(' : // not allowed ( we scan for "file(line)" )
case ')' :
case '@' :
case '\'' :
// missing code for accent grave
retn = TRUE;
break;
}
return retn;
}
static IDEBool parseFileChunk // PARSE FILE CHUNK (BETWEEN \'S)
( SCAN_INFO* si ) // - scanning information
{
IDEBool retn; // - return: TRUE ==> scanned file name
IDEBool got_chunk; // - TRUE ==> got a chunk
IDEBool got_dot; // - TRUE ==> got '.' separator
for( got_dot = FALSE, got_chunk = FALSE; ; got_chunk = TRUE ) {
if( isFileNameChar( *si->scan ) ) {
retn = collectChar( si );
if( ! retn ) break;
} else if( got_dot ) {
retn = got_chunk;
break;
} else if( collectIfChar( si, '.' ) ) {
got_dot = TRUE;
} else {
retn = got_chunk;
break;
}
}
return retn;
}
static IDEBool parseFileName // PARSE FILE NAME, IF POSSIBLE
( SCAN_INFO* si ) // - scanning information
{
char const * scan; // - scanner
IDEBool retn; // - return: TRUE ==> scanned file name
scan = si->scan;
if( scan[0] != '\0' && scan[1] == ':' ) {
collectChar( si );
collectChar( si );
}
collectIfChar( si, '\\' );
for( ; ; ) {
if( ! parseFileChunk( si ) ) {
retn = FALSE;
break;
}
scan = si->scan;
if( ! collectIfChar( si, '\\' ) ) {
*si->tgt = '\0';
retn = TRUE;
break;
}
}
return retn;
}
IDEBool IDEDLL_EXPORT IDEParseMessage // PARSE A MESSAGE
( IDEDllHdl hdl // - handle for this instantiation
, char const* msg // - message
, ErrorInfo* err ) // - error information
{
IDEBool retn; // - return: TRUE ==> failed
SCAN_INFO scan_info; // - scanning information
NUMBER_STR number; // - used for number scanning
hdl = hdl;
DbgVerify( hdl == CompInfo.dll_handle
, "ParseMessage -- handle mismatch" );
scan_info.scan = msg;
scan_info.tgt = err->filename;
scan_info.left = sizeof( err->filename ) - 1;
if( parseFileName( &scan_info )
&& mustBeChar( &scan_info, '(' )
&& collectNumber( &scan_info, number )
&& mustBeText( &scan_info, "): " )
) {
err->linenum = atoi( number );
err->flags = ERRINFO_FILENAME | ERRINFO_LINENUM;
if( ( mustBeText( &scan_info, "Error! E" )
|| mustBeText( &scan_info, "Warning! W" )
|| mustBeText( &scan_info, "Note! N" )
)
&& collectNumber( &scan_info, number )
&& mustBeText( &scan_info, ": " )
) {
err->flags |= ERRINFO_HELPINDEX;
err->help_index = atoi( number );
mustBeChar( &scan_info, ' ' );
}
if( mustBeText( &scan_info, "(col " )
&& collectNumber( &scan_info, number )
&& mustBeText( &scan_info, ") " )
) {
err->col = atoi( number );
err->flags |= ERRINFO_COLUMN;
}
retn = FALSE;
} else {
err->flags = 0;
retn = TRUE;
}
return retn;
}
#endif
IDEBool IDEDLL_EXPORT IDEPassInitInfo( IDEDllHdl hdl, IDEInitInfo *info )
{
hdl = hdl;
DbgVerify( hdl == CompInfo.dll_handle
, "PassInitInfo -- handle mismatch" );
if( info->ver < 2 ) {
return( TRUE );
}
if( info->ignore_env ) {
CompFlags.ignore_environment = TRUE;
CompFlags.ignore_current_dir = TRUE;
}
if( info->ver >= 2 ) {
if( info->cmd_line_has_files ) {
CompFlags.ide_cmd_line = TRUE;
}
if( info->ver >= 3 ) {
if( info->console_output ) {
CompFlags.ide_console_output = TRUE;
}
if( info->ver >= 4 ) {
if( info->progress_messages ) {
CompFlags.progress_messages = TRUE;
}
}
}
}
#if defined(wpp_dll)
CompFlags.dll_active = TRUE;
#endif
return( FALSE );
}
char* CppGetEnv // COVER FOR getenv
( char const * name ) // - environment variable
{
#if defined(wpp_dll)
IDECallBacks* cbs; // - pointer to call backs
char* env_val = NULL; // - NULL or value of environment variable
if( ! CompFlags.ignore_environment ) {
cbs = CompInfo.dll_callbacks;
if( (*cbs->GetInfo)( CompInfo.dll_handle
, 6
, (IDEGetInfoWParam) name
, (IDEGetInfoLParam) &env_val ) ) {
env_val = NULL;
}
}
return env_val;
#else
return getenv( name );
#endif
}
void CppStartFuncMessage( SYMBOL sym )
/************************************/
{
#if defined(wpp_dll)
IDECallBacks *cbs; // - pointer to call backs
auto VBUF buff;
DbgAssert( CompFlags.progress_messages );
if( sym != NULL ) {
FormatSymWithTypedefs( sym, &buff );
cbs = CompInfo.dll_callbacks;
(*cbs->ProgressMessage)( CompInfo.dll_handle, buff.buf );
VbufFree( &buff );
}
#else
sym = sym;
#endif
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?