sstyle.c

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

C
600
字号
    }
    if( ss == ss_start ) {
        return;
    }
    memmove( ss_start, ss, i * sizeof( ss_block ) );
    ss_start->len -= start_col;
}


// NOTE! for this to work ...
// ss_old must point the the head of a
void SSDifBlock( ss_block *ss_old, char *text, int start_col,
                 line *line, linenum line_no, int *dif )
{
    ss_block    ss_new, *ss_inc;
    int         index;
    int         changed;
    int         anychange;
    int         text_col;

    *dif = 0;
    index = 0;
    anychange = FALSE;
    switch( CurrentInfo->Language ) {
        case LANG_C:
        case LANG_CPP:
        case LANG_JAVA:
        case LANG_SQL:
        case LANG_BAT:
        case LANG_BASIC:
        case LANG_PERL:
        case LANG_DBTEST:
        case LANG_USER:
            InitCLine( text );
            break;
        case LANG_FORTRAN:
            InitFORTRANLine( text, line_no );
            break;
        case LANG_HTML:
        case LANG_WML:
            InitHTMLLine( text );
            break;
        case LANG_GML:
            InitGMLLine( text );
            break;
        case LANG_MAKEFILE:
            InitMkLine( text );
            break;
    }
    ss_inc = ss_old;
    text_col = 0;
    do {
        ss_new.type = SE_UNPARSED;
        do {
            getNextBlock( &ss_new, text, text_col, line, line_no );
            // -3 because as many as 2 extra blocks could be needed
            // when selection is inserted
            if( index == MAX_SS_BLOCKS - 3 && ss_new.end != BEYOND_TEXT ) {
                // out of room - fake rest of line
                ss_new.end = BEYOND_TEXT;
                break;
            }
            index++;
            text_col = ss_new.end + 1;
        } while( ss_new.end < start_col );

        changed = memcmp( ss_inc, &ss_new, sizeof( ss_block ) );
        if( changed ) {
            memcpy( ss_inc, &ss_new, sizeof( ss_block ) );
        }
        anychange |= changed;
        if( !anychange ) {
            *dif = ss_inc->end + 1;
        }
    } while( ( ss_inc++ )->end != BEYOND_TEXT );

    if( SelRgn.selected ) {
        addSelection( ss_old, line_no );
        fixSelection( ss_old, start_col );
    }

    // change origin of ->ends from text[0] to text[start_col]
    ss_inc = ss_old;
    while( ss_inc->end != BEYOND_TEXT ) {
        ss_inc->end -= start_col;
        ss_inc++;
    }
}

ss_block *SSNewBlock( void )
{
    return( MemAlloc( MAX_SS_BLOCKS * sizeof( ss_block ) ) );
}

void SSKillBlock( ss_block *ss )
{
    MemFree( ss );
}

bool SSKillsFlags( char ch )
{
    // Warning!  contains language-specific information

    if( CurrentInfo != NULL ) {
        switch( CurrentInfo->Language ) {
        case LANG_C:
        case LANG_CPP:
        case LANG_JAVA:
        case LANG_SQL:
        case LANG_BAT:
        case LANG_BASIC:
        case LANG_PERL:
        case LANG_DBTEST:
        case LANG_USER:
            if( ch == '#' || ch == '"' || ch == '/' || ch == '*' ) return( TRUE );
            break;
        case LANG_FORTRAN:
            if( ch == '\'' ) return( TRUE );
            break;
        case LANG_HTML:
        case LANG_WML:
            if( ch == '<' || ch == '>' ) return( TRUE );
            break;
        case LANG_GML:
            if( ch == ':' || ch == '.' ) return( TRUE );
            break;
        case LANG_MAKEFILE:
            if( ch == '#' ) return( TRUE );
            break;
        }
    }
    return( FALSE );
}

void SSInitLanguageFlags( linenum line_no )
{
    if( CurrentInfo != NULL ) {
        switch( CurrentInfo->Language ) {
            case LANG_C:
            case LANG_CPP:
            case LANG_JAVA:
            case LANG_SQL:
            case LANG_BAT:
            case LANG_BASIC:
            case LANG_PERL:
            case LANG_DBTEST:
            case LANG_USER:
                InitCFlags( line_no );
                break;
            case LANG_FORTRAN:
                InitFORTRANFlags( line_no );
                break;
            case LANG_HTML:
            case LANG_WML:
                InitHTMLFlags( line_no );
                break;
            case LANG_GML:
                InitGMLFlags( line_no );
                break;
            case LANG_MAKEFILE:
                InitMkFlags( line_no );
                break;
        }
    }
}

