dcf6d83a7c8f43c90687ebf626cf7dac00b19cf9
[scilab.git] / scilab / modules / string / sci_gateway / cpp / sci_strncpy.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) Digiteo 2011 - Cedric DELAMARRE
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13
14 #include "function.hxx"
15 #include "string.hxx"
16 #include "list.hxx"
17 #include "double.hxx"
18 #include "funcmanager.hxx"
19 #include "string_gw.hxx"
20
21 extern "C"
22 {
23 #include "sci_malloc.h"
24 #include "core_math.h"
25 #include "localization.h"
26 #include "Scierror.h"
27 }
28
29
30 types::Function::ReturnValue sci_strncpy(types::typed_list &in, int _iRetCount, types::typed_list &out)
31 {
32     types::String* pString      = NULL;
33     types::Double* pDouble      = NULL;
34     types::String* pOutString   = NULL;
35
36     if (in.size() != 2)
37     {
38         Scierror(77, _("%s: Wrong number of input argument(s): %d expected.\n"), "strncpy", 2);
39         return types::Function::Error;
40     }
41     if (_iRetCount != 1)
42     {
43         Scierror(78, _("%s: Wrong number of output argument(s): %d expected.\n"), "strncpy", 1);
44         return types::Function::Error;
45     }
46     if (in[0]->isString() == false)
47     {
48         Scierror(999, _("%s: Wrong type for input argument #%d: Matrix of strings expected.\n"), "strncpy", 1);
49         return types::Function::Error;
50     }
51
52     if (in[1]->isDouble() == false)
53     {
54         Scierror(999, _("%s: Wrong type for input argument #%d: Matrix of integers expected.\n"), "strncpy", 2);
55         return types::Function::Error;
56     }
57
58     pString = in[0]->getAs<types::String>();
59     pDouble = in[1]->getAs<types::Double>();
60
61     if (pDouble->getSize() == 0)
62     {
63         Scierror(999, _("%s: Wrong size for input argument #%d: Non-empty matrix expected.\n"), "strncpy", 2);
64         return types::Function::Error;
65     }
66
67     //same dimension or 2nd arg scalar
68     if (pString->getSize() != pDouble->getSize() && pDouble->isScalar() == false)
69     {
70         Scierror(999, _("%s: Wrong size for input argument #%d.\n"), "strncpy", 2);
71         return types::Function::Error;
72     }
73
74     pOutString  = new types::String(pString->getDims(), pString->getDimsArray());
75
76     int j = 0; /* Input parameter two is dimension one */
77     for (int i = 0 ; i < pString->getSize() ; i++)
78     {
79         char* output   = NULL;
80         int sizeOfCopy      = 0;
81
82         if (pDouble->isScalar() == false)
83         {
84             j = i; /* Input parameter One & two have same dimension */
85         }
86
87         if (pDouble->get(j) < strlen(pString->get(i)))
88         {
89             int iLen = (int)pDouble->get(j);
90             if (iLen < 0)
91             {
92                 iLen = 0;
93             }
94
95             output = (char*)MALLOC(sizeof(char) * (iLen + 1));
96             sizeOfCopy = iLen;
97         }
98         else
99         {
100             int iLen = (int)strlen(pString->get(i));
101             output = (char*)MALLOC(sizeof(char) * (iLen + 1));
102             sizeOfCopy = iLen;
103         }
104
105         if (output)
106         {
107             strncpy(output, pString->get(i), sizeOfCopy);
108             output[sizeOfCopy] = '\0';
109
110             pOutString->set(i, output);
111             FREE(output);
112             output = NULL;
113         }
114         else
115         {
116             delete pOutString;
117             Scierror(999, _("%s: No more memory.\n"), "strncpy");
118             return types::Function::Error;
119         }
120     }
121
122     out.push_back(pOutString);
123     return types::Function::OK;
124 }
125