static vi_rc getFile( char *fname ) { char dir[MAX_STR]; char *dirptr, ch; vi_rc rc; NextWord1( fname, dir ); rc = EditFile( dir, FALSE ); if( rc != ERR_NO_ERR ) { return( rc ); } dirptr = dir; if( isFgrep ) { if( caseIgn ) { ch = '~'; } else { ch = '@'; } dirptr += 2; strcpy( dirptr, origString ); MakeExpressionNonRegular( dirptr ); dirptr--; *dirptr = ch; if( IsMagicCharRegular( ch ) ) { dirptr--; *dirptr = '\\'; } } else { strcpy( dir, origString ); } AddString2( &(EditVars.FindHist.data[EditVars.FindHist.curr % EditVars.FindHist.max] ), origString ); EditVars.FindHist.curr += 1; ColorFind( dirptr, FINDFL_NOERROR ); SetLastFind( origString ); return( rc ); }
/* * FancyDoReplace - get strings, search for one, replace with other */ vi_rc FancyDoReplace( void ) { #ifdef __WIN__ static char *lastReplace; vi_rc rc; char find[MAX_INPUT_LINE + 1], replace[MAX_INPUT_LINE + 1]; fancy_find ff; bool is_forward = TRUE; bool old_ci; bool old_sw; if( CurrentFile == NULL ) { // you cant search if theres no file! return( ERR_NO_FILE ); } old_ci = EditFlags.CaseIgnore; old_sw = EditFlags.SearchWrap; if( lastFind != NULL ) { strcpy( find, lastFind ); ff.use_regexp = lastFindWasRegExp; ff.case_ignore = lastFindWasCaseIgnore; ff.search_forward = is_forward; ff.search_wrap = lastFindWasWrap; } else { find[0] = 0; } if( lastReplace != NULL ) { strcpy( replace, lastReplace ); } else { replace[0] = 0; } ff.find = find; ff.findlen = sizeof( find ); ff.replace = replace; ff.replacelen = sizeof( replace ); if( !GetReplaceStringDialog( &ff ) ) { return( ERR_NO_ERR ); } EditFlags.CaseIgnore = ff.case_ignore; EditFlags.SearchWrap = ff.search_wrap; if( !ff.use_regexp ) { MakeExpressionNonRegular( find ); // MakeExpressionNonRegular( replace ); } AddString2( &lastReplace, replace ); EditFlags.LastSearchWasForward = is_forward; /*NOTE: does not use is_forward (how about %s?this/that/?) does not use selection_only */ rc = TwoPartSubstitute( find, replace, ff.prompt, ff.search_wrap ); EditFlags.CaseIgnore = old_ci; EditFlags.SearchWrap = old_sw; lastFindWasRegExp = ff.use_regexp; lastFindWasCaseIgnore = ff.case_ignore; lastFindWasForward = ff.search_forward; lastFindWasWrap = ff.search_wrap; return( rc ); #else return( ERR_NO_ERR ); #endif } /* FancyDoReplace */
/* * getFindString - get string and search for it */ static vi_rc getFindString( range *r, bool is_forward, bool is_fancy, bool search_again ) { vi_rc rc; char st[MAX_INPUT_LINE + 1]; char *res; char *prompt; #ifdef __WIN__ bool old_ci; bool old_sw; bool old_no; fancy_find ff; #endif is_fancy = is_fancy; search_again = search_again; #ifdef __WIN__ old_ci = EditFlags.CaseIgnore; old_sw = EditFlags.SearchWrap; old_no = EditFlags.NoReplaceSearchString; if( is_fancy ) { if( lastFindStr != NULL ) { strcpy( st, lastFindStr ); ff.use_regexp = lastFindWasRegExp; ff.case_ignore = lastFindWasCaseIgnore; ff.search_forward = is_forward; ff.search_wrap = lastFindWasWrap; } else { st[0] = 0; } ff.find = st; ff.findlen = sizeof( st ); if( !search_again ) { if( !GetFindStringDialog( &ff ) ) { return( RANGE_REQUEST_CANCELLED ); } } else { st[0] = 0; EditFlags.NoReplaceSearchString = TRUE; } is_forward = ff.search_forward; EditFlags.CaseIgnore = ff.case_ignore; EditFlags.SearchWrap = ff.search_wrap; if( !ff.use_regexp ) { /* we need to add the string without any changes */ if( !EditFlags.NoReplaceSearchString ) { AddString2( &lastFindStr, st ); lastFindWasRegExp = FALSE; } MakeExpressionNonRegular( st ); } res = st; } else { #endif if( is_forward ) { prompt = "/"; } else { prompt = "?"; } st[0] = prompt[0]; rc = PromptForString( prompt, st + 1, sizeof( st ) - 1, &FindHist ); if( rc != ERR_NO_ERR ) { if( rc == NO_VALUE_ENTERED ) { return( ERR_NO_ERR ); } return( rc ); } res = &st[1]; // skip prompt #ifdef __WIN__ } #endif if( is_forward ) { rc = processFind( r, res, GetFindForward ); } else { rc = processFind( r, res, GetFindBackwards ); } #ifdef __WIN__ EditFlags.NoReplaceSearchString = old_no; EditFlags.CaseIgnore = old_ci; EditFlags.SearchWrap = old_sw; lastFindWasRegExp = ff.use_regexp; lastFindWasCaseIgnore = ff.case_ignore; lastFindWasForward = ff.search_forward; lastFindWasWrap = ff.search_wrap; #endif EditFlags.LastSearchWasForward = is_forward; return( rc ); } /* getFindString */