bug #4276 fixed: strsubst() replaces all occurences in regex mode. 44/19144/2
Aashay Singhal [Wed, 1 Mar 2017 19:40:44 +0000 (00:40 +0530)]
Updated the test case file also.

Change-Id: I8a39e20a509c7c59452a79354d62d33c92825549

scilab/CHANGES.md
scilab/modules/string/includes/pcre_private.h
scilab/modules/string/src/c/pcre_private.c
scilab/modules/string/src/c/strsubst.c
scilab/modules/string/tests/nonreg_tests/bug_4276.tst [new file with mode: 0644]
scilab/modules/string/tests/unit_tests/strsubst.dia.ref [deleted file]
scilab/modules/string/tests/unit_tests/strsubst.tst

index f7089c6..6063044 100644 (file)
@@ -343,6 +343,7 @@ the [development mailing list](dev@lists.scilab.org) for a particular toolbox.
 
 
 ### Bugs fixed in 6.0.1:
+* [#4276](http://bugzilla.scilab.org/show_bug.cgi?id=4276): `strsubst` replaced the first occurence in regex mode.
 * [#5278](http://bugzilla.scilab.org/show_bug.cgi?id=5278): obsolete `xset()` was still used in scripts, macros, tests and help pages.
 * [#14636](http://bugzilla.scilab.org/show_bug.cgi?id=14636): Xcos model with modelica electrical blocks (created in 5.5.2) crashed Scilab 6.
 * [#14637](http://bugzilla.scilab.org/show_bug.cgi?id=14367): Some Scilab 5.5.2 diagrams didn't simulate properly in Xcos.
index d8d1f23..351439a 100644 (file)
@@ -39,8 +39,8 @@ typedef enum
 } pcre_error_code;
 
 
-STRING_IMPEXP pcre_error_code pcre_private(char *INPUT_LINE, char *INPUT_PAT, int *Output_Start, int *Output_End, char*** _pstCapturedString, int* _piCapturedStringCount);
-STRING_IMPEXP pcre_error_code wide_pcre_private(wchar_t *INPUT_LINE, wchar_t *INPUT_PAT, int *Output_Start, int *Output_End, wchar_t*** _pstCapturedString, int* _piCapturedStringCount);
+STRING_IMPEXP pcre_error_code pcre_private(const char *INPUT_LINE, const char *INPUT_PAT, int *Output_Start, int *Output_End, char*** _pstCapturedString, int* _piCapturedStringCount);
+STRING_IMPEXP pcre_error_code wide_pcre_private(const wchar_t *INPUT_LINE, const wchar_t *INPUT_PAT, int *Output_Start, int *Output_End, wchar_t*** _pstCapturedString, int* _piCapturedStringCount);
 
 #endif /* __PCRE_PRIVATE_H__ */
 /*------------------------------------------------------------------------*/
index 9aa7d99..e6141d7 100644 (file)
@@ -176,7 +176,7 @@ static int check_match_limit(pcre *re, pcre_extra *extra, char *bptr, int len,
 consist of a regular expression, in delimiters and optionally followed by
 options, followed by a set of test data, terminated by an empty line. */
 
-pcre_error_code pcre_private(char *INPUT_LINE, char *INPUT_PAT, int *Output_Start, int *Output_End, char*** _pstCapturedString, int* _piCapturedStringCount)
+pcre_error_code pcre_private(const char *INPUT_LINE, const char *INPUT_PAT, int *Output_Start, int *Output_End, char*** _pstCapturedString, int* _piCapturedStringCount)
 {
     /* ALL strings are managed as UTF-8 by default */
     int options = PCRE_UTF8;
@@ -1157,7 +1157,7 @@ SKIP_DATA:
     return PCRE_EXIT;
 }
 /*-------------------------------------------------------------------------------*/
-pcre_error_code wide_pcre_private(wchar_t* _pwstInput, wchar_t* _pwstPattern, int* _piStart, int* _piEnd, wchar_t*** _pstCapturedString, int* _piCapturedStringCount)
+pcre_error_code wide_pcre_private(const wchar_t* _pwstInput, const wchar_t* _pwstPattern, int* _piStart, int* _piEnd, wchar_t*** _pstCapturedString, int* _piCapturedStringCount)
 {
     pcre_error_code iPcreStatus = PCRE_FINISHED_OK;
     int i               = 0;
index 7cd9b70..9364e35 100644 (file)
@@ -24,6 +24,7 @@
 #include "pcre_private.h"
 #include "os_string.h"
 #include "charEncoding.h"
+#include "pcre_error.h"
 /*--------------------------------------------------------------------------*/
 char **strsubst(const char **strings_input, int strings_dim, const char *string_to_search, const char *replacement_string)
 {
@@ -255,7 +256,11 @@ wchar_t *wcssub_reg(const wchar_t* _pwstInput, const wchar_t* _pwstSearch, const
     pcre_error_code iPcreStatus = PCRE_FINISHED_OK;
     int iStart = 0;
     int iEnd = 0;
-    int iLen = 0;
+    int len = (int)wcslen(_pwstInput);
+    int* arriStart = (int*)MALLOC(sizeof(int) * len);
+    int* arriEnd = (int*)MALLOC(sizeof(int) * len);
+    int iOccurs = 0;
+    int iJump = 0;
 
     wchar_t* pwstOutput = NULL;
 
@@ -269,28 +274,75 @@ wchar_t *wcssub_reg(const wchar_t* _pwstInput, const wchar_t* _pwstSearch, const
         return os_wcsdup(_pwstInput);
     }
 
-    iPcreStatus = wide_pcre_private((wchar_t*)_pwstInput, (wchar_t*)_pwstSearch, &iStart, &iEnd, NULL, NULL);
-    if (iPcreStatus != PCRE_FINISHED_OK)
+    do
     {
-        *_piErr = iPcreStatus;
-        return os_wcsdup(_pwstInput);
-    }
+        iPcreStatus = wide_pcre_private(_pwstInput + iJump, _pwstSearch, &iStart, &iEnd, NULL, NULL);
+        if (iPcreStatus == PCRE_FINISHED_OK)
+        {
+            if (iEnd != iStart)
+            {
+                arriStart[iOccurs] = iStart + iJump;
+                arriEnd[iOccurs++] = iEnd + iJump;
+                iJump += iEnd;
+            }
+            else if (iEnd == 0 && _pwstInput[iJump] != L'\0')
+            {
+                //avoid infinite loop
+                iJump++;
+            }
+        }
+        else if (iPcreStatus != NO_MATCH)
+        {
+            pcre_error("strsubst", iPcreStatus);
+            FREE(arriStart);
+            FREE(arriEnd);
+            return NULL;
+        }
+    } while (iPcreStatus == PCRE_FINISHED_OK && iStart != iEnd);
+
+    if (iOccurs)
+    {
+        int i = 0;
+        int replaceLen = (int)wcslen(_pwstReplace);
+        int finalSize = len;
+        wchar_t* result = NULL;
+        //compute final size
+        for (i = 0; i < iOccurs; ++i)
+        {
+            finalSize -= (arriEnd[i] - arriStart[i]);
+            finalSize += replaceLen;
+        }
 
-    //compute new size of output string
-    iLen += (int)wcslen(_pwstReplace) - (iEnd - iStart);
+        result = (wchar_t*)MALLOC(sizeof(wchar_t) * (finalSize + 1));
+        result[0] = '\0';
 
-    pwstOutput = (wchar_t*)MALLOC(sizeof(wchar_t) * (wcslen(_pwstInput) + iLen + 1));
-    memset(pwstOutput, 0x00, sizeof(wchar_t) * (wcslen(_pwstInput) + iLen + 1));
+        //from start to first occurence
+        wcsncat(result, _pwstInput, arriStart[0]);
+        result[arriStart[0]] = '\0';
 
-    //copy start of original string
-    wcsncpy(pwstOutput, _pwstInput, iStart);
-    //copy replace string
-    wcscpy(pwstOutput + wcslen(pwstOutput), _pwstReplace);
-    //copy end of original string
-    wcscpy(pwstOutput + wcslen(pwstOutput), _pwstInput + iEnd);
+        for (i = 0; i < iOccurs - 1; ++i)
+        {
+            int curLen = (int)wcslen(result);
+            int partLen = arriStart[i + 1] - arriEnd[i];
+            //insert replace string
+            wcscat(result, _pwstReplace);
+            //copy part between 2 occurences
+            wcsncat(result, _pwstInput + arriEnd[i], partLen);
+            result[curLen + replaceLen + partLen] = '\0';
+        }
 
-    *_piErr = iPcreStatus;
-    return pwstOutput;
+        wcscat(result, _pwstReplace);
+        //copy part after last occurence
+        wcscat(result, _pwstInput + arriEnd[iOccurs - 1]);
+        return result;
+    }
+    else
+    {
+        *_piErr = iPcreStatus;
+        return os_wcsdup(_pwstInput);
+    }
+
+    return NULL;
 }
 /*-------------------------------------------------------------------------------------*/
 wchar_t **wcssubst_reg(const wchar_t** _pwstInput, int _iInputSize, const wchar_t* _pwstSearch, const wchar_t* _pwstReplace, int* _piErr)
diff --git a/scilab/modules/string/tests/nonreg_tests/bug_4276.tst b/scilab/modules/string/tests/nonreg_tests/bug_4276.tst
new file mode 100644 (file)
index 0000000..a871c0a
--- /dev/null
@@ -0,0 +1,21 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2017 - ESI - Antoine ELIAS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+
+// <-- Non-regression test for bug 4276 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=4276
+//
+// <-- Short Description -->
+// strsubst replaced the first occurence in regex mode.
+
+assert_checkequal(strsubst('abc012def', '/[a-z]+/', '', 'r'), "012");
+assert_checkequal(strsubst('abc012def', '/[a-z]+/', 'xyz', 'r'), "xyz012xyz");
+assert_checkequal(strsubst('abc012-def456', '/[a-z]+[0-9]+/', 'qrstuvwxyz', 'r'), "qrstuvwxyz-qrstuvwxyz");
diff --git a/scilab/modules/string/tests/unit_tests/strsubst.dia.ref b/scilab/modules/string/tests/unit_tests/strsubst.dia.ref
deleted file mode 100644 (file)
index 67331fd..0000000
+++ /dev/null
@@ -1,392 +0,0 @@
-//======================================================================================== 
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2007-2008 - INRIA
-//
-//  This file is distributed under the same license as the Scilab package.
-//======================================================================================== 
-// <-- CLI SHELL MODE -->
-//======================================================================================== 
-// unit tests strsubst
-//======================================================================================== 
-if strsubst('abc,abd,aa,bxe',',',';')<>'abc;abd;aa;bxe'  then bugmes();quit;end
-//======================================================================================== 
-if strsubst('abc,abd,aa,bxe',',',emptystr())<>'abcabdaabxe'  then bugmes();quit;end
-//======================================================================================== 
-if strsubst(',abc,abd,aa,bxe',',',emptystr())<>'abcabdaabxe'  then bugmes();quit;end
-//======================================================================================== 
-if strsubst('abc',',',';')<>'abc'  then bugmes();quit;end
-//======================================================================================== 
-if strsubst('SCI/demos/scicos','SCI','.') <> './demos/scicos'  then bugmes();quit;end
-//======================================================================================== 
-if strsubst('SCI/demos/scicos','/',' ') <> 'SCI demos scicos'  then bugmes();quit;end
-//======================================================================================== 
-if strsubst([],'/',' ') <> [] then bugmes();quit;end
-//======================================================================================== 
-if strsubst([],' ','') <> [] then bugmes();quit;end
-//======================================================================================== 
-if strsubst('',' ','') <> '' then bugmes();quit;end
-//======================================================================================== 
-if strsubst("2","3","1") <> "2" then bugmes();quit;end
-//======================================================================================== 
-if strsubst(["2","3"],"3","1") <> ['2' '1'] then bugmes();quit;end
-//======================================================================================== 
-r = strsubst(['Scilab','Mathlab';'Octlab','Rlab'],'lab','');
-ref  = ['Sci','Math';'Oct','R'];
-if (r <> ref) then  bugmes();quit;end
-//======================================================================================== 
-if strsubst('xbc','/abc/',' ','r') <>  'xbc'   then bugmes();quit;end
-if strsubst('axc','/abc/',' ','r') <>  'axc'   then bugmes();quit;end
-if strsubst('xaccy','/abc/',' ','r') <>  'xaccy'   then bugmes();quit;end
-if strsubst('abc','/ab*c/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abc','/ab*bc/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abbc','/ab*bc/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abbbbc','/ab*bc/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abbbbc','/.{1}/',' ','r') <>  ' bbbbc'   then bugmes();quit;end
-if strsubst('abbbbc','/.{3,4}/',' ','r') <>  ' bc'   then bugmes();quit;end
-if strsubst('abbbbc','/ab{0,}bc/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('abbc','/ab+bc/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('abc','/ab+bc/','^','r') <>  'abc'   then bugmes();quit;end
-if strsubst('abq','/ab+bc/','^','r') <>  'abq'   then bugmes();quit;end
-if strsubst('abbc','/ab{1,}bc/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('abbbbc','/ab+bc/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('abbbbc','/ab{1,}bc/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('abbc','/ab{1,3}bc/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('abbbbc','/ab{3,4}bc/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('abbbbc','/ab{4,5}bc/','^','r') <>  'abbbbc'   then bugmes();quit;end
-if strsubst('abbc','/ab?bc/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abc','/ab?bc/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abc','/ab{0,1}bc/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('xaccy','/ab?bc/',' ','r') <>  'xaccy'   then bugmes();quit;end
-if strsubst('abc','/ab?c/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abc','/ab{0,1}c/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abbc','/ab*bc/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abc','/^abc$/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abcc','/^abc$/',' ','r') <>  'abcc'   then bugmes();quit;end
-if strsubst('aabc','/^abc&/',' ','r') <>  'aabc'   then bugmes();quit;end
-if strsubst('abbbbc','/ab{0,}bc/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('aabc','/abc$/','^','r') <>  'a^'   then bugmes();quit;end
-if strsubst('abc','/ab+bc/','^','r') <>  'abc'   then bugmes();quit;end
-if strsubst('abq','/ab+bc/','^','r') <>  'abq'   then bugmes();quit;end
-if strsubst('abbc','/ab{1,}bc/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('abbbbc','/ab+bc/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('abbbbc','/ab{1,}bc/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('xy','/\By\b/','^','r') <>  'x^'   then bugmes();quit;end
-if strsubst('xy','/\By\b/','^','r') <>  'x^'   then bugmes();quit;end
-if strsubst('yz','/\by\B/','^','r') <>  '^z'   then bugmes();quit;end
-if strsubst('e','/a|b|c|d|e/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abcdefg','/abcd*efg/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('xaccy','/abc/',' ','r') <>  'xaccy'   then bugmes();quit;end
-if strsubst('xabyabbbz','/ab*/',' ','r') <>  'x yabbbz'   then bugmes();quit;end
-if strsubst('hij','/[abhgefdc]ij/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abcde','/^(ab|cd)e/',' ','r') <>  'abcde'   then bugmes();quit;end
-if strsubst('abbbbc','/ab*bc/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abbbbc','/.{1}/',' ','r') <>  ' bbbbc'   then bugmes();quit;end
-if strsubst('abbbbc','/.{3,4}/',' ','r') <>  ' bc'   then bugmes();quit;end
-if strsubst('effg','/(bc+d$|ef*g.|h?i(j|k))/','^','r') <>  'effg'   then bugmes();quit;end
-if strsubst('aa','/((((((((((a))))))))))\10/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('a!','/((((((((((a))))))))))\041/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('a','/(((((((((a)))))))))/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('multiple words, yeah','/multiple words/','^','r') <>  '^, yeah'   then bugmes();quit;end
-if strsubst('ac','/a[-]?c/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('a','/(a)|\1/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('A-','/a[-b]/i','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('A-','/a[b-]/i','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('A]','/a]/i','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('abbc','/ab?bc/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abc','/ab?bc/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abc','/ab{0,1}bc/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('xaccy','/ab?bc/',' ','r') <>  'xaccy'   then bugmes();quit;end
-if strsubst('abc','/ab?c/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abc','/ab{0,1}c/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abbc','/ab*bc/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abc','/^abc$/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abcc','/^abc$/',' ','r') <>  'abcc'   then bugmes();quit;end
-if strsubst('aabc','/^abc&/',' ','r') <>  'aabc'   then bugmes();quit;end
-if strsubst('abbbbc','/ab{0,}bc/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('aabc','/abc$/','^','r') <>  'a^'   then bugmes();quit;end
-if strsubst('abc','/ab+bc/','^','r') <>  'abc'   then bugmes();quit;end
-if strsubst('abq','/ab+bc/','^','r') <>  'abq'   then bugmes();quit;end
-if strsubst('abbc','/ab{1,}bc/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('abbbbc','/ab+bc/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('abbbbc','/ab{1,}bc/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('xy','/\By\b/','^','r') <>  'x^'   then bugmes();quit;end
-if strsubst('xy','/\By\b/','^','r') <>  'x^'   then bugmes();quit;end
-if strsubst('yz','/\by\B/','^','r') <>  '^z'   then bugmes();quit;end
-if strsubst('e','/a|b|c|d|e/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abcdefg','/abcd*efg/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('xaccy','/abc/',' ','r') <>  'xaccy'   then bugmes();quit;end
-if strsubst('xabyabbbz','/ab*/',' ','r') <>  'x yabbbz'   then bugmes();quit;end
-if strsubst('hij','/[abhgefdc]ij/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abcde','/^(ab|cd)e/',' ','r') <>  'abcde'   then bugmes();quit;end
-if strsubst('abbbbc','/ab*bc/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abbbbc','/.{1}/',' ','r') <>  ' bbbbc'   then bugmes();quit;end
-if strsubst('abbbbc','/.{3,4}/',' ','r') <>  ' bc'   then bugmes();quit;end
-if strsubst('effg','/(bc+d$|ef*g.|h?i(j|k))/','^','r') <>  'effg'   then bugmes();quit;end
-if strsubst('aa','/((((((((((a))))))))))\10/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('a!','/((((((((((a))))))))))\041/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('a','/(((((((((a)))))))))/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('multiple words, yeah','/multiple words/','^','r') <>  '^, yeah'   then bugmes();quit;end
-if strsubst('ac','/a[-]?c/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('a','/(a)|\1/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('A-','/a[-b]/i','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('A-','/a[b-]/i','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('A]','/a]/i','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('abbc','/ab?bc/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abc','/ab?bc/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abc','/ab{0,1}bc/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('xaccy','/ab?bc/',' ','r') <>  'xaccy'   then bugmes();quit;end
-if strsubst('abc','/ab?c/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abc','/ab{0,1}c/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abbc','/ab*bc/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abc','/^abc$/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abcc','/^abc$/',' ','r') <>  'abcc'   then bugmes();quit;end
-if strsubst('aabc','/^abc&/',' ','r') <>  'aabc'   then bugmes();quit;end
-if strsubst('abbbbc','/ab{0,}bc/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('aabc','/abc$/','^','r') <>  'a^'   then bugmes();quit;end
-if strsubst('abc','/ab+bc/','^','r') <>  'abc'   then bugmes();quit;end
-if strsubst('abq','/ab+bc/','^','r') <>  'abq'   then bugmes();quit;end
-if strsubst('abbc','/ab{1,}bc/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('abbbbc','/ab+bc/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('abbbbc','/ab{1,}bc/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('xy','/\By\b/','^','r') <>  'x^'   then bugmes();quit;end
-if strsubst('xy','/\By\b/','^','r') <>  'x^'   then bugmes();quit;end
-if strsubst('yz','/\by\B/','^','r') <>  '^z'   then bugmes();quit;end
-if strsubst('e','/a|b|c|d|e/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abcdefg','/abcd*efg/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('xaccy','/abc/',' ','r') <>  'xaccy'   then bugmes();quit;end
-if strsubst('xabyabbbz','/ab*/',' ','r') <>  'x yabbbz'   then bugmes();quit;end
-if strsubst('hij','/[abhgefdc]ij/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abcde','/^(ab|cd)e/',' ','r') <>  'abcde'   then bugmes();quit;end
-if strsubst('abbbbc','/ab*bc/',' ','r') <>  ' '   then bugmes();quit;end
-if strsubst('abbbbc','/.{1}/',' ','r') <>  ' bbbbc'   then bugmes();quit;end
-if strsubst('abbbbc','/.{3,4}/',' ','r') <>  ' bc'   then bugmes();quit;end
-if strsubst('effg','/(bc+d$|ef*g.|h?i(j|k))/','^','r') <>  'effg'   then bugmes();quit;end
-if strsubst('aa','/((((((((((a))))))))))\10/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('a!','/((((((((((a))))))))))\041/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('a','/(((((((((a)))))))))/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('multiple words, yeah','/multiple words/','^','r') <>  '^, yeah'   then bugmes();quit;end
-if strsubst('ac','/a[-]?c/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('a','/(a)|\1/','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('A-','/a[-b]/i','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('A-','/a[b-]/i','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('A]','/a]/i','^','r') <>  '^'   then bugmes();quit;end
-if strsubst('abc','/abc/',' ','r') <>  ' '   then bugmes();quit;end
-//======================================================================================== 
-if strsubst('......abef','/.*a(?!(b|cd)*e).*f/'                 ,' ' ,'r') <>  '......abef'  then bugmes();quit;end
-if strsubst('fools','/(foo|fool|x.|money|parted)$/'        ,' ' ,'r') <>  'fools'  then bugmes();quit;end
-if strsubst('fools','/(x.|foo|fool|x.|money|parted|y.)$/'  ,' ' ,'r') <>  'fools'  then bugmes();quit;end
-if strsubst('fools','/(foo|fool|money|parted)$/'           ,' ' ,'r') <>  'fools'  then bugmes();quit;end
-if strsubst('Oo','/^(o)(?!.*\1)/i'                      ,' ' ,'r') <>  'Oo'  then bugmes();quit;end
-if strsubst('AbCd','/ab(?i)cd/'                           ,' ' ,'r') <>  'AbCd'  then bugmes();quit;end
-if strsubst('a\nb\n','/a\Z/'                                ,' ' ,'r') <> 'a\nb\n'  then bugmes();quit;end
-if strsubst('a\nb\n','/a\z/'                                ,' ' ,'r') <> 'a\nb\n'  then bugmes();quit;end
-if strsubst('a\nb\n','/a$/'                                 ,' ' ,'r') <>  'a\nb\n' then bugmes();quit;end
-if strsubst('b\na\n','/a\z/'                                ,' ' ,'r') <>  'b\na\n'  then bugmes();quit;end
-if strsubst('a\nb\n','/a\Z/m'                               ,' ' ,'r') <>  'a\nb\n'  then bugmes();quit;end
-if strsubst('a\nb\n','/a\z/m'                               ,' ' ,'r') <> 'a\nb\n'  then bugmes();quit;end
-if strsubst('b\na\n','/a\z/m'                               ,' ' ,'r') <>  'b\na\n'  then bugmes();quit;end
-if strsubst('aa\nb\n','/aa\Z/'                               ,' ' ,'r') <>  'aa\nb\n' then bugmes();quit;end
-if strsubst('aa\nb\n','/aa\z/'                               ,' ' ,'r') <>  'aa\nb\n'  then bugmes();quit;end
-if strsubst('aa\nb\n','/aa$/'                                ,' ' ,'r') <>  'aa\nb\n'  then bugmes();quit;end
-if strsubst('b\naa\n','/aa\z/'                               ,' ' ,'r') <>  'b\naa\n'  then bugmes();quit;end
-if strsubst('aa\nb\n','/aa\Z/m'                              ,' ' ,'r') <>  'aa\nb\n'  then bugmes();quit;end
-if strsubst('aa\nb\n','/aa\z/m'                              ,' ' ,'r') <>  'aa\nb\n'  then bugmes();quit;end
-if strsubst('b\naa\n','/aa\z/m'                              ,' ' ,'r') <>  'b\naa\n'  then bugmes();quit;end
-if strsubst('ac\nb\n','/aa\Z/'                               ,' ' ,'r') <>  'ac\nb\n'  then bugmes();quit;end
-if strsubst('ac\nb\n','/aa\z/'                               ,' ' ,'r') <>  'ac\nb\n'  then bugmes();quit;end
-if strsubst('ac\nb\n','/aa$/'                                ,' ' ,'r') <>  'ac\nb\n'  then bugmes();quit;end
-if strsubst('b\nac\n','/aa\Z/'                               ,' ' ,'r') <>  'b\nac\n'  then bugmes();quit;end
-if strsubst('b\nac\n','/aa\z/'                               ,' ' ,'r') <>  'b\nac\n'  then bugmes();quit;end
-if strsubst('b\nac\n','/aa$/'                                ,' ' ,'r') <>  'b\nac\n'  then bugmes();quit;end
-if strsubst('b\nac'  ,'/aa\Z/'                               ,' ' ,'r') <>  'b\nac'  then bugmes();quit;end
-if strsubst('b\nac'  ,'/aa\z/'                               ,' ' ,'r') <>  'b\nac'  then bugmes();quit;end
-if strsubst('b\nac'  ,'/aa$/'                                ,' ' ,'r') <>  'b\nac'  then bugmes();quit;end
-if strsubst('ac\nb\n','/aa\Z/m'                              ,' ' ,'r') <>  'ac\nb\n'  then bugmes();quit;end
-if strsubst('ac\nb\n','/aa\z/m'                              ,' ' ,'r') <>  'ac\nb\n'  then bugmes();quit;end
-if strsubst('ac\nb\n','/aa$/m'                               ,' ' ,'r') <>  'ac\nb\n'  then bugmes();quit;end
-if strsubst('b\nac\n','/aa\Z/m'                              ,' ' ,'r') <>  'b\nac\n' then bugmes();quit;end
-if strsubst('b\nac\n','/aa\z/m'                              ,' ' ,'r') <>  'b\nac\n'  then bugmes();quit;end
-if strsubst('b\nac\n','/aa$/m'                               ,' ' ,'r') <>  'b\nac\n' then bugmes();quit;end
-if strsubst('b\nac'  ,'/aa\Z/m'                              ,' ' ,'r') <>  'b\nac'  then bugmes();quit;end
-if strsubst('b\nac'  ,'/aa\z/m'                              ,' ' ,'r') <>  'b\nac'  then bugmes();quit;end
-if strsubst('b\nac'  ,'/aa$/m'                               ,' ' ,'r') <>  'b\nac' then bugmes();quit;end
-if strsubst('ca\nb\n','/aa\Z/'                               ,' ' ,'r') <>  'ca\nb\n'  then bugmes();quit;end
-if strsubst('ca\nb\n','/aa\z/'                               ,' ' ,'r') <>  'ca\nb\n'  then bugmes();quit;end
-if strsubst('ca\nb\n','/aa$/'                                ,' ' ,'r') <>  'ca\nb\n'  then bugmes();quit;end
-if strsubst('b\nca\n','/aa\Z/'                               ,' ' ,'r') <>  'b\nca\n'  then bugmes();quit;end
-if strsubst('b\nca\n','/aa\z/'                               ,' ' ,'r') <>  'b\nca\n' then bugmes();quit;end
-if strsubst('b\nca\n','/aa$/'                                ,' ' ,'r') <>  'b\nca\n'  then bugmes();quit;end
-if strsubst('b\nca'  ,'/aa\Z/'                               ,' ' ,'r') <>  'b\nca'   then bugmes();quit;end
-if strsubst('b\nca'  ,'/aa\z/'                               ,' ' ,'r') <> 'b\nca'   then bugmes();quit;end
-if strsubst('b\nca'  ,'/aa$/'                                ,' ' ,'r') <>  'b\nca'  then bugmes();quit;end
-if strsubst('ca\nb\n','/aa\Z/m'                              ,' ' ,'r') <> 'ca\nb\n'  then bugmes();quit;end
-if strsubst('ca\nb\n','/aa\z/m'                              ,' ' ,'r') <>  'ca\nb\n'  then bugmes();quit;end
-if strsubst('ca\nb\n','/aa$/m'                               ,' ' ,'r') <>  'ca\nb\n' then bugmes();quit;end
-if strsubst('b\nca\n','/aa\Z/m'                              ,' ' ,'r') <> 'b\nca\n'  then bugmes();quit;end
-if strsubst('b\nca\n','/aa\z/m'                              ,' ' ,'r') <> 'b\nca\n'  then bugmes();quit;end
-if strsubst('b\nca\n','/aa$/m'                               ,' ' ,'r') <> 'b\nca\n'  then bugmes();quit;end
-if strsubst('b\nca'  ,'/aa\Z/m'                              ,' ' ,'r') <>  'b\nca'  then bugmes();quit;end
-if strsubst('b\nca'  ,'/aa\z/m'                              ,' ' ,'r') <>  'b\nca'   then bugmes();quit;end
-if strsubst('b\nca'  ,'/aa$/m'                               ,' ' ,'r') <>  'b\nca'   then bugmes();quit;end
-if strsubst('ab\nb\n','/ab\Z/'                               ,' ' ,'r') <>  'ab\nb\n'  then bugmes();quit;end
-if strsubst('ab\nb\n','/ab\z/'                               ,' ' ,'r') <>  'ab\nb\n' then bugmes();quit;end
-if strsubst('ab\nb\n','/ab$/'                                ,' ' ,'r') <> 'ab\nb\n'  then bugmes();quit;end
-if strsubst('b\nab\n','/ab\z/'                               ,' ' ,'r') <>  'b\nab\n' then bugmes();quit;end
-if strsubst('ab\nb\n','/ab\Z/m'                              ,' ' ,'r') <>  'ab\nb\n'  then bugmes();quit;end
-if strsubst('ab\nb\n','/ab\z/m'                              ,' ' ,'r') <>  'ab\nb\n'  then bugmes();quit;end
-if strsubst('b\nab\n','/ab\z/m'                              ,' ' ,'r') <> 'b\nab\n'  then bugmes();quit;end
-if strsubst('ac\nb\n','/ab\Z/'                               ,' ' ,'r') <> 'ac\nb\n'  then bugmes();quit;end
-if strsubst('ac\nb\n','/ab\z/'                               ,' ' ,'r') <> 'ac\nb\n' then bugmes();quit;end
-if strsubst('ac\nb\n','/ab$/'                                ,' ' ,'r') <>  'ac\nb\n'  then bugmes();quit;end
-if strsubst('b\nac\n','/ab\Z/'                               ,' ' ,'r') <>  'b\nac\n'  then bugmes();quit;end
-if strsubst('b\nac\n','/ab\z/'                               ,' ' ,'r') <>  'b\nac\n' then bugmes();quit;end
-if strsubst('b\nac\n','/ab$/'                                ,' ' ,'r') <>  'b\nac\n'  then bugmes();quit;end
-if strsubst('b\nac'  ,'/ab\Z/'                               ,' ' ,'r') <>  'b\nac'  then bugmes();quit;end
-if strsubst('b\nac'  ,'/ab\z/'                               ,' ' ,'r') <>  'b\nac' then bugmes();quit;end
-if strsubst('b\nac'  ,'/ab$/'                                ,' ' ,'r') <> 'b\nac' then bugmes();quit;end
-if strsubst('ac\nb\n','/ab\Z/m'                              ,' ' ,'r') <>  'ac\nb\n'  then bugmes();quit;end
-if strsubst('ac\nb\n','/ab\z/m'                              ,' ' ,'r') <> 'ac\nb\n'  then bugmes();quit;end
-if strsubst('ac\nb\n','/ab$/m'                               ,' ' ,'r') <>  'ac\nb\n'  then bugmes();quit;end
-if strsubst('b\nac\n','/ab\Z/m'                              ,' ' ,'r') <> 'b\nac\n'  then bugmes();quit;end
-if strsubst('b\nac\n','/ab\z/m'                              ,' ' ,'r') <> 'b\nac\n' then bugmes();quit;end
-if strsubst('b\nac\n','/ab$/m'                               ,' ' ,'r') <>  'b\nac\n'  then bugmes();quit;end
-if strsubst('b\nac'  ,'/ab\Z/m'                              ,' ' ,'r') <>  'b\nac'   then bugmes();quit;end
-if strsubst('b\nac'  ,'/ab\z/m'                              ,' ' ,'r') <>  'b\nac'  then bugmes();quit;end
-if strsubst('b\nac'  ,'/ab$/m'                               ,' ' ,'r') <>  'b\nac'   then bugmes();quit;end
-if strsubst('ca\nb\n','/ab\Z/'                               ,' ' ,'r') <>  'ca\nb\n' then bugmes();quit;end
-if strsubst('ca\nb\n','/ab\z/'                               ,' ' ,'r') <>  'ca\nb\n'  then bugmes();quit;end
-if strsubst('ca\nb\n','/ab$/'                                ,' ' ,'r') <>  'ca\nb\n'  then bugmes();quit;end
-if strsubst('b\nca\n','/ab\Z/'                               ,' ' ,'r') <>  'b\nca\n'  then bugmes();quit;end
-if strsubst('b\nca\n','/ab\z/'                               ,' ' ,'r') <> 'b\nca\n'  then bugmes();quit;end
-if strsubst('b\nca\n','/ab$/'                                ,' ' ,'r') <>  'b\nca\n'  then bugmes();quit;end
-if strsubst('b\nca'  ,'/ab\Z/'                               ,' ' ,'r') <>  'b\nca'  then bugmes();quit;end
-if strsubst('b\nca'  ,'/ab\z/'                               ,' ' ,'r') <>  'b\nca'  then bugmes();quit;end
-if strsubst('b\nca'  ,'/ab$/'                                ,' ' ,'r') <> 'b\nca'  then bugmes();quit;end
-if strsubst('ca\nb\n','/ab\Z/m'                              ,' ' ,'r') <>  'ca\nb\n'  then bugmes();quit;end
-if strsubst('ca\nb\n','/ab\z/m'                              ,' ' ,'r') <>  'ca\nb\n' then bugmes();quit;end
-if strsubst('ca\nb\n','/ab$/m'                               ,' ' ,'r') <> 'ca\nb\n'  then bugmes();quit;end
-if strsubst('b\nca\n','/ab\Z/m'                              ,' ' ,'r') <> 'b\nca\n' then bugmes();quit;end
-if strsubst('b\nca\n' ,'/ab\z/m'                              ,' ' ,'r') <> 'b\nca\n'  then bugmes();quit;end
-if strsubst('b\nca\n','/ab$/m'                               ,' ' ,'r') <>  'b\nca\n'  then bugmes();quit;end
-if strsubst('b\nca'     ,'/ab\Z/m'                              ,' ' ,'r') <> 'b\nca'   then bugmes();quit;end
-if strsubst('b\nca'     ,'/ab\z/m'                              ,' ' ,'r') <>  'b\nca'   then bugmes();quit;end
-if strsubst('b\nca'     ,'/ab$/m'                               ,' ' ,'r') <>  'b\nca'   then bugmes();quit;end
-if strsubst('abb\nb\n'  ,'/abb\Z/'                              ,' ' ,'r') <>  'abb\nb\n'  then bugmes();quit;end
-if strsubst('abb\nb\n'  ,'/abb\z/'                              ,' ' ,'r') <>  'abb\nb\n'  then bugmes();quit;end
-if strsubst('abb\nb\n'  ,'/abb$/'                               ,' ' ,'r') <>  'abb\nb\n'  then bugmes();quit;end
-if strsubst('b\nabb\n'  ,'/abb\z/'                              ,' ' ,'r') <>  'b\nabb\n'   then bugmes();quit;end
-if strsubst('abb\nb\n'  ,'/abb\Z/m'                             ,' ' ,'r') <> 'abb\nb\n'  then bugmes();quit;end
-if strsubst('abb\nb\n'  ,'/abb\z/m'                             ,' ' ,'r') <>  'abb\nb\n'  then bugmes();quit;end
-if strsubst('b\nabb\n','/abb\z/m'                             ,' ' ,'r') <>  'b\nabb\n'  then bugmes();quit;end
-if strsubst('ac\nb\n'  ,'/abb\Z/'                              ,' ' ,'r') <>  'ac\nb\n'  then bugmes();quit;end
-if strsubst('ac\nb\n'  ,'/abb\z/'                              ,' ' ,'r') <>  'ac\nb\n' then bugmes();quit;end
-if strsubst('ac\nb\n'  ,'/abb$/'                               ,' ' ,'r') <> 'ac\nb\n'  then bugmes();quit;end
-if strsubst('b\nac\n' ,'/abb\Z/'                              ,' ' ,'r') <> 'b\nac\n'  then bugmes();quit;end
-if strsubst('b\nac\n'  ,'/abb\z/'                              ,' ' ,'r') <>  'b\nac\n' then bugmes();quit;end
-if strsubst('b\nac\n'   ,'/abb$/'                               ,' ' ,'r') <>  'b\nac\n'  then bugmes();quit;end
-if strsubst('b\nac'     ,'/abb\Z/'                              ,' ' ,'r') <>  'b\nac'  then bugmes();quit;end
-if strsubst('b\nac'   ,'/abb\z/'                              ,' ' ,'r') <> 'b\nac'  then bugmes();quit;end
-if strsubst('b\nac'   ,'/abb$/'                               ,' ' ,'r') <>  'b\nac'  then bugmes();quit;end
-if strsubst('ac\nb\n'   ,'/abb\Z/m'                             ,' ' ,'r') <>  'ac\nb\n'   then bugmes();quit;end
-if strsubst('ac\nb\n'     ,'/abb\z/m'                             ,' ' ,'r') <> 'ac\nb\n'   then bugmes();quit;end
-if strsubst('ac\nb\n'  ,'/abb$/m'                              ,' ' ,'r') <>  'ac\nb\n'  then bugmes();quit;end
-if strsubst('b\nac\n' ,'/abb\Z/m'                             ,' ' ,'r') <>  'b\nac\n'   then bugmes();quit;end
-if strsubst('b\nac\n'    ,'/abb\z/m'                             ,' ' ,'r') <> 'b\nac\n'   then bugmes();quit;end
-if strsubst('b\nac\n'    ,'/abb$/m'                              ,' ' ,'r') <>  'b\nac\n'   then bugmes();quit;end
-if strsubst('b\nac'     ,'/abb\Z/m'                             ,' ' ,'r') <>  'b\nac'   then bugmes();quit;end
-if strsubst('b\nac'   ,'/abb\z/m'                             ,' ' ,'r') <>  'b\nac'   then bugmes();quit;end
-if strsubst('b\nac'    ,'/abb$/m'                              ,' ' ,'r') <>  'b\nac'   then bugmes();quit;end
-if strsubst('ca\nb\n'   ,'/abb\Z/'                              ,' ' ,'r') <>  'ca\nb\n'  then bugmes();quit;end
-if strsubst('ca\nb\n' ,'/abb\z/'                              ,' ' ,'r') <>  'ca\nb\n'  then bugmes();quit;end
-if strsubst('ca\nb\n'  ,'/abb$/'                               ,' ' ,'r') <>  'ca\nb\n'  then bugmes();quit;end
-if strsubst('b\nca\n' ,'/abb\Z/'                              ,' ' ,'r') <>  'b\nca\n'   then bugmes();quit;end
-if strsubst('b\nca\n'   ,'/abb\z/'                              ,' ' ,'r') <>  'b\nca\n'   then bugmes();quit;end
-if strsubst('b\nca\n'   ,'/abb$/'                               ,' ' ,'r') <>  'b\nca\n'   then bugmes();quit;end
-if strsubst('b\nca'       ,'/abb\Z/'                              ,' ' ,'r') <>  'b\nca'   then bugmes();quit;end
-if strsubst('b\nca'         ,'/abb\z/'                              ,' ' ,'r') <> 'b\nca'   then bugmes();quit;end
-if strsubst('b\nca'        ,'/abb$/'                               ,' ' ,'r') <>  'b\nca'   then bugmes();quit;end
-if strsubst('ca\nb\n'     ,'/abb\Z/m'                             ,' ' ,'r') <>  'ca\nb\n'   then bugmes();quit;end
-if strsubst('ca\nb\n'   ,'/abb\z/m'                             ,' ' ,'r') <> 'ca\nb\n'   then bugmes();quit;end
-if strsubst('ca\nb\n'    ,'/abb$/m'                              ,' ' ,'r') <> 'ca\nb\n'   then bugmes();quit;end
-if strsubst('b\nca\n'     ,'/abb\Z/m'                             ,' ' ,'r') <>  'b\nca\n'   then bugmes();quit;end
-if strsubst('b\nca\n'      ,'/abb\z/m'                             ,' ' ,'r') <>  'b\nca\n'   then bugmes();quit;end
-if strsubst('b\nca\n'  ,'/abb$/m'                              ,' ' ,'r') <>  'b\nca\n'  then bugmes();quit;end
-if strsubst('b\nca'       ,'/abb\Z/m'                             ,' ' ,'r') <>  'b\nca' then bugmes();quit;end
-if strsubst('b\nca'       ,'/abb\z/m'                             ,' ' ,'r') <>  'b\nca'  then bugmes();quit;end
-if strsubst('b\nca'            ,'/abb$/m'                              ,' ' ,'r') <>  'b\nca'  then bugmes();quit;end
-if strsubst('aaab'        ,'/^(?=(a+?))\1ab/'                     ,' ' ,'r') <>  'aaab'   then bugmes();quit;end
-if strsubst('aaab'             ,'/^(?=(a+?))\1ab/'                     ,' ' ,'r') <>  'aaab'   then bugmes();quit;end
-if strsubst('abcd:'               ,'/([\w:]+::)?(\w+)$/'                  ,' ' ,'r') <>  'abcd:'   then bugmes();quit;end
-if strsubst('abcd:'            ,'/([\w:]+::)?(\w+)$/'                  ,' ' ,'r') <>   'abcd:'  then bugmes();quit;end
-if strsubst('aaab'                  ,'/(>a+)ab/'                            ,' ' ,'r') <>  'aaab'   then bugmes();quit;end
-//======================================================================================== 
-v = "世界您好";
-c = "您";
-if strsubst(v,c,'ç')<>'世界ç好' then bugmes();quit;end
-v = "азеазея";
-c = "з";
-if strsubst(v,c,'ç')<>'аçеаçея'  then bugmes();quit;end
-v = "ድቅስድቅስግ";
-c = "ቅ";
-if strsubst(v,c,'ç')<> 'ድçስድçስግ'  then bugmes();quit;end
-v = "ハロー・ワールド";
-c = "ド";
-if strsubst(v,c,'ç')<> 'ハロー・ワールç'  then bugmes();quit;end
-v = "เฮลโลเวิลด์";
-c = "เ";
-if strsubst(v,c,'ç')<> 'çฮลโลçวิลด์' then bugmes();quit;end
-v = "حريات وحقوق";
-c = "قوق";
-if strsubst(v,c,'ç')<> 'حريات وحç'  then bugmes();quit;end
-v = "ഹലോ വേള്‍ഡ";
-c = "‍ഡ";
-if strsubst(v,c,'ç')<>'ഹലോ വേള്ç'  then bugmes();quit;end
-v = "תוכנית";
-c = "י";
-if strsubst(v,c,'ç')<>'תוכנçת'  then bugmes();quit;end
-//===============================
-// Chinese
-str = '世界您好';
-if strsubst(str,'/^世界/','ç','r') <> 'ç您好' then bugmes();quit;end
-if strsubst(str,'/世界$/','ç','r') <> str then bugmes();quit;end
-if strsubst(str,'/您好$/','ç','r') <> '世界ç' then bugmes();quit;end
-if strsubst(str,'/^您好/','ç','r') <> str then bugmes();quit;end
-if strsubst(str,'/界您/','ç','r') <> '世ç好' then bugmes();quit;end
-if strsubst(str,'/界_您/','ç','r') <> str then bugmes();quit;end
-//======================================================================================== 
-// Russian
-str = 'привет мир';
-if strsubst(str,'/^привет/','ç','r') <> 'ç мир' then bugmes();quit;end
-if strsubst(str,'/привет$/','ç','r') <> str then bugmes();quit;end
-if strsubst(str,'/мир$/','ç','r') <> 'привет ç' then bugmes();quit;end
-if strsubst(str,'/^мир/','ç','r') <> str then bugmes();quit;end
-if strsubst(str,'/вет\sм/','ç','r') <> 'приçир' then bugmes();quit;end
-if strsubst(str,'/вет_м/','ç','r') <> 'привет мир' then bugmes();quit;end
-//======================================================================================== 
-// Cyrilic
-str = 'АБВГДЄЖЅЗИІКЛМНОПҀРСТѸФХѠЦЧШЩЪЪІЬѢЮѦѨѪѬѮѰѲѴѤ';
-if strsubst(str,'/^АБВГДЄЖЅЗИІКЛМНОПҀР/','ç','r') <> 'çСТѸФХѠЦЧШЩЪЪІЬѢЮѦѨѪѬѮѰѲѴѤ' then bugmes();quit;end
-if strsubst(str,'/АБВГДЄЖЅЗИІКЛМНОПҀР$/','ç','r') <> str then bugmes();quit;end
-if strsubst(str,'/ЧШЩЪЪІЬѢЮѦѨѪѬѮѰѲѴѤ$/','ç','r') <> 'АБВГДЄЖЅЗИІКЛМНОПҀРСТѸФХѠЦç' then bugmes();quit;end
-if strsubst(str,'/^ЧШЩЪЪІЬѢЮѦѨѪѬѮѰѲѴѤ/','ç','r') <> str then bugmes();quit;end
-if strsubst(str,'/ИІКЛМНОПҀРСТѸФХѠЦЧШЩЪ/','ç','r') <> 'АБВГДЄЖЅЗçЪІЬѢЮѦѨѪѬѮѰѲѴѤ' then bugmes();quit;end
-if strsubst(str,'/ИІКЛМНОПҀ_РСТѸФХѠЦЧШЩЪ/','ç','r') <> str then bugmes();quit;end
-//======================================================================================== 
-// Japanese
-str = '丑丞串乃之乎也云亘亙些亦亥亨亮仔伊伎伍伽佃佑伶侃侑俄侠俣俐侶倭俺倶倦倖偲僅傭儲允兎兜其冥冴冶凄凌凜凛凧凪凰凱函刹劉劫勁勃';
-if strsubst(str,'/^丑丞串乃之乎也云亘亙些亦/','ç','r') <> 'ç亥亨亮仔伊伎伍伽佃佑伶侃侑俄侠俣俐侶倭俺倶倦倖偲僅傭儲允兎兜其冥冴冶凄凌凜凛凧凪凰凱函刹劉劫勁勃' then bugmes();quit;end
-if strsubst(str,'/丑丞串乃之乎也云亘亙些亦$/','ç','r') <> str then bugmes();quit;end
-if strsubst(str,'/凰凱函刹劉劫勁勃$/','ç','r') <> '丑丞串乃之乎也云亘亙些亦亥亨亮仔伊伎伍伽佃佑伶侃侑俄侠俣俐侶倭俺倶倦倖偲僅傭儲允兎兜其冥冴冶凄凌凜凛凧凪ç' then bugmes();quit;end
-if strsubst(str,'/^凰凱函刹劉劫勁勃/','ç','r') <> str then bugmes();quit;end
-if strsubst(str,'/亨亮仔伊伎伍伽佃佑伶侃/','ç','r') <> '丑丞串乃之乎也云亘亙些亦亥ç侑俄侠俣俐侶倭俺倶倦倖偲僅傭儲允兎兜其冥冴冶凄凌凜凛凧凪凰凱函刹劉劫勁勃' then bugmes();quit;end
-if strsubst(str,'/亨亮仔伊_伎伍伽佃佑伶侃/','ç','r') <> str then bugmes();quit;end
-//======================================================================================== 
-// Thaï
-str = 'มกระดุกกระดิก';
-if strsubst(str,'/^มกระดุกกร/','ç','r')<>'çะดิก' then bugmes();quit;end
-if strsubst(str,'/มกระดุกกร$/','ç','r') <> str then bugmes();quit;end
-if strsubst(str,'/กกระดิก$/','ç','r')<>'มกระดุç' then bugmes();quit;end
-if strsubst(str,'/^กกระดิก/','ç','r') <> str then bugmes();quit;end
-if strsubst(str,'/ดุกก/','ç','r')<>'มกระçระดิก' then bugmes();quit;end
-if strsubst(str,'/ดุก_ก/','ç','r') <> str then bugmes();quit;end
-//======================================================================================== 
index e964cc2..24c5e19 100644 (file)
 //======================================================================================== 
 
 // <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
 
 //======================================================================================== 
 // unit tests strsubst
 //======================================================================================== 
-if strsubst('abc,abd,aa,bxe',',',';')<>'abc;abd;aa;bxe'  then pause,end
+assert_checkequal( strsubst('abc,abd,aa,bxe',',',';'),'abc;abd;aa;bxe'  );
 //======================================================================================== 
-if strsubst('abc,abd,aa,bxe',',',emptystr())<>'abcabdaabxe'  then pause,end
+assert_checkequal( strsubst('abc,abd,aa,bxe',',',emptystr()),'abcabdaabxe'  );
 //======================================================================================== 
-if strsubst(',abc,abd,aa,bxe',',',emptystr())<>'abcabdaabxe'  then pause,end
+assert_checkequal( strsubst(',abc,abd,aa,bxe',',',emptystr()),'abcabdaabxe'  );
 //======================================================================================== 
-if strsubst('abc',',',';')<>'abc'  then pause,end
+assert_checkequal( strsubst('abc',',',';'),'abc'  );
 //======================================================================================== 
-if strsubst('SCI/demos/scicos','SCI','.') <> './demos/scicos'  then pause,end
+assert_checkequal( strsubst('SCI/demos/scicos','SCI','.') , './demos/scicos'  );
 //======================================================================================== 
-if strsubst('SCI/demos/scicos','/',' ') <> 'SCI demos scicos'  then pause,end
+assert_checkequal( strsubst('SCI/demos/scicos','/',' ') , 'SCI demos scicos'  );
 //======================================================================================== 
-if strsubst([],'/',' ') <> [] then pause,end
+assert_checkequal( strsubst([],'/',' ') , [] );
 //======================================================================================== 
-if strsubst([],' ','') <> [] then pause,end
+assert_checkequal( strsubst([],' ','') , [] );
 //======================================================================================== 
-if strsubst('',' ','') <> '' then pause,end
+assert_checkequal( strsubst('',' ','') , '' );
 //======================================================================================== 
-if strsubst("2","3","1") <> "2" then pause,end
+assert_checkequal( strsubst("2","3","1") , "2" );
 //======================================================================================== 
-if strsubst(["2","3"],"3","1") <> ['2' '1'] then pause,end
+assert_checkequal( strsubst(["2","3"],"3","1") , ['2' '1'] );
 //======================================================================================== 
 r = strsubst(['Scilab','Mathlab';'Octlab','Rlab'],'lab','');
 ref  = ['Sci','Math';'Oct','R'];
-if (r <> ref) then  pause,end
+assert_checkequal( r , ref);
 //======================================================================================== 
-if strsubst('xbc','/abc/',' ','r') <>  'xbc'   then pause,end
-if strsubst('axc','/abc/',' ','r') <>  'axc'   then pause,end
-if strsubst('xaccy','/abc/',' ','r') <>  'xaccy'   then pause,end
-if strsubst('abc','/ab*c/',' ','r') <>  ' '   then pause,end
-if strsubst('abc','/ab*bc/',' ','r') <>  ' '   then pause,end
-if strsubst('abbc','/ab*bc/',' ','r') <>  ' '   then pause,end
-if strsubst('abbbbc','/ab*bc/',' ','r') <>  ' '   then pause,end
-if strsubst('abbbbc','/.{1}/',' ','r') <>  ' bbbbc'   then pause,end
-if strsubst('abbbbc','/.{3,4}/',' ','r') <>  ' bc'   then pause,end
-if strsubst('abbbbc','/ab{0,}bc/','^','r') <>  '^'   then pause,end
-if strsubst('abbc','/ab+bc/','^','r') <>  '^'   then pause,end
-if strsubst('abc','/ab+bc/','^','r') <>  'abc'   then pause,end
-if strsubst('abq','/ab+bc/','^','r') <>  'abq'   then pause,end
-if strsubst('abbc','/ab{1,}bc/','^','r') <>  '^'   then pause,end
-if strsubst('abbbbc','/ab+bc/','^','r') <>  '^'   then pause,end
-if strsubst('abbbbc','/ab{1,}bc/','^','r') <>  '^'   then pause,end
-if strsubst('abbc','/ab{1,3}bc/','^','r') <>  '^'   then pause,end
-if strsubst('abbbbc','/ab{3,4}bc/','^','r') <>  '^'   then pause,end
-if strsubst('abbbbc','/ab{4,5}bc/','^','r') <>  'abbbbc'   then pause,end
-if strsubst('abbc','/ab?bc/',' ','r') <>  ' '   then pause,end
-if strsubst('abc','/ab?bc/',' ','r') <>  ' '   then pause,end
-if strsubst('abc','/ab{0,1}bc/',' ','r') <>  ' '   then pause,end
-if strsubst('xaccy','/ab?bc/',' ','r') <>  'xaccy'   then pause,end
-if strsubst('abc','/ab?c/',' ','r') <>  ' '   then pause,end
-if strsubst('abc','/ab{0,1}c/',' ','r') <>  ' '   then pause,end
-if strsubst('abbc','/ab*bc/',' ','r') <>  ' '   then pause,end
-if strsubst('abc','/^abc$/',' ','r') <>  ' '   then pause,end
-if strsubst('abcc','/^abc$/',' ','r') <>  'abcc'   then pause,end
-if strsubst('aabc','/^abc&/',' ','r') <>  'aabc'   then pause,end
-if strsubst('abbbbc','/ab{0,}bc/','^','r') <>  '^'   then pause,end
-if strsubst('aabc','/abc$/','^','r') <>  'a^'   then pause,end
-if strsubst('abc','/ab+bc/','^','r') <>  'abc'   then pause,end
-if strsubst('abq','/ab+bc/','^','r') <>  'abq'   then pause,end
-if strsubst('abbc','/ab{1,}bc/','^','r') <>  '^'   then pause,end
-if strsubst('abbbbc','/ab+bc/','^','r') <>  '^'   then pause,end
-if strsubst('abbbbc','/ab{1,}bc/','^','r') <>  '^'   then pause,end
-if strsubst('xy','/\By\b/','^','r') <>  'x^'   then pause,end
-if strsubst('xy','/\By\b/','^','r') <>  'x^'   then pause,end
-if strsubst('yz','/\by\B/','^','r') <>  '^z'   then pause,end
-if strsubst('e','/a|b|c|d|e/',' ','r') <>  ' '   then pause,end
-if strsubst('abcdefg','/abcd*efg/',' ','r') <>  ' '   then pause,end
-if strsubst('xaccy','/abc/',' ','r') <>  'xaccy'   then pause,end
-if strsubst('xabyabbbz','/ab*/',' ','r') <>  'x yabbbz'   then pause,end
-if strsubst('hij','/[abhgefdc]ij/',' ','r') <>  ' '   then pause,end
-if strsubst('abcde','/^(ab|cd)e/',' ','r') <>  'abcde'   then pause,end
-if strsubst('abbbbc','/ab*bc/',' ','r') <>  ' '   then pause,end
-if strsubst('abbbbc','/.{1}/',' ','r') <>  ' bbbbc'   then pause,end
-if strsubst('abbbbc','/.{3,4}/',' ','r') <>  ' bc'   then pause,end
-if strsubst('effg','/(bc+d$|ef*g.|h?i(j|k))/','^','r') <>  'effg'   then pause,end
-if strsubst('aa','/((((((((((a))))))))))\10/','^','r') <>  '^'   then pause,end
-if strsubst('a!','/((((((((((a))))))))))\041/','^','r') <>  '^'   then pause,end
-if strsubst('a','/(((((((((a)))))))))/','^','r') <>  '^'   then pause,end
-if strsubst('multiple words, yeah','/multiple words/','^','r') <>  '^, yeah'   then pause,end
-if strsubst('ac','/a[-]?c/','^','r') <>  '^'   then pause,end
-if strsubst('a','/(a)|\1/','^','r') <>  '^'   then pause,end
-if strsubst('A-','/a[-b]/i','^','r') <>  '^'   then pause,end
-if strsubst('A-','/a[b-]/i','^','r') <>  '^'   then pause,end
-if strsubst('A]','/a]/i','^','r') <>  '^'   then pause,end
-if strsubst('abbc','/ab?bc/',' ','r') <>  ' '   then pause,end
-if strsubst('abc','/ab?bc/',' ','r') <>  ' '   then pause,end
-if strsubst('abc','/ab{0,1}bc/',' ','r') <>  ' '   then pause,end
-if strsubst('xaccy','/ab?bc/',' ','r') <>  'xaccy'   then pause,end
-if strsubst('abc','/ab?c/',' ','r') <>  ' '   then pause,end
-if strsubst('abc','/ab{0,1}c/',' ','r') <>  ' '   then pause,end
-if strsubst('abbc','/ab*bc/',' ','r') <>  ' '   then pause,end
-if strsubst('abc','/^abc$/',' ','r') <>  ' '   then pause,end
-if strsubst('abcc','/^abc$/',' ','r') <>  'abcc'   then pause,end
-if strsubst('aabc','/^abc&/',' ','r') <>  'aabc'   then pause,end
-if strsubst('abbbbc','/ab{0,}bc/','^','r') <>  '^'   then pause,end
-if strsubst('aabc','/abc$/','^','r') <>  'a^'   then pause,end
-if strsubst('abc','/ab+bc/','^','r') <>  'abc'   then pause,end
-if strsubst('abq','/ab+bc/','^','r') <>  'abq'   then pause,end
-if strsubst('abbc','/ab{1,}bc/','^','r') <>  '^'   then pause,end
-if strsubst('abbbbc','/ab+bc/','^','r') <>  '^'   then pause,end
-if strsubst('abbbbc','/ab{1,}bc/','^','r') <>  '^'   then pause,end
-if strsubst('xy','/\By\b/','^','r') <>  'x^'   then pause,end
-if strsubst('xy','/\By\b/','^','r') <>  'x^'   then pause,end
-if strsubst('yz','/\by\B/','^','r') <>  '^z'   then pause,end
-if strsubst('e','/a|b|c|d|e/',' ','r') <>  ' '   then pause,end
-if strsubst('abcdefg','/abcd*efg/',' ','r') <>  ' '   then pause,end
-if strsubst('xaccy','/abc/',' ','r') <>  'xaccy'   then pause,end
-if strsubst('xabyabbbz','/ab*/',' ','r') <>  'x yabbbz'   then pause,end
-if strsubst('hij','/[abhgefdc]ij/',' ','r') <>  ' '   then pause,end
-if strsubst('abcde','/^(ab|cd)e/',' ','r') <>  'abcde'   then pause,end
-if strsubst('abbbbc','/ab*bc/',' ','r') <>  ' '   then pause,end
-if strsubst('abbbbc','/.{1}/',' ','r') <>  ' bbbbc'   then pause,end
-if strsubst('abbbbc','/.{3,4}/',' ','r') <>  ' bc'   then pause,end
-if strsubst('effg','/(bc+d$|ef*g.|h?i(j|k))/','^','r') <>  'effg'   then pause,end
-if strsubst('aa','/((((((((((a))))))))))\10/','^','r') <>  '^'   then pause,end
-if strsubst('a!','/((((((((((a))))))))))\041/','^','r') <>  '^'   then pause,end
-if strsubst('a','/(((((((((a)))))))))/','^','r') <>  '^'   then pause,end
-if strsubst('multiple words, yeah','/multiple words/','^','r') <>  '^, yeah'   then pause,end
-if strsubst('ac','/a[-]?c/','^','r') <>  '^'   then pause,end
-if strsubst('a','/(a)|\1/','^','r') <>  '^'   then pause,end
-if strsubst('A-','/a[-b]/i','^','r') <>  '^'   then pause,end
-if strsubst('A-','/a[b-]/i','^','r') <>  '^'   then pause,end
-if strsubst('A]','/a]/i','^','r') <>  '^'   then pause,end
-if strsubst('abbc','/ab?bc/',' ','r') <>  ' '   then pause,end
-if strsubst('abc','/ab?bc/',' ','r') <>  ' '   then pause,end
-if strsubst('abc','/ab{0,1}bc/',' ','r') <>  ' '   then pause,end
-if strsubst('xaccy','/ab?bc/',' ','r') <>  'xaccy'   then pause,end
-if strsubst('abc','/ab?c/',' ','r') <>  ' '   then pause,end
-if strsubst('abc','/ab{0,1}c/',' ','r') <>  ' '   then pause,end
-if strsubst('abbc','/ab*bc/',' ','r') <>  ' '   then pause,end
-if strsubst('abc','/^abc$/',' ','r') <>  ' '   then pause,end
-if strsubst('abcc','/^abc$/',' ','r') <>  'abcc'   then pause,end
-if strsubst('aabc','/^abc&/',' ','r') <>  'aabc'   then pause,end
-if strsubst('abbbbc','/ab{0,}bc/','^','r') <>  '^'   then pause,end
-if strsubst('aabc','/abc$/','^','r') <>  'a^'   then pause,end
-if strsubst('abc','/ab+bc/','^','r') <>  'abc'   then pause,end
-if strsubst('abq','/ab+bc/','^','r') <>  'abq'   then pause,end
-if strsubst('abbc','/ab{1,}bc/','^','r') <>  '^'   then pause,end
-if strsubst('abbbbc','/ab+bc/','^','r') <>  '^'   then pause,end
-if strsubst('abbbbc','/ab{1,}bc/','^','r') <>  '^'   then pause,end
-if strsubst('xy','/\By\b/','^','r') <>  'x^'   then pause,end
-if strsubst('xy','/\By\b/','^','r') <>  'x^'   then pause,end
-if strsubst('yz','/\by\B/','^','r') <>  '^z'   then pause,end
-if strsubst('e','/a|b|c|d|e/',' ','r') <>  ' '   then pause,end
-if strsubst('abcdefg','/abcd*efg/',' ','r') <>  ' '   then pause,end
-if strsubst('xaccy','/abc/',' ','r') <>  'xaccy'   then pause,end
-if strsubst('xabyabbbz','/ab*/',' ','r') <>  'x yabbbz'   then pause,end
-if strsubst('hij','/[abhgefdc]ij/',' ','r') <>  ' '   then pause,end
-if strsubst('abcde','/^(ab|cd)e/',' ','r') <>  'abcde'   then pause,end
-if strsubst('abbbbc','/ab*bc/',' ','r') <>  ' '   then pause,end
-if strsubst('abbbbc','/.{1}/',' ','r') <>  ' bbbbc'   then pause,end
-if strsubst('abbbbc','/.{3,4}/',' ','r') <>  ' bc'   then pause,end
-if strsubst('effg','/(bc+d$|ef*g.|h?i(j|k))/','^','r') <>  'effg'   then pause,end
-if strsubst('aa','/((((((((((a))))))))))\10/','^','r') <>  '^'   then pause,end
-if strsubst('a!','/((((((((((a))))))))))\041/','^','r') <>  '^'   then pause,end
-if strsubst('a','/(((((((((a)))))))))/','^','r') <>  '^'   then pause,end
-if strsubst('multiple words, yeah','/multiple words/','^','r') <>  '^, yeah'   then pause,end
-if strsubst('ac','/a[-]?c/','^','r') <>  '^'   then pause,end
-if strsubst('a','/(a)|\1/','^','r') <>  '^'   then pause,end
-if strsubst('A-','/a[-b]/i','^','r') <>  '^'   then pause,end
-if strsubst('A-','/a[b-]/i','^','r') <>  '^'   then pause,end
-if strsubst('A]','/a]/i','^','r') <>  '^'   then pause,end
-if strsubst('abc','/abc/',' ','r') <>  ' '   then pause,end
+assert_checkequal( strsubst('xbc','/abc/',' ','r') ,  'xbc'   );
+assert_checkequal( strsubst('axc','/abc/',' ','r') ,  'axc'   );
+assert_checkequal( strsubst('xaccy','/abc/',' ','r') ,  'xaccy'   );
+assert_checkequal( strsubst('abc','/ab*c/',' ','r') ,  ' '   );
+assert_checkequal( strsubst('abc','/ab*bc/',' ','r') ,  ' '   );
+assert_checkequal( strsubst('abbc','/ab*bc/',' ','r') ,  ' '   );
+assert_checkequal( strsubst('abbbbc','/ab*bc/',' ','r') ,  ' '   );
+assert_checkequal( strsubst('abbbbc','/.{1}/',' ','r') ,  '      '   );
+assert_checkequal( strsubst('abbbbc','/.{3,4}/',' ','r') ,  ' bc'   );
+assert_checkequal( strsubst('abbbbc','/ab{0,}bc/','^','r') ,  '^'   );
+assert_checkequal( strsubst('abbc','/ab+bc/','^','r') ,  '^'   );
+assert_checkequal( strsubst('abc','/ab+bc/','^','r') ,  'abc'   );
+assert_checkequal( strsubst('abq','/ab+bc/','^','r') ,  'abq'   );
+assert_checkequal( strsubst('abbc','/ab{1,}bc/','^','r') ,  '^'   );
+assert_checkequal( strsubst('abbbbc','/ab+bc/','^','r') ,  '^'   );
+assert_checkequal( strsubst('abbbbc','/ab{1,}bc/','^','r') ,  '^'   );
+assert_checkequal( strsubst('abbc','/ab{1,3}bc/','^','r') ,  '^'   );
+assert_checkequal( strsubst('abbbbc','/ab{3,4}bc/','^','r') ,  '^'   );
+assert_checkequal( strsubst('abbbbc','/ab{4,5}bc/','^','r') ,  'abbbbc'   );
+assert_checkequal( strsubst('abbc','/ab?bc/',' ','r') ,  ' '   );
+assert_checkequal( strsubst('abc','/ab?bc/',' ','r') ,  ' '   );
+assert_checkequal( strsubst('abc','/ab{0,1}bc/',' ','r') ,  ' '   );
+assert_checkequal( strsubst('xaccy','/ab?bc/',' ','r') ,  'xaccy'   );
+assert_checkequal( strsubst('abc','/ab?c/',' ','r') ,  ' '   );
+assert_checkequal( strsubst('abc','/ab{0,1}c/',' ','r') ,  ' '   );
+assert_checkequal( strsubst('abc','/^abc$/',' ','r') ,  ' '   );
+assert_checkequal( strsubst('abcc','/^abc$/',' ','r') ,  'abcc'   );
+assert_checkequal( strsubst('aabc','/^abc&/',' ','r') ,  'aabc'   );
+assert_checkequal( strsubst('aabc','/abc$/','^','r') ,  'a^'   );
+assert_checkequal( strsubst('xy','/\By\b/','^','r') ,  'x^'   );
+assert_checkequal( strsubst('yz','/\by\B/','^','r') ,  '^z'   );
+assert_checkequal( strsubst('e','/a|b|c|d|e/',' ','r') ,  ' '   );
+assert_checkequal( strsubst('abcdefg','/abcd*efg/',' ','r') ,  ' '   );
+assert_checkequal( strsubst('xabyabbbz','/ab*/',' ','r') ,  'x y z'   );
+assert_checkequal( strsubst('hij','/[abhgefdc]ij/',' ','r') ,  ' '   );
+assert_checkequal( strsubst('abcde','/^(ab|cd)e/',' ','r') ,  'abcde'   );
+assert_checkequal( strsubst('effg','/(bc+d$|ef*g.|h?i(j|k))/','^','r') ,  'effg'   );
+assert_checkequal( strsubst('aa','/((((((((((a))))))))))\10/','^','r') ,  '^'   );
+assert_checkequal( strsubst('a!','/((((((((((a))))))))))\041/','^','r') ,  '^'   );
+assert_checkequal( strsubst('a','/(((((((((a)))))))))/','^','r') ,  '^'   );
+assert_checkequal( strsubst('multiple words, yeah','/multiple words/','^','r') ,  '^, yeah'   );
+assert_checkequal( strsubst('ac','/a[-]?c/','^','r') ,  '^'   );
+assert_checkequal( strsubst('a','/(a)|\1/','^','r') ,  '^'   );
+assert_checkequal( strsubst('A-','/a[-b]/i','^','r') ,  '^'   );
+assert_checkequal( strsubst('A-','/a[b-]/i','^','r') ,  '^'   );
+assert_checkequal( strsubst('A]','/a]/i','^','r') ,  '^'   );
+assert_checkequal( strsubst('abc','/ab?bc/',' ','r') ,  ' '   );
+assert_checkequal( strsubst('abc','/ab{0,1}bc/',' ','r') ,  ' '   );
+assert_checkequal( strsubst('xaccy','/ab?bc/',' ','r') ,  'xaccy'   );
+assert_checkequal( strsubst('abc','/ab?c/',' ','r') ,  ' '   );
+assert_checkequal( strsubst('abc','/ab{0,1}c/',' ','r') ,  ' '   );
+assert_checkequal( strsubst('abc','/^abc$/',' ','r') ,  ' '   );
+assert_checkequal( strsubst('abcc','/^abc$/',' ','r') ,  'abcc'   );
+assert_checkequal( strsubst('aabc','/^abc&/',' ','r') ,  'aabc'   );
+assert_checkequal( strsubst('xy','/\By\b/','^','r') ,  'x^'   );
+assert_checkequal( strsubst('xy','/\By\b/','^','r') ,  'x^'   );
+assert_checkequal( strsubst('abc','/abc/',' ','r') ,  ' '   );
 //======================================================================================== 
-if strsubst('......abef','/.*a(?!(b|cd)*e).*f/'                 ,' ' ,'r') <>  '......abef'  then pause,end
-if strsubst('fools','/(foo|fool|x.|money|parted)$/'        ,' ' ,'r') <>  'fools'  then pause,end
-if strsubst('fools','/(x.|foo|fool|x.|money|parted|y.)$/'  ,' ' ,'r') <>  'fools'  then pause,end
-if strsubst('fools','/(foo|fool|money|parted)$/'           ,' ' ,'r') <>  'fools'  then pause,end
-if strsubst('Oo','/^(o)(?!.*\1)/i'                      ,' ' ,'r') <>  'Oo'  then pause,end
-if strsubst('AbCd','/ab(?i)cd/'                           ,' ' ,'r') <>  'AbCd'  then pause,end
-if strsubst('a\nb\n','/a\Z/'                                ,' ' ,'r') <> 'a\nb\n'  then pause,end
-if strsubst('a\nb\n','/a\z/'                                ,' ' ,'r') <> 'a\nb\n'  then pause,end
-if strsubst('a\nb\n','/a$/'                                 ,' ' ,'r') <>  'a\nb\n' then pause,end
-if strsubst('b\na\n','/a\z/'                                ,' ' ,'r') <>  'b\na\n'  then pause,end
-if strsubst('a\nb\n','/a\Z/m'                               ,' ' ,'r') <>  'a\nb\n'  then pause,end
-if strsubst('a\nb\n','/a\z/m'                               ,' ' ,'r') <> 'a\nb\n'  then pause,end
-if strsubst('b\na\n','/a\z/m'                               ,' ' ,'r') <>  'b\na\n'  then pause,end
-if strsubst('aa\nb\n','/aa\Z/'                               ,' ' ,'r') <>  'aa\nb\n' then pause,end
-if strsubst('aa\nb\n','/aa\z/'                               ,' ' ,'r') <>  'aa\nb\n'  then pause,end
-if strsubst('aa\nb\n','/aa$/'                                ,' ' ,'r') <>  'aa\nb\n'  then pause,end
-if strsubst('b\naa\n','/aa\z/'                               ,' ' ,'r') <>  'b\naa\n'  then pause,end
-if strsubst('aa\nb\n','/aa\Z/m'                              ,' ' ,'r') <>  'aa\nb\n'  then pause,end
-if strsubst('aa\nb\n','/aa\z/m'                              ,' ' ,'r') <>  'aa\nb\n'  then pause,end
-if strsubst('b\naa\n','/aa\z/m'                              ,' ' ,'r') <>  'b\naa\n'  then pause,end
-if strsubst('ac\nb\n','/aa\Z/'                               ,' ' ,'r') <>  'ac\nb\n'  then pause,end
-if strsubst('ac\nb\n','/aa\z/'                               ,' ' ,'r') <>  'ac\nb\n'  then pause,end
-if strsubst('ac\nb\n','/aa$/'                                ,' ' ,'r') <>  'ac\nb\n'  then pause,end
-if strsubst('b\nac\n','/aa\Z/'                               ,' ' ,'r') <>  'b\nac\n'  then pause,end
-if strsubst('b\nac\n','/aa\z/'                               ,' ' ,'r') <>  'b\nac\n'  then pause,end
-if strsubst('b\nac\n','/aa$/'                                ,' ' ,'r') <>  'b\nac\n'  then pause,end
-if strsubst('b\nac'  ,'/aa\Z/'                               ,' ' ,'r') <>  'b\nac'  then pause,end
-if strsubst('b\nac'  ,'/aa\z/'                               ,' ' ,'r') <>  'b\nac'  then pause,end
-if strsubst('b\nac'  ,'/aa$/'                                ,' ' ,'r') <>  'b\nac'  then pause,end
-if strsubst('ac\nb\n','/aa\Z/m'                              ,' ' ,'r') <>  'ac\nb\n'  then pause,end
-if strsubst('ac\nb\n','/aa\z/m'                              ,' ' ,'r') <>  'ac\nb\n'  then pause,end
-if strsubst('ac\nb\n','/aa$/m'                               ,' ' ,'r') <>  'ac\nb\n'  then pause,end
-if strsubst('b\nac\n','/aa\Z/m'                              ,' ' ,'r') <>  'b\nac\n' then pause,end
-if strsubst('b\nac\n','/aa\z/m'                              ,' ' ,'r') <>  'b\nac\n'  then pause,end
-if strsubst('b\nac\n','/aa$/m'                               ,' ' ,'r') <>  'b\nac\n' then pause,end
-if strsubst('b\nac'  ,'/aa\Z/m'                              ,' ' ,'r') <>  'b\nac'  then pause,end
-if strsubst('b\nac'  ,'/aa\z/m'                              ,' ' ,'r') <>  'b\nac'  then pause,end
-if strsubst('b\nac'  ,'/aa$/m'                               ,' ' ,'r') <>  'b\nac' then pause,end
-if strsubst('ca\nb\n','/aa\Z/'                               ,' ' ,'r') <>  'ca\nb\n'  then pause,end
-if strsubst('ca\nb\n','/aa\z/'                               ,' ' ,'r') <>  'ca\nb\n'  then pause,end
-if strsubst('ca\nb\n','/aa$/'                                ,' ' ,'r') <>  'ca\nb\n'  then pause,end
-if strsubst('b\nca\n','/aa\Z/'                               ,' ' ,'r') <>  'b\nca\n'  then pause,end
-if strsubst('b\nca\n','/aa\z/'                               ,' ' ,'r') <>  'b\nca\n' then pause,end
-if strsubst('b\nca\n','/aa$/'                                ,' ' ,'r') <>  'b\nca\n'  then pause,end
-if strsubst('b\nca'  ,'/aa\Z/'                               ,' ' ,'r') <>  'b\nca'   then pause,end
-if strsubst('b\nca'  ,'/aa\z/'                               ,' ' ,'r') <> 'b\nca'   then pause,end
-if strsubst('b\nca'  ,'/aa$/'                                ,' ' ,'r') <>  'b\nca'  then pause,end
-if strsubst('ca\nb\n','/aa\Z/m'                              ,' ' ,'r') <> 'ca\nb\n'  then pause,end
-if strsubst('ca\nb\n','/aa\z/m'                              ,' ' ,'r') <>  'ca\nb\n'  then pause,end
-if strsubst('ca\nb\n','/aa$/m'                               ,' ' ,'r') <>  'ca\nb\n' then pause,end
-if strsubst('b\nca\n','/aa\Z/m'                              ,' ' ,'r') <> 'b\nca\n'  then pause,end
-if strsubst('b\nca\n','/aa\z/m'                              ,' ' ,'r') <> 'b\nca\n'  then pause,end
-if strsubst('b\nca\n','/aa$/m'                               ,' ' ,'r') <> 'b\nca\n'  then pause,end
-if strsubst('b\nca'  ,'/aa\Z/m'                              ,' ' ,'r') <>  'b\nca'  then pause,end
-if strsubst('b\nca'  ,'/aa\z/m'                              ,' ' ,'r') <>  'b\nca'   then pause,end
-if strsubst('b\nca'  ,'/aa$/m'                               ,' ' ,'r') <>  'b\nca'   then pause,end
-if strsubst('ab\nb\n','/ab\Z/'                               ,' ' ,'r') <>  'ab\nb\n'  then pause,end
-if strsubst('ab\nb\n','/ab\z/'                               ,' ' ,'r') <>  'ab\nb\n' then pause,end
-if strsubst('ab\nb\n','/ab$/'                                ,' ' ,'r') <> 'ab\nb\n'  then pause,end
-if strsubst('b\nab\n','/ab\z/'                               ,' ' ,'r') <>  'b\nab\n' then pause,end
-if strsubst('ab\nb\n','/ab\Z/m'                              ,' ' ,'r') <>  'ab\nb\n'  then pause,end
-if strsubst('ab\nb\n','/ab\z/m'                              ,' ' ,'r') <>  'ab\nb\n'  then pause,end
-if strsubst('b\nab\n','/ab\z/m'                              ,' ' ,'r') <> 'b\nab\n'  then pause,end
-if strsubst('ac\nb\n','/ab\Z/'                               ,' ' ,'r') <> 'ac\nb\n'  then pause,end
-if strsubst('ac\nb\n','/ab\z/'                               ,' ' ,'r') <> 'ac\nb\n' then pause,end
-if strsubst('ac\nb\n','/ab$/'                                ,' ' ,'r') <>  'ac\nb\n'  then pause,end
-if strsubst('b\nac\n','/ab\Z/'                               ,' ' ,'r') <>  'b\nac\n'  then pause,end
-if strsubst('b\nac\n','/ab\z/'                               ,' ' ,'r') <>  'b\nac\n' then pause,end
-if strsubst('b\nac\n','/ab$/'                                ,' ' ,'r') <>  'b\nac\n'  then pause,end
-if strsubst('b\nac'  ,'/ab\Z/'                               ,' ' ,'r') <>  'b\nac'  then pause,end
-if strsubst('b\nac'  ,'/ab\z/'                               ,' ' ,'r') <>  'b\nac' then pause,end
-if strsubst('b\nac'  ,'/ab$/'                                ,' ' ,'r') <> 'b\nac' then pause,end
-if strsubst('ac\nb\n','/ab\Z/m'                              ,' ' ,'r') <>  'ac\nb\n'  then pause,end
-if strsubst('ac\nb\n','/ab\z/m'                              ,' ' ,'r') <> 'ac\nb\n'  then pause,end
-if strsubst('ac\nb\n','/ab$/m'                               ,' ' ,'r') <>  'ac\nb\n'  then pause,end
-if strsubst('b\nac\n','/ab\Z/m'                              ,' ' ,'r') <> 'b\nac\n'  then pause,end
-if strsubst('b\nac\n','/ab\z/m'                              ,' ' ,'r') <> 'b\nac\n' then pause,end
-if strsubst('b\nac\n','/ab$/m'                               ,' ' ,'r') <>  'b\nac\n'  then pause,end
-if strsubst('b\nac'  ,'/ab\Z/m'                              ,' ' ,'r') <>  'b\nac'   then pause,end
-if strsubst('b\nac'  ,'/ab\z/m'                              ,' ' ,'r') <>  'b\nac'  then pause,end
-if strsubst('b\nac'  ,'/ab$/m'                               ,' ' ,'r') <>  'b\nac'   then pause,end
-if strsubst('ca\nb\n','/ab\Z/'                               ,' ' ,'r') <>  'ca\nb\n' then pause,end
-if strsubst('ca\nb\n','/ab\z/'                               ,' ' ,'r') <>  'ca\nb\n'  then pause,end
-if strsubst('ca\nb\n','/ab$/'                                ,' ' ,'r') <>  'ca\nb\n'  then pause,end
-if strsubst('b\nca\n','/ab\Z/'                               ,' ' ,'r') <>  'b\nca\n'  then pause,end
-if strsubst('b\nca\n','/ab\z/'                               ,' ' ,'r') <> 'b\nca\n'  then pause,end
-if strsubst('b\nca\n','/ab$/'                                ,' ' ,'r') <>  'b\nca\n'  then pause,end
-if strsubst('b\nca'  ,'/ab\Z/'                               ,' ' ,'r') <>  'b\nca'  then pause,end
-if strsubst('b\nca'  ,'/ab\z/'                               ,' ' ,'r') <>  'b\nca'  then pause,end
-if strsubst('b\nca'  ,'/ab$/'                                ,' ' ,'r') <> 'b\nca'  then pause,end
-if strsubst('ca\nb\n','/ab\Z/m'                              ,' ' ,'r') <>  'ca\nb\n'  then pause,end
-if strsubst('ca\nb\n','/ab\z/m'                              ,' ' ,'r') <>  'ca\nb\n' then pause,end
-if strsubst('ca\nb\n','/ab$/m'                               ,' ' ,'r') <> 'ca\nb\n'  then pause,end
-if strsubst('b\nca\n','/ab\Z/m'                              ,' ' ,'r') <> 'b\nca\n' then pause,end
-if strsubst('b\nca\n' ,'/ab\z/m'                              ,' ' ,'r') <> 'b\nca\n'  then pause,end
-if strsubst('b\nca\n','/ab$/m'                               ,' ' ,'r') <>  'b\nca\n'  then pause,end
-if strsubst('b\nca'     ,'/ab\Z/m'                              ,' ' ,'r') <> 'b\nca'   then pause,end
-if strsubst('b\nca'     ,'/ab\z/m'                              ,' ' ,'r') <>  'b\nca'   then pause,end
-if strsubst('b\nca'     ,'/ab$/m'                               ,' ' ,'r') <>  'b\nca'   then pause,end
-if strsubst('abb\nb\n'  ,'/abb\Z/'                              ,' ' ,'r') <>  'abb\nb\n'  then pause,end
-if strsubst('abb\nb\n'  ,'/abb\z/'                              ,' ' ,'r') <>  'abb\nb\n'  then pause,end
-if strsubst('abb\nb\n'  ,'/abb$/'                               ,' ' ,'r') <>  'abb\nb\n'  then pause,end
-if strsubst('b\nabb\n'  ,'/abb\z/'                              ,' ' ,'r') <>  'b\nabb\n'   then pause,end
-if strsubst('abb\nb\n'  ,'/abb\Z/m'                             ,' ' ,'r') <> 'abb\nb\n'  then pause,end
-if strsubst('abb\nb\n'  ,'/abb\z/m'                             ,' ' ,'r') <>  'abb\nb\n'  then pause,end
-if strsubst('b\nabb\n','/abb\z/m'                             ,' ' ,'r') <>  'b\nabb\n'  then pause,end
-if strsubst('ac\nb\n'  ,'/abb\Z/'                              ,' ' ,'r') <>  'ac\nb\n'  then pause,end
-if strsubst('ac\nb\n'  ,'/abb\z/'                              ,' ' ,'r') <>  'ac\nb\n' then pause,end
-if strsubst('ac\nb\n'  ,'/abb$/'                               ,' ' ,'r') <> 'ac\nb\n'  then pause,end
-if strsubst('b\nac\n' ,'/abb\Z/'                              ,' ' ,'r') <> 'b\nac\n'  then pause,end
-if strsubst('b\nac\n'  ,'/abb\z/'                              ,' ' ,'r') <>  'b\nac\n' then pause,end
-if strsubst('b\nac\n'   ,'/abb$/'                               ,' ' ,'r') <>  'b\nac\n'  then pause,end
-if strsubst('b\nac'     ,'/abb\Z/'                              ,' ' ,'r') <>  'b\nac'  then pause,end
-if strsubst('b\nac'   ,'/abb\z/'                              ,' ' ,'r') <> 'b\nac'  then pause,end
-if strsubst('b\nac'   ,'/abb$/'                               ,' ' ,'r') <>  'b\nac'  then pause,end
-if strsubst('ac\nb\n'   ,'/abb\Z/m'                             ,' ' ,'r') <>  'ac\nb\n'   then pause,end
-if strsubst('ac\nb\n'     ,'/abb\z/m'                             ,' ' ,'r') <> 'ac\nb\n'   then pause,end
-if strsubst('ac\nb\n'  ,'/abb$/m'                              ,' ' ,'r') <>  'ac\nb\n'  then pause,end
-if strsubst('b\nac\n' ,'/abb\Z/m'                             ,' ' ,'r') <>  'b\nac\n'   then pause,end
-if strsubst('b\nac\n'    ,'/abb\z/m'                             ,' ' ,'r') <> 'b\nac\n'   then pause,end
-if strsubst('b\nac\n'    ,'/abb$/m'                              ,' ' ,'r') <>  'b\nac\n'   then pause,end
-if strsubst('b\nac'     ,'/abb\Z/m'                             ,' ' ,'r') <>  'b\nac'   then pause,end
-if strsubst('b\nac'   ,'/abb\z/m'                             ,' ' ,'r') <>  'b\nac'   then pause,end
-if strsubst('b\nac'    ,'/abb$/m'                              ,' ' ,'r') <>  'b\nac'   then pause,end
-if strsubst('ca\nb\n'   ,'/abb\Z/'                              ,' ' ,'r') <>  'ca\nb\n'  then pause,end
-if strsubst('ca\nb\n' ,'/abb\z/'                              ,' ' ,'r') <>  'ca\nb\n'  then pause,end
-if strsubst('ca\nb\n'  ,'/abb$/'                               ,' ' ,'r') <>  'ca\nb\n'  then pause,end
-if strsubst('b\nca\n' ,'/abb\Z/'                              ,' ' ,'r') <>  'b\nca\n'   then pause,end
-if strsubst('b\nca\n'   ,'/abb\z/'                              ,' ' ,'r') <>  'b\nca\n'   then pause,end
-if strsubst('b\nca\n'   ,'/abb$/'                               ,' ' ,'r') <>  'b\nca\n'   then pause,end
-if strsubst('b\nca'       ,'/abb\Z/'                              ,' ' ,'r') <>  'b\nca'   then pause,end
-if strsubst('b\nca'         ,'/abb\z/'                              ,' ' ,'r') <> 'b\nca'   then pause,end
-if strsubst('b\nca'        ,'/abb$/'                               ,' ' ,'r') <>  'b\nca'   then pause,end
-if strsubst('ca\nb\n'     ,'/abb\Z/m'                             ,' ' ,'r') <>  'ca\nb\n'   then pause,end
-if strsubst('ca\nb\n'   ,'/abb\z/m'                             ,' ' ,'r') <> 'ca\nb\n'   then pause,end
-if strsubst('ca\nb\n'    ,'/abb$/m'                              ,' ' ,'r') <> 'ca\nb\n'   then pause,end
-if strsubst('b\nca\n'     ,'/abb\Z/m'                             ,' ' ,'r') <>  'b\nca\n'   then pause,end
-if strsubst('b\nca\n'      ,'/abb\z/m'                             ,' ' ,'r') <>  'b\nca\n'   then pause,end
-if strsubst('b\nca\n'  ,'/abb$/m'                              ,' ' ,'r') <>  'b\nca\n'  then pause,end
-if strsubst('b\nca'       ,'/abb\Z/m'                             ,' ' ,'r') <>  'b\nca' then pause,end
-if strsubst('b\nca'       ,'/abb\z/m'                             ,' ' ,'r') <>  'b\nca'  then pause,end
-if strsubst('b\nca'            ,'/abb$/m'                              ,' ' ,'r') <>  'b\nca'  then pause,end
-if strsubst('aaab'        ,'/^(?=(a+?))\1ab/'                     ,' ' ,'r') <>  'aaab'   then pause,end
-if strsubst('aaab'             ,'/^(?=(a+?))\1ab/'                     ,' ' ,'r') <>  'aaab'   then pause,end
-if strsubst('abcd:'               ,'/([\w:]+::)?(\w+)$/'                  ,' ' ,'r') <>  'abcd:'   then pause,end
-if strsubst('abcd:'            ,'/([\w:]+::)?(\w+)$/'                  ,' ' ,'r') <>   'abcd:'  then pause,end
-if strsubst('aaab'                  ,'/(>a+)ab/'                            ,' ' ,'r') <>  'aaab'   then pause,end
+assert_checkequal( strsubst('......abef','/.*a(?!(b|cd)*e).*f/'                 ,' ' ,'r') ,  '......abef'  );
+assert_checkequal( strsubst('fools','/(foo|fool|x.|money|parted)$/'        ,' ' ,'r') ,  'fools'  );
+assert_checkequal( strsubst('fools','/(x.|foo|fool|x.|money|parted|y.)$/'  ,' ' ,'r') ,  'fools'  );
+assert_checkequal( strsubst('fools','/(foo|fool|money|parted)$/'           ,' ' ,'r') ,  'fools'  );
+assert_checkequal( strsubst('Oo','/^(o)(?!.*\1)/i'                      ,' ' ,'r') ,  'Oo'  );
+assert_checkequal( strsubst('AbCd','/ab(?i)cd/'                           ,' ' ,'r') ,  'AbCd'  );
+assert_checkequal( strsubst('a\nb\n','/a\Z/'                                ,' ' ,'r') , 'a\nb\n'  );
+assert_checkequal( strsubst('a\nb\n','/a\z/'                                ,' ' ,'r') , 'a\nb\n'  );
+assert_checkequal( strsubst('a\nb\n','/a$/'                                 ,' ' ,'r') ,  'a\nb\n' );
+assert_checkequal( strsubst('b\na\n','/a\z/'                                ,' ' ,'r') ,  'b\na\n'  );
+assert_checkequal( strsubst('a\nb\n','/a\Z/m'                               ,' ' ,'r') ,  'a\nb\n'  );
+assert_checkequal( strsubst('a\nb\n','/a\z/m'                               ,' ' ,'r') , 'a\nb\n'  );
+assert_checkequal( strsubst('b\na\n','/a\z/m'                               ,' ' ,'r') ,  'b\na\n'  );
+assert_checkequal( strsubst('aa\nb\n','/aa\Z/'                               ,' ' ,'r') ,  'aa\nb\n' );
+assert_checkequal( strsubst('aa\nb\n','/aa\z/'                               ,' ' ,'r') ,  'aa\nb\n'  );
+assert_checkequal( strsubst('aa\nb\n','/aa$/'                                ,' ' ,'r') ,  'aa\nb\n'  );
+assert_checkequal( strsubst('b\naa\n','/aa\z/'                               ,' ' ,'r') ,  'b\naa\n'  );
+assert_checkequal( strsubst('aa\nb\n','/aa\Z/m'                              ,' ' ,'r') ,  'aa\nb\n'  );
+assert_checkequal( strsubst('aa\nb\n','/aa\z/m'                              ,' ' ,'r') ,  'aa\nb\n'  );
+assert_checkequal( strsubst('b\naa\n','/aa\z/m'                              ,' ' ,'r') ,  'b\naa\n'  );
+assert_checkequal( strsubst('ac\nb\n','/aa\Z/'                               ,' ' ,'r') ,  'ac\nb\n'  );
+assert_checkequal( strsubst('ac\nb\n','/aa\z/'                               ,' ' ,'r') ,  'ac\nb\n'  );
+assert_checkequal( strsubst('ac\nb\n','/aa$/'                                ,' ' ,'r') ,  'ac\nb\n'  );
+assert_checkequal( strsubst('b\nac\n','/aa\Z/'                               ,' ' ,'r') ,  'b\nac\n'  );
+assert_checkequal( strsubst('b\nac\n','/aa\z/'                               ,' ' ,'r') ,  'b\nac\n'  );
+assert_checkequal( strsubst('b\nac\n','/aa$/'                                ,' ' ,'r') ,  'b\nac\n'  );
+assert_checkequal( strsubst('b\nac'  ,'/aa\Z/'                               ,' ' ,'r') ,  'b\nac'  );
+assert_checkequal( strsubst('b\nac'  ,'/aa\z/'                               ,' ' ,'r') ,  'b\nac'  );
+assert_checkequal( strsubst('b\nac'  ,'/aa$/'                                ,' ' ,'r') ,  'b\nac'  );
+assert_checkequal( strsubst('ac\nb\n','/aa\Z/m'                              ,' ' ,'r') ,  'ac\nb\n'  );
+assert_checkequal( strsubst('ac\nb\n','/aa\z/m'                              ,' ' ,'r') ,  'ac\nb\n'  );
+assert_checkequal( strsubst('ac\nb\n','/aa$/m'                               ,' ' ,'r') ,  'ac\nb\n'  );
+assert_checkequal( strsubst('b\nac\n','/aa\Z/m'                              ,' ' ,'r') ,  'b\nac\n' );
+assert_checkequal( strsubst('b\nac\n','/aa\z/m'                              ,' ' ,'r') ,  'b\nac\n'  );
+assert_checkequal( strsubst('b\nac\n','/aa$/m'                               ,' ' ,'r') ,  'b\nac\n' );
+assert_checkequal( strsubst('b\nac'  ,'/aa\Z/m'                              ,' ' ,'r') ,  'b\nac'  );
+assert_checkequal( strsubst('b\nac'  ,'/aa\z/m'                              ,' ' ,'r') ,  'b\nac'  );
+assert_checkequal( strsubst('b\nac'  ,'/aa$/m'                               ,' ' ,'r') ,  'b\nac' );
+assert_checkequal( strsubst('ca\nb\n','/aa\Z/'                               ,' ' ,'r') ,  'ca\nb\n'  );
+assert_checkequal( strsubst('ca\nb\n','/aa\z/'                               ,' ' ,'r') ,  'ca\nb\n'  );
+assert_checkequal( strsubst('ca\nb\n','/aa$/'                                ,' ' ,'r') ,  'ca\nb\n'  );
+assert_checkequal( strsubst('b\nca\n','/aa\Z/'                               ,' ' ,'r') ,  'b\nca\n'  );
+assert_checkequal( strsubst('b\nca\n','/aa\z/'                               ,' ' ,'r') ,  'b\nca\n' );
+assert_checkequal( strsubst('b\nca\n','/aa$/'                                ,' ' ,'r') ,  'b\nca\n'  );
+assert_checkequal( strsubst('b\nca'  ,'/aa\Z/'                               ,' ' ,'r') ,  'b\nca'   );
+assert_checkequal( strsubst('b\nca'  ,'/aa\z/'                               ,' ' ,'r') , 'b\nca'   );
+assert_checkequal( strsubst('b\nca'  ,'/aa$/'                                ,' ' ,'r') ,  'b\nca'  );
+assert_checkequal( strsubst('ca\nb\n','/aa\Z/m'                              ,' ' ,'r') , 'ca\nb\n'  );
+assert_checkequal( strsubst('ca\nb\n','/aa\z/m'                              ,' ' ,'r') ,  'ca\nb\n'  );
+assert_checkequal( strsubst('ca\nb\n','/aa$/m'                               ,' ' ,'r') ,  'ca\nb\n' );
+assert_checkequal( strsubst('b\nca\n','/aa\Z/m'                              ,' ' ,'r') , 'b\nca\n'  );
+assert_checkequal( strsubst('b\nca\n','/aa\z/m'                              ,' ' ,'r') , 'b\nca\n'  );
+assert_checkequal( strsubst('b\nca\n','/aa$/m'                               ,' ' ,'r') , 'b\nca\n'  );
+assert_checkequal( strsubst('b\nca'  ,'/aa\Z/m'                              ,' ' ,'r') ,  'b\nca'  );
+assert_checkequal( strsubst('b\nca'  ,'/aa\z/m'                              ,' ' ,'r') ,  'b\nca'   );
+assert_checkequal( strsubst('b\nca'  ,'/aa$/m'                               ,' ' ,'r') ,  'b\nca'   );
+assert_checkequal( strsubst('ab\nb\n','/ab\Z/'                               ,' ' ,'r') ,  'ab\nb\n'  );
+assert_checkequal( strsubst('ab\nb\n','/ab\z/'                               ,' ' ,'r') ,  'ab\nb\n' );
+assert_checkequal( strsubst('ab\nb\n','/ab$/'                                ,' ' ,'r') , 'ab\nb\n'  );
+assert_checkequal( strsubst('b\nab\n','/ab\z/'                               ,' ' ,'r') ,  'b\nab\n' );
+assert_checkequal( strsubst('ab\nb\n','/ab\Z/m'                              ,' ' ,'r') ,  'ab\nb\n'  );
+assert_checkequal( strsubst('ab\nb\n','/ab\z/m'                              ,' ' ,'r') ,  'ab\nb\n'  );
+assert_checkequal( strsubst('b\nab\n','/ab\z/m'                              ,' ' ,'r') , 'b\nab\n'  );
+assert_checkequal( strsubst('ac\nb\n','/ab\Z/'                               ,' ' ,'r') , 'ac\nb\n'  );
+assert_checkequal( strsubst('ac\nb\n','/ab\z/'                               ,' ' ,'r') , 'ac\nb\n' );
+assert_checkequal( strsubst('ac\nb\n','/ab$/'                                ,' ' ,'r') ,  'ac\nb\n'  );
+assert_checkequal( strsubst('b\nac\n','/ab\Z/'                               ,' ' ,'r') ,  'b\nac\n'  );
+assert_checkequal( strsubst('b\nac\n','/ab\z/'                               ,' ' ,'r') ,  'b\nac\n' );
+assert_checkequal( strsubst('b\nac\n','/ab$/'                                ,' ' ,'r') ,  'b\nac\n'  );
+assert_checkequal( strsubst('b\nac'  ,'/ab\Z/'                               ,' ' ,'r') ,  'b\nac'  );
+assert_checkequal( strsubst('b\nac'  ,'/ab\z/'                               ,' ' ,'r') ,  'b\nac' );
+assert_checkequal( strsubst('b\nac'  ,'/ab$/'                                ,' ' ,'r') , 'b\nac' );
+assert_checkequal( strsubst('ac\nb\n','/ab\Z/m'                              ,' ' ,'r') ,  'ac\nb\n'  );
+assert_checkequal( strsubst('ac\nb\n','/ab\z/m'                              ,' ' ,'r') , 'ac\nb\n'  );
+assert_checkequal( strsubst('ac\nb\n','/ab$/m'                               ,' ' ,'r') ,  'ac\nb\n'  );
+assert_checkequal( strsubst('b\nac\n','/ab\Z/m'                              ,' ' ,'r') , 'b\nac\n'  );
+assert_checkequal( strsubst('b\nac\n','/ab\z/m'                              ,' ' ,'r') , 'b\nac\n' );
+assert_checkequal( strsubst('b\nac\n','/ab$/m'                               ,' ' ,'r') ,  'b\nac\n'  );
+assert_checkequal( strsubst('b\nac'  ,'/ab\Z/m'                              ,' ' ,'r') ,  'b\nac'   );
+assert_checkequal( strsubst('b\nac'  ,'/ab\z/m'                              ,' ' ,'r') ,  'b\nac'  );
+assert_checkequal( strsubst('b\nac'  ,'/ab$/m'                               ,' ' ,'r') ,  'b\nac'   );
+assert_checkequal( strsubst('ca\nb\n','/ab\Z/'                               ,' ' ,'r') ,  'ca\nb\n' );
+assert_checkequal( strsubst('ca\nb\n','/ab\z/'                               ,' ' ,'r') ,  'ca\nb\n'  );
+assert_checkequal( strsubst('ca\nb\n','/ab$/'                                ,' ' ,'r') ,  'ca\nb\n'  );
+assert_checkequal( strsubst('b\nca\n','/ab\Z/'                               ,' ' ,'r') ,  'b\nca\n'  );
+assert_checkequal( strsubst('b\nca\n','/ab\z/'                               ,' ' ,'r') , 'b\nca\n'  );
+assert_checkequal( strsubst('b\nca\n','/ab$/'                                ,' ' ,'r') ,  'b\nca\n'  );
+assert_checkequal( strsubst('b\nca'  ,'/ab\Z/'                               ,' ' ,'r') ,  'b\nca'  );
+assert_checkequal( strsubst('b\nca'  ,'/ab\z/'                               ,' ' ,'r') ,  'b\nca'  );
+assert_checkequal( strsubst('b\nca'  ,'/ab$/'                                ,' ' ,'r') , 'b\nca'  );
+assert_checkequal( strsubst('ca\nb\n','/ab\Z/m'                              ,' ' ,'r') ,  'ca\nb\n'  );
+assert_checkequal( strsubst('ca\nb\n','/ab\z/m'                              ,' ' ,'r') ,  'ca\nb\n' );
+assert_checkequal( strsubst('ca\nb\n','/ab$/m'                               ,' ' ,'r') , 'ca\nb\n'  );
+assert_checkequal( strsubst('b\nca\n','/ab\Z/m'                              ,' ' ,'r') , 'b\nca\n' );
+assert_checkequal( strsubst('b\nca\n' ,'/ab\z/m'                              ,' ' ,'r') , 'b\nca\n'  );
+assert_checkequal( strsubst('b\nca\n','/ab$/m'                               ,' ' ,'r') ,  'b\nca\n'  );
+assert_checkequal( strsubst('b\nca'     ,'/ab\Z/m'                              ,' ' ,'r') , 'b\nca'   );
+assert_checkequal( strsubst('b\nca'     ,'/ab\z/m'                              ,' ' ,'r') ,  'b\nca'   );
+assert_checkequal( strsubst('b\nca'     ,'/ab$/m'                               ,' ' ,'r') ,  'b\nca'   );
+assert_checkequal( strsubst('abb\nb\n'  ,'/abb\Z/'                              ,' ' ,'r') ,  'abb\nb\n'  );
+assert_checkequal( strsubst('abb\nb\n'  ,'/abb\z/'                              ,' ' ,'r') ,  'abb\nb\n'  );
+assert_checkequal( strsubst('abb\nb\n'  ,'/abb$/'                               ,' ' ,'r') ,  'abb\nb\n'  );
+assert_checkequal( strsubst('b\nabb\n'  ,'/abb\z/'                              ,' ' ,'r') ,  'b\nabb\n'   );
+assert_checkequal( strsubst('abb\nb\n'  ,'/abb\Z/m'                             ,' ' ,'r') , 'abb\nb\n'  );
+assert_checkequal( strsubst('abb\nb\n'  ,'/abb\z/m'                             ,' ' ,'r') ,  'abb\nb\n'  );
+assert_checkequal( strsubst('b\nabb\n','/abb\z/m'                             ,' ' ,'r') ,  'b\nabb\n'  );
+assert_checkequal( strsubst('ac\nb\n'  ,'/abb\Z/'                              ,' ' ,'r') ,  'ac\nb\n'  );
+assert_checkequal( strsubst('ac\nb\n'  ,'/abb\z/'                              ,' ' ,'r') ,  'ac\nb\n' );
+assert_checkequal( strsubst('ac\nb\n'  ,'/abb$/'                               ,' ' ,'r') , 'ac\nb\n'  );
+assert_checkequal( strsubst('b\nac\n' ,'/abb\Z/'                              ,' ' ,'r') , 'b\nac\n'  );
+assert_checkequal( strsubst('b\nac\n'  ,'/abb\z/'                              ,' ' ,'r') ,  'b\nac\n' );
+assert_checkequal( strsubst('b\nac\n'   ,'/abb$/'                               ,' ' ,'r') ,  'b\nac\n'  );
+assert_checkequal( strsubst('b\nac'     ,'/abb\Z/'                              ,' ' ,'r') ,  'b\nac'  );
+assert_checkequal( strsubst('b\nac'   ,'/abb\z/'                              ,' ' ,'r') , 'b\nac'  );
+assert_checkequal( strsubst('b\nac'   ,'/abb$/'                               ,' ' ,'r') ,  'b\nac'  );
+assert_checkequal( strsubst('ac\nb\n'   ,'/abb\Z/m'                             ,' ' ,'r') ,  'ac\nb\n'   );
+assert_checkequal( strsubst('ac\nb\n'     ,'/abb\z/m'                             ,' ' ,'r') , 'ac\nb\n'   );
+assert_checkequal( strsubst('ac\nb\n'  ,'/abb$/m'                              ,' ' ,'r') ,  'ac\nb\n'  );
+assert_checkequal( strsubst('b\nac\n' ,'/abb\Z/m'                             ,' ' ,'r') ,  'b\nac\n'   );
+assert_checkequal( strsubst('b\nac\n'    ,'/abb\z/m'                             ,' ' ,'r') , 'b\nac\n'   );
+assert_checkequal( strsubst('b\nac\n'    ,'/abb$/m'                              ,' ' ,'r') ,  'b\nac\n'   );
+assert_checkequal( strsubst('b\nac'     ,'/abb\Z/m'                             ,' ' ,'r') ,  'b\nac'   );
+assert_checkequal( strsubst('b\nac'   ,'/abb\z/m'                             ,' ' ,'r') ,  'b\nac'   );
+assert_checkequal( strsubst('b\nac'    ,'/abb$/m'                              ,' ' ,'r') ,  'b\nac'   );
+assert_checkequal( strsubst('ca\nb\n'   ,'/abb\Z/'                              ,' ' ,'r') ,  'ca\nb\n'  );
+assert_checkequal( strsubst('ca\nb\n' ,'/abb\z/'                              ,' ' ,'r') ,  'ca\nb\n'  );
+assert_checkequal( strsubst('ca\nb\n'  ,'/abb$/'                               ,' ' ,'r') ,  'ca\nb\n'  );
+assert_checkequal( strsubst('b\nca\n' ,'/abb\Z/'                              ,' ' ,'r') ,  'b\nca\n'   );
+assert_checkequal( strsubst('b\nca\n'   ,'/abb\z/'                              ,' ' ,'r') ,  'b\nca\n'   );
+assert_checkequal( strsubst('b\nca\n'   ,'/abb$/'                               ,' ' ,'r') ,  'b\nca\n'   );
+assert_checkequal( strsubst('b\nca'       ,'/abb\Z/'                              ,' ' ,'r') ,  'b\nca'   );
+assert_checkequal( strsubst('b\nca'         ,'/abb\z/'                              ,' ' ,'r') , 'b\nca'   );
+assert_checkequal( strsubst('b\nca'        ,'/abb$/'                               ,' ' ,'r') ,  'b\nca'   );
+assert_checkequal( strsubst('ca\nb\n'     ,'/abb\Z/m'                             ,' ' ,'r') ,  'ca\nb\n'   );
+assert_checkequal( strsubst('ca\nb\n'   ,'/abb\z/m'                             ,' ' ,'r') , 'ca\nb\n'   );
+assert_checkequal( strsubst('ca\nb\n'    ,'/abb$/m'                              ,' ' ,'r') , 'ca\nb\n'   );
+assert_checkequal( strsubst('b\nca\n'     ,'/abb\Z/m'                             ,' ' ,'r') ,  'b\nca\n'   );
+assert_checkequal( strsubst('b\nca\n'      ,'/abb\z/m'                             ,' ' ,'r') ,  'b\nca\n'   );
+assert_checkequal( strsubst('b\nca\n'  ,'/abb$/m'                              ,' ' ,'r') ,  'b\nca\n'  );
+assert_checkequal( strsubst('b\nca'       ,'/abb\Z/m'                             ,' ' ,'r') ,  'b\nca' );
+assert_checkequal( strsubst('b\nca'       ,'/abb\z/m'                             ,' ' ,'r') ,  'b\nca'  );
+assert_checkequal( strsubst('b\nca'            ,'/abb$/m'                              ,' ' ,'r') ,  'b\nca'  );
+assert_checkequal( strsubst('aaab'        ,'/^(?=(a+?))\1ab/'                     ,' ' ,'r') ,  'aaab'   );
+assert_checkequal( strsubst('aaab'             ,'/^(?=(a+?))\1ab/'                     ,' ' ,'r') ,  'aaab'   );
+assert_checkequal( strsubst('abcd:'               ,'/([\w:]+::)?(\w+)$/'                  ,' ' ,'r') ,  'abcd:'   );
+assert_checkequal( strsubst('abcd:'            ,'/([\w:]+::)?(\w+)$/'                  ,' ' ,'r') ,   'abcd:'  );
+assert_checkequal( strsubst('aaab'                  ,'/(>a+)ab/'                            ,' ' ,'r') ,  'aaab'   );
 //======================================================================================== 
 v = "世界您好";
 c = "您";
-if strsubst(v,c,'ç')<>'世界ç好' then pause,end
+assert_checkequal( strsubst(v,c,'ç'),'世界ç好' );
 
 v = "азеазея";
 c = "з";
-if strsubst(v,c,'ç')<>'аçеаçея'  then pause,end
+assert_checkequal( strsubst(v,c,'ç'),'аçеаçея'  );
 
 v = "ድቅስድቅስግ";
 c = "ቅ";
-if strsubst(v,c,'ç')<> 'ድçስድçስግ'  then pause,end
+assert_checkequal( strsubst(v,c,'ç'), 'ድçስድçስግ'  );
 
 v = "ハロー・ワールド";
 c = "ド";
-if strsubst(v,c,'ç')<> 'ハロー・ワールç'  then pause,end
+assert_checkequal( strsubst(v,c,'ç'), 'ハロー・ワールç'  );
 
 v = "เฮลโลเวิลด์";
 c = "เ"; 
-if strsubst(v,c,'ç')<> 'çฮลโลçวิลด์' then pause,end
+assert_checkequal( strsubst(v,c,'ç'), 'çฮลโลçวิลด์' );
 
 v = "حريات وحقوق";
 c = "قوق";
-if strsubst(v,c,'ç')<> 'حريات وحç'  then pause,end
+assert_checkequal( strsubst(v,c,'ç'), 'حريات وحç'  );
 
 v = "ഹലോ വേള്‍ഡ";
 c = "‍ഡ"; 
-if strsubst(v,c,'ç')<>'ഹലോ വേള്ç'  then pause,end
+assert_checkequal( strsubst(v,c,'ç'),'ഹലോ വേള്ç'  );
 
 v = "תוכנית";
 c = "י";
-if strsubst(v,c,'ç')<>'תוכנçת'  then pause,end
+assert_checkequal( strsubst(v,c,'ç'),'תוכנçת'  );
 //===============================
 // Chinese
 str = '世界您好';
-if strsubst(str,'/^世界/','ç','r') <> 'ç您好' then pause,end
+assert_checkequal( strsubst(str,'/^世界/','ç','r') , 'ç您好' );
 
-if strsubst(str,'/世界$/','ç','r') <> str then pause,end
+assert_checkequal( strsubst(str,'/世界$/','ç','r') , str );
 
-if strsubst(str,'/您好$/','ç','r') <> '世界ç' then pause,end
+assert_checkequal( strsubst(str,'/您好$/','ç','r') , '世界ç' );
 
-if strsubst(str,'/^您好/','ç','r') <> str then pause,end
+assert_checkequal( strsubst(str,'/^您好/','ç','r') , str );
 
-if strsubst(str,'/界您/','ç','r') <> '世ç好' then pause,end
+assert_checkequal( strsubst(str,'/界您/','ç','r') , '世ç好' );
 
-if strsubst(str,'/界_您/','ç','r') <> str then pause,end
+assert_checkequal( strsubst(str,'/界_您/','ç','r') , str );
 //======================================================================================== 
 // Russian
 str = 'привет мир';
-if strsubst(str,'/^привет/','ç','r') <> 'ç мир' then pause,end
+assert_checkequal( strsubst(str,'/^привет/','ç','r') , 'ç мир' );
 
-if strsubst(str,'/привет$/','ç','r') <> str then pause,end
+assert_checkequal( strsubst(str,'/привет$/','ç','r') , str );
 
-if strsubst(str,'/мир$/','ç','r') <> 'привет ç' then pause,end
+assert_checkequal( strsubst(str,'/мир$/','ç','r') , 'привет ç' );
 
-if strsubst(str,'/^мир/','ç','r') <> str then pause,end
+assert_checkequal( strsubst(str,'/^мир/','ç','r') , str );
 
-if strsubst(str,'/вет\sм/','ç','r') <> 'приçир' then pause,end
+assert_checkequal( strsubst(str,'/вет\sм/','ç','r') , 'приçир' );
 
-if strsubst(str,'/вет_м/','ç','r') <> 'привет мир' then pause,end
+assert_checkequal( strsubst(str,'/вет_м/','ç','r') , 'привет мир' );
 //======================================================================================== 
 // Cyrilic
 str = 'АБВГДЄЖЅЗИІКЛМНОПҀРСТѸФХѠЦЧШЩЪЪІЬѢЮѦѨѪѬѮѰѲѴѤ';
 
-if strsubst(str,'/^АБВГДЄЖЅЗИІКЛМНОПҀР/','ç','r') <> 'çСТѸФХѠЦЧШЩЪЪІЬѢЮѦѨѪѬѮѰѲѴѤ' then pause,end
+assert_checkequal( strsubst(str,'/^АБВГДЄЖЅЗИІКЛМНОПҀР/','ç','r') , 'çСТѸФХѠЦЧШЩЪЪІЬѢЮѦѨѪѬѮѰѲѴѤ' );
 
-if strsubst(str,'/АБВГДЄЖЅЗИІКЛМНОПҀР$/','ç','r') <> str then pause,end
+assert_checkequal( strsubst(str,'/АБВГДЄЖЅЗИІКЛМНОПҀР$/','ç','r') , str );
 
-if strsubst(str,'/ЧШЩЪЪІЬѢЮѦѨѪѬѮѰѲѴѤ$/','ç','r') <> 'АБВГДЄЖЅЗИІКЛМНОПҀРСТѸФХѠЦç' then pause,end
+assert_checkequal( strsubst(str,'/ЧШЩЪЪІЬѢЮѦѨѪѬѮѰѲѴѤ$/','ç','r') , 'АБВГДЄЖЅЗИІКЛМНОПҀРСТѸФХѠЦç' );
 
-if strsubst(str,'/^ЧШЩЪЪІЬѢЮѦѨѪѬѮѰѲѴѤ/','ç','r') <> str then pause,end
+assert_checkequal( strsubst(str,'/^ЧШЩЪЪІЬѢЮѦѨѪѬѮѰѲѴѤ/','ç','r') , str );
 
-if strsubst(str,'/ИІКЛМНОПҀРСТѸФХѠЦЧШЩЪ/','ç','r') <> 'АБВГДЄЖЅЗçЪІЬѢЮѦѨѪѬѮѰѲѴѤ' then pause,end
+assert_checkequal( strsubst(str,'/ИІКЛМНОПҀРСТѸФХѠЦЧШЩЪ/','ç','r') , 'АБВГДЄЖЅЗçЪІЬѢЮѦѨѪѬѮѰѲѴѤ' );
 
-if strsubst(str,'/ИІКЛМНОПҀ_РСТѸФХѠЦЧШЩЪ/','ç','r') <> str then pause,end
+assert_checkequal( strsubst(str,'/ИІКЛМНОПҀ_РСТѸФХѠЦЧШЩЪ/','ç','r') , str );
 //======================================================================================== 
 // Japanese
 str = '丑丞串乃之乎也云亘亙些亦亥亨亮仔伊伎伍伽佃佑伶侃侑俄侠俣俐侶倭俺倶倦倖偲僅傭儲允兎兜其冥冴冶凄凌凜凛凧凪凰凱函刹劉劫勁勃';
 
-if strsubst(str,'/^丑丞串乃之乎也云亘亙些亦/','ç','r') <> 'ç亥亨亮仔伊伎伍伽佃佑伶侃侑俄侠俣俐侶倭俺倶倦倖偲僅傭儲允兎兜其冥冴冶凄凌凜凛凧凪凰凱函刹劉劫勁勃' then pause,end
+assert_checkequal( strsubst(str,'/^丑丞串乃之乎也云亘亙些亦/','ç','r') , 'ç亥亨亮仔伊伎伍伽佃佑伶侃侑俄侠俣俐侶倭俺倶倦倖偲僅傭儲允兎兜其冥冴冶凄凌凜凛凧凪凰凱函刹劉劫勁勃' );
+assert_checkequal( strsubst(str,'/丑丞串乃之乎也云亘亙些亦$/','ç','r') , str );
 
-if strsubst(str,'/丑丞串乃之乎也云亘亙些亦$/','ç','r') <> str then pause,end
+assert_checkequal( strsubst(str,'/凰凱函刹劉劫勁勃$/','ç','r') , '丑丞串乃之乎也云亘亙些亦亥亨亮仔伊伎伍伽佃佑伶侃侑俄侠俣俐侶倭俺倶倦倖偲僅傭儲允兎兜其冥冴冶凄凌凜凛凧凪ç' );
 
-if strsubst(str,'/凰凱函刹劉劫勁勃$/','ç','r') <> '丑丞串乃之乎也云亘亙些亦亥亨亮仔伊伎伍伽佃佑伶侃侑俄侠俣俐侶倭俺倶倦倖偲僅傭儲允兎兜其冥冴冶凄凌凜凛凧凪ç' then pause,end
+assert_checkequal( strsubst(str,'/^凰凱函刹劉劫勁勃/','ç','r') , str );
 
-if strsubst(str,'/^凰凱函刹劉劫勁勃/','ç','r') <> str then pause,end
+assert_checkequal( strsubst(str,'/亨亮仔伊伎伍伽佃佑伶侃/','ç','r') , '丑丞串乃之乎也云亘亙些亦亥ç侑俄侠俣俐侶倭俺倶倦倖偲僅傭儲允兎兜其冥冴冶凄凌凜凛凧凪凰凱函刹劉劫勁勃' );
 
-if strsubst(str,'/亨亮仔伊伎伍伽佃佑伶侃/','ç','r') <> '丑丞串乃之乎也云亘亙些亦亥ç侑俄侠俣俐侶倭俺倶倦倖偲僅傭儲允兎兜其冥冴冶凄凌凜凛凧凪凰凱函刹劉劫勁勃' then pause,end
-
-if strsubst(str,'/亨亮仔伊_伎伍伽佃佑伶侃/','ç','r') <> str then pause,end
+assert_checkequal( strsubst(str,'/亨亮仔伊_伎伍伽佃佑伶侃/','ç','r') , str );
 //======================================================================================== 
 // Thaï
 str = 'มกระดุกกระดิก';
-if strsubst(str,'/^มกระดุกกร/','ç','r')<>'çะดิก' then pause,end
+assert_checkequal( strsubst(str,'/^มกระดุกกร/','ç','r'),'çะดิก' );
 
-if strsubst(str,'/มกระดุกกร$/','ç','r') <> str then pause,end
+assert_checkequal( strsubst(str,'/มกระดุกกร$/','ç','r') , str );
 
-if strsubst(str,'/กกระดิก$/','ç','r')<>'มกระดุç' then pause,end
+assert_checkequal( strsubst(str,'/กกระดิก$/','ç','r'),'มกระดุç' );
 
-if strsubst(str,'/^กกระดิก/','ç','r') <> str then pause,end
+assert_checkequal( strsubst(str,'/^กกระดิก/','ç','r') , str );
 
-if strsubst(str,'/ดุกก/','ç','r')<>'มกระçระดิก' then pause,end
+assert_checkequal( strsubst(str,'/ดุกก/','ç','r'),'มกระçระดิก' );
 
-if strsubst(str,'/ดุก_ก/','ç','r') <> str then pause,end
+assert_checkequal( strsubst(str,'/ดุก_ก/','ç','r') , str );
 //========================================================================================