bug 8732 fixed - strchr and strrchr did not work with a non-ASCII character needle. 69/2869/3
Allan CORNET [Fri, 7 Jan 2011 10:37:26 +0000 (11:37 +0100)]
Change-Id: I5f7fa57c8113d9c8f17dd4330ebd694a705b8399

13 files changed:
scilab/CHANGES_5.3.X
scilab/modules/api_scilab/src/cpp/api_string.cpp
scilab/modules/string/Makefile.am
scilab/modules/string/Makefile.in
scilab/modules/string/includes/gw_string.h
scilab/modules/string/sci_gateway/c/gw_string.c
scilab/modules/string/sci_gateway/c/sci_strchr.c
scilab/modules/string/sci_gateway/c/sci_strrchr.c [deleted file]
scilab/modules/string/src/c/string.vcproj
scilab/modules/string/src/c/stringsstrrchr.c
scilab/modules/string/src/c/stringsstrrchr.h
scilab/modules/string/tests/nonreg_tests/bug_8732.dia.ref [new file with mode: 0644]
scilab/modules/string/tests/nonreg_tests/bug_8732.tst [new file with mode: 0644]

index 6138061..ab67fd3 100644 (file)
@@ -20,7 +20,7 @@ Removed functions (previously declared as obsolete):
 Documentation:
 ==============
 
-* In an example in the documentation, when an undocumented function is used, 
+* In an example in the documentation, when an undocumented function is used,
 trigger a warning and do not add a link on the function name.
 
 * bug 7069 fixed - Old documentation about the documentation build process
@@ -71,7 +71,7 @@ Graphics:
 GUI:
 ====
 
-* bug 8203 fixed - It was not possible to close the fontchooser or the 
+* bug 8203 fixed - It was not possible to close the fontchooser or the
                    colorchooser with the escape key.
 
 Quality assurance:
@@ -99,12 +99,14 @@ Scilab:
 Bug fixes:
 ==========
 
-* bug 7691 fixed - Giving complex arguments to inverse degree trigonometric 
+* bug 7691 fixed - Giving complex arguments to inverse degree trigonometric
                    functions produced inconsistent results.
 
 * bug 8492 fixed - When the documentation was generated, error messages were not
                    displayed in the console but in the terminal.
 
+* bug 8732 fixed - strchr and strrchr did not work with a non-ASCII character needle.
+
 
             Changes between version 5.3.0-beta-5 and 5.3.0 of Scilab
             ========================================================
@@ -124,7 +126,7 @@ Xcos:
 
 * bug 8407 fixed - The blocks was always resized after a parameters edition.
 
-* bug 8441 fixed - "xcos_block" abstract block were not removed on the 
+* bug 8441 fixed - "xcos_block" abstract block were not removed on the
                    compilation.
 
 * bug 8483 fixed - Multiplying a scalar and vector using the MATMUL block did not
