Replace characters in a string

;  
Optimize procedure
;  
Parameter PF_Field_to_check (Field name)
Parameter PC_Look_For (Character   10000000)
Parameter PC_Change_To (Character   10000000)
Other parameters are optional
Parameter PB_Match_Case (Boolean) = kTrue     ;; Match the case of the word?
Parameter PB_Match_Everytime (Boolean) = kTrue
Parameter PB_Whole_Words (Boolean) = kFalse     ;; Only match whole words
;  
Calculate LC_RETURN as ''
Calculate LC_WORK_WITH as PF_Field_to_check
If not(PB_Match_Case)
	Calculate PC_Look_For as upp(PC_Look_For)
End If
Calculate LN_Len_Look4 as len(PC_Look_For)
Calculate LN_POS_FIND as pick(PB_Match_Case,pos(PC_Look_For,upp(LC_WORK_WITH)),pos(PC_Look_For,LC_WORK_WITH))
While LN_POS_FIND>0
	If PB_Whole_Words
		Calculate LB_BEFORE_OK as (LN_POS_FIND=1)|not(chk(upp(mid(LC_WORK_WITH,LN_POS_FIND-1,1)),'A','Z'))
		Calculate LB_AFTER_OK as (LN_POS_FIND+len(PC_Look_For)>len(LC_WORK_WITH))|not(chk(upp(mid(LC_WORK_WITH,LN_POS_FIND+len(PC_Look_For),1)),'A','Z'))
		Calculate #F as LB_BEFORE_OK&LB_AFTER_OK
	Else
		Calculate #F as kTrue
	End If
	If flag true
		If PB_Match_Everytime
			Calculate LC_RETURN as con(LC_RETURN,mid(LC_WORK_WITH,1,LN_POS_FIND-1))
			Calculate LC_WORK_WITH as con(PC_Change_To,mid(LC_WORK_WITH,LN_POS_FIND+LN_Len_Look4,len(LC_WORK_WITH)))
		Else
			Calculate LC_RETURN as con(LC_RETURN,mid(LC_WORK_WITH,1,LN_POS_FIND-1),PC_Change_To)
			Calculate LC_WORK_WITH as mid(LC_WORK_WITH,LN_POS_FIND+LN_Len_Look4,len(LC_WORK_WITH))
		End If
	Else
		Calculate LC_RETURN as con(LC_RETURN,mid(LC_WORK_WITH,1,LN_POS_FIND))
		Calculate LC_WORK_WITH as mid(LC_WORK_WITH,LN_POS_FIND+1,len(LC_WORK_WITH))
	End If
	Calculate LN_POS_FIND as pick(PB_Match_Case,pos(PC_Look_For,upp(LC_WORK_WITH)),pos(PC_Look_For,LC_WORK_WITH))
End While
Calculate PF_Field_to_check as con(LC_RETURN,LC_WORK_WITH)
Quit procedure
;  
Local variable LB_AFTER_OK (Boolean)
Local variable LB_BEFORE_OK (Boolean)
;  
Local variable LC_WORK_WITH (Character   10000000)
Local variable LC_RETURN (Character   10000000)
;  
Local variable LN_Len_Look4 (Long integer) = 0
Local variable LN_POS_FIND (Long integer) = 0
Local variable LN_POS_ORIG (Long integer) = 0