void SSInitLanguageFlagsGivenValues( ss_flags *flags )
{
    if( CurrentInfo != NULL ) {
        switch( CurrentInfo->Language ) {
            case LANG_C:
            case LANG_CPP:
            case LANG_JAVA:
            case LANG_SQL:
            case LANG_BAT:
            case LANG_BASIC:
            case LANG_PERL:
            case LANG_DBTEST:
            case LANG_USER:
                InitCFlagsGivenValues( &( flags->c ) );
                break;
            case LANG_FORTRAN:
                InitFORTRANFlagsGivenValues( &( flags->f ) );
                break;
            case LANG_HTML:
            case LANG_WML:
                InitHTMLFlagsGivenValues( &( flags->h ) );
                break;
            case LANG_GML:
                InitGMLFlagsGivenValues( &( flags->g ) );
                break;
            case LANG_MAKEFILE:
                InitMkFlagsGivenValues( &( flags->m ) );
                break;
        }
    }
}

void SSGetLanguageFlags( ss_flags *flags )
{
    if( CurrentInfo != NULL ) {
        switch( CurrentInfo->Language ) {
            case LANG_C:
            case LANG_CPP:
            case LANG_JAVA:
            case LANG_SQL:
            case LANG_BAT:
            case LANG_BASIC:
            case LANG_PERL:
            case LANG_DBTEST:
            case LANG_USER:
                GetCFlags( &( flags->c ) );
                break;
            case LANG_FORTRAN:
                GetFORTRANFlags( &( flags->f ) );
                break;
            case LANG_HTML:
            case LANG_WML:
                GetHTMLFlags( &( flags->h ) );
                break;
            case LANG_GML:
                GetGMLFlags( &( flags->g ) );
                break;
            case LANG_MAKEFILE:
                GetMkFlags( &( flags->m ) );
                break;
        }
    }
}

#ifdef __WIN__
int SSGetStyle( int row, int col )
{
    dc          c_line;
    ss_block    *ss;

    c_line = DCFindLine( row - 1, CurrentWindow );
    assert( c_line->valid );
    if( c_line->start_col != LeftColumn ) {
        // text is scrolled off screen - ws remains
        return( SE_WHITESPACE );
    }
    // count across to column
    ss = c_line->ss;
    while( ss->end < col ) {
        ss++;
    }
    return( ss->type );
}
#endif

/*
 * SSInitBeforeConfig - init that happens before reading config file
 */
void SSInitBeforeConfig( void )
{
    int i;

    for( i = 0; i < SE_NUMTYPES; i++ ) {
        SEType[ i ].foreground = -1;
        SEType[ i ].background = -1;
        SEType[ i ].font = 0;
    }
}

/*
 * SSInitAfterConfig - init that happens after reading config file
 */
void SSInitAfterConfig( void )
{
    int i;

    // text must have some color
    if( SEType[ SE_TEXT ].foreground == -1 ) {
        SEType[ SE_TEXT ].foreground = WHITE;
        SEType[ SE_TEXT ].background = BLACK;
    }

    // selection should default to inverse of text
    if( SEType[ SE_SELECTION ].foreground == -1 ) {
        SEType[ SE_SELECTION ].foreground = SEType[ SE_TEXT ].background;
        SEType[ SE_SELECTION ].background = SEType[ SE_TEXT ].foreground;
    }

    // any syntax style not specified defaults to SE_TEXT style
    for( i = 0; i < SE_NUMTYPES; i++ ) {
        if( SEType[ i ].foreground == -1 ) {
            SEType[ i ].foreground = SEType[ SE_TEXT ].foreground;
            SEType[ i ].background = SEType[ SE_TEXT ].background;
        }
    }
}

/*
 * SSFini - deinitialize this module
 */
void SSFini( void )
{
}

⌨️ 快捷键说明

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