index b1d4abc..64faa49 100644 (file)
@@ -576,7 +576,7 @@ int getAllocatedMatrixOfWideString(void* _pvCtx, int* _piAddress, int* _piRows,
 
        for(i = 0 ; i < *_piRows * *_piCols ; i++)
        {
-               *_pwstData[i] = (wchar_t*)MALLOC(sizeof(wchar_t) * (piLen[i] + 1));//+1 for null termination
+               (*_pwstData)[i] = (wchar_t*)MALLOC(sizeof(wchar_t) * (piLen[i] + 1));//+1 for null termination
        }
 
        sciErr = getMatrixOfWideString(_pvCtx, _piAddress, _piRows, _piCols, piLen, *_pwstData);
index 0186b05..8df2d12 100644 (file)
@@ -53,7 +53,6 @@ sci_gateway/c/sci_isascii.c \
 sci_gateway/c/sci_strchr.c \
 sci_gateway/c/sci_strcspn.c \
 sci_gateway/c/sci_strncpy.c \
-sci_gateway/c/sci_strrchr.c \
 sci_gateway/c/sci_strrev.c \
 sci_gateway/c/sci_strspn.c \
 sci_gateway/c/sci_strstr.c \
index e0264a2..5489951 100644 (file)
@@ -147,10 +147,9 @@ am__objects_3 = libscistring_la-gw_string.lo \
        libscistring_la-sci_isalphanum.lo \
        libscistring_la-sci_isascii.lo libscistring_la-sci_strchr.lo \
        libscistring_la-sci_strcspn.lo libscistring_la-sci_strncpy.lo \
-       libscistring_la-sci_strrchr.lo libscistring_la-sci_strrev.lo \
-       libscistring_la-sci_strspn.lo libscistring_la-sci_strstr.lo \
-       libscistring_la-sci_strtod.lo libscistring_la-sci_strtok.lo \
-       libscistring_la-sci_regexp.lo
+       libscistring_la-sci_strrev.lo libscistring_la-sci_strspn.lo \
+       libscistring_la-sci_strstr.lo libscistring_la-sci_strtod.lo \
+       libscistring_la-sci_strtok.lo libscistring_la-sci_regexp.lo
 am__objects_4 = sci_string.lo strops.lo
 am_libscistring_la_OBJECTS = $(am__objects_1) $(am__objects_2) \
        $(am__objects_3) $(am__objects_4)
@@ -481,7 +480,6 @@ sci_gateway/c/sci_isascii.c \
 sci_gateway/c/sci_strchr.c \
 sci_gateway/c/sci_strcspn.c \
 sci_gateway/c/sci_strncpy.c \
-sci_gateway/c/sci_strrchr.c \
 sci_gateway/c/sci_strrev.c \
 sci_gateway/c/sci_strspn.c \
 sci_gateway/c/sci_strstr.c \
@@ -697,7 +695,6 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscistring_la-sci_string.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscistring_la-sci_stripblanks.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscistring_la-sci_strncpy.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscistring_la-sci_strrchr.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscistring_la-sci_strrev.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscistring_la-sci_strsplit.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscistring_la-sci_strspn.Plo@am__quote@
@@ -1067,13 +1064,6 @@ libscistring_la-sci_strncpy.lo: sci_gateway/c/sci_strncpy.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscistring_la_CFLAGS) $(CFLAGS) -c -o libscistring_la-sci_strncpy.lo `test -f 'sci_gateway/c/sci_strncpy.c' || echo '$(srcdir)/'`sci_gateway/c/sci_strncpy.c
 
-libscistring_la-sci_strrchr.lo: sci_gateway/c/sci_strrchr.c
-@am__fastdepCC_TRUE@   $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscistring_la_CFLAGS) $(CFLAGS) -MT libscistring_la-sci_strrchr.lo -MD -MP -MF $(DEPDIR)/libscistring_la-sci_strrchr.Tpo -c -o libscistring_la-sci_strrchr.lo `test -f 'sci_gateway/c/sci_strrchr.c' || echo '$(srcdir)/'`sci_gateway/c/sci_strrchr.c
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/libscistring_la-sci_strrchr.Tpo $(DEPDIR)/libscistring_la-sci_strrchr.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='sci_gateway/c/sci_strrchr.c' object='libscistring_la-sci_strrchr.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscistring_la_CFLAGS) $(CFLAGS) -c -o libscistring_la-sci_strrchr.lo `test -f 'sci_gateway/c/sci_strrchr.c' || echo '$(srcdir)/'`sci_gateway/c/sci_strrchr.c
-
 libscistring_la-sci_strrev.lo: sci_gateway/c/sci_strrev.c
 @am__fastdepCC_TRUE@   $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscistring_la_CFLAGS) $(CFLAGS) -MT libscistring_la-sci_strrev.lo -MD -MP -MF $(DEPDIR)/libscistring_la-sci_strrev.Tpo -c -o libscistring_la-sci_strrev.lo `test -f 'sci_gateway/c/sci_strrev.c' || echo '$(srcdir)/'`sci_gateway/c/sci_strrev.c
 @am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/libscistring_la-sci_strrev.Tpo $(DEPDIR)/libscistring_la-sci_strrev.Plo
index 3efc3ae..0f0bd75 100644 (file)
@@ -15,6 +15,7 @@
 #define __GW_STRING__
 #include "api_scilab.h"
 #include "dynlib_string.h"
+#include "BOOL.h"
 
 /*--------------------------------------------------------------------------*/ 
 STRING_IMPEXP int gw_string(void);
