* Bug 16365 fixed: median(m,'r'|'c') was wrong after 5dc990
[scilab.git] / scilab / modules / string / sci_gateway / cpp / sci_strcmp.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) Digiteo 2011 - Cedric DELAMARRE
4  *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15
16
17 #include "function.hxx"
18 #include "string.hxx"
19 #include "list.hxx"
20 #include "double.hxx"
21 #include "function.hxx"
22 #include "string_gw.hxx"
23
24 extern "C"
25 {
26 #include "core_math.h"
27 #include "localization.h"
28 #include "Scierror.h"
29 #include "BOOL.h"
30 #include "stringsCompare.h"
31 }
32
33 #define CHAR_I 'i'
34 #define CHAR_S 's'
35
36 types::Function::ReturnValue sci_strcmp(types::typed_list &in, int _iRetCount, types::typed_list &out)
37 {
38     types::Double* pOutDouble   = NULL;
39     types::String* pString1     = NULL;
40     types::String* pString2     = NULL;
41     wchar_t* pwcChar3           = NULL;
42     BOOL do_stricmp             = FALSE;
43
44     if (in.size() < 2 || in.size() > 3)
45     {
46         Scierror(77, _("%s: Wrong number of input argument(s): %d to %d expected.\n"), "strcmp", 2, 3);
47         return types::Function::Error;
48     }
49     if (_iRetCount > 1)
50     {
51         Scierror(78, _("%s: Wrong number of output argument(s): %d expected.\n"), "strcmp", 1);
52         return types::Function::Error;
53     }
54     if (in[0]->isString() == false)
55     {
56         Scierror(999, _("%s: Wrong type for input argument #%d: String expected.\n"), "strcmp", 1);
57         return types::Function::Error;
58     }
59     if (in[1]->isString() == false)
60     {
61         Scierror(999, _("%s: Wrong type for input argument #%d: String expected.\n"), "strcmp", 2);
62         return types::Function::Error;
63     }
64
65     pString1 = in[0]->getAs<types::String>();
66     pString2 = in[1]->getAs<types::String>();
67
68
69
70     if (pString1->getSize() != pString2->getSize() && pString2->isScalar() == false)
71     {
72         Scierror(999, _("%s: Wrong size for input argument #%d.\n"), "strcmp", 2);
73         return types::Function::Error;
74     }
75
76     if (in.size() == 3)
77     {
78         if (in[2]->isString() == false || in[2]->getAs<types::String>()->isScalar() == false || wcslen(in[2]->getAs<types::String>()->get(0)) != 1)
79         {
80             Scierror(999, _("%s: Wrong type for input argument #%d: Char expected.\n"), "strcmp", 3);
81             return types::Function::Error;
82         }
83
84         pwcChar3 = in[2]->getAs<types::String>()->get(0);
85         if ( (pwcChar3[0] != CHAR_I) && (pwcChar3[0] != CHAR_S))
86         {
87             Scierror(999, _("%s: Wrong value for input argument #%d: %s or %s expected.\n"), "strcmp", 3, "'i' (stricmp)", "'s' (strcmp)");
88             return types::Function::Error;
89         }
90
91         if (pwcChar3[0] == CHAR_I)
92         {
93             do_stricmp = TRUE;
94         }
95     }
96
97     int *values = stringsCompare(pString1->get(), pString1->getSize(), pString2->get(), pString2->getSize(), do_stricmp);
98
99     if (values)
100     {
101         pOutDouble  = new types::Double(pString1->getDims(), pString1->getDimsArray());
102         pOutDouble->setInt(values);
103         FREE(values);
104     }
105     else
106     {
107         Scierror(999, _("%s : No more memory.\n"), "strcmp");
108     }
109
110
111     out.push_back(pOutDouble);
112     return types::Function::OK;
113 }
114