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