@@ -41,7 +42,6 @@ STRING_IMPEXP int sci_isalphanum(char *fname,unsigned long fname_len);
 STRING_IMPEXP int sci_isascii(char *fname,unsigned long fname_len);
 STRING_IMPEXP int sci_strcspn(char *fname,unsigned long fname_len);
 STRING_IMPEXP int sci_strncpy(char *fname,unsigned long fname_len);
-STRING_IMPEXP int sci_strrchr(char *fname,unsigned long fname_len);
 STRING_IMPEXP int sci_strchr(char *fname,unsigned long fname_len);
 STRING_IMPEXP int sci_strstr(char *fname,unsigned long fname_len);
 STRING_IMPEXP int sci_strrev(char *fname,unsigned long fname_len);
index fe63c01..9dbdc2d 100644 (file)
@@ -40,7 +40,7 @@ static gw_generic_table Tab[] =
        {sci_isascii,"isascii"},
        {sci_strcspn,"strcspn"},
        {sci_strncpy,"strncpy"},
-       {sci_strrchr,"strrchr"},
+       {sci_strchr,"strrchr"},
        {sci_strchr,"strchr"},
        {sci_strstr,"strstr"},
        {sci_strrev,"strrev"},
index 52325bb..fc2bfa3 100644 (file)
 #include "freeArrayOfString.h"
 #include "stringsstrrchr.h"
 /*----------------------------------------------------------------------------*/
