bug 5071 bug 5072
Allan CORNET [Thu, 29 Oct 2009 07:56:25 +0000 (08:56 +0100)]
scilab/CHANGES_5.2.X
scilab/modules/string/sci_gateway/c/sci_isletter.c
scilab/modules/string/sci_gateway/c/sci_strcspn.c
scilab/modules/string/sci_gateway/c/sci_strspn.c
scilab/modules/string/src/c/isletter.c
scilab/modules/string/src/c/isletter.h
scilab/modules/string/tests/nonreg_tests/bug_5071.dia.ref [new file with mode: 0644]
scilab/modules/string/tests/nonreg_tests/bug_5071.tst [new file with mode: 0644]
scilab/modules/string/tests/nonreg_tests/bug_5072.dia.ref [new file with mode: 0644]
scilab/modules/string/tests/nonreg_tests/bug_5072.tst [new file with mode: 0644]

index dbd5fbe..1f636b3 100644 (file)
@@ -524,6 +524,10 @@ Bugs:
 
 * bug 4768 fixed - strsplit returned strange results with accented characters
 
+* bug 5071 fixed - isletter("é") returns [%F %F] instead of %F.
+
+* bug 5072 fixed - strspn("aéio","éa") returns 3 instead of 2.
+
 String manipulation:
 ====================
 
index ba2e5d2..b1c5e8a 100644 (file)
@@ -22,6 +22,7 @@
 #include "freeArrayOfString.h"
 #include "isletter.h"
 #include "MALLOC.h"
