dbgwset.c

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

C
683
字号
        if( alt->key == key ) break;
    }
    return( alt->name );
}

static char *AddOn( char *buff, key_desc desc )
{
    switch( desc & STATE ) {
    case CTRL:
        return( StrCopy( STR_CTRL, buff ) );
    case SHIFT:
        return( StrCopy( STR_SHIFT, buff ) );
    case ALT:
        return( StrCopy( STR_ALT, buff ) );
    default:
        return( buff );
    }
}


char *KeyName( unsigned key )
{
    static char         buff[20];
    key_name            *k;
    char                *p;
    alt_key_name        *alt;

    for( k = KeyNames; k->key != 0; ++k ) {
        if( k->key == key ) {
            p = AddOn( buff, k->desc );
            StrCopy( KeyNamePieces[ k->desc & ~STATE ], p );
            return( buff );
        }
    }
    if( key <= 255 && isprint( key ) ) {
        buff[0] = key;
        buff[1] = '\0';
        return( buff );
    }
    for( alt = CtrlKeyNames; alt->name != 0; ++alt ) {
        if( alt->key == key ) {
            p = AddOn( buff, CTRL );
            *p++ = alt->name;
            *p = '\0';
            return( buff );
        }
    }
    for( alt = AltKeyNames; alt->name != 0; ++alt ) {
        if( alt->key == key ) {
            p = AddOn( buff, ALT );
            *p++ = alt->name;
            *p = '\0';
            return( buff );
        }
    }
    return( NULL );
}

static key_desc StripOff( char **start, unsigned *len,
                          char *test, key_desc desc )
{
    int         tlen;

    tlen = strlen( test );
    if( strnicmp( *start, test, tlen ) == 0 ) {
        *start += tlen;
        *len -= tlen;
        return( desc );
    }
    return( 0 );
}


static unsigned MapKey( char *start, unsigned len )
{
    key_name            *k;
    key_desc            desc;
    int                 i;
    alt_key_name        *alt;
    char                ch;

    if( len == 1 ) {
        return( *start );
    }
    desc  = StripOff( &start, &len, STR_CTRL,  CTRL );
    desc |= StripOff( &start, &len, STR_SHIFT, SHIFT );
    desc |= StripOff( &start, &len, STR_ALT,   ALT );
    if( len == 1 ) {
        alt = NULL;
        if( desc == CTRL ) {
            alt = CtrlKeyNames;
        }
        if( desc == ALT ) {
            alt = AltKeyNames;
        }
        if( alt != NULL ) {
            ch = tolower( *start );
            while( alt->name != 0 ) {
                if( alt->name == ch ) {
                    return( alt->key );
                }
                ++alt;
            }
        }
    }
    for( i = 0; i < ArraySize( KeyNamePieces ); ++i ) {
        if( strnicmp( KeyNamePieces[i], start, len ) == 0 ) {
            if( strlen( KeyNamePieces[i] ) == len ) {
                desc += i;
                for( k = KeyNames; k->key != 0; ++k ) {
                    if( k->desc == desc ) return( k->key );
                }
                return( 0 );
            }
        }
    }
    return( 0 );
}


wnd_macro *MacAddDel( unsigned key, wnd_class class, cmd_list *cmds )
{
    wnd_macro           **owner,*curr;
    bool                is_main;

    owner = &WndMacroList;
    for( ;; ) {
        curr = *owner;
        if( curr == NULL ) break;
        if( curr->key == key && curr->class == class ) break;
        owner = &curr->link;
    }
    if( cmds != NULL ) {
        if( curr == NULL ) {
            _Alloc( curr, sizeof( wnd_macro ) );
            if( curr == NULL ) {
                FreeCmdList( cmds );
                Error( ERR_NONE, LIT( ERR_NO_MEMORY ) );
            }
            curr->key = key;
            curr->class = class;
            curr->link = NULL;
            curr->menu = NULL;
            *owner = curr;
        } else {
            WndMenuSetHotKey( curr->menu, curr->type == MACRO_MAIN_MENU, LIT( Empty ) );
            FreeCmdList( curr->cmd );
        }
        curr->cmd = cmds;
        curr->menu = AddMenuAccel( KeyName( key ), cmds->buff, class, &is_main );
        if( curr->menu == NULL ) {
            curr->type = MACRO_COMMAND;
        } else if( is_main ) {
            curr->type = MACRO_MAIN_MENU;
        } else {
            curr->type = MACRO_POPUP_MENU;
        }
    } else {
        if( curr != NULL ) {
            *owner = curr->link;
            WndMenuSetHotKey( curr->menu, curr->type == MACRO_MAIN_MENU, LIT( Empty ) );
            FreeCmdList( curr->cmd );
            _Free( curr );
        }
    }
    DbgUpdate( UP_MACRO_CHANGE );
    return( curr );
}