-int sci_strchr(char *fname,unsigned long fname_len)
+static wchar_t **getInputArgumentAsMatrixOfWideString(void* _pvCtx, int _iVar,
+                                       const char *fname,
+                                       int *m, int *n, int *iErr);
+/*----------------------------------------------------------------------------*/
+int sci_strchr(char *fname, unsigned long fname_len)
+{
+    SciErr sciErr;
+    int iErr = 0;
+
+    wchar_t **pStrVarOne = NULL;
+    int m1 = 0; int n1 = 0;
+
+    wchar_t **pStrVarTwo = NULL;
+    int m2 = 0; int n2 = 0;
+
+    int i = 0;
+    BOOL do_strchr = (strcmp(fname, "strchr") == 0);
+
+    wchar_t **wcOutput_Strings = NULL;
+
+    pStrVarOne = getInputArgumentAsMatrixOfWideString(pvApiCtx, 1, fname, &m1, &n1, &iErr);
+    if (iErr) return 0;
+
+    pStrVarTwo = getInputArgumentAsMatrixOfWideString(pvApiCtx, 2, fname, &m2, &n2, &iErr);
+    if (iErr) 
+    {
+        if (pStrVarOne) {freeAllocatedMatrixOfWideString(m1, n1, pStrVarOne); pStrVarOne = NULL;}
+        return 0;
+    }
+
+    for (i = 0; i < m2 * n2; i++)
+    {
+               if (wcslen(pStrVarTwo[i]) != 1)
+        {
+            if (pStrVarOne) {freeAllocatedMatrixOfWideString(m1, n1, pStrVarOne); pStrVarOne = NULL;}
+            if (pStrVarTwo) {freeAllocatedMatrixOfWideString(m2, n2, pStrVarTwo); pStrVarTwo = NULL;}
+            Scierror(999, _("%s: Wrong size for input argument #%d: A character expected.\n"), fname, 2);
+            return 0;
+        }
+    }
+
+    wcOutput_Strings = strings_wcsrchr(pStrVarOne, m1 * n1, pStrVarTwo, m2 * n2, do_strchr);
+    if (pStrVarOne) {freeAllocatedMatrixOfWideString(m1, n1, pStrVarOne); pStrVarOne = NULL;}
+    if (pStrVarTwo) {freeAllocatedMatrixOfWideString(m2, n2, pStrVarTwo); pStrVarTwo = NULL;}
+
+    if (wcOutput_Strings)
+    {
+        sciErr = createMatrixOfWideString(pvApiCtx, Rhs + 1 , m1, n1, wcOutput_Strings);
+
+        if (wcOutput_Strings) {freeAllocatedMatrixOfWideString(m1, n1, wcOutput_Strings); wcOutput_Strings = NULL;}
+
+        if(sciErr.iErr)
+        {
+            printError(&sciErr, 0);
+            return 0;
+        }
+
+        LhsVar(1) = Rhs+1 ;
+        C2F(putlhsvar)();
+    }
+    else
+    {
+        Scierror(999,_("%s: No more memory.\n"), fname);
+    }
+    return 0;
+}
+/*----------------------------------------------------------------------------*/
+static wchar_t **getInputArgumentAsMatrixOfWideString(void* _pvCtx, int _iVar,
+                                       const char *fname,
+                                       int *m, int *n, int *iErr)
 {
-       CheckRhs(2,2);
-       CheckLhs(0,1);
-
-       if ( (GetType(1) == sci_strings) && (GetType(2) == sci_strings) )
-       {
-               int m1 = 0, n1 = 0;
-               char **Input_StringMatrix_1 = NULL;
-               int m1n1 = 0;
-
-               int m2 = 0, n2 = 0;
-               char **Input_StringMatrix_2 = NULL;
-               int m2n2 = 0;
-
-               GetRhsVar(1,MATRIX_OF_STRING_DATATYPE,&m1,&n1,&Input_StringMatrix_1);
-               m1n1 = m1 * n1 ;
-
-               GetRhsVar(2,MATRIX_OF_STRING_DATATYPE,&m2,&n2,&Input_StringMatrix_2);
-               m2n2 = m2 * n2 ;
-
-               if ( ((m1==m2) &&(n1==n2)) || (m2n2 == 1) )
-               {
-                       char **Output_Strings = NULL;
-                       int i = 0;
-
-                       for(i = 0;i < m2n2; i++)
-                       {
-                               if (strlen(Input_StringMatrix_2[i]) != 1)
-                               {
-                                       freeArrayOfString(Input_StringMatrix_1,m1n1);
-                                       freeArrayOfString(Input_StringMatrix_2,m2n2);
-                                       Scierror(999,_("%s: Wrong size for input argument #%d: A character expected.\n"),fname,2);
-                                       return 0;
-                               }
-                       }
-
-                       Output_Strings = strings_strrchr(Input_StringMatrix_1,m1n1,Input_StringMatrix_2,m2n2,FALSE);
-                       if (Output_Strings)
-                       {
-                               CreateVarFromPtr(Rhs+1,MATRIX_OF_STRING_DATATYPE,&m1,&n1,Output_Strings);
-                               LhsVar(1) = Rhs+1 ;
-                               C2F(putlhsvar)();
-
-                               freeArrayOfString(Input_StringMatrix_1,m1n1);
-                               freeArrayOfString(Input_StringMatrix_2,m2n2);
-                               freeArrayOfString(Output_Strings,m1n1);
-                       }
-                       else
-                       {
-                               freeArrayOfString(Input_StringMatrix_1,m1n1);
-                               freeArrayOfString(Input_StringMatrix_2,m2n2);
-                               Scierror(999,_("%s: No more memory.\n"),fname);
-                       }
-               }
-               else
-               {
-                       freeArrayOfString(Input_StringMatrix_1,m1n1);
-                       freeArrayOfString(Input_StringMatrix_2,m2n2);
-                       Scierror(999,_("%s : Wrong size for input argument #%d.\n"),fname,2);
-                       return 0;
-               }
-       }
-       else
-       {
-               if(GetType(1) != sci_strings)
-               {
-                       Scierror(999,_("%s: Wrong type for input argument #%d: Matrix of strings expected.\n"),fname,1);
-               }
-               else
-               {
-                       Scierror(999,_("%s: Wrong type for input argument #%d: A character expected.\n"),fname,2);
-               }
-       }
-       return 0;
+    SciErr sciErr;
+    wchar_t **pStringValues = NULL;
+    int *piAddressVar = NULL;
+    int m_ = 0, n_ = 0;
+    int iType = 0;
+
+    sciErr = getVarAddressFromPosition(pvApiCtx, _iVar, &piAddressVar);
+    if(sciErr.iErr)
+    {
+        *iErr = sciErr.iErr;
+        printError(&sciErr, 0);
+        return NULL;
+    }
+
+    sciErr = getVarType(pvApiCtx, piAddressVar, &iType);
+    if(sciErr.iErr)
+    {
+        *iErr = sciErr.iErr;
+        printError(&sciErr, 0);
+        return NULL;
+    }
+
+    if (iType != sci_strings)
+    {
+        *iErr =  API_ERROR_INVALID_TYPE;
+        Scierror(999,_("%s: Wrong type for input argument #%d: A string expected.\n"), fname, _iVar);
+        return NULL;
+    }
+
+    *iErr = getAllocatedMatrixOfWideString(pvApiCtx, piAddressVar, &m_, &n_, &pStringValues);
+    if (*iErr)
+    {
+        if (pStringValues) {freeAllocatedMatrixOfWideString(m_, n_, pStringValues); pStringValues = NULL;}
+        *m = 0;
+        *n = 0;
+    }
+    else
+    {
+        *m = m_;
+        *n = n_;
+    }
+
+    return pStringValues;
 }
