/* * GetHiddenRange - get range of lines hidden around a given line */ void GetHiddenRange( linenum l, linenum *s, linenum *e ) { line *cline, *oline; fcb *cfcb, *ofcb; int i; (*s) = (*e) = l; i = CGimmeLinePtr( l, &ofcb, &oline ); if( i ) { return; } /* * go back */ cfcb = ofcb; cline = oline; for( ;; ) { i = GimmePrevLinePtr( &cfcb, &cline ); if( i ) { break; } if( cline->u.ld.hidden ) { (*s)--; continue; } else { break; } } /* * go forwards */ cfcb = ofcb; cline = oline; for( ;; ) { i = CGimmeNextLinePtr( &cfcb, &cline ); if( i ) { break; } if( cline->u.ld.hidden ) { (*e)++; continue; } else { break; } } } /* GetHiddenRange */
void InitFORTRANFlags( linenum line_no ) { char *text; // char *start; line *line; fcb *fcb; vi_rc rc; int numQuotes = 0; flags.inString = false; rc = CGimmeLinePtr( line_no, &fcb, &line ); if( rc != ERR_NO_ERR ) { // probably past eof return; } if( isInitialLine( line ) ) { return; } for( ;; ) { rc = GimmePrevLinePtr( &fcb, &line ); if( rc != ERR_NO_ERR ) { break; } text = line->u.ld.nolinedata ? WorkLine->data : line->data; // start = text; if( iscomment( *text ) ) { continue; } while( *text != '\0' ) { if( *text == '!' ) { // rest of line is part of a comment break; } else if( *text == '\'' ) { numQuotes ^= 1; } text++; } if( isInitialLine( line ) ) { break; } } if( numQuotes == 1 ) { flags.inString = true; } }
void InitRexxFlags( linenum line_no ) { fcb *fcb; char *text; char *starttext; line *thisline; line *topline; char topChar; vi_rc rc; bool withinQuotes = false; line *line; bool inBlock = false; flags.inCComment = false; flags.inCPPComment = false; flags.inString = false; flags.inPreprocessor = false; CGimmeLinePtr( line_no, &fcb, &thisline ); line = thisline; while( (rc = GimmePrevLinePtr( &fcb, &line )) == ERR_NO_ERR ) { if( line->data[line->len - 1] != '\\' ) { break; } inBlock = true; } if( rc == ERR_NO_ERR ) { topline = line; if( inBlock ) { CGimmeNextLinePtr( &fcb, &line ); } } else { topline = NULL; if( inBlock ) { CGimmeLinePtr( 1, &fcb, &line ); } else { return; } } if( inBlock ) { // jot down whether it started with # text = line->data; while( *text != '\0' && isspace( *text ) ) { text++; } topChar = *text; // parse down through lines, noticing /*, */ and " while( line != thisline ) { for( text = line->data; ; ++text ) { for( ; *text != '\0' && *text != '/'; ++text ) { if( text[0] == '"' ) { if( !withinQuotes ) { withinQuotes = true; } else if( text[-1] != '\\' || text[-2] == '\\' ) { withinQuotes = false; } } } if( text[0] == '\0' ) { break; } if( !withinQuotes ) { if( text[-1] == '/' ) { flags.inCPPComment = true; } else if( text[1] == '*' ) { flags.inCComment = true; lenCComment = 100; } } if( text[-1] == '*' && !withinQuotes ) { flags.inCComment = false; } } rc = CGimmeNextLinePtr( &fcb, &line ); } // if not in a comment (and none above), we may be string or pp if( !flags.inCComment ) { if( topChar == '#' && !EditFlags.PPKeywordOnly ) { flags.inPreprocessor = true; } if( withinQuotes ) { flags.inString = true; } } } if( topline == NULL ) { return; } if( !flags.inCComment ) { // keep going above multi-line thing till hit /* or */ line = topline; do { starttext = line->data; for( text = starttext + line->len; ; --text ) { while( text != starttext && *text != '/' ) { text--; } if( text[1] == '*' && text[0] == '/' && text[-1] != '/' ) { if( text == starttext ) { flags.inCComment = true; lenCComment = 100; return; } withinQuotes = false; do { text--; if( text[0] == '"' ) { if( !withinQuotes ) { withinQuotes = true; } else if( text[-1] != '\\' || text[-2] == '\\' ) { withinQuotes = false; } } } while( text != starttext ); if( withinQuotes ) { flags.inString = true; } else { flags.inCComment = true; lenCComment = 100; } return; } if( text == starttext ) { break; } if( text[-1] == '*' ) { // we may actually be in a string, but that's extreme // (if this becomes a problem, count the "s to beginning // of line, check if multiline, etc. etc.) return; } } rc = GimmePrevLinePtr( &fcb, &line ); } while( rc == ERR_NO_ERR ); } }
void InitPerlFlags( linenum line_no ) { fcb *fcb; char *text; line *thisline; // line *topline; vi_rc rc; bool withinQuotes = false; line *line; bool inBlock = false; flags.inString = false; flags.beforeRegExp = true; flags.doubleRegExp = false; CGimmeLinePtr( line_no, &fcb, &thisline ); line = thisline; rc = GimmePrevLinePtr( &fcb, &line ); while( rc == ERR_NO_ERR ) { if( line->data[line->len - 1] != '\\' ) { break; } inBlock = true; rc = GimmePrevLinePtr( &fcb, &line ); } if( rc == ERR_NO_ERR ) { // topline = line; if( inBlock ) { CGimmeNextLinePtr( &fcb, &line ); } } else { // topline = NULL; if( inBlock ) { CGimmeLinePtr( 1, &fcb, &line ); } else { return; } } if( inBlock ) { // parse down through lines, noticing " while( line != thisline ) { text = line->data; while( *text ) { if( *text == '"' ) { if( !withinQuotes ) { withinQuotes = true; } else if( *(text - 1) != '\\' || *(text - 2) == '\\' ) { withinQuotes = false; } } text++; } rc = CGimmeNextLinePtr( &fcb, &line ); } if( withinQuotes ) { flags.inString = true; } } }
/* * FindRegularExpressionBackwards - do a reverse search for a regular expression */ vi_rc FindRegularExpressionBackwards( char *pat, i_mark *pos1, char **linedata, linenum termline, find_type flags ) { vi_rc rc; char *data; bool wrapped = false; bool found; linenum ilineno = 0; line *cline; fcb *cfcb; regexp rcpy; int scol; linenum sline; /* * initialize for search */ if( wrapMsgPrinted ) { wrapMsgPrinted = false; ClearWindow( message_window_id ); } sline = pos1->line; rc = CGimmeLinePtr( sline, &cfcb, &cline ); if( rc != ERR_NO_ERR ) { return( rc ); } if( flags & FINDFL_WRAP ) { ilineno = sline; } scol = pos1->column; if( pat != NULL ) { rc = CurrentRegComp( pat ); if( rc != ERR_NO_ERR ) { return( rc ); } } memset( &rcpy, 0, sizeof( rcpy ) ); /* * loop until string found */ for( ;; ) { data = cline->data; found = false; /* * run through all possible matches on the line, accepting * only the last one */ if( scol >= 0 ) { while( *data != '\0' && RegExec( CurrentRegularExpression, data, (data == cline->data) ) ) { int col, len; if( RegExpError != ERR_NO_ERR ) { return( RegExpError ); } col = GetCurrRegExpColumn( cline->data ); len = GetCurrRegExpLength(); if( col + len > scol ) { break; } found = true; memcpy( &rcpy, CurrentRegularExpression, sizeof( regexp ) ); data = &(cline->data[col + 1]); } if( found ) { break; } } /* * get next line */ rc = GimmePrevLinePtr( &cfcb, &cline ); if( rc == ERR_NO_ERR ) { --sline; } else if( rc == ERR_NO_MORE_LINES ) { if( (flags & FINDFL_WRAP) == 0 ) { return( ERR_FIND_TOP_OF_FILE ); } else { Message1( wrapMsg, "top" ); MyBeep(); wrapMsgPrinted = true; } if( wrapped ) { return( ERR_FIND_NOT_FOUND ); } rc = CFindLastLine( &sline ); if( rc != ERR_NO_ERR ) { return( rc ); } rc = CGimmeLinePtr( sline, &cfcb, &cline ); if( rc != ERR_NO_ERR ) { return( rc ); } wrapped = true; } else { return( rc ); } if( sline < termline ) { return( ERR_FIND_PAST_TERM_LINE ); } if( wrapped ) { if( sline < ilineno ) { return( ERR_FIND_NOT_FOUND ); } } scol = cline->len; } *linedata = cline->data; memcpy( CurrentRegularExpression, &rcpy, sizeof( regexp ) ); pos1->column = GetCurrRegExpColumn( cline->data ); pos1->line = sline; return( ERR_NO_ERR ); } /* FindRegularExpressionBackwards */