home *** CD-ROM | disk | FTP | other *** search
/ Hackers Magazine 57 / CdHackersMagazineNr57.iso / Software / Programming / nsis-2.46-setup.exe / Include / WordFunc.nsh < prev    next >
Encoding:
Text File  |  2008-11-20  |  42.6 KB  |  1,804 lines

  1. /*
  2. _____________________________________________________________________________
  3.  
  4.                        Word Functions Header v3.3
  5. _____________________________________________________________________________
  6.  
  7.  2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru)
  8.  
  9.  See documentation for more information about the following functions.
  10.  
  11.  Usage in script:
  12.  1. !include "WordFunc.nsh"
  13.  2. [Section|Function]
  14.       ${WordFunction} "Param1" "Param2" "..." $var
  15.     [SectionEnd|FunctionEnd]
  16.  
  17.  
  18.  WordFunction=[WordFind|WordFindS|WordFind2X|WordFind2XS|WordFind3X|WordFind3XS|
  19.                WordReplace|WordReplaceS|WordAdd|WordAddS|WordInsert|WordInsertS|
  20.                StrFilter|StrFilterS|VersionCompare|VersionConvert]
  21.  
  22. _____________________________________________________________________________
  23.  
  24.                        Thanks to:
  25. _____________________________________________________________________________
  26.  
  27. WordFind3X
  28.     Afrow UK (Based on his idea of Function "StrSortLR")
  29. StrFilter
  30.     sunjammer (Function "StrUpper")
  31. VersionCompare
  32.     Afrow UK (Based on his Function "VersionCheckNew2")
  33. VersionConvert
  34.     Afrow UK (Based on his idea of Function "CharIndexReplace")
  35. */
  36.  
  37.  
  38. ;_____________________________________________________________________________
  39. ;
  40. ;                         Macros
  41. ;_____________________________________________________________________________
  42. ;
  43. ; Change log window verbosity (default: 3=no script)
  44. ;
  45. ; Example:
  46. ; !include "WordFunc.nsh"
  47. ; !insertmacro WordFind
  48. ; ${WORDFUNC_VERBOSE} 4   # all verbosity
  49. ; !insertmacro WordReplace
  50. ; ${WORDFUNC_VERBOSE} 3   # no script
  51.  
  52. !ifndef WORDFUNC_INCLUDED
  53. !define WORDFUNC_INCLUDED
  54.  
  55. !include Util.nsh
  56.  
  57. !verbose push
  58. !verbose 3
  59. !ifndef _WORDFUNC_VERBOSE
  60.     !define _WORDFUNC_VERBOSE 3
  61. !endif
  62. !verbose ${_WORDFUNC_VERBOSE}
  63. !define WORDFUNC_VERBOSE `!insertmacro WORDFUNC_VERBOSE`
  64. !verbose pop
  65.  
  66. !macro WORDFUNC_VERBOSE _VERBOSE
  67.     !verbose push
  68.     !verbose 3
  69.     !undef _WORDFUNC_VERBOSE
  70.     !define _WORDFUNC_VERBOSE ${_VERBOSE}
  71.     !verbose pop
  72. !macroend
  73.  
  74.  
  75. !macro WordFindCall _ART _STRING _DELIMITER _OPTION _RESULT
  76.     !verbose push
  77.     !verbose ${_WORDFUNC_VERBOSE}
  78.     Push `${_STRING}`
  79.     Push `${_DELIMITER}`
  80.     Push `${_OPTION}`
  81.     ${CallArtificialFunction}${_ART} WordFind_
  82.     Pop ${_RESULT}
  83.     !verbose pop
  84. !macroend
  85.  
  86. !macro WordFindSCall _ART _STRING _DELIMITER _OPTION _RESULT
  87.     !verbose push
  88.     !verbose ${_WORDFUNC_VERBOSE}
  89.     Push `${_STRING}`
  90.     Push `${_DELIMITER}`
  91.     Push `${_OPTION}`
  92.     ${CallArtificialFunction}${_ART} WordFindS_
  93.     Pop ${_RESULT}
  94.     !verbose pop
  95. !macroend
  96.  
  97. !macro WordFind2XCall _STRING _DELIMITER1 _DELIMITER2 _NUMBER _RESULT
  98.     !verbose push
  99.     !verbose ${_WORDFUNC_VERBOSE}
  100.     Push `${_STRING}`
  101.     Push `${_DELIMITER1}`
  102.     Push `${_DELIMITER2}`
  103.     Push `${_NUMBER}`
  104.     ${CallArtificialFunction} WordFind2X_
  105.     Pop ${_RESULT}
  106.     !verbose pop
  107. !macroend
  108.  
  109. !macro WordFind2XSCall _STRING _DELIMITER1 _DELIMITER2 _NUMBER _RESULT
  110.     !verbose push
  111.     !verbose ${_WORDFUNC_VERBOSE}
  112.     Push `${_STRING}`
  113.     Push `${_DELIMITER1}`
  114.     Push `${_DELIMITER2}`
  115.     Push `${_NUMBER}`
  116.     ${CallArtificialFunction} WordFind2XS_
  117.     Pop ${_RESULT}
  118.     !verbose pop
  119. !macroend
  120.  
  121. !macro WordFind3XCall _STRING _DELIMITER1 _CENTER _DELIMITER2 _NUMBER _RESULT
  122.     !verbose push
  123.     !verbose ${_WORDFUNC_VERBOSE}
  124.     Push `${_STRING}`
  125.     Push `${_DELIMITER1}`
  126.     Push `${_CENTER}`
  127.     Push `${_DELIMITER2}`
  128.     Push `${_NUMBER}`
  129.     ${CallArtificialFunction} WordFind3X_
  130.     Pop ${_RESULT}
  131.     !verbose pop
  132. !macroend
  133.  
  134. !macro WordFind3XSCall _STRING _DELIMITER1 _CENTER _DELIMITER2 _NUMBER _RESULT
  135.     !verbose push
  136.     !verbose ${_WORDFUNC_VERBOSE}
  137.     Push `${_STRING}`
  138.     Push `${_DELIMITER1}`
  139.     Push `${_CENTER}`
  140.     Push `${_DELIMITER2}`
  141.     Push `${_NUMBER}`
  142.     ${CallArtificialFunction} WordFind3XS_
  143.     Pop ${_RESULT}
  144.     !verbose pop
  145. !macroend
  146.  
  147. !macro WordReplaceCall _STRING _WORD1 _WORD2 _NUMBER _RESULT
  148.     !verbose push
  149.     !verbose ${_WORDFUNC_VERBOSE}
  150.     Push `${_STRING}`
  151.     Push `${_WORD1}`
  152.     Push `${_WORD2}`
  153.     Push `${_NUMBER}`
  154.     ${CallArtificialFunction} WordReplace_
  155.     Pop ${_RESULT}
  156.     !verbose pop
  157. !macroend
  158.  
  159. !macro WordReplaceSCall _STRING _WORD1 _WORD2 _NUMBER _RESULT
  160.     !verbose push
  161.     !verbose ${_WORDFUNC_VERBOSE}
  162.     Push `${_STRING}`
  163.     Push `${_WORD1}`
  164.     Push `${_WORD2}`
  165.     Push `${_NUMBER}`
  166.     ${CallArtificialFunction} WordReplaceS_
  167.     Pop ${_RESULT}
  168.     !verbose pop
  169. !macroend
  170.  
  171. !macro WordAddCall _STRING1 _DELIMITER _STRING2 _RESULT
  172.     !verbose push
  173.     !verbose ${_WORDFUNC_VERBOSE}
  174.     Push `${_STRING1}`
  175.     Push `${_DELIMITER}`
  176.     Push `${_STRING2}`
  177.     ${CallArtificialFunction} WordAdd_
  178.     Pop ${_RESULT}
  179.     !verbose pop
  180. !macroend
  181.  
  182. !macro WordAddSCall _STRING1 _DELIMITER _STRING2 _RESULT
  183.     !verbose push
  184.     !verbose ${_WORDFUNC_VERBOSE}
  185.     Push `${_STRING1}`
  186.     Push `${_DELIMITER}`
  187.     Push `${_STRING2}`
  188.     ${CallArtificialFunction} WordAddS_
  189.     Pop ${_RESULT}
  190.     !verbose pop
  191. !macroend
  192.  
  193. !macro WordInsertCall _STRING _DELIMITER _WORD _NUMBER _RESULT
  194.     !verbose push
  195.     !verbose ${_WORDFUNC_VERBOSE}
  196.     Push `${_STRING}`
  197.     Push `${_DELIMITER}`
  198.     Push `${_WORD}`
  199.     Push `${_NUMBER}`
  200.     ${CallArtificialFunction} WordInsert_
  201.     Pop ${_RESULT}
  202.     !verbose pop
  203. !macroend
  204.  
  205. !macro WordInsertSCall _STRING _DELIMITER _WORD _NUMBER _RESULT
  206.     !verbose push
  207.     !verbose ${_WORDFUNC_VERBOSE}
  208.     Push `${_STRING}`
  209.     Push `${_DELIMITER}`
  210.     Push `${_WORD}`
  211.     Push `${_NUMBER}`
  212.     ${CallArtificialFunction} WordInsertS_
  213.     Pop ${_RESULT}
  214.     !verbose pop
  215. !macroend
  216.  
  217. !macro StrFilterCall _STRING _FILTER _INCLUDE _EXCLUDE _RESULT
  218.     !verbose push
  219.     !verbose ${_WORDFUNC_VERBOSE}
  220.     Push `${_STRING}`
  221.     Push `${_FILTER}`
  222.     Push `${_INCLUDE}`
  223.     Push `${_EXCLUDE}`
  224.     ${CallArtificialFunction} StrFilter_
  225.     Pop ${_RESULT}
  226.     !verbose pop
  227. !macroend
  228.  
  229. !macro StrFilterSCall _STRING _FILTER _INCLUDE _EXCLUDE _RESULT
  230.     !verbose push
  231.     !verbose ${_WORDFUNC_VERBOSE}
  232.     Push `${_STRING}`
  233.     Push `${_FILTER}`
  234.     Push `${_INCLUDE}`
  235.     Push `${_EXCLUDE}`
  236.     ${CallArtificialFunction} StrFilterS_
  237.     Pop ${_RESULT}
  238.     !verbose pop
  239. !macroend
  240.  
  241. !macro VersionCompareCall _VER1 _VER2 _RESULT
  242.     !verbose push
  243.     !verbose ${_WORDFUNC_VERBOSE}
  244.     Push `${_VER1}`
  245.     Push `${_VER2}`
  246.     ${CallArtificialFunction} VersionCompare_
  247.     Pop ${_RESULT}
  248.     !verbose pop
  249. !macroend
  250.  
  251. !macro VersionConvertCall _VERSION _CHARLIST _RESULT
  252.     !verbose push
  253.     !verbose ${_WORDFUNC_VERBOSE}
  254.     Push `${_VERSION}`
  255.     Push `${_CHARLIST}`
  256.     ${CallArtificialFunction} VersionConvert_
  257.     Pop ${_RESULT}
  258.     !verbose pop
  259. !macroend
  260.  
  261. !macro WordFindBody _WORDFUNC_S
  262.     Exch $1
  263.     Exch
  264.     Exch $0
  265.     Exch
  266.     Exch 2
  267.     Exch $R0
  268.     Exch 2
  269.     Push $2
  270.     Push $3
  271.     Push $4
  272.     Push $5
  273.     Push $6
  274.     Push $7
  275.     Push $8
  276.     Push $9
  277.     Push $R1
  278.     Push $R2
  279.     ClearErrors
  280.  
  281.     StrCpy $9 ''
  282.     StrCpy $2 $1 1
  283.     StrCpy $1 $1 '' 1
  284.     StrCmp $2 'E' 0 +3
  285.     StrCpy $9 E
  286.     goto -4
  287.  
  288.     StrCpy $3 ''
  289.     StrCmp${_WORDFUNC_S} $2 '+' +6
  290.     StrCmp${_WORDFUNC_S} $2 '-' +5
  291.     StrCmp${_WORDFUNC_S} $2 '/' WordFunc_WordFind${_WORDFUNC_S}_restart
  292.     StrCmp${_WORDFUNC_S} $2 '#' WordFunc_WordFind${_WORDFUNC_S}_restart
  293.     StrCmp${_WORDFUNC_S} $2 '*' WordFunc_WordFind${_WORDFUNC_S}_restart
  294.     goto WordFunc_WordFind${_WORDFUNC_S}_error3
  295.  
  296.     StrCpy $4 $1 1 -1
  297.     StrCmp${_WORDFUNC_S} $4 '*' +4
  298.     StrCmp${_WORDFUNC_S} $4 '}' +3
  299.     StrCmp${_WORDFUNC_S} $4 '{' +2
  300.     goto +4
  301.     StrCpy $1 $1 -1
  302.     StrCpy $3 '$4$3'
  303.     goto -7
  304.     StrCmp${_WORDFUNC_S} $3 '*' WordFunc_WordFind${_WORDFUNC_S}_error3
  305.     StrCmp${_WORDFUNC_S} $3 '**' WordFunc_WordFind${_WORDFUNC_S}_error3
  306.     StrCmp${_WORDFUNC_S} $3 '}{' WordFunc_WordFind${_WORDFUNC_S}_error3
  307.     IntOp $1 $1 + 0
  308.     StrCmp${_WORDFUNC_S} $1 0 WordFunc_WordFind${_WORDFUNC_S}_error2
  309.  
  310.     WordFunc_WordFind${_WORDFUNC_S}_restart:
  311.     StrCmp${_WORDFUNC_S} $R0 '' WordFunc_WordFind${_WORDFUNC_S}_error1
  312.     StrCpy $4 0
  313.     StrCpy $5 0
  314.     StrCpy $6 0
  315.     StrLen $7 $0
  316.     goto WordFunc_WordFind${_WORDFUNC_S}_loop
  317.  
  318.     WordFunc_WordFind${_WORDFUNC_S}_preloop:
  319.     IntOp $6 $6 + 1
  320.  
  321.     WordFunc_WordFind${_WORDFUNC_S}_loop:
  322.     StrCpy $8 $R0 $7 $6
  323.     StrCmp${_WORDFUNC_S} $8$5 0 WordFunc_WordFind${_WORDFUNC_S}_error1
  324.     StrLen $R2 $8
  325.     IntCmp $R2 0 +2
  326.     StrCmp${_WORDFUNC_S} $8 $0 +5 WordFunc_WordFind${_WORDFUNC_S}_preloop
  327.     StrCmp${_WORDFUNC_S} $3 '{' WordFunc_WordFind${_WORDFUNC_S}_minus
  328.     StrCmp${_WORDFUNC_S} $3 '}' WordFunc_WordFind${_WORDFUNC_S}_minus
  329.     StrCmp${_WORDFUNC_S} $2 '*' WordFunc_WordFind${_WORDFUNC_S}_minus
  330.     StrCmp${_WORDFUNC_S} $5 $6 WordFunc_WordFind${_WORDFUNC_S}_minus +5
  331.     StrCmp${_WORDFUNC_S} $3 '{' +4
  332.     StrCmp${_WORDFUNC_S} $3 '}' +3
  333.     StrCmp${_WORDFUNC_S} $2 '*' +2
  334.     StrCmp${_WORDFUNC_S} $5 $6 WordFunc_WordFind${_WORDFUNC_S}_nextword
  335.     IntOp $4 $4 + 1
  336.     StrCmp${_WORDFUNC_S} $2$4 +$1 WordFunc_WordFind${_WORDFUNC_S}_plus
  337.     StrCmp${_WORDFUNC_S} $2 '/' 0 WordFunc_WordFind${_WORDFUNC_S}_nextword
  338.     IntOp $8 $6 - $5
  339.     StrCpy $8 $R0 $8 $5
  340.     StrCmp${_WORDFUNC_S} $1 $8 0 WordFunc_WordFind${_WORDFUNC_S}_nextword
  341.     StrCpy $R1 $4
  342.     goto WordFunc_WordFind${_WORDFUNC_S}_end
  343.     WordFunc_WordFind${_WORDFUNC_S}_nextword:
  344.     IntOp $6 $6 + $7
  345.     StrCpy $5 $6
  346.     goto WordFunc_WordFind${_WORDFUNC_S}_loop
  347.  
  348.     WordFunc_WordFind${_WORDFUNC_S}_minus:
  349.     StrCmp${_WORDFUNC_S} $2 '-' 0 WordFunc_WordFind${_WORDFUNC_S}_sum
  350.     StrCpy $2 '+'
  351.     IntOp $1 $4 - $1
  352.     IntOp $1 $1 + 1
  353.     IntCmp $1 0 WordFunc_WordFind${_WORDFUNC_S}_error2 WordFunc_WordFind${_WORDFUNC_S}_error2 WordFunc_WordFind${_WORDFUNC_S}_restart
  354.     WordFunc_WordFind${_WORDFUNC_S}_sum:
  355.     StrCmp${_WORDFUNC_S} $2 '#' 0 WordFunc_WordFind${_WORDFUNC_S}_sumdelim
  356.     StrCpy $R1 $4
  357.     goto WordFunc_WordFind${_WORDFUNC_S}_end
  358.     WordFunc_WordFind${_WORDFUNC_S}_sumdelim:
  359.     StrCmp${_WORDFUNC_S} $2 '*' 0 WordFunc_WordFind${_WORDFUNC_S}_error2
  360.     StrCpy $R1 $4
  361.     goto WordFunc_WordFind${_WORDFUNC_S}_end
  362.  
  363.     WordFunc_WordFind${_WORDFUNC_S}_plus:
  364.     StrCmp${_WORDFUNC_S} $3 '' 0 +4
  365.     IntOp $6 $6 - $5
  366.     StrCpy $R1 $R0 $6 $5
  367.     goto WordFunc_WordFind${_WORDFUNC_S}_end
  368.     StrCmp${_WORDFUNC_S} $3 '{' 0 +3
  369.     StrCpy $R1 $R0 $6
  370.     goto WordFunc_WordFind${_WORDFUNC_S}_end
  371.     StrCmp${_WORDFUNC_S} $3 '}' 0 +4
  372.     IntOp $6 $6 + $7
  373.     StrCpy $R1 $R0 '' $6
  374.     goto WordFunc_WordFind${_WORDFUNC_S}_end
  375.     StrCmp${_WORDFUNC_S} $3 '{*' +2
  376.     StrCmp${_WORDFUNC_S} $3 '*{' 0 +3
  377.     StrCpy $R1 $R0 $6
  378.     goto WordFunc_WordFind${_WORDFUNC_S}_end
  379.     StrCmp${_WORDFUNC_S} $3 '*}' +2
  380.     StrCmp${_WORDFUNC_S} $3 '}*' 0 +3
  381.     StrCpy $R1 $R0 '' $5
  382.     goto WordFunc_WordFind${_WORDFUNC_S}_end
  383.     StrCmp${_WORDFUNC_S} $3 '}}' 0 +3
  384.     StrCpy $R1 $R0 '' $6
  385.     goto WordFunc_WordFind${_WORDFUNC_S}_end
  386.     StrCmp${_WORDFUNC_S} $3 '{{' 0 +3
  387.     StrCpy $R1 $R0 $5
  388.     goto WordFunc_WordFind${_WORDFUNC_S}_end
  389.     StrCmp${_WORDFUNC_S} $3 '{}' 0 WordFunc_WordFind${_WORDFUNC_S}_error3
  390.     StrLen $3 $R0
  391.     StrCmp${_WORDFUNC_S} $3 $6 0 +3
  392.     StrCpy $0 ''
  393.     goto +2
  394.     IntOp $6 $6 + $7
  395.     StrCpy $8 $R0 '' $6
  396.     StrCmp${_WORDFUNC_S} $4$8 1 +6
  397.     StrCmp${_WORDFUNC_S} $4 1 +2 +7
  398.     IntOp $6 $6 + $7
  399.     StrCpy $3 $R0 $7 $6
  400.     StrCmp${_WORDFUNC_S} $3 '' +2
  401.     StrCmp${_WORDFUNC_S} $3 $0 -3 +3
  402.     StrCpy $R1 ''
  403.     goto WordFunc_WordFind${_WORDFUNC_S}_end
  404.     StrCmp${_WORDFUNC_S} $5 0 0 +3
  405.     StrCpy $0 ''
  406.     goto +2
  407.     IntOp $5 $5 - $7
  408.     StrCpy $3 $R0 $5
  409.     StrCpy $R1 '$3$0$8'
  410.     goto WordFunc_WordFind${_WORDFUNC_S}_end
  411.  
  412.     WordFunc_WordFind${_WORDFUNC_S}_error3:
  413.     StrCpy $R1 3
  414.     goto WordFunc_WordFind${_WORDFUNC_S}_error
  415.     WordFunc_WordFind${_WORDFUNC_S}_error2:
  416.     StrCpy $R1 2
  417.     goto WordFunc_WordFind${_WORDFUNC_S}_error
  418.     WordFunc_WordFind${_WORDFUNC_S}_error1:
  419.     StrCpy $R1 1
  420.     WordFunc_WordFind${_WORDFUNC_S}_error:
  421.     StrCmp $9 'E' 0 +3
  422.     SetErrors
  423.  
  424.     WordFunc_WordFind${_WORDFUNC_S}_end:
  425.     StrCpy $R0 $R1
  426.  
  427.     Pop $R2
  428.     Pop $R1
  429.     Pop $9
  430.     Pop $8
  431.     Pop $7
  432.     Pop $6
  433.     Pop $5
  434.     Pop $4
  435.     Pop $3
  436.     Pop $2
  437.     Pop $1
  438.     Pop $0
  439.     Exch $R0
  440. !macroend
  441.  
  442. !define WordFind `!insertmacro WordFindCall ''`
  443. !define un.WordFind `!insertmacro WordFindCall ''`
  444.  
  445. !macro WordFind
  446. !macroend
  447.  
  448. !macro un.WordFind
  449. !macroend
  450.  
  451. !macro WordFind_
  452.     !verbose push
  453.     !verbose ${_WORDFUNC_VERBOSE}
  454.  
  455.     !insertmacro WordFindBody ''
  456.  
  457.     !verbose pop
  458. !macroend
  459.  
  460. !define WordFindS `!insertmacro WordFindSCall ''`
  461. !define un.WordFindS `!insertmacro WordFindSCall ''`
  462.  
  463. !macro WordFindS
  464. !macroend
  465.  
  466. !macro un.WordFindS
  467. !macroend
  468.  
  469. !macro WordFindS_
  470.     !verbose push
  471.     !verbose ${_WORDFUNC_VERBOSE}
  472.  
  473.     !insertmacro WordFindBody 'S'
  474.  
  475.     !verbose pop
  476. !macroend
  477.  
  478. !macro WordFind2XBody _WORDFUNC_S
  479.     Exch $2
  480.     Exch
  481.     Exch $1
  482.     Exch
  483.     Exch 2
  484.     Exch $0
  485.     Exch 2
  486.     Exch 3
  487.     Exch $R0
  488.     Exch 3
  489.     Push $3
  490.     Push $4
  491.     Push $5
  492.     Push $6
  493.     Push $7
  494.     Push $8
  495.     Push $9
  496.     Push $R1
  497.     Push $R2
  498.     ClearErrors
  499.  
  500.     StrCpy $R2 ''
  501.     StrCpy $3 $2 1
  502.     StrCpy $2 $2 '' 1
  503.     StrCmp $3 'E' 0 +3
  504.     StrCpy $R2 E
  505.     goto -4
  506.  
  507.     StrCmp${_WORDFUNC_S} $3 '+' +5
  508.     StrCmp${_WORDFUNC_S} $3 '-' +4
  509.     StrCmp${_WORDFUNC_S} $3 '#' WordFunc_WordFind2X${_WORDFUNC_S}_restart
  510.     StrCmp${_WORDFUNC_S} $3 '/' WordFunc_WordFind2X${_WORDFUNC_S}_restart
  511.     goto WordFunc_WordFind2X${_WORDFUNC_S}_error3
  512.  
  513.     StrCpy $4 $2 2 -2
  514.     StrCmp${_WORDFUNC_S} $4 '{{' +9
  515.     StrCmp${_WORDFUNC_S} $4 '}}' +8
  516.     StrCmp${_WORDFUNC_S} $4 '{*' +7
  517.     StrCmp${_WORDFUNC_S} $4 '*{' +6
  518.     StrCmp${_WORDFUNC_S} $4 '*}' +5
  519.     StrCmp${_WORDFUNC_S} $4 '}*' +4
  520.     StrCmp${_WORDFUNC_S} $4 '{}' +3
  521.     StrCpy $4 ''
  522.     goto +2
  523.     StrCpy $2 $2 -2
  524.     IntOp $2 $2 + 0
  525.     StrCmp${_WORDFUNC_S} $2 0 WordFunc_WordFind2X${_WORDFUNC_S}_error2
  526.  
  527.     WordFunc_WordFind2X${_WORDFUNC_S}_restart:
  528.     StrCmp${_WORDFUNC_S} $R0 '' WordFunc_WordFind2X${_WORDFUNC_S}_error1
  529.     StrCpy $5 -1
  530.     StrCpy $6 0
  531.     StrCpy $7 ''
  532.     StrLen $8 $0
  533.     StrLen $9 $1
  534.  
  535.     WordFunc_WordFind2X${_WORDFUNC_S}_loop:
  536.     IntOp $5 $5 + 1
  537.  
  538.     WordFunc_WordFind2X${_WORDFUNC_S}_delim1:
  539.     StrCpy $R1 $R0 $8 $5
  540.     StrCmp${_WORDFUNC_S} $R1$6 0 WordFunc_WordFind2X${_WORDFUNC_S}_error1
  541.     StrCmp${_WORDFUNC_S} $R1 '' WordFunc_WordFind2X${_WORDFUNC_S}_minus
  542.     StrCmp${_WORDFUNC_S} $R1 $0 +2
  543.     StrCmp${_WORDFUNC_S} $7 '' WordFunc_WordFind2X${_WORDFUNC_S}_loop WordFunc_WordFind2X${_WORDFUNC_S}_delim2
  544.     StrCmp${_WORDFUNC_S} $0 $1 0 +2
  545.     StrCmp${_WORDFUNC_S} $7 '' 0 WordFunc_WordFind2X${_WORDFUNC_S}_delim2
  546.     IntOp $7 $5 + $8
  547.     StrCpy $5 $7
  548.     goto WordFunc_WordFind2X${_WORDFUNC_S}_delim1
  549.  
  550.     WordFunc_WordFind2X${_WORDFUNC_S}_delim2:
  551.     StrCpy $R1 $R0 $9 $5
  552.     StrCmp${_WORDFUNC_S} $R1 $1 0 WordFunc_WordFind2X${_WORDFUNC_S}_loop
  553.     IntOp $6 $6 + 1
  554.     StrCmp${_WORDFUNC_S} $3$6 '+$2' WordFunc_WordFind2X${_WORDFUNC_S}_plus
  555.     StrCmp${_WORDFUNC_S} $3 '/' 0 WordFunc_WordFind2X${_WORDFUNC_S}_nextword
  556.     IntOp $R1 $5 - $7
  557.     StrCpy $R1 $R0 $R1 $7
  558.     StrCmp${_WORDFUNC_S} $R1 $2 0 +3
  559.     StrCpy $R1 $6
  560.     goto WordFunc_WordFind2X${_WORDFUNC_S}_end
  561.     WordFunc_WordFind2X${_WORDFUNC_S}_nextword:
  562.     IntOp $5 $5 + $9
  563.     StrCpy $7 ''
  564.     goto WordFunc_WordFind2X${_WORDFUNC_S}_delim1
  565.  
  566.     WordFunc_WordFind2X${_WORDFUNC_S}_minus:
  567.     StrCmp${_WORDFUNC_S} $3 '-' 0 WordFunc_WordFind2X${_WORDFUNC_S}_sum
  568.     StrCpy $3 +
  569.     IntOp $2 $6 - $2
  570.     IntOp $2 $2 + 1
  571.     IntCmp $2 0 WordFunc_WordFind2X${_WORDFUNC_S}_error2 WordFunc_WordFind2X${_WORDFUNC_S}_error2 WordFunc_WordFind2X${_WORDFUNC_S}_restart
  572.     WordFunc_WordFind2X${_WORDFUNC_S}_sum:
  573.     StrCmp${_WORDFUNC_S} $3 '#' 0 WordFunc_WordFind2X${_WORDFUNC_S}_error2
  574.     StrCpy $R1 $6
  575.     goto WordFunc_WordFind2X${_WORDFUNC_S}_end
  576.  
  577.     WordFunc_WordFind2X${_WORDFUNC_S}_plus:
  578.     StrCmp${_WORDFUNC_S} $4 '' 0 +4
  579.     IntOp $R1 $5 - $7
  580.     StrCpy $R1 $R0 $R1 $7
  581.     goto WordFunc_WordFind2X${_WORDFUNC_S}_end
  582.     IntOp $5 $5 + $9
  583.     IntOp $7 $7 - $8
  584.     StrCmp${_WORDFUNC_S} $4 '{*' +2
  585.     StrCmp${_WORDFUNC_S} $4 '*{' 0 +3
  586.     StrCpy $R1 $R0 $5
  587.     goto WordFunc_WordFind2X${_WORDFUNC_S}_end
  588.     StrCmp${_WORDFUNC_S} $4 '*}' +2
  589.     StrCmp${_WORDFUNC_S} $4 '}*' 0 +3
  590.     StrCpy $R1 $R0 '' $7
  591.     goto WordFunc_WordFind2X${_WORDFUNC_S}_end
  592.     StrCmp${_WORDFUNC_S} $4 '}}' 0 +3
  593.     StrCpy $R1 $R0 '' $5
  594.     goto WordFunc_WordFind2X${_WORDFUNC_S}_end
  595.     StrCmp${_WORDFUNC_S} $4 '{{' 0 +3
  596.     StrCpy $R1 $R0 $7
  597.     goto WordFunc_WordFind2X${_WORDFUNC_S}_end
  598.     StrCmp${_WORDFUNC_S} $4 '{}' 0 WordFunc_WordFind2X${_WORDFUNC_S}_error3
  599.     StrCpy $5 $R0 '' $5
  600.     StrCpy $7 $R0 $7
  601.     StrCpy $R1 '$7$5'
  602.     goto WordFunc_WordFind2X${_WORDFUNC_S}_end
  603.  
  604.     WordFunc_WordFind2X${_WORDFUNC_S}_error3:
  605.     StrCpy $R1 3
  606.     goto WordFunc_WordFind2X${_WORDFUNC_S}_error
  607.     WordFunc_WordFind2X${_WORDFUNC_S}_error2:
  608.     StrCpy $R1 2
  609.     goto WordFunc_WordFind2X${_WORDFUNC_S}_error
  610.     WordFunc_WordFind2X${_WORDFUNC_S}_error1:
  611.     StrCpy $R1 1
  612.     WordFunc_WordFind2X${_WORDFUNC_S}_error:
  613.     StrCmp $R2 'E' 0 +3
  614.     SetErrors
  615.  
  616.     WordFunc_WordFind2X${_WORDFUNC_S}_end:
  617.     StrCpy $R0 $R1
  618.  
  619.     Pop $R2
  620.     Pop $R1
  621.     Pop $9
  622.     Pop $8
  623.     Pop $7
  624.     Pop $6
  625.     Pop $5
  626.     Pop $4
  627.     Pop $3
  628.     Pop $2
  629.     Pop $1
  630.     Pop $0
  631.     Exch $R0
  632. !macroend
  633.  
  634. !define WordFind2X `!insertmacro WordFind2XCall`
  635. !define un.WordFind2X `!insertmacro WordFind2XCall`
  636.  
  637. !macro WordFind2X
  638. !macroend
  639.  
  640. !macro un.WordFind2X
  641. !macroend
  642.  
  643. !macro WordFind2X_
  644.     !verbose push
  645.     !verbose ${_WORDFUNC_VERBOSE}
  646.  
  647.     !insertmacro WordFind2XBody ''
  648.  
  649.     !verbose pop
  650. !macroend
  651.  
  652. !define WordFind2XS `!insertmacro WordFind2XSCall`
  653. !define un.WordFind2XS `!insertmacro WordFind2XSCall`
  654.  
  655. !macro WordFind2XS
  656. !macroend
  657.  
  658. !macro un.WordFind2XS
  659. !macroend
  660.  
  661. !macro WordFind2XS_
  662.     !verbose push
  663.     !verbose ${_WORDFUNC_VERBOSE}
  664.  
  665.     !insertmacro WordFind2XBody 'S'
  666.  
  667.     !verbose pop
  668. !macroend
  669.  
  670. !macro WordFind3XBody _WORDFUNC_S
  671.     Exch $3
  672.     Exch
  673.     Exch $2
  674.     Exch
  675.     Exch 2
  676.     Exch $1
  677.     Exch 2
  678.     Exch 3
  679.     Exch $0
  680.     Exch 3
  681.     Exch 4
  682.     Exch $R0
  683.     Exch 4
  684.     Push $4
  685.     Push $5
  686.     Push $6
  687.     Push $7
  688.     Push $8
  689.     Push $9
  690.     Push $R1
  691.     Push $R2
  692.     Push $R3
  693.     Push $R4
  694.     Push $R5
  695.     ClearErrors
  696.  
  697.     StrCpy $R5 ''
  698.     StrCpy $4 $3 1
  699.     StrCpy $3 $3 '' 1
  700.     StrCmp $4 'E' 0 +3
  701.     StrCpy $R5 E
  702.     goto -4
  703.  
  704.     StrCmp${_WORDFUNC_S} $4 '+' +5
  705.     StrCmp${_WORDFUNC_S} $4 '-' +4
  706.     StrCmp${_WORDFUNC_S} $4 '#' WordFunc_WordFind3X${_WORDFUNC_S}_restart
  707.     StrCmp${_WORDFUNC_S} $4 '/' WordFunc_WordFind3X${_WORDFUNC_S}_restart
  708.     goto WordFunc_WordFind3X${_WORDFUNC_S}_error3
  709.  
  710.     StrCpy $5 $3 2 -2
  711.     StrCmp${_WORDFUNC_S} $5 '{{' +9
  712.     StrCmp${_WORDFUNC_S} $5 '}}' +8
  713.     StrCmp${_WORDFUNC_S} $5 '{*' +7
  714.     StrCmp${_WORDFUNC_S} $5 '*{' +6
  715.     StrCmp${_WORDFUNC_S} $5 '*}' +5
  716.     StrCmp${_WORDFUNC_S} $5 '}*' +4
  717.     StrCmp${_WORDFUNC_S} $5 '{}' +3
  718.     StrCpy $5 ''
  719.     goto +2
  720.     StrCpy $3 $3 -2
  721.     IntOp $3 $3 + 0
  722.     StrCmp${_WORDFUNC_S} $3 0 WordFunc_WordFind3X${_WORDFUNC_S}_error2
  723.  
  724.     WordFunc_WordFind3X${_WORDFUNC_S}_restart:
  725.     StrCmp${_WORDFUNC_S} $R0 '' WordFunc_WordFind3X${_WORDFUNC_S}_error1
  726.     StrCpy $6 -1
  727.     StrCpy $7 0
  728.     StrCpy $8 ''
  729.     StrCpy $9 ''
  730.     StrLen $R1 $0
  731.     StrLen $R2 $1
  732.     StrLen $R3 $2
  733.  
  734.     WordFunc_WordFind3X${_WORDFUNC_S}_loop:
  735.     IntOp $6 $6 + 1
  736.  
  737.     WordFunc_WordFind3X${_WORDFUNC_S}_delim1:
  738.     StrCpy $R4 $R0 $R1 $6
  739.     StrCmp${_WORDFUNC_S} $R4$7 0 WordFunc_WordFind3X${_WORDFUNC_S}_error1
  740.     StrCmp${_WORDFUNC_S} $R4 '' WordFunc_WordFind3X${_WORDFUNC_S}_minus
  741.     StrCmp${_WORDFUNC_S} $R4 $0 +2
  742.     StrCmp${_WORDFUNC_S} $8 '' WordFunc_WordFind3X${_WORDFUNC_S}_loop WordFunc_WordFind3X${_WORDFUNC_S}_center
  743.     StrCmp${_WORDFUNC_S} $0 $1 +2
  744.     StrCmp${_WORDFUNC_S} $0 $2 0 +2
  745.     StrCmp${_WORDFUNC_S} $8 '' 0 WordFunc_WordFind3X${_WORDFUNC_S}_center
  746.     IntOp $8 $6 + $R1
  747.     StrCpy $6 $8
  748.     goto WordFunc_WordFind3X${_WORDFUNC_S}_delim1
  749.  
  750.     WordFunc_WordFind3X${_WORDFUNC_S}_center:
  751.     StrCmp${_WORDFUNC_S} $9 '' 0 WordFunc_WordFind3X${_WORDFUNC_S}_delim2
  752.     StrCpy $R4 $R0 $R2 $6
  753.     StrCmp${_WORDFUNC_S} $R4 $1 0 WordFunc_WordFind3X${_WORDFUNC_S}_loop
  754.     IntOp $9 $6 + $R2
  755.     StrCpy $6 $9
  756.     goto WordFunc_WordFind3X${_WORDFUNC_S}_delim1
  757.  
  758.     WordFunc_WordFind3X${_WORDFUNC_S}_delim2:
  759.     StrCpy $R4 $R0 $R3 $6
  760.     StrCmp${_WORDFUNC_S} $R4 $2 0 WordFunc_WordFind3X${_WORDFUNC_S}_loop
  761.     IntOp $7 $7 + 1
  762.     StrCmp${_WORDFUNC_S} $4$7 '+$3' WordFunc_WordFind3X${_WORDFUNC_S}_plus
  763.     StrCmp${_WORDFUNC_S} $4 '/' 0 WordFunc_WordFind3X${_WORDFUNC_S}_nextword
  764.     IntOp $R4 $6 - $8
  765.     StrCpy $R4 $R0 $R4 $8
  766.     StrCmp${_WORDFUNC_S} $R4 $3 0 +3
  767.     StrCpy $R4 $7
  768.     goto WordFunc_WordFind3X${_WORDFUNC_S}_end
  769.     WordFunc_WordFind3X${_WORDFUNC_S}_nextword:
  770.     IntOp $6 $6 + $R3
  771.     StrCpy $8 ''
  772.     StrCpy $9 ''
  773.     goto WordFunc_WordFind3X${_WORDFUNC_S}_delim1
  774.  
  775.     WordFunc_WordFind3X${_WORDFUNC_S}_minus:
  776.     StrCmp${_WORDFUNC_S} $4 '-' 0 WordFunc_WordFind3X${_WORDFUNC_S}_sum
  777.     StrCpy $4 +
  778.     IntOp $3 $7 - $3
  779.     IntOp $3 $3 + 1
  780.     IntCmp $3 0 WordFunc_WordFind3X${_WORDFUNC_S}_error2 WordFunc_WordFind3X${_WORDFUNC_S}_error2 WordFunc_WordFind3X${_WORDFUNC_S}_restart
  781.     WordFunc_WordFind3X${_WORDFUNC_S}_sum:
  782.     StrCmp${_WORDFUNC_S} $4 '#' 0 WordFunc_WordFind3X${_WORDFUNC_S}_error2
  783.     StrCpy $R4 $7
  784.     goto WordFunc_WordFind3X${_WORDFUNC_S}_end
  785.  
  786.     WordFunc_WordFind3X${_WORDFUNC_S}_plus:
  787.     StrCmp${_WORDFUNC_S} $5 '' 0 +4
  788.     IntOp $R4 $6 - $8
  789.     StrCpy $R4 $R0 $R4 $8
  790.     goto WordFunc_WordFind3X${_WORDFUNC_S}_end
  791.     IntOp $6 $6 + $R3
  792.     IntOp $8 $8 - $R1
  793.     StrCmp${_WORDFUNC_S} $5 '{*' +2
  794.     StrCmp${_WORDFUNC_S} $5 '*{' 0 +3
  795.     StrCpy $R4 $R0 $6
  796.     goto WordFunc_WordFind3X${_WORDFUNC_S}_end
  797.     StrCmp${_WORDFUNC_S} $5 '*}' +2
  798.     StrCmp${_WORDFUNC_S} $5 '}*' 0 +3
  799.     StrCpy $R4 $R0 '' $8
  800.     goto WordFunc_WordFind3X${_WORDFUNC_S}_end
  801.     StrCmp${_WORDFUNC_S} $5 '}}' 0 +3
  802.     StrCpy $R4 $R0 '' $6
  803.     goto WordFunc_WordFind3X${_WORDFUNC_S}_end
  804.     StrCmp${_WORDFUNC_S} $5 '{{' 0 +3
  805.     StrCpy $R4 $R0 $8
  806.     goto WordFunc_WordFind3X${_WORDFUNC_S}_end
  807.     StrCmp${_WORDFUNC_S} $5 '{}' 0 WordFunc_WordFind3X${_WORDFUNC_S}_error3
  808.     StrCpy $6 $R0 '' $6
  809.     StrCpy $8 $R0 $8
  810.     StrCpy $R4 '$8$6'
  811.     goto WordFunc_WordFind3X${_WORDFUNC_S}_end
  812.  
  813.     WordFunc_WordFind3X${_WORDFUNC_S}_error3:
  814.     StrCpy $R4 3
  815.     goto WordFunc_WordFind3X${_WORDFUNC_S}_error
  816.     WordFunc_WordFind3X${_WORDFUNC_S}_error2:
  817.     StrCpy $R4 2
  818.     goto WordFunc_WordFind3X${_WORDFUNC_S}_error
  819.     WordFunc_WordFind3X${_WORDFUNC_S}_error1:
  820.     StrCpy $R4 1
  821.     WordFunc_WordFind3X${_WORDFUNC_S}_error:
  822.     StrCmp $R5 'E' 0 +3
  823.     SetErrors
  824.  
  825.     WordFunc_WordFind3X${_WORDFUNC_S}_end:
  826.     StrCpy $R0 $R4
  827.     Pop $R5
  828.     Pop $R4
  829.     Pop $R3
  830.     Pop $R2
  831.     Pop $R1
  832.     Pop $9
  833.     Pop $8
  834.     Pop $7
  835.     Pop $6
  836.     Pop $5
  837.     Pop $4
  838.     Pop $3
  839.     Pop $2
  840.     Pop $1
  841.     Pop $0
  842.     Exch $R0
  843. !macroend
  844.  
  845. !define WordFind3X `!insertmacro WordFind3XCall`
  846. !define un.WordFind3X `!insertmacro WordFind3XCall`
  847.  
  848. !macro WordFind3X
  849. !macroend
  850.  
  851. !macro un.WordFind3X
  852. !macroend
  853.  
  854. !macro WordFind3X_
  855.     !verbose push
  856.     !verbose ${_WORDFUNC_VERBOSE}
  857.  
  858.     !insertmacro WordFind3XBody ''
  859.  
  860.     !verbose pop
  861. !macroend
  862.  
  863. !define WordFind3XS `!insertmacro WordFind3XSCall`
  864. !define un.WordFind3XS `!insertmacro WordFind3XSCall`
  865.  
  866. !macro WordFind3XS
  867. !macroend
  868.  
  869. !macro un.WordFind3XS
  870. !macroend
  871.  
  872. !macro WordFind3XS_
  873.     !verbose push
  874.     !verbose ${_WORDFUNC_VERBOSE}
  875.  
  876.     !insertmacro WordFind3XBody 'S'
  877.  
  878.     !verbose pop
  879. !macroend
  880.  
  881. !macro WordReplaceBody _WORDFUNC_S
  882.     Exch $2
  883.     Exch
  884.     Exch $1
  885.     Exch
  886.     Exch 2
  887.     Exch $0
  888.     Exch 2
  889.     Exch 3
  890.     Exch $R0
  891.     Exch 3
  892.     Push $3
  893.     Push $4
  894.     Push $5
  895.     Push $6
  896.     Push $7
  897.     Push $8
  898.     Push $9
  899.     Push $R1
  900.     ClearErrors
  901.  
  902.     StrCpy $R1 $R0
  903.     StrCpy $9 ''
  904.     StrCpy $3 $2 1
  905.     StrCpy $2 $2 '' 1
  906.     StrCmp $3 'E' 0 +3
  907.     StrCpy $9 E
  908.     goto -4
  909.  
  910.     StrCpy $4 $2 1 -1
  911.     StrCpy $5 ''
  912.     StrCpy $6 ''
  913.     StrLen $7 $0
  914.  
  915.     StrCmp${_WORDFUNC_S} $7 0 WordFunc_WordReplace${_WORDFUNC_S}_error1
  916.     StrCmp${_WORDFUNC_S} $R0 '' WordFunc_WordReplace${_WORDFUNC_S}_error1
  917.     StrCmp${_WORDFUNC_S} $3 '{' WordFunc_WordReplace${_WORDFUNC_S}_beginning
  918.     StrCmp${_WORDFUNC_S} $3 '}' WordFunc_WordReplace${_WORDFUNC_S}_ending WordFunc_WordReplace${_WORDFUNC_S}_errorchk
  919.  
  920.     WordFunc_WordReplace${_WORDFUNC_S}_beginning:
  921.     StrCpy $8 $R0 $7
  922.     StrCmp${_WORDFUNC_S} $8 $0 0 +4
  923.     StrCpy $R0 $R0 '' $7
  924.     StrCpy $5 '$5$1'
  925.     goto -4
  926.     StrCpy $3 $2 1
  927.     StrCmp${_WORDFUNC_S} $3 '}' 0 WordFunc_WordReplace${_WORDFUNC_S}_merge
  928.  
  929.     WordFunc_WordReplace${_WORDFUNC_S}_ending:
  930.     StrCpy $8 $R0 '' -$7
  931.     StrCmp${_WORDFUNC_S} $8 $0 0 +4
  932.     StrCpy $R0 $R0 -$7
  933.     StrCpy $6 '$6$1'
  934.     goto -4
  935.  
  936.     WordFunc_WordReplace${_WORDFUNC_S}_merge:
  937.     StrCmp${_WORDFUNC_S} $4 '*' 0 +5
  938.     StrCmp${_WORDFUNC_S} $5 '' +2
  939.     StrCpy $5 $1
  940.     StrCmp${_WORDFUNC_S} $6 '' +2
  941.     StrCpy $6 $1
  942.     StrCpy $R0 '$5$R0$6'
  943.     goto WordFunc_WordReplace${_WORDFUNC_S}_end
  944.  
  945.     WordFunc_WordReplace${_WORDFUNC_S}_errorchk:
  946.     StrCmp${_WORDFUNC_S} $3 '+' +2
  947.     StrCmp${_WORDFUNC_S} $3 '-' 0 WordFunc_WordReplace${_WORDFUNC_S}_error3
  948.  
  949.     StrCpy $5 $2 1
  950.     IntOp $2 $2 + 0
  951.     StrCmp${_WORDFUNC_S} $2 0 0 WordFunc_WordReplace${_WORDFUNC_S}_one
  952.     StrCmp${_WORDFUNC_S} $5 0 WordFunc_WordReplace${_WORDFUNC_S}_error2
  953.     StrCpy $3 ''
  954.  
  955.     WordFunc_WordReplace${_WORDFUNC_S}_all:
  956.     StrCpy $5 0
  957.     StrCpy $2 $R0 $7 $5
  958.     StrCmp${_WORDFUNC_S} $2 '' +4
  959.     StrCmp${_WORDFUNC_S} $2 $0 +6
  960.     IntOp $5 $5 + 1
  961.     goto -4
  962.     StrCmp${_WORDFUNC_S} $R0 $R1 WordFunc_WordReplace${_WORDFUNC_S}_error1
  963.     StrCpy $R0 '$3$R0'
  964.     goto WordFunc_WordReplace${_WORDFUNC_S}_end
  965.     StrCpy $2 $R0 $5
  966.     IntOp $5 $5 + $7
  967.     StrCmp${_WORDFUNC_S} $4 '*' 0 +3
  968.     StrCpy $6 $R0 $7 $5
  969.     StrCmp${_WORDFUNC_S} $6 $0 -3
  970.     StrCpy $R0 $R0 '' $5
  971.     StrCpy $3 '$3$2$1'
  972.     goto WordFunc_WordReplace${_WORDFUNC_S}_all
  973.  
  974.     WordFunc_WordReplace${_WORDFUNC_S}_one:
  975.     StrCpy $5 0
  976.     StrCpy $8 0
  977.     goto WordFunc_WordReplace${_WORDFUNC_S}_loop
  978.  
  979.     WordFunc_WordReplace${_WORDFUNC_S}_preloop:
  980.     IntOp $5 $5 + 1
  981.  
  982.     WordFunc_WordReplace${_WORDFUNC_S}_loop:
  983.     StrCpy $6 $R0 $7 $5
  984.     StrCmp${_WORDFUNC_S} $6$8 0 WordFunc_WordReplace${_WORDFUNC_S}_error1
  985.     StrCmp${_WORDFUNC_S} $6 '' WordFunc_WordReplace${_WORDFUNC_S}_minus
  986.     StrCmp${_WORDFUNC_S} $6 $0 0 WordFunc_WordReplace${_WORDFUNC_S}_preloop
  987.     IntOp $8 $8 + 1
  988.     StrCmp${_WORDFUNC_S} $3$8 +$2 WordFunc_WordReplace${_WORDFUNC_S}_found
  989.     IntOp $5 $5 + $7
  990.     goto WordFunc_WordReplace${_WORDFUNC_S}_loop
  991.  
  992.     WordFunc_WordReplace${_WORDFUNC_S}_minus:
  993.     StrCmp${_WORDFUNC_S} $3 '-' 0 WordFunc_WordReplace${_WORDFUNC_S}_error2
  994.     StrCpy $3 +
  995.     IntOp $2 $8 - $2
  996.     IntOp $2 $2 + 1
  997.     IntCmp $2 0 WordFunc_WordReplace${_WORDFUNC_S}_error2 WordFunc_WordReplace${_WORDFUNC_S}_error2 WordFunc_WordReplace${_WORDFUNC_S}_one
  998.  
  999.     WordFunc_WordReplace${_WORDFUNC_S}_found:
  1000.     StrCpy $3 $R0 $5
  1001.     StrCmp${_WORDFUNC_S} $4 '*' 0 +5
  1002.     StrCpy $6 $3 '' -$7
  1003.     StrCmp${_WORDFUNC_S} $6 $0 0 +3
  1004.     StrCpy $3 $3 -$7
  1005.     goto -3
  1006.     IntOp $5 $5 + $7
  1007.     StrCmp${_WORDFUNC_S} $4 '*' 0 +3
  1008.     StrCpy $6 $R0 $7 $5
  1009.     StrCmp${_WORDFUNC_S} $6 $0 -3
  1010.     StrCpy $R0 $R0 '' $5
  1011.     StrCpy $R0 '$3$1$R0'
  1012.     goto WordFunc_WordReplace${_WORDFUNC_S}_end
  1013.  
  1014.     WordFunc_WordReplace${_WORDFUNC_S}_error3:
  1015.     StrCpy $R0 3
  1016.     goto WordFunc_WordReplace${_WORDFUNC_S}_error
  1017.     WordFunc_WordReplace${_WORDFUNC_S}_error2:
  1018.     StrCpy $R0 2
  1019.     goto WordFunc_WordReplace${_WORDFUNC_S}_error
  1020.     WordFunc_WordReplace${_WORDFUNC_S}_error1:
  1021.     StrCpy $R0 1
  1022.     WordFunc_WordReplace${_WORDFUNC_S}_error:
  1023.     StrCmp $9 'E' +3
  1024.     StrCpy $R0 $R1
  1025.     goto +2
  1026.     SetErrors
  1027.  
  1028.     WordFunc_WordReplace${_WORDFUNC_S}_end:
  1029.     Pop $R1
  1030.     Pop $9
  1031.     Pop $8
  1032.     Pop $7
  1033.     Pop $6
  1034.     Pop $5
  1035.     Pop $4
  1036.     Pop $3
  1037.     Pop $2
  1038.     Pop $1
  1039.     Pop $0
  1040.     Exch $R0
  1041. !macroend
  1042.  
  1043. !define WordReplace `!insertmacro WordReplaceCall`
  1044. !define un.WordReplace `!insertmacro WordReplaceCall`
  1045.  
  1046. !macro WordReplace
  1047. !macroend
  1048.  
  1049. !macro un.WordReplace
  1050. !macroend
  1051.  
  1052. !macro WordReplace_
  1053.     !verbose push
  1054.     !verbose ${_WORDFUNC_VERBOSE}
  1055.  
  1056.     !insertmacro WordReplaceBody ''
  1057.  
  1058.     !verbose pop
  1059. !macroend
  1060.  
  1061. !define WordReplaceS `!insertmacro WordReplaceSCall`
  1062. !define un.WordReplaceS `!insertmacro WordReplaceSCall`
  1063.  
  1064. !macro WordReplaceS
  1065. !macroend
  1066.  
  1067. !macro un.WordReplaceS
  1068. !macroend
  1069.  
  1070. !macro WordReplaceS_
  1071.     !verbose push
  1072.     !verbose ${_WORDFUNC_VERBOSE}
  1073.  
  1074.     !insertmacro WordReplaceBody 'S'
  1075.  
  1076.     !verbose pop
  1077. !macroend
  1078.  
  1079. !macro WordAddBody _WORDFUNC_S
  1080.     Exch $1
  1081.     Exch
  1082.     Exch $0
  1083.     Exch
  1084.     Exch 2
  1085.     Exch $R0
  1086.     Exch 2
  1087.     Push $2
  1088.     Push $3
  1089.     Push $4
  1090.     Push $5
  1091.     Push $6
  1092.     Push $7
  1093.     Push $R1
  1094.     ClearErrors
  1095.  
  1096.     StrCpy $7 ''
  1097.     StrCpy $2 $1 1
  1098.     StrCmp $2 'E' 0 +4
  1099.     StrCpy $7 E
  1100.     StrCpy $1 $1 '' 1
  1101.     goto -4
  1102.  
  1103.     StrCpy $5 0
  1104.     StrCpy $R1 $R0
  1105.     StrCpy $2 $1 '' 1
  1106.     StrCpy $1 $1 1
  1107.     StrCmp${_WORDFUNC_S} $1 '+' +2
  1108.     StrCmp${_WORDFUNC_S} $1 '-' 0 WordFunc_WordAdd${_WORDFUNC_S}_error3
  1109.  
  1110.     StrCmp${_WORDFUNC_S} $0 '' WordFunc_WordAdd${_WORDFUNC_S}_error1
  1111.     StrCmp${_WORDFUNC_S} $2 '' WordFunc_WordAdd${_WORDFUNC_S}_end
  1112.     StrCmp${_WORDFUNC_S} $R0 '' 0 +5
  1113.     StrCmp${_WORDFUNC_S} $1 '-' WordFunc_WordAdd${_WORDFUNC_S}_end
  1114.     StrCmp${_WORDFUNC_S} $1 '+' 0 +3
  1115.     StrCpy $R0 $2
  1116.     goto WordFunc_WordAdd${_WORDFUNC_S}_end
  1117.  
  1118.     WordFunc_WordAdd${_WORDFUNC_S}_loop:
  1119.     IntOp $5 $5 + 1
  1120.     !insertmacro WordFind${_WORDFUNC_S}Call 2 $2 $0 E+$5 $3
  1121.     IfErrors 0 WordFunc_WordAdd${_WORDFUNC_S}_/word
  1122.     StrCmp${_WORDFUNC_S} $3 2 +4
  1123.     StrCmp${_WORDFUNC_S} $3$5 11 0 +3
  1124.     StrCpy $3 $2
  1125.     goto WordFunc_WordAdd${_WORDFUNC_S}_/word
  1126.     StrCmp${_WORDFUNC_S} $1 '-' WordFunc_WordAdd${_WORDFUNC_S}_end WordFunc_WordAdd${_WORDFUNC_S}_preend
  1127.  
  1128.     WordFunc_WordAdd${_WORDFUNC_S}_/word:
  1129.     !insertmacro WordFind${_WORDFUNC_S}Call 2 $R0 $0 E/$3 $4
  1130.     IfErrors +2
  1131.     StrCmp${_WORDFUNC_S} $1 '-' WordFunc_WordAdd${_WORDFUNC_S}_delete WordFunc_WordAdd${_WORDFUNC_S}_loop
  1132.     StrCmp${_WORDFUNC_S} $1$4 '-1' +2
  1133.     StrCmp${_WORDFUNC_S} $1 '-' WordFunc_WordAdd${_WORDFUNC_S}_loop +4
  1134.     StrCmp${_WORDFUNC_S} $R0 $3 0 WordFunc_WordAdd${_WORDFUNC_S}_loop
  1135.     StrCpy $R0 ''
  1136.     goto WordFunc_WordAdd${_WORDFUNC_S}_end
  1137.     StrCmp${_WORDFUNC_S} $1$4 '+1' 0 +2
  1138.     StrCmp${_WORDFUNC_S} $R0 $3 WordFunc_WordAdd${_WORDFUNC_S}_loop
  1139.     StrCmp${_WORDFUNC_S} $R0 $R1 +3
  1140.     StrCpy $R1 '$R1$0$3'
  1141.     goto WordFunc_WordAdd${_WORDFUNC_S}_loop
  1142.     StrLen $6 $0
  1143.     StrCpy $6 $R0 '' -$6
  1144.     StrCmp${_WORDFUNC_S} $6 $0 0 -4
  1145.     StrCpy $R1 '$R1$3'
  1146.     goto WordFunc_WordAdd${_WORDFUNC_S}_loop
  1147.  
  1148.     WordFunc_WordAdd${_WORDFUNC_S}_delete:
  1149.     !insertmacro WordFind${_WORDFUNC_S}Call 2 $R0 $0 E+$4{} $R0
  1150.     goto WordFunc_WordAdd${_WORDFUNC_S}_/word
  1151.  
  1152.     WordFunc_WordAdd${_WORDFUNC_S}_error3:
  1153.     StrCpy $R1 3
  1154.     goto WordFunc_WordAdd${_WORDFUNC_S}_error
  1155.     WordFunc_WordAdd${_WORDFUNC_S}_error1:
  1156.     StrCpy $R1 1
  1157.     WordFunc_WordAdd${_WORDFUNC_S}_error:
  1158.     StrCmp $7 'E' 0 WordFunc_WordAdd${_WORDFUNC_S}_end
  1159.     SetErrors
  1160.  
  1161.     WordFunc_WordAdd${_WORDFUNC_S}_preend:
  1162.     StrCpy $R0 $R1
  1163.  
  1164.     WordFunc_WordAdd${_WORDFUNC_S}_end:
  1165.     Pop $R1
  1166.     Pop $7
  1167.     Pop $6
  1168.     Pop $5
  1169.     Pop $4
  1170.     Pop $3
  1171.     Pop $2
  1172.     Pop $1
  1173.     Pop $0
  1174.     Exch $R0
  1175. !macroend
  1176.  
  1177. !define WordAdd `!insertmacro WordAddCall`
  1178. !define un.WordAdd `!insertmacro WordAddCall`
  1179.  
  1180. !macro WordAdd
  1181. !macroend
  1182.  
  1183. !macro un.WordAdd
  1184. !macroend
  1185.  
  1186. !macro WordAdd_
  1187.     !verbose push
  1188.     !verbose ${_WORDFUNC_VERBOSE}
  1189.  
  1190.     !insertmacro WordAddBody ''
  1191.  
  1192.     !verbose pop
  1193. !macroend
  1194.  
  1195. !define WordAddS `!insertmacro WordAddSCall`
  1196. !define un.WordAddS `!insertmacro WordAddSCall`
  1197.  
  1198. !macro WordAddS
  1199. !macroend
  1200.  
  1201. !macro un.WordAddS
  1202. !macroend
  1203.  
  1204. !macro WordAddS_
  1205.     !verbose push
  1206.     !verbose ${_WORDFUNC_VERBOSE}
  1207.  
  1208.     !insertmacro WordAddBody 'S'
  1209.  
  1210.     !verbose pop
  1211. !macroend
  1212.  
  1213. !macro WordInsertBody _WORDFUNC_S
  1214.     Exch $2
  1215.     Exch
  1216.     Exch $1
  1217.     Exch
  1218.     Exch 2
  1219.     Exch $0
  1220.     Exch 2
  1221.     Exch 3
  1222.     Exch $R0
  1223.     Exch 3
  1224.     Push $3
  1225.     Push $4
  1226.     Push $5
  1227.     Push $6
  1228.     Push $7
  1229.     Push $8
  1230.     Push $9
  1231.     Push $R1
  1232.     ClearErrors
  1233.  
  1234.     StrCpy $5 ''
  1235.     StrCpy $6 $0
  1236.     StrCpy $7 }
  1237.  
  1238.     StrCpy $9 ''
  1239.     StrCpy $R1 $R0
  1240.     StrCpy $3 $2 1
  1241.     StrCpy $2 $2 '' 1
  1242.     StrCmp $3 'E' 0 +3
  1243.     StrCpy $9 'E'
  1244.     goto -4
  1245.  
  1246.     StrCmp${_WORDFUNC_S} $3 '+' +2
  1247.     StrCmp${_WORDFUNC_S} $3 '-' 0 WordFunc_WordInsert${_WORDFUNC_S}_error3
  1248.     IntOp $2 $2 + 0
  1249.     StrCmp${_WORDFUNC_S} $2 0 WordFunc_WordInsert${_WORDFUNC_S}_error2
  1250.     StrCmp${_WORDFUNC_S} $0 '' WordFunc_WordInsert${_WORDFUNC_S}_error1
  1251.  
  1252.     StrCmp${_WORDFUNC_S} $2 1 0 WordFunc_WordInsert${_WORDFUNC_S}_two
  1253.     GetLabelAddress $8 WordFunc_WordInsert${_WORDFUNC_S}_oneback
  1254.     StrCmp${_WORDFUNC_S} $3 '+' WordFunc_WordInsert${_WORDFUNC_S}_call
  1255.     StrCpy $7 {
  1256.     goto WordFunc_WordInsert${_WORDFUNC_S}_call
  1257.     WordFunc_WordInsert${_WORDFUNC_S}_oneback:
  1258.     IfErrors 0 +2
  1259.     StrCpy $4 $R0
  1260.     StrCmp${_WORDFUNC_S} $3 '+' 0 +3
  1261.     StrCpy $R0 '$1$0$4'
  1262.     goto WordFunc_WordInsert${_WORDFUNC_S}_end
  1263.     StrCpy $R0 '$4$0$1'
  1264.     goto WordFunc_WordInsert${_WORDFUNC_S}_end
  1265.  
  1266.     WordFunc_WordInsert${_WORDFUNC_S}_two:
  1267.     IntOp $2 $2 - 1
  1268.     GetLabelAddress $8 WordFunc_WordInsert${_WORDFUNC_S}_twoback
  1269.     StrCmp${_WORDFUNC_S} $3 '+' 0 WordFunc_WordInsert${_WORDFUNC_S}_call
  1270.     StrCpy $7 {
  1271.     goto WordFunc_WordInsert${_WORDFUNC_S}_call
  1272.     WordFunc_WordInsert${_WORDFUNC_S}_twoback:
  1273.     IfErrors 0 WordFunc_WordInsert${_WORDFUNC_S}_tree
  1274.     StrCmp${_WORDFUNC_S} $2$4 11 0 WordFunc_WordInsert${_WORDFUNC_S}_error2
  1275.     StrCmp${_WORDFUNC_S} $3 '+' 0 +3
  1276.     StrCpy $R0 '$R0$0$1'
  1277.     goto WordFunc_WordInsert${_WORDFUNC_S}_end
  1278.     StrCpy $R0 '$1$0$R0'
  1279.     goto WordFunc_WordInsert${_WORDFUNC_S}_end
  1280.  
  1281.     WordFunc_WordInsert${_WORDFUNC_S}_tree:
  1282.     StrCpy $7 }
  1283.     StrCpy $5 $4
  1284.     IntOp $2 $2 + 1
  1285.     GetLabelAddress $8 WordFunc_WordInsert${_WORDFUNC_S}_treeback
  1286.     StrCmp${_WORDFUNC_S} $3 '+' WordFunc_WordInsert${_WORDFUNC_S}_call
  1287.     StrCpy $7 {
  1288.     goto WordFunc_WordInsert${_WORDFUNC_S}_call
  1289.     WordFunc_WordInsert${_WORDFUNC_S}_treeback:
  1290.     IfErrors 0 +3
  1291.     StrCpy $4 ''
  1292.     StrCpy $6 ''
  1293.     StrCmp${_WORDFUNC_S} $3 '+' 0 +3
  1294.     StrCpy $R0 '$5$0$1$6$4'
  1295.     goto WordFunc_WordInsert${_WORDFUNC_S}_end
  1296.     StrCpy $R0 '$4$6$1$0$5'
  1297.     goto WordFunc_WordInsert${_WORDFUNC_S}_end
  1298.  
  1299.     WordFunc_WordInsert${_WORDFUNC_S}_call:
  1300.     !insertmacro WordFind${_WORDFUNC_S}Call 2 $R0 $0 E$3$2*$7 $4
  1301.     goto $8
  1302.  
  1303.     WordFunc_WordInsert${_WORDFUNC_S}_error3:
  1304.     StrCpy $R0 3
  1305.     goto WordFunc_WordInsert${_WORDFUNC_S}_error
  1306.     WordFunc_WordInsert${_WORDFUNC_S}_error2:
  1307.     StrCpy $R0 2
  1308.     goto WordFunc_WordInsert${_WORDFUNC_S}_error
  1309.     WordFunc_WordInsert${_WORDFUNC_S}_error1:
  1310.     StrCpy $R0 1
  1311.     WordFunc_WordInsert${_WORDFUNC_S}_error:
  1312.     StrCmp $9 'E' +3
  1313.     StrCpy $R0 $R1
  1314.     goto +2
  1315.     SetErrors
  1316.  
  1317.     WordFunc_WordInsert${_WORDFUNC_S}_end:
  1318.     Pop $R1
  1319.     Pop $9
  1320.     Pop $8
  1321.     Pop $7
  1322.     Pop $6
  1323.     Pop $5
  1324.     Pop $4
  1325.     Pop $3
  1326.     Pop $2
  1327.     Pop $1
  1328.     Pop $0
  1329.     Exch $R0
  1330. !macroend
  1331.  
  1332. !define WordInsert `!insertmacro WordInsertCall`
  1333. !define un.WordInsert `!insertmacro WordInsertCall`
  1334.  
  1335. !macro WordInsert
  1336. !macroend
  1337.  
  1338. !macro un.WordInsert
  1339. !macroend
  1340.  
  1341. !macro WordInsert_
  1342.     !verbose push
  1343.     !verbose ${_WORDFUNC_VERBOSE}
  1344.  
  1345.     !insertmacro WordInsertBody ''
  1346.  
  1347.     !verbose pop
  1348. !macroend
  1349.  
  1350.  
  1351. !define WordInsertS `!insertmacro WordInsertSCall`
  1352. !define un.WordInsertS `!insertmacro WordInsertSCall`
  1353.  
  1354. !macro WordInsertS
  1355. !macroend
  1356.  
  1357. !macro un.WordInsertS
  1358. !macroend
  1359.  
  1360. !macro WordInsertS_
  1361.     !verbose push
  1362.     !verbose ${_WORDFUNC_VERBOSE}
  1363.  
  1364.     !insertmacro WordInsertBody 'S'
  1365.  
  1366.     !verbose pop
  1367. !macroend
  1368.  
  1369. !macro StrFilterBody _WORDFUNC_S
  1370.     Exch $2
  1371.     Exch
  1372.     Exch $1
  1373.     Exch
  1374.     Exch 2
  1375.     Exch $0
  1376.     Exch 2
  1377.     Exch 3
  1378.     Exch $R0
  1379.     Exch 3
  1380.     Push $3
  1381.     Push $4
  1382.     Push $5
  1383.     Push $6
  1384.     Push $7
  1385.     Push $R1
  1386.     Push $R2
  1387.     Push $R3
  1388.     Push $R4
  1389.     Push $R5
  1390.     Push $R6
  1391.     Push $R7
  1392.     Push $R8
  1393.     ClearErrors
  1394.  
  1395.     StrCpy $R2 $0 '' -3
  1396.     StrCmp $R2 "eng" WordFunc_StrFilter${_WORDFUNC_S}_eng
  1397.     StrCmp $R2 "rus" WordFunc_StrFilter${_WORDFUNC_S}_rus
  1398.     WordFunc_StrFilter${_WORDFUNC_S}_eng:
  1399.     StrCpy $4 65
  1400.     StrCpy $5 90
  1401.     StrCpy $6 97
  1402.     StrCpy $7 122
  1403.     goto WordFunc_StrFilter${_WORDFUNC_S}_langend
  1404.     WordFunc_StrFilter${_WORDFUNC_S}_rus:
  1405.     StrCpy $4 192
  1406.     StrCpy $5 223
  1407.     StrCpy $6 224
  1408.     StrCpy $7 255
  1409.     goto WordFunc_StrFilter${_WORDFUNC_S}_langend
  1410.     ;...
  1411.  
  1412.     WordFunc_StrFilter${_WORDFUNC_S}_langend:
  1413.     StrCpy $R7 ''
  1414.     StrCpy $R8 ''
  1415.  
  1416.     StrCmp${_WORDFUNC_S} $2 '' 0 WordFunc_StrFilter${_WORDFUNC_S}_begin
  1417.  
  1418.     WordFunc_StrFilter${_WORDFUNC_S}_restart1:
  1419.     StrCpy $2 ''
  1420.     StrCpy $3 $0 1
  1421.     StrCmp${_WORDFUNC_S} $3 '+' +2
  1422.     StrCmp${_WORDFUNC_S} $3 '-' 0 +3
  1423.     StrCpy $0 $0 '' 1
  1424.     goto +2
  1425.     StrCpy $3 ''
  1426.  
  1427.     IntOp $0 $0 + 0
  1428.     StrCmp${_WORDFUNC_S} $0 0 +5
  1429.     StrCpy $R7 $0 1 0
  1430.     StrCpy $R8 $0 1 1
  1431.     StrCpy $R2 $0 1 2
  1432.     StrCmp${_WORDFUNC_S} $R2 '' WordFunc_StrFilter${_WORDFUNC_S}_filter WordFunc_StrFilter${_WORDFUNC_S}_error
  1433.  
  1434.     WordFunc_StrFilter${_WORDFUNC_S}_restart2:
  1435.     StrCmp${_WORDFUNC_S} $3 '' WordFunc_StrFilter${_WORDFUNC_S}_end
  1436.     StrCpy $R7 ''
  1437.     StrCpy $R8 '+-'
  1438.     goto WordFunc_StrFilter${_WORDFUNC_S}_begin
  1439.  
  1440.     WordFunc_StrFilter${_WORDFUNC_S}_filter:
  1441.     StrCmp${_WORDFUNC_S} $R7 '1' +3
  1442.     StrCmp${_WORDFUNC_S} $R7 '2' +2
  1443.     StrCmp${_WORDFUNC_S} $R7 '3' 0 WordFunc_StrFilter${_WORDFUNC_S}_error
  1444.  
  1445.     StrCmp${_WORDFUNC_S} $R8 '' WordFunc_StrFilter${_WORDFUNC_S}_begin
  1446.     StrCmp${_WORDFUNC_S} $R7$R8 '23' +2
  1447.     StrCmp${_WORDFUNC_S} $R7$R8 '32' 0 +3
  1448.     StrCpy $R7 -1
  1449.     goto WordFunc_StrFilter${_WORDFUNC_S}_begin
  1450.     StrCmp${_WORDFUNC_S} $R7$R8 '13' +2
  1451.     StrCmp${_WORDFUNC_S} $R7$R8 '31' 0 +3
  1452.     StrCpy $R7 -2
  1453.     goto WordFunc_StrFilter${_WORDFUNC_S}_begin
  1454.     StrCmp${_WORDFUNC_S} $R7$R8 '12' +2
  1455.     StrCmp${_WORDFUNC_S} $R7$R8 '21' 0 WordFunc_StrFilter${_WORDFUNC_S}_error
  1456.     StrCpy $R7 -3
  1457.  
  1458.     WordFunc_StrFilter${_WORDFUNC_S}_begin:
  1459.     StrCpy $R6 0
  1460.     StrCpy $R1 ''
  1461.  
  1462.     WordFunc_StrFilter${_WORDFUNC_S}_loop:
  1463.     StrCpy $R2 $R0 1 $R6
  1464.     StrCmp${_WORDFUNC_S} $R2 '' WordFunc_StrFilter${_WORDFUNC_S}_restartchk
  1465.  
  1466.     StrCmp${_WORDFUNC_S} $2 '' +7
  1467.     StrCpy $R4 0
  1468.     StrCpy $R5 $2 1 $R4
  1469.     StrCmp${_WORDFUNC_S} $R5 '' WordFunc_StrFilter${_WORDFUNC_S}_addsymbol
  1470.     StrCmp${_WORDFUNC_S} $R5 $R2 WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol
  1471.     IntOp $R4 $R4 + 1
  1472.     goto -4
  1473.  
  1474.     StrCmp${_WORDFUNC_S} $1 '' +7
  1475.     StrCpy $R4 0
  1476.     StrCpy $R5 $1 1 $R4
  1477.     StrCmp${_WORDFUNC_S} $R5 '' +4
  1478.     StrCmp${_WORDFUNC_S} $R5 $R2 WordFunc_StrFilter${_WORDFUNC_S}_addsymbol
  1479.     IntOp $R4 $R4 + 1
  1480.     goto -4
  1481.  
  1482.     StrCmp${_WORDFUNC_S} $R7 '1' +2
  1483.     StrCmp${_WORDFUNC_S} $R7 '-1' 0 +4
  1484.     StrCpy $R4 48
  1485.     StrCpy $R5 57
  1486.     goto WordFunc_StrFilter${_WORDFUNC_S}_loop2
  1487.     StrCmp${_WORDFUNC_S} $R8 '+-' 0 +2
  1488.     StrCmp${_WORDFUNC_S} $3 '+' 0 +4
  1489.     StrCpy $R4 $4
  1490.     StrCpy $R5 $5
  1491.     goto WordFunc_StrFilter${_WORDFUNC_S}_loop2
  1492.     StrCpy $R4 $6
  1493.     StrCpy $R5 $7
  1494.  
  1495.     WordFunc_StrFilter${_WORDFUNC_S}_loop2:
  1496.     IntFmt $R3 '%c' $R4
  1497.     StrCmp $R2 $R3 WordFunc_StrFilter${_WORDFUNC_S}_found
  1498.     StrCmp $R4 $R5 WordFunc_StrFilter${_WORDFUNC_S}_notfound
  1499.     IntOp $R4 $R4 + 1
  1500.     goto WordFunc_StrFilter${_WORDFUNC_S}_loop2
  1501.  
  1502.     WordFunc_StrFilter${_WORDFUNC_S}_found:
  1503.     StrCmp${_WORDFUNC_S} $R8 '+-' WordFunc_StrFilter${_WORDFUNC_S}_setcase
  1504.     StrCmp${_WORDFUNC_S} $R7 '3' WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol
  1505.     StrCmp${_WORDFUNC_S} $R7 '-3' WordFunc_StrFilter${_WORDFUNC_S}_addsymbol
  1506.     StrCmp${_WORDFUNC_S} $R8 '' WordFunc_StrFilter${_WORDFUNC_S}_addsymbol WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol
  1507.  
  1508.     WordFunc_StrFilter${_WORDFUNC_S}_notfound:
  1509.     StrCmp${_WORDFUNC_S} $R8 '+-' WordFunc_StrFilter${_WORDFUNC_S}_addsymbol
  1510.     StrCmp${_WORDFUNC_S} $R7 '3' 0 +2
  1511.     StrCmp${_WORDFUNC_S} $R5 57 WordFunc_StrFilter${_WORDFUNC_S}_addsymbol +3
  1512.     StrCmp${_WORDFUNC_S} $R7 '-3' 0 +5
  1513.     StrCmp${_WORDFUNC_S} $R5 57 WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol
  1514.     StrCpy $R4 48
  1515.     StrCpy $R5 57
  1516.     goto WordFunc_StrFilter${_WORDFUNC_S}_loop2
  1517.     StrCmp${_WORDFUNC_S} $R8 '' WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol WordFunc_StrFilter${_WORDFUNC_S}_addsymbol
  1518.  
  1519.     WordFunc_StrFilter${_WORDFUNC_S}_setcase:
  1520.     StrCpy $R2 $R3
  1521.     WordFunc_StrFilter${_WORDFUNC_S}_addsymbol:
  1522.     StrCpy $R1 $R1$R2
  1523.     WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol:
  1524.     IntOp $R6 $R6 + 1
  1525.     goto WordFunc_StrFilter${_WORDFUNC_S}_loop
  1526.  
  1527.     WordFunc_StrFilter${_WORDFUNC_S}_error:
  1528.     SetErrors
  1529.     StrCpy $R0 ''
  1530.     goto WordFunc_StrFilter${_WORDFUNC_S}_end
  1531.  
  1532.     WordFunc_StrFilter${_WORDFUNC_S}_restartchk:
  1533.     StrCpy $R0 $R1
  1534.     StrCmp${_WORDFUNC_S} $2 '' 0 WordFunc_StrFilter${_WORDFUNC_S}_restart1
  1535.     StrCmp${_WORDFUNC_S} $R8 '+-' 0 WordFunc_StrFilter${_WORDFUNC_S}_restart2
  1536.  
  1537.     WordFunc_StrFilter${_WORDFUNC_S}_end:
  1538.     Pop $R8
  1539.     Pop $R7
  1540.     Pop $R6
  1541.     Pop $R5
  1542.     Pop $R4
  1543.     Pop $R3
  1544.     Pop $R2
  1545.     Pop $R1
  1546.     Pop $7
  1547.     Pop $6
  1548.     Pop $5
  1549.     Pop $4
  1550.     Pop $3
  1551.     Pop $2
  1552.     Pop $1
  1553.     Pop $0
  1554.     Exch $R0
  1555. !macroend
  1556.  
  1557. !define StrFilter `!insertmacro StrFilterCall`
  1558. !define un.StrFilter `!insertmacro StrFilterCall`
  1559.  
  1560. !macro StrFilter
  1561. !macroend
  1562.  
  1563. !macro un.StrFilter
  1564. !macroend
  1565.  
  1566. !macro StrFilter_
  1567.     !verbose push
  1568.     !verbose ${_WORDFUNC_VERBOSE}
  1569.  
  1570.     !insertmacro StrFilterBody ''
  1571.  
  1572.     !verbose pop
  1573. !macroend
  1574.  
  1575.  
  1576. !define StrFilterS `!insertmacro StrFilterSCall`
  1577. !define un.StrFilterS `!insertmacro StrFilterSCall`
  1578.  
  1579. !macro StrFilterS
  1580. !macroend
  1581.  
  1582. !macro un.StrFilterS
  1583. !macroend
  1584.  
  1585. !macro StrFilterS_
  1586.     !verbose push
  1587.     !verbose ${_WORDFUNC_VERBOSE}
  1588.  
  1589.     !insertmacro StrFilterBody 'S'
  1590.  
  1591.     !verbose pop
  1592. !macroend
  1593.  
  1594. !define VersionCompare `!insertmacro VersionCompareCall`
  1595. !define un.VersionCompare `!insertmacro VersionCompareCall`
  1596.  
  1597. !macro VersionCompare
  1598. !macroend
  1599.  
  1600. !macro un.VersionCompare
  1601. !macroend
  1602.  
  1603. !macro VersionCompare_
  1604.     !verbose push
  1605.     !verbose ${_WORDFUNC_VERBOSE}
  1606.  
  1607.     Exch $1
  1608.     Exch
  1609.     Exch $0
  1610.     Exch
  1611.     Push $2
  1612.     Push $3
  1613.     Push $4
  1614.     Push $5
  1615.     Push $6
  1616.     Push $7
  1617.  
  1618.     WordFunc_VersionCompare_begin:
  1619.     StrCpy $2 -1
  1620.     IntOp $2 $2 + 1
  1621.     StrCpy $3 $0 1 $2
  1622.     StrCmp $3 '' +2
  1623.     StrCmp $3 '.' 0 -3
  1624.     StrCpy $4 $0 $2
  1625.     IntOp $2 $2 + 1
  1626.     StrCpy $0 $0 '' $2
  1627.  
  1628.     StrCpy $2 -1
  1629.     IntOp $2 $2 + 1
  1630.     StrCpy $3 $1 1 $2
  1631.     StrCmp $3 '' +2
  1632.     StrCmp $3 '.' 0 -3
  1633.     StrCpy $5 $1 $2
  1634.     IntOp $2 $2 + 1
  1635.     StrCpy $1 $1 '' $2
  1636.  
  1637.     StrCmp $4$5 '' WordFunc_VersionCompare_equal
  1638.  
  1639.     StrCpy $6 -1
  1640.     IntOp $6 $6 + 1
  1641.     StrCpy $3 $4 1 $6
  1642.     StrCmp $3 '0' -2
  1643.     StrCmp $3 '' 0 +2
  1644.     StrCpy $4 0
  1645.  
  1646.     StrCpy $7 -1
  1647.     IntOp $7 $7 + 1
  1648.     StrCpy $3 $5 1 $7
  1649.     StrCmp $3 '0' -2
  1650.     StrCmp $3 '' 0 +2
  1651.     StrCpy $5 0
  1652.  
  1653.     StrCmp $4 0 0 +2
  1654.     StrCmp $5 0 WordFunc_VersionCompare_begin WordFunc_VersionCompare_newer2
  1655.     StrCmp $5 0 WordFunc_VersionCompare_newer1
  1656.     IntCmp $6 $7 0 WordFunc_VersionCompare_newer1 WordFunc_VersionCompare_newer2
  1657.  
  1658.     StrCpy $4 '1$4'
  1659.     StrCpy $5 '1$5'
  1660.     IntCmp $4 $5 WordFunc_VersionCompare_begin WordFunc_VersionCompare_newer2 WordFunc_VersionCompare_newer1
  1661.  
  1662.     WordFunc_VersionCompare_equal:
  1663.     StrCpy $0 0
  1664.     goto WordFunc_VersionCompare_end
  1665.     WordFunc_VersionCompare_newer1:
  1666.     StrCpy $0 1
  1667.     goto WordFunc_VersionCompare_end
  1668.     WordFunc_VersionCompare_newer2:
  1669.     StrCpy $0 2
  1670.  
  1671.     WordFunc_VersionCompare_end:
  1672.     Pop $7
  1673.     Pop $6
  1674.     Pop $5
  1675.     Pop $4
  1676.     Pop $3
  1677.     Pop $2
  1678.     Pop $1
  1679.     Exch $0
  1680.  
  1681.     !verbose pop
  1682. !macroend
  1683.  
  1684. !define VersionConvert `!insertmacro VersionConvertCall`
  1685. !define un.VersionConvert `!insertmacro VersionConvertCall`
  1686.  
  1687. !macro VersionConvert
  1688. !macroend
  1689.  
  1690. !macro un.VersionConvert
  1691. !macroend
  1692.  
  1693. !macro VersionConvert_
  1694.     !verbose push
  1695.     !verbose ${_WORDFUNC_VERBOSE}
  1696.  
  1697.     Exch $1
  1698.     Exch
  1699.     Exch $0
  1700.     Exch
  1701.     Push $2
  1702.     Push $3
  1703.     Push $4
  1704.     Push $5
  1705.     Push $6
  1706.     Push $7
  1707.  
  1708.     StrCmp $1 '' 0 +2
  1709.     StrCpy $1 'abcdefghijklmnopqrstuvwxyz'
  1710.     StrCpy $1 $1 99
  1711.  
  1712.     StrCpy $2 0
  1713.     StrCpy $7 'dot'
  1714.     goto WordFunc_VersionConvert_loop
  1715.  
  1716.     WordFunc_VersionConvert_preloop:
  1717.     IntOp $2 $2 + 1
  1718.  
  1719.     WordFunc_VersionConvert_loop:
  1720.     StrCpy $3 $0 1 $2
  1721.     StrCmp $3 '' WordFunc_VersionConvert_endcheck
  1722.     StrCmp $3 '.' WordFunc_VersionConvert_dot
  1723.     StrCmp $3 '0' WordFunc_VersionConvert_digit
  1724.     IntCmp $3 '0' WordFunc_VersionConvert_letter WordFunc_VersionConvert_letter WordFunc_VersionConvert_digit
  1725.  
  1726.     WordFunc_VersionConvert_dot:
  1727.     StrCmp $7 'dot' WordFunc_VersionConvert_replacespecial
  1728.     StrCpy $7 'dot'
  1729.     goto WordFunc_VersionConvert_preloop
  1730.  
  1731.     WordFunc_VersionConvert_digit:
  1732.     StrCmp $7 'letter' WordFunc_VersionConvert_insertdot
  1733.     StrCpy $7 'digit'
  1734.     goto WordFunc_VersionConvert_preloop
  1735.  
  1736.     WordFunc_VersionConvert_letter:
  1737.     StrCpy $5 0
  1738.     StrCpy $4 $1 1 $5
  1739.     IntOp $5 $5 + 1
  1740.     StrCmp $4 '' WordFunc_VersionConvert_replacespecial
  1741.     StrCmp $4 $3 0 -3
  1742.     IntCmp $5 9 0 0 +2
  1743.     StrCpy $5 '0$5'
  1744.  
  1745.     StrCmp $7 'letter' +2
  1746.     StrCmp $7 'dot' 0 +3
  1747.     StrCpy $6 ''
  1748.     goto +2
  1749.     StrCpy $6 '.'
  1750.  
  1751.     StrCpy $4 $0 $2
  1752.     IntOp $2 $2 + 1
  1753.     StrCpy $0 $0 '' $2
  1754.     StrCpy $0 '$4$6$5$0'
  1755.     StrLen $4 '$6$5'
  1756.     IntOp $2 $2 + $4
  1757.     IntOp $2 $2 - 1
  1758.     StrCpy $7 'letter'
  1759.     goto WordFunc_VersionConvert_loop
  1760.  
  1761.     WordFunc_VersionConvert_replacespecial:
  1762.     StrCmp $7 'dot' 0 +3
  1763.     StrCpy $6 ''
  1764.     goto +2
  1765.     StrCpy $6 '.'
  1766.  
  1767.     StrCpy $4 $0 $2
  1768.     IntOp $2 $2 + 1
  1769.     StrCpy $0 $0 '' $2
  1770.     StrCpy $0 '$4$6$0'
  1771.     StrLen $4 $6
  1772.     IntOp $2 $2 + $4
  1773.     IntOp $2 $2 - 1
  1774.     StrCpy $7 'dot'
  1775.     goto WordFunc_VersionConvert_loop
  1776.  
  1777.     WordFunc_VersionConvert_insertdot:
  1778.     StrCpy $4 $0 $2
  1779.     StrCpy $0 $0 '' $2
  1780.     StrCpy $0 '$4.$0'
  1781.     StrCpy $7 'dot'
  1782.     goto WordFunc_VersionConvert_preloop
  1783.  
  1784.     WordFunc_VersionConvert_endcheck:
  1785.     StrCpy $4 $0 1 -1
  1786.     StrCmp $4 '.' 0 WordFunc_VersionConvert_end
  1787.     StrCpy $0 $0 -1
  1788.     goto -3
  1789.  
  1790.     WordFunc_VersionConvert_end:
  1791.     Pop $7
  1792.     Pop $6
  1793.     Pop $5
  1794.     Pop $4
  1795.     Pop $3
  1796.     Pop $2
  1797.     Pop $1
  1798.     Exch $0
  1799.  
  1800.     !verbose pop
  1801. !macroend
  1802.  
  1803. !endif
  1804.