extern void MacroSet( void )
{
    wnd_class   class;
    cmd_list    *cmds;
    unsigned    key;
    char        *start;
    unsigned    len;
    bool        scanned;
    char        *p,*q;
    int         i;


    class = ReqWndName();
    key = 0;
    if( ScanItem( TRUE, &start, &len ) ) {
        key = MapKey( start, len );
    }
    if( key == 0 ) Error( ERR_NONE, LIT( ERR_MACRO_NOT_VALID ) );
    scanned = ScanItem( TRUE, &start, &len );
    ReqEOC();
    if( scanned ) {
        p = TxtBuff;
        q = start;
        i = len;
        while( isspace( *q ) ) {
            ++q;
            --i;
        }
        while( --i >= 0 ) {
            if( *q != '\r' ) *p++ = *q;
            ++q;
        }
        *p = '\0';
        cmds = AllocCmdList( TxtBuff, strlen( TxtBuff ) );
    } else {
        cmds = NULL;
    }
    MacAddDel( key, class, cmds );
}

extern  void    MacroConf( void )
{
    char        wnd_name[20];
    wnd_macro     *mac;
    char        *fmt;

    for( mac = WndMacroList; mac != NULL; mac = mac->link ) {
        GetCmdEntry( WndNameTab, mac->class+1, wnd_name );
        if( TxtBuff[ 0 ] == NULLCHAR ) break;
        fmt = isspace( mac->key ) ? "%s {%s} {" : "%s %s {";
        Format( TxtBuff, fmt, wnd_name, KeyName( mac->key ) );
        ConfigLine( TxtBuff );
        ConfigCmdList( ((cmd_list*)mac->cmd)->buff, 0 );
        WndDlgTxt( "}" );
    }
}

extern  void    FiniMacros( void )
{
    wnd_macro   *mac;
    wnd_macro   *junk;

    mac = WndMacroList;
    while( mac != NULL ) {
        junk = mac;
        WndMenuSetHotKey( mac->menu, mac->type == MACRO_MAIN_MENU, LIT( Empty ) );
        mac = mac->link;
        FreeCmdList( junk->cmd );
        _Free( junk );
    }
    WndMacroList = NULL;
}


int TabIntervalGet( void )
{
    return( TabInterval );
}

void TabIntervalSet( int new )
{
    TabInterval = new;
    WndRedraw( WND_FILE );
    WndRedraw( WND_SOURCE );
}

extern void TabSet( void )
{
    int      new;
    unsigned    old;

    old = SetCurrRadix( 10 );
    new = ReqExpr();
    ReqEOC();
    if( new < 0 || new > MAX_TAB ) Error( ERR_NONE, LIT( ERR_BAD_TAB ) );
    TabIntervalSet( new );
    SetCurrRadix( old );
}


extern void TabConf( void )
{
    CnvULongDec( TabInterval, TxtBuff );
    ConfigLine( TxtBuff );
}

static char SearchSettings[] = {
    "CASEIgnore\0"
    "CASEREspect\0"
    "Rx\0"
    "NORx\0"
};
enum {
    SEARCH_IGNORE = 1,
    SEARCH_RESPECT,
    SEARCH_RX,
    SEARCH_NORX
};


extern void SearchSet( void )
{
    char        *start;
    unsigned    len;

    while( CurrToken == T_DIV ) {
        Scan();
        switch( ScanCmd( SearchSettings ) ) {
        case SEARCH_IGNORE:
            SrchIgnoreCase = TRUE;
            break;
        case SEARCH_RESPECT:
            SrchIgnoreCase = FALSE;
            break;
        case SEARCH_RX:
            SrchRX = TRUE;
            break;
        case SEARCH_NORX:
            SrchRX = FALSE;
            break;
        default:
            Error( ERR_LOC, LIT( ERR_BAD_SUBCOMMAND ), GetCmdName( CMD_SET ) );
            break;
        }
    }
    if( ScanItem( TRUE, &start, &len ) ) {
        if( len > MAX_MAGIC_STR ) len = MAX_MAGIC_STR;
        memcpy( SrchMagicChars, start, len );
        SrchMagicChars[len] = '\0';
    }
    ReqEOC();
}


extern void SearchConf( void )
{
    char        *ptr;

    ptr = TxtBuff;
    *ptr++ = '/';
    ptr = GetCmdEntry( SearchSettings,
                       SrchIgnoreCase ? SEARCH_IGNORE : SEARCH_RESPECT, ptr );
    *ptr++ = '/';
    ptr = GetCmdEntry( SearchSettings,
                       SrchRX ? SEARCH_RX : SEARCH_NORX, ptr );
    ptr = StrCopy( " {", ptr );
    ptr = StrCopy( SrchMagicChars, ptr );
    ptr = StrCopy( "}", ptr );
    ConfigLine( TxtBuff );
}

⌨️ 快捷键说明

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