echoapi.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 704 行 · 第 1/2 页
C
704 行
case_prt( O_FLOW_NOT, ! )
case_prt( O_POINTS, @ )
case_str( O_GOTO )
case_str( O_BIG_GOTO )
case_str( O_IF_TRUE )
case_str( O_IF_FALSE )
case_str( O_INVOKE_LABEL )
case_str( O_LABEL )
case_str( O_BIG_LABEL )
case_str( O_LABEL_RETURN )
case_str( O_PROC )
case_str( O_PARM_DEF )
case_str( O_AUTO_DEF )
case_str( O_COMMA )
case_str( O_PASS_PROC_PARM )
case_str( O_DEFN_PROC_PARM )
case_str( O_CALL_PROC_PARM )
case_str( O_PRE_GETS )
case_str( O_POST_GETS )
case_str( O_SIDE_EFFECT )
default :
EchoAPIString( "O_0" );
itoa( op, buffer, 10 );
EchoAPIString( buffer );
break;
}
break;
}
case 'n' : {
EchoAPIHandle( (int)va_arg( args, cg_name ), "cg" );
break;
}
case 'P' : {
EchoAPIHandle( (int)va_arg( args, patch_handle ), "ph" );
break;
}
case 's' : {
cg_sym_handle handle = va_arg( args, cg_sym_handle );
EchoAPIString( FEName( handle ) );
EchoAPIChar( '[' );
itoa( (int)handle, buffer, 16 );
EchoAPIString( buffer );
EchoAPIChar( ']' );
break;
}
case 'S' : {
EchoAPIHandle( (int)va_arg( args, sel_handle ), "sh" );
break;
}
case 'T' : {
EchoAPIHandle( (int)va_arg( args, temp_handle ), "th" );
break;
}
case 't' : {
cg_type type = (cg_type)va_arg( args, int );
switch( type ) {
case_str( T_UINT_1 )
case_str( T_INT_1 )
case_str( T_UINT_2 )
case_str( T_INT_2 )
case_str( T_UINT_4 )
case_str( T_INT_4 )
case_str( T_UINT_8 )
case_str( T_INT_8 )
case_str( T_LONG_POINTER )
case_str( T_HUGE_POINTER )
case_str( T_NEAR_POINTER )
case_str( T_LONG_CODE_PTR )
case_str( T_NEAR_CODE_PTR )
case_str( T_SINGLE )
#if defined( BY_C_FRONT_END ) || defined( BY_CPP_FRONT_END )
case_str( TY_DOUBLE )
#else
case_str( T_DOUBLE )
#endif
case_str( T_LONG_DOUBLE )
case_str( T_UNKNOWN )
#if defined( BY_C_FRONT_END ) || defined( BY_CPP_FRONT_END )
case_str( TY_DEFAULT )
#else
case_str( T_DEFAULT )
#endif
case_str( T_INTEGER )
#if defined( BY_C_FRONT_END ) || defined( BY_CPP_FRONT_END )
case_str( TY_UNSIGNED )
#else
case_str( T_UNSIGNED )
#endif
case_str( T_POINTER )
case_str( T_CODE_PTR )
case_str( T_BOOLEAN )
case_str( T_PROC_PARM )
default :
EchoAPIString( "T_0" );
itoa( type, buffer, 10 );
EchoAPIString( buffer );
break;
}
break;
}
case 'x' : {
int val = va_arg( args, int );
EchoAPIString( "0x" );
itoa( val, buffer, 16 );
EchoAPIString( buffer );
break;
}
default : {
EchoAPIString( "*** BAD %" );
EchoAPIChar( *text );
EchoAPIString( " ***" );
break;
}
}
} else {
EchoAPIChar( *text );
}
}
}
}
cg_name EchoAPICgnameReturn // EchoAPI cg_name RETURN VALUE
( cg_name retn ) // - cg_name value
{
EchoAPI( " -> %n\n", retn );
return retn;
}
call_handle EchoAPICallHandleReturn // EchoAPI call_handle RETURN VALUE
( call_handle retn ) // - call_handle value
{
EchoAPI( " -> %C\n", retn );
return retn;
}
cg_type EchoAPICgtypeReturn // EchoAPI cg_type RETURN VALUE
( cg_type retn ) // - cg_type value
{
EchoAPI( " -> %t\n", retn );
return retn;
}
int EchoAPIHexReturn // EchoAPI HEXADECIMAL RETURN VALUE
( int retn ) // - value
{
EchoAPI( " -> %x\n", retn );
return retn;
}
int EchoAPIIntReturn // EchoAPI DECIMAL RETURN VALUE
( int retn ) // - value
{
EchoAPI( " -> %i\n", retn );
return retn;
}
select_node *EchoAPISelHandleReturn // EchoAPI sel_handle RETURN VALUE
( select_node *retn ) // - sel_handle value
{
EchoAPI( " -> %S\n", retn );
return retn;
}
call_handle EchoAPITempHandleReturn // EchoAPI temp_handle RETURN VALUE
( temp_handle retn ) // - temp_handle value
{
EchoAPI( " -> %T\n", retn );
return retn;
}
void handleExists // VERIFY EXISTING HANDLE
( handle_type hdltype
, use_info *useinfo ) // - the handle
{
if( useinfo == NULL ) {
handleMsg( hdltype, "handle does not exist" );
}
if( useinfo->hdltype != hdltype ) {
ErrExpectFound( hdltype, useinfo->hdltype );
}
}
// USE HANDLE EXACTLY ONCE
void handleUseOnce( handle_type hdltype, use_info *useinfo )
{
handleExists( hdltype, useinfo );
if( useinfo->used ) {
handleMsg( hdltype, "handle already used" );
} else {
useinfo->used = TRUE;
}
}
static void handleSetup( handle_type hdltype, use_info *useinfo )
{
useinfo->hdltype = hdltype;
useinfo->used = FALSE;
}
void handleAddReuse( handle_type hdltype, use_info *useinfo )
{
if( useinfo->hdltype == hdltype ) {
if( useinfo->used ) {
handleSetup( hdltype, useinfo );
} else {
handleMsg( hdltype, "Handle already exists" );
}
} else {
handleSetup( hdltype, useinfo );
}
}
void handleAdd( handle_type hdltype, use_info *useinfo )
{
if( useinfo->hdltype != NO_HANDLE || useinfo->used ) {
handleMsg( hdltype, "Handle already exists" );
} else {
handleSetup( hdltype, useinfo );
}
}
void hdlAddUnary // ADD A HANDLE AFTER A UNARY OPERATION
( handle_type hdltype // - the handle type
, tn handle // - the handle
, tn old ) // - handle operated upon by unary oper'n
{
old = old;
hdlAddReuse( hdltype, handle );
}
void hdlAddBinary // ADD A HANDLE AFTER A BINARY OPERATION
( handle_type hdltype
, tn handle // - the handle
, tn old_l // - handle operated upon by unary oper'n
, tn old_r ) // - handle operated upon by unary oper'n
{
old_l = old_l;
old_r = old_r;
hdlAddReuse( hdltype, handle );
}
void hdlAddTernary // ADD A HANDLE AFTER A TERNARY OPERATION
( handle_type hdltype
, tn handle // - the handle
, tn old_t // - handle operated upon by unary oper'n
, tn old_l // - handle operated upon by unary oper'n
, tn old_r ) // - handle operated upon by unary oper'n
{
old_t = old_t;
old_l = old_l;
old_r = old_r;
hdlAddReuse( hdltype, handle );
}
void hdlAllUsed // VERIFY ALL HANDLES IN RING HAVE BEEN USED
( handle_type hdltype )
{
// check to ensure that all nodes of type hdltype are used LMW
// create linked list of node when creating, and check all are empty
// after tree is burned
hdltype = hdltype;
}
// Callback stuff
typedef struct cb_name CB_NAME;
struct cb_name // CB_NAME -- call back name
{ CB_NAME* next; // - next in ring
char const* name; // - name
void (*rtn)( void* ); // - rtn address
};
static CB_NAME* callback_names; // call-back names
// CALL-BACK NAMES
void CgEchoAPICbName // REGISTER A CALL-BACK NAME
( void (*rtn)( void* ) // - rtn address
, char const* name ) // - rtn name
{
CB_NAME* cbn;
_Alloc( cbn, sizeof( CB_NAME ) ); // Free'd in DbgFini
cbn->rtn = rtn;
cbn->name = name;
// insert
cbn->next = callback_names;
callback_names = cbn;
}
void EchoAPIInit( void )
{
callback_names = NULL;
EchoAPIRedirect();
}
// remove callback name from list
void EchoAPIFini( void )
{
CB_NAME *cbn, *next; // - call back name
for( cbn = callback_names; cbn; cbn = next ) {
next = cbn->next;
_Free( cbn, sizeof( CB_NAME ) );
}
callback_names = NULL;
EchoAPIUnredirect();
}
static char* callBackName // MAKE CALL-BACK NAME FOR PRINTING
( void (*rtn)( void* ) // - rtn address
, char * buffer ) // - buffer
{
CB_NAME* cbn; // - call back name
char const* name = NULL; // - name to be used
for( cbn = callback_names; cbn; cbn = cbn->next ) {
if( rtn == cbn->rtn ) {
name = cbn->name;
break;
}
}
if( name == NULL ) {
sprintf( buffer, "%x", rtn );
} else {
sprintf( buffer, "%x:%s", rtn, name );
}
return buffer;
}
void EchoAPICallBack( // CALL-BACK SUPPORT
tn node
, cg_callback rtn
, callback_handle param
, char *start_end ) // - call-back entry
{
char buffer[64];
EchoAPI( "\n*** CALL BACK[%x] to %c(%x) "
, node
, callBackName( rtn, buffer )
, param );
EchoAPI(start_end);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?