-/*--------------------------------------------------------------------------*/
+/*----------------------------------------------------------------------------*/
diff --git a/scilab/modules/string/sci_gateway/c/sci_strrchr.c b/scilab/modules/string/sci_gateway/c/sci_strrchr.c
deleted file mode 100644 (file)
index 9af9869..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) INRIA - Cong WU
- * 
- * This file must be used under the terms of the CeCILL.
- * This source file is licensed as described in the file COPYING, which
- * you should have received as part of this distribution.  The terms
- * are also available at    
- * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
- *
- */
-
-/*----------------------------------------------------------------------------*/
-#include <string.h>
-#include <stdio.h>
-#include <ctype.h>
-#include "gw_string.h"
-#include "stack-c.h"
-#include "MALLOC.h"
-#include "Scierror.h"
-#include "localization.h"
-#include "freeArrayOfString.h"
-#include "stringsstrrchr.h"
-/*----------------------------------------------------------------------------*/
-int sci_strrchr(char *fname,unsigned long fname_len)
-{
-       CheckRhs(2,2);
-       CheckLhs(0,1);
-
-       if ( (GetType(1) == sci_strings) && (GetType(2) == sci_strings) )
-       {
-               int m1 = 0, n1 = 0;
-               char **Input_StringMatrix_1 = NULL;
-               int m1n1 = 0;
-
-               int m2 = 0, n2 = 0;
-               char **Input_StringMatrix_2 = NULL;
-               int m2n2 = 0;
-
-               GetRhsVar(1,MATRIX_OF_STRING_DATATYPE,&m1,&n1,&Input_StringMatrix_1);
-               m1n1 = m1 * n1 ;
-
-               GetRhsVar(2,MATRIX_OF_STRING_DATATYPE,&m2,&n2,&Input_StringMatrix_2);
-               m2n2 = m2 * n2 ;
-
-               if ( ((m1 == m2) && (n1 == n2)) || (m2n2 == 1) )
-               {
-                       char **Output_Strings = NULL;
-                       int i = 0;
-
-                       for(i = 0;i < m2n2; i++)
-                       {
-                               if (strlen(Input_StringMatrix_2[i]) != 1)
-                               {
-                                       freeArrayOfString(Input_StringMatrix_1,m1n1);
-                                       freeArrayOfString(Input_StringMatrix_2,m2n2);
-                                       Scierror(999,_("%s: Wrong type for input argument #%d: A character expected.\n"),fname,2);
-                                       return 0;
-                               }
-                       }
-                       
-                       Output_Strings = strings_strrchr(Input_StringMatrix_1,m1n1,Input_StringMatrix_2,m2n2,TRUE);
-                       if (Output_Strings)
-                       {
-                               CreateVarFromPtr(Rhs+1,MATRIX_OF_STRING_DATATYPE,&m1,&n1,Output_Strings);
-                               LhsVar(1) = Rhs+1 ;
-                               C2F(putlhsvar)();
-
-                               freeArrayOfString(Input_StringMatrix_1,m1n1);
-                               freeArrayOfString(Input_StringMatrix_2,m2n2);
-                               freeArrayOfString(Output_Strings,m1n1);
-                       }
-                       else
-                       {
-                               freeArrayOfString(Input_StringMatrix_1,m1n1);
-                               freeArrayOfString(Input_StringMatrix_2,m2n2);
-                               Scierror(999,_("%s: No more memory.\n"),fname);
-                       }
-               }
-               else
-               {
-                       freeArrayOfString(Input_StringMatrix_1,m1n1);
-                       freeArrayOfString(Input_StringMatrix_2,m2n2);
-                       Scierror(999,_("%s: Wrong type for input argument #%d: A character expected.\n"),fname,2);
-                       return 0;
-               }
-       }
-       else
-       {
-               if(GetType(1) != sci_strings)
-               {
-                       Scierror(999,_("%s: Wrong type for input argument #%d: Matrix of strings expected.\n"),fname,1);
-               }
-               else
-               {
-                       Scierror(999,_("%s: Wrong type for input argument #%d: A character expected.\n"),fname,2);
-               }
-       }
-       return 0;
-}
-/*--------------------------------------------------------------------------*/
index 3256581..c015c8e 100644 (file)
                                >
                        </File>
                        <File
