/* * getBracketLoc - find a matching '(' for a ')' */ static vi_rc getBracketLoc( i_mark *pos ) { vi_rc rc; char tmp[3]; int len; // linenum lne; tmp[0] = '\\'; tmp[1] = ')'; tmp[2] = 0; // lne = CurrentPos.line; RegExpAttrSave( -1, NULL ); rc = GetFind( tmp, pos, &len, FINDFL_BACKWARDS | FINDFL_NOERROR | FINDFL_NOCHANGE ); RegExpAttrRestore(); if( pos->line != CurrentPos.line ) { return( ERR_FIND_NOT_FOUND ); } if( rc != ERR_NO_ERR ) { return( rc ); } /* * find the matching '(' */ CurrentPos = *pos; CGimmeLinePtr( CurrentPos.line, &CurrentFcb, &CurrentLine ); rc = FindMatch( pos ); return( rc ); } /* getBracketLoc */
/* * ColorFind - find string and color it */ vi_rc ColorFind( char *data, find_type findfl ) { vi_rc rc; int len; char *buff; i_mark pos; /* * get search string and flags */ buff = StaticAlloc(); if( (len = NextWordSlash( data, buff ) ) <= 0 ) { StaticFree( buff ); return( ERR_INVALID_FIND_CMD ); } /* * go get the match */ GoToLineNoRelCurs( 1 ); rc = GetFind( buff, &pos, &len, FINDFL_FORWARD | findfl ); if( rc == ERR_NO_ERR ) { pos.column += 1; JumpTo( &pos ); DCUpdate(); #ifndef __WIN__ // Windows selects instead HiliteAColumnRange( pos.line, pos.column, pos.column + len - 1 ); #endif EditFlags.ResetDisplayLine = TRUE; } StaticFree( buff ); return( rc ); } /* ColorFind */
/* * GetFindBackwards - get backwards find position */ vi_rc GetFindBackwards( char *st, i_mark *pos1, int *len1 ) { find_type flags; flags = FINDFL_BACKWARDS; if( EditFlags.SearchWrap ) flags |= FINDFL_WRAP; if( EditFlags.NoReplaceSearchString ) flags |= FINDFL_NOCHANGE; return( GetFind( st, pos1, len1, flags ) ); } /* GetFindBackwards */
/* * GetFindForward - get position of forward find string */ static vi_rc GetFindForward( char *st, i_mark *pos1, int *len1 ) { find_type flags; flags = FINDFL_FORWARD; if( EditFlags.SearchWrap ) flags |= FINDFL_WRAP; if( EditFlags.NoReplaceSearchString ) flags |= FINDFL_NOCHANGE; return( GetFind( st, pos1, len1, flags ) ); } /* GetFindForward */
/* * GetAddress - parse to obtain line number */ vi_rc GetAddress( const char **buffp, linenum *num ) { linenum numstack[NUM_STACK_SIZE]; char currnum[NUM_STACK_SIZE]; linenum sum; int numptr; int nument, csign, numsign; int i, j; bool numinprog, stopnum, endparse; char c; char *tmp, st[2]; int len; find_type fl; i_mark pos; vi_rc rc; const char *buff; /* * check if we have a numeric type thingy here */ buff = *buffp; c = *buff; if( !(c == '/' || c == '?' || c == '+' || c == '-' || c == '\'' || c == '.' || c == '$' || (c >= '0' && c <= '9')) ) { return( NO_NUMBER ); } if( c == '+' || c == '-' ) { sum = CurrentPos.line; } else { sum = 0; } numptr = nument = 0; csign = numsign = 1; numinprog = stopnum = false; endparse = false; while( !endparse ) { c = *buff; switch( c ) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': currnum[numptr++] = c; numinprog = true; break; case '/': case '?': if( numinprog ) { return( NO_NUMBER ); } tmp = StaticAlloc(); st[0] = c; st[1] = '\0'; buff = GetNextWord( buff, tmp, st ); if( c == '?' ) { fl = FINDFL_BACKWARDS | FINDFL_NEXTLINE; } else { fl = FINDFL_FORWARD | FINDFL_NEXTLINE; } rc = GetFind( tmp, &pos, &len, fl ); numstack[nument] = pos.line; stopnum = true; StaticFree( tmp ); if( rc != ERR_NO_ERR ) { return( rc ); } if( *buff == '\0' ) --buff; break; case '\'': if( numinprog ) { return( NO_NUMBER ); } j = buff[1] - 'a'; rc = VerifyMark( j + 1, true ); if( rc != ERR_NO_ERR ) { return( rc ); } numstack[nument] = MarkList[j].p.line; stopnum = true; ++buff; break; case '+': csign = 1; if( numinprog ) { stopnum = true; } else { numsign = 1; } break; case '-': if( numinprog ) { stopnum = true; csign = -1; } else { numsign = -1; csign = 1; } break; case '.': if( numinprog ) { return( NO_NUMBER ); } numstack[nument] = CurrentPos.line; stopnum = true; break; case '$': if( numinprog ) { return( NO_NUMBER ); } rc = CFindLastLine( &numstack[nument] ); if( rc != ERR_NO_ERR ) { return( rc ); } stopnum = true; break; default: --buff; endparse = true; if( numinprog ) { stopnum = true; } break; } ++buff; /* * check if a number was being scanned */ if( stopnum && numinprog ) { currnum[numptr] = '\0'; numptr = 0; numstack[nument] = atol( currnum ); numinprog = false; } if( stopnum ) { numstack[nument] *= numsign; nument++; numsign = csign; csign = 1; stopnum = false; } } *buffp = buff; for( i = 0; i < nument; i++ ) { sum += numstack[i]; } *num = sum; return( ERR_NO_ERR ); } /* GetAddress */