+#include "charEncoding.h"
 /*----------------------------------------------------------------------------*/
 int sci_isletter(char *fname,unsigned long fname_len)
 {
@@ -35,8 +36,10 @@ int sci_isletter(char *fname,unsigned long fname_len)
        {
                char **Input_StringMatrix = NULL;
                BOOL *values = NULL;
+               int sizeValues = 0;
                int Row_Num = 0,Col_Num = 0;
                int mn = 0; /* Row_Num * Col_Num */
+               wchar_t *wcInput = NULL;
 
                GetRhsVar(1,MATRIX_OF_STRING_DATATYPE,&Row_Num,&Col_Num,&Input_StringMatrix);
                mn = Row_Num * Col_Num;
@@ -48,12 +51,22 @@ int sci_isletter(char *fname,unsigned long fname_len)
                        return 0;
                }
 
-               values = isletter(Input_StringMatrix[0]);
+               wcInput = to_wide_string(Input_StringMatrix[0]);
+               if (wcInput)
+               {
+                       values = isletterW(wcInput, &sizeValues);
+                       FREE(wcInput);
+                       wcInput = NULL;
+               }
+               else
+               {
+                       values = isletter(Input_StringMatrix[0], &sizeValues);
+               }
 
                if (values)
                {
                        int m1 = 1;
-                       int n1 = (int)strlen(Input_StringMatrix[0]);
+                       int n1 = sizeValues;
                        CreateVarFromPtr(Rhs+1,MATRIX_OF_BOOLEAN_DATATYPE, &m1, &n1, &values);
                        LhsVar(1)=Rhs+1;
                        C2F(putlhsvar)();
index ed975a3..3317379 100644 (file)
@@ -24,6 +24,7 @@
 #include "MALLOC.h"
 #include "Scierror.h"
 #include "localization.h"
+#include "charEncoding.h"
 #include "freeArrayOfString.h"
 /*---------------------------------------------------------------------------*/
 int sci_strcspn(char *fname,unsigned long fname_len)
@@ -57,10 +58,27 @@ int sci_strcspn(char *fname,unsigned long fname_len)
                        CreateVar(Rhs+1,MATRIX_OF_DOUBLE_DATATYPE,&m1,&n1,&outIndex);   
                        for ( i = 0 ; i < m1n1 ; i++ )
                        {
+                               wchar_t *wcParam1 = NULL;
+                               wchar_t *wcParam2 = NULL;
+
                                if (m2n2 == 1) j = 0;
                                else j = i;
 
-                               stk(outIndex)[i] = (double) strcspn( InputString_Parameter1[i], InputString_Parameter2[j] );
+                               wcParam1 = to_wide_string(InputString_Parameter1[i]);
+                               wcParam2 = to_wide_string(InputString_Parameter2[j]);
+
+                               if (wcParam1 && wcParam2)
+                               {
+                                       stk(outIndex)[i] = (double) wcscspn( wcParam1, wcParam2 );
+                               }
+                               else
+                               {
+                                       stk(outIndex)[i] = (double) strcspn( InputString_Parameter1[i], InputString_Parameter2[j] );
+                               }
+
+                               if (wcParam1) { FREE(wcParam1); wcParam1 = NULL;}
+                               if (wcParam2) { FREE(wcParam2); wcParam2 = NULL;}
+                               
                        }
                        LhsVar(1) = Rhs+1 ;
                        C2F(putlhsvar)();
index 3378529..184e635 100644 (file)
@@ -24,6 +24,7 @@
 #include "Scierror.h"
 #include "localization.h"
 #include "freeArrayOfString.h"
+#include "charEncoding.h"
 /*----------------------------------------------------------------------------*/
 int sci_strspn(char *fname,unsigned long fname_len)
 {
@@ -56,10 +57,26 @@ int sci_strspn(char *fname,unsigned long fname_len)
                        CreateVar(Rhs+1,MATRIX_OF_DOUBLE_DATATYPE,&m1,&n1,&outIndex);   
                        for ( i = 0 ; i < m1n1 ; i++ )
                        {
+                               wchar_t *wcParam1 = NULL;
+                               wchar_t *wcParam2 = NULL;
+
                                if (m2n2 == 1) j = 0;
                                else j = i;
                                
-                               stk(outIndex)[i] = (double) strspn( InputString_Parameter1[i], InputString_Parameter2[j] );
+                               wcParam1 = to_wide_string(InputString_Parameter1[i]);
+                               wcParam2 = to_wide_string(InputString_Parameter2[j]);
+
+                               if (wcParam1 && wcParam2)
+                               {
+                                       stk(outIndex)[i] = (double) wcsspn( wcParam1, wcParam2 );
+                               }
+                               else
+                               {
+                                       stk(outIndex)[i] = (double) strspn( InputString_Parameter1[i], InputString_Parameter2[j] );
+                               }
+
+                               if (wcParam1) { FREE(wcParam1); wcParam1 = NULL;}
+                               if (wcParam2) { FREE(wcParam2); wcParam2 = NULL;}
                        }
                        LhsVar(1) = Rhs+1 ;
                        C2F(putlhsvar)();
index b069f30..984571d 100644 (file)
 #include <ctype.h>
 #include "isletter.h"
 #include "MALLOC.h"
+
 /*--------------------------------------------------------------------------*/
-BOOL *isletter(char *input_string)
+BOOL *isletter(char *input_string, int *sizeArray)
 {
        BOOL *returnedValues = NULL;
        if (input_string)
        {
                int i = 0;
                int length_input_string = (int)strlen(input_string);
+               *sizeArray = length_input_string;
 
                if (length_input_string > 0)
                {
@@ -41,3 +43,29 @@ BOOL *isletter(char *input_string)
        return returnedValues;
 }
 /*--------------------------------------------------------------------------*/
+BOOL *isletterW(wchar_t *wcInput_string, int *sizeArray)
+{
+       BOOL *returnedValues = NULL;
+       if (wcInput_string)
+       {
+               int i = 0;
+               int length_input_string = (int)wcslen(wcInput_string);
+
+               *sizeArray = length_input_string;
+
+               if (length_input_string > 0)
+               {
+                       returnedValues = (BOOL*)MALLOC(sizeof(BOOL)*length_input_string);
+                       if (returnedValues)
+                       {
+                               for (i = 0;i < length_input_string; i++)
+                               {
+                                       if ( iswalpha(wcInput_string[i]) ) returnedValues[i] = TRUE;
+                                       else returnedValues[i] = FALSE;
+                               }
+                       }
+               }
+       }
+       return returnedValues;
+}
+/*--------------------------------------------------------------------------*/
index f513e21..8b0bf60 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 - 2009 - 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
@@ -15,6 +16,7 @@
 #ifndef __ISLETTER_H__
 #define __ISLETTER_H__
 
+#include <wchar.h>
 #include "BOOL.h"
 
 /**
 * @param[in] a string
 * @return BOOL array 
 */
-BOOL *isletter(char *input_string);
+BOOL *isletter(char *input_string, int *sizeArray);
+
+/**
+* array elements that are alphabetic letters
+* @param[in] a string
+* @return BOOL array 
+*/
+BOOL *isletterW(wchar_t *wcInput_string, int *sizeArray);
 
 #endif /* __ISLETTER_H__ */
 /*--------------------------------------------------------------------------*/
diff --git a/scilab/modules/string/tests/nonreg_tests/bug_5071.dia.ref b/scilab/modules/string/tests/nonreg_tests/bug_5071.dia.ref
new file mode 100644 (file)
index 0000000..ad95357
--- /dev/null
@@ -0,0 +1,30 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2009 - DIGITEO - Allan CORNET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- JVM NOT MANDATORY -->
+// <-- Non-regression test for bug 5071 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=5071
+//
+// <-- Short Description -->
+// isletter("é") returns [%F %F] instead of %F
+//======================================================================================== 
+v = "世界您好 3";
+ref = [%T %T %T %T %F %F];
+if ~and(isletter(v) == ref) then bugmes();quit;end
+if length(v) <> size(isletter(v),'*') then bugmes();quit;end
+//======================================================================================== 
+v = "азеазея 3 азеазея";
+ref = [ %T %T %T %T %T %T %T %F %F %F %T %T %T %T %T %T %T ];
+if ~and(isletter(v) == ref) then bugmes();quit;end
+if length(v) <> size(isletter(v),'*') then bugmes();quit;end
+//======================================================================================== 
+v = "TéTé a 3";
+ref = [ %T %T %T %T %F %T %F %F ];
+if ~and(isletter(v) == ref) then bugmes();quit;end
+if length(v) <> size(isletter(v),'*') then bugmes();quit;end
+//======================================================================================== 
diff --git a/scilab/modules/string/tests/nonreg_tests/bug_5071.tst b/scilab/modules/string/tests/nonreg_tests/bug_5071.tst
new file mode 100644 (file)
index 0000000..9d8702a
--- /dev/null
@@ -0,0 +1,32 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2009 - DIGITEO - Allan CORNET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- JVM NOT MANDATORY -->
+// <-- Non-regression test for bug 5071 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=5071
+//
+// <-- Short Description -->
+// isletter("é") returns [%F %F] instead of %F
+
+//======================================================================================== 
+v = "世界您好 3";
+ref = [%T %T %T %T %F %F];
+if ~and(isletter(v) == ref) then pause,end
+if length(v) <> size(isletter(v),'*') then pause,end
+//======================================================================================== 
+v = "азеазея 3 азеазея";
+ref = [ %T %T %T %T %T %T %T %F %F %F %T %T %T %T %T %T %T ];
+if ~and(isletter(v) == ref) then pause,end
+if length(v) <> size(isletter(v),'*') then pause,end
+//======================================================================================== 
+v = "TéTé a 3";
+ref = [ %T %T %T %T %F %T %F %F ];
+if ~and(isletter(v) == ref) then pause,end
+if length(v) <> size(isletter(v),'*') then pause,end
+//======================================================================================== 
+
diff --git a/scilab/modules/string/tests/nonreg_tests/bug_5072.dia.ref b/scilab/modules/string/tests/nonreg_tests/bug_5072.dia.ref
new file mode 100644 (file)
index 0000000..18c771f
--- /dev/null
@@ -0,0 +1,19 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2009 - DIGITEO - Allan CORNET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- JVM NOT MANDATORY -->
+// <-- Non-regression test for bug 5072 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=5072
+//
+// <-- Short Description -->
+// strspn("aéio","éa") returns 3 instead of 2
+//======================================================================================== 
+ref = 2;
+res = strspn("aéio","éa");
+if ref <> res then bugmes();quit;end
+//======================================================================================== 
diff --git a/scilab/modules/string/tests/nonreg_tests/bug_5072.tst b/scilab/modules/string/tests/nonreg_tests/bug_5072.tst
new file mode 100644 (file)
index 0000000..ad8ca01
--- /dev/null
@@ -0,0 +1,22 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2009 - DIGITEO - Allan CORNET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- JVM NOT MANDATORY -->
+// <-- Non-regression test for bug 5072 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=5072
+//
+// <-- Short Description -->
+// strspn("aéio","éa") returns 3 instead of 2
+
+//======================================================================================== 
+ref = 2;
+res = strspn("aéio","éa");
+if ref <> res then pause,end
+//======================================================================================== 
+
+