-                               RelativePath="..\..\sci_gateway\c\sci_strrchr.c"
-                               >
-                       </File>
-                       <File
                                RelativePath="..\..\sci_gateway\c\sci_strrev.c"
                                >
                        </File>
index 5fa80e6..0422c62 100644 (file)
@@ -2,6 +2,7 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) INRIA - Allan CORNET
+ * Copyright (C) DIGITEO - 2011 - Allan CORNET
  * 
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
 #ifdef _MSC_VER
 #include "strdup_windows.h"
 #endif
+#define EMPTY_WCSTR L""
 /*----------------------------------------------------------------------------*/
-char ** strings_strrchr(char **InputStrings,int Dim_InputStrings,char** InputChar,int Dim_InputChar,BOOL do_strrchr)
+wchar_t ** strings_wcsrchr(const wchar_t **InputStrings, int Dim_InputStrings,
+                           const wchar_t** InputChar, int Dim_InputChar, BOOL do_strchr)
 {
-       char **Output_Strings = NULL;
+    wchar_t **wcOutput_Strings = NULL;
 
-       if ( (InputStrings) && (InputChar) )
-       {
-               Output_Strings = (char**)MALLOC(sizeof(char*)*Dim_InputStrings);
-               if (Output_Strings)
-               {
-                       int i = 0;
-                       for(i = 0;i < Dim_InputStrings; i++)
-                       {
-                               int c = 0;
-                               char *ptrStr = NULL;
+    if ( (InputStrings) && (InputChar) )
+    {
+        wcOutput_Strings = (wchar_t**)MALLOC(sizeof(wchar_t*)*Dim_InputStrings);
+        if (wcOutput_Strings)
+        {
+            int i = 0;
+            for(i = 0;i < Dim_InputStrings; i++)
+            {
+                int c = 0;
+                wchar_t *ptrStr = NULL;
 
-                               if (Dim_InputChar == 1) c = InputChar[0][0];
-                               else  c = InputChar[i][0];
+                if (Dim_InputChar == 1) c = InputChar[0][0];
+                else  c = InputChar[i][0];
 
-                               if (do_strrchr) ptrStr = strrchr(InputStrings[i],c);
-                               else ptrStr = strchr(InputStrings[i],c);
+                if (do_strchr) ptrStr = wcschr(InputStrings[i], c);
+                else ptrStr = wcsrchr(InputStrings[i], c);
 
-                               if (ptrStr)
-                               {
-                                       Output_Strings[i] = strdup(ptrStr);
-                               }
-                               else
-                               {
-                                       Output_Strings[i] = strdup("");
-                               }
-                       }
-               }
-       }
-       return Output_Strings;
+                if (ptrStr)
+                {
+                    wcOutput_Strings[i] = (wchar_t*)MALLOC(sizeof(wchar_t) * (wcslen(ptrStr) + 1));
+                    wcscpy(wcOutput_Strings[i], ptrStr);
+                }
+                else
+                {
+                    wcOutput_Strings[i] = (wchar_t*)MALLOC(sizeof(wchar_t) * (wcslen(EMPTY_WCSTR) + 1));
+                    wcscpy(wcOutput_Strings[i], EMPTY_WCSTR);
+                }
+            }
+        }
+    }
+    return wcOutput_Strings;
 }
 /*--------------------------------------------------------------------------*/
index 8bb639a..06c560f 100644 (file)
@@ -2,7 +2,8 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) INRIA - Allan CORNET
- * 
+ * Copyright (C) DIGITEO - 2011 - Allan CORNET
+ *
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
  * you should have received as part of this distribution.  The terms
@@ -16,6 +17,7 @@
 #define __STRINGSTRRCHAR_H__
 
 #include "BOOL.h"
