0
|
1 |
; StrReplace
|
|
2 |
; Replaces all ocurrences of a given needle within a haystack with another string
|
|
3 |
; Written by Dan Fuhry
|
|
4 |
|
|
5 |
!ifndef _StrRep
|
|
6 |
!define _StrRep
|
|
7 |
|
|
8 |
Var sr_haystack
|
|
9 |
Var sr_needle
|
|
10 |
Var sr_replace
|
|
11 |
Var sr_pos
|
|
12 |
Var sr_needlelen
|
|
13 |
Var sr_p_before
|
|
14 |
Var sr_stacklen
|
|
15 |
Var sr_p_after
|
|
16 |
Var sr_newpos
|
|
17 |
Var sr_test
|
|
18 |
|
|
19 |
Function str_replace
|
|
20 |
Exch $sr_replace
|
|
21 |
Exch 1
|
|
22 |
Exch $sr_needle
|
|
23 |
Exch 2
|
|
24 |
Exch $sr_haystack
|
|
25 |
StrCpy $sr_pos -1
|
|
26 |
StrLen $sr_needlelen $sr_needle
|
|
27 |
StrLen $sr_stacklen $sr_haystack
|
|
28 |
loop:
|
|
29 |
IntOp $sr_pos $sr_pos + 1
|
|
30 |
StrCpy $sr_test $sr_haystack $sr_needlelen $sr_pos
|
|
31 |
StrCmp $sr_test $sr_needle found
|
|
32 |
StrCmp $sr_pos $sr_stacklen done
|
|
33 |
Goto loop
|
|
34 |
found:
|
|
35 |
StrCpy $sr_p_before $sr_haystack $sr_pos
|
|
36 |
IntOp $sr_newpos $sr_pos + $sr_needlelen
|
|
37 |
StrCpy $sr_p_after $sr_haystack "" $sr_newpos
|
|
38 |
StrCpy $sr_haystack $sr_p_before$sr_replace$sr_p_after
|
|
39 |
StrCpy $sr_pos $sr_newpos
|
|
40 |
StrLen $sr_stacklen $sr_haystack
|
|
41 |
Goto loop
|
|
42 |
done:
|
|
43 |
Pop $sr_needle ; Prevent "invalid opcode" errors and keep the
|
|
44 |
Pop $sr_needle ; stack as it was before the function was called
|
|
45 |
Exch $sr_haystack
|
|
46 |
FunctionEnd
|
|
47 |
|
|
48 |
!endif ; _StrRep
|
|
49 |
|
|
50 |
!ifndef StrReplace
|
|
51 |
!macro _strReplaceConstructor OUT NEEDLE NEEDLE2 HAYSTACK
|
|
52 |
Push `${HAYSTACK}`
|
|
53 |
Push `${NEEDLE}`
|
|
54 |
Push `${NEEDLE2}`
|
|
55 |
Call str_replace
|
|
56 |
Pop `${OUT}`
|
|
57 |
!macroend
|
|
58 |
|
|
59 |
!define StrReplace '!insertmacro "_strReplaceConstructor"'
|
|
60 |
!define str_replace '!insertmacro "_strReplaceConstructor"'
|
|
61 |
!endif
|
|
62 |
|
|
63 |
; StrStr
|
|
64 |
; input, top of stack = string to search for
|
|
65 |
; top of stack-1 = string to search in
|
|
66 |
; output, top of stack (replaces with the portion of the string remaining)
|
|
67 |
; modifies no other variables.
|
|
68 |
;
|
|
69 |
; Usage:
|
|
70 |
; Push "this is a long ass string"
|
|
71 |
; Push "ass"
|
|
72 |
; Call StrStr
|
|
73 |
; Pop $R0
|
|
74 |
; ($R0 at this point is "ass string")
|
|
75 |
|
|
76 |
!macro StrStr un
|
|
77 |
Function ${un}StrStr
|
|
78 |
Exch $R1 ; st=haystack,old$R1, $R1=needle
|
|
79 |
Exch ; st=old$R1,haystack
|
|
80 |
Exch $R2 ; st=old$R1,old$R2, $R2=haystack
|
|
81 |
Push $R3
|
|
82 |
Push $R4
|
|
83 |
Push $R5
|
|
84 |
StrLen $R3 $R1
|
|
85 |
StrCpy $R4 0
|
|
86 |
; $R1=needle
|
|
87 |
; $R2=haystack
|
|
88 |
; $R3=len(needle)
|
|
89 |
; $R4=cnt
|
|
90 |
; $R5=tmp
|
|
91 |
loop:
|
|
92 |
StrCpy $R5 $R2 $R3 $R4
|
|
93 |
StrCmp $R5 $R1 done
|
|
94 |
StrCmp $R5 "" done
|
|
95 |
IntOp $R4 $R4 + 1
|
|
96 |
Goto loop
|
|
97 |
done:
|
|
98 |
StrCpy $R1 $R2 "" $R4
|
|
99 |
Pop $R5
|
|
100 |
Pop $R4
|
|
101 |
Pop $R3
|
|
102 |
Pop $R2
|
|
103 |
Exch $R1
|
|
104 |
FunctionEnd
|
|
105 |
!macroend
|
|
106 |
|
|
107 |
!insertmacro StrStr ""
|
3
|
108 |
!insertmacro StrStr "un."
|