+#include "charEncoding.h"
 
 /*
 * Locate last occurrence of character in string or
 * @param[in] Dimension m*n of String matrix one
 * @param[in] String matrix Two
 * @param[in] Dimension m*n of String matrix two
-* @param[in] BOOL to do strrchr
-* @return a string matrix (result of strchr)
+* @param[in] BOOL to do strchr (first occurrence)
+* @return a string matrix (result of strchr or strrchr)
 */
-char ** strings_strrchr(char **InputStrings,int Dim_InputStrings,char** InputChar,int Dim_InputChar,BOOL do_strrchr);
+wchar_t ** strings_wcsrchr(const wchar_t **InputStrings, int Dim_InputStrings,
+                           const wchar_t** InputChar, int Dim_InputChar, BOOL do_strchr);
 
 #endif /* __STRINGSTRRCHAR_H__ */
 /*----------------------------------------------------------------------------*/
diff --git a/scilab/modules/string/tests/nonreg_tests/bug_8732.dia.ref b/scilab/modules/string/tests/nonreg_tests/bug_8732.dia.ref
new file mode 100644 (file)
index 0000000..b3b802a
--- /dev/null
@@ -0,0 +1,46 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2011 - Allan CORNET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- JVM NOT MANDATORY -->
+//
+// <-- Non-regression test for bug 8732 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=8732
+//
+// <-- Short Description -->
+// strchr did not work with a non-ASCII character needle.
+//
+// =============================================================================
+v = "世界您好";
+c = "您";
+if strchr(v, c) <> "您好" then bugmes();quit;end
+if strrchr(v, c) <> "您好" then bugmes();quit;end
+// =============================================================================
+v = "азеаея";
+c = "з";
+if strchr(v, c) <> "зеаея" then bugmes();quit;end
+if strrchr(v, c) <> "зеаея" then bugmes();quit;end
+// =============================================================================
+v = "азеаея";
+c = "е";
+if strchr(v, c) <> "еаея" then bugmes();quit;end
+if strrchr(v, c) <> "ея" then bugmes();quit;end
+// =============================================================================
+v = "ハロー・ワールド";
+c = "ド";
+if strchr(v, c) <> "ド" then bugmes();quit;end
+if strrchr(v, c) <> "ド" then bugmes();quit;end
+// =============================================================================
+v = "תוכנית";
+c = "י";
+if strchr(v, c) <> "ית" then bugmes();quit;end
+if strrchr(v, c) <> "ית" then bugmes();quit;end
+// =============================================================================
+if strchr("This is a sample string with accent é&à", "é") <> "é&à" then bugmes();quit;end
+if strrchr("This is a sample string with accent é&à", "é") <> "é&à" then bugmes();quit;end
+// =============================================================================
diff --git a/scilab/modules/string/tests/nonreg_tests/bug_8732.tst b/scilab/modules/string/tests/nonreg_tests/bug_8732.tst
new file mode 100644 (file)
index 0000000..048663f
--- /dev/null
@@ -0,0 +1,46 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2011 - Allan CORNET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- JVM NOT MANDATORY -->
+//
+// <-- Non-regression test for bug 8732 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=8732
+//
+// <-- Short Description -->
+// strchr did not work with a non-ASCII character needle.
+//
+// =============================================================================
+v = "世界您好";
+c = "您";
+if strchr(v, c) <> "您好" then pause, end
+if strrchr(v, c) <> "您好" then pause, end
+// =============================================================================
+v = "азеаея";
+c = "з";
+if strchr(v, c) <> "зеаея" then pause, end
+if strrchr(v, c) <> "зеаея" then pause, end
+// =============================================================================
+v = "азеаея";
+c = "е";
+if strchr(v, c) <> "еаея" then pause, end
+if strrchr(v, c) <> "ея" then pause, end
+// =============================================================================
+v = "ハロー・ワールド";
+c = "ド";
+if strchr(v, c) <> "ド" then pause, end
+if strrchr(v, c) <> "ド" then pause, end
+// =============================================================================
+v = "תוכנית";
+c = "י";
+if strchr(v, c) <> "ית" then pause, end
+if strrchr(v, c) <> "ית" then pause, end
+// =============================================================================
+if strchr("This is a sample string with accent é&à", "é") <> "é&à" then pause, end
+if strrchr("This is a sample string with accent é&à", "é") <> "é&à" then pause, end
+// =============================================================================