Merge remote-tracking branch 'origin/master' into windows
[scilab.git] / scilab / modules / fileio / sci_gateway / cpp / sci_mputl.cpp
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2010 - DIGITEO - Allan CORNET
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 #include "filemanager.hxx"
17 #include "fileio_gw.hxx"
18 #include "string.hxx"
19 #include "double.hxx"
20 #include "bool.hxx"
21 #include "function.hxx"
22
23 extern "C"
24 {
25 #include "sci_malloc.h"
26 #include "mputl.h"
27 #include "localization.h"
28 #include "Scierror.h"
29 #include "mopen.h"
30 #include "mclose.h"
31 #include "expandPathVariable.h"
32 }
33
34 /*--------------------------------------------------------------------------*/
35 types::Function::ReturnValue sci_mputl(types::typed_list &in, int _iRetCount, types::typed_list &out)
36 {
37     int iFileID     = 0;
38     int iErr        = 0;
39     bool bCloseFile = false;
40
41     if (in.size() != 2)
42     {
43         Scierror(999, _("%s: Wrong number of input argument(s): %d expected.\n"), "mputl", 2);
44         return types::Function::Error;
45     }
46
47     if (_iRetCount != 1)
48     {
49         Scierror(999, _("%s: Wrong number of output argument(s): %d expected.\n"), "mputl", 1);
50         return types::Function::Error;
51     }
52
53     if (in[1]->isDouble() && in[1]->getAs<types::Double>()->getSize() == 1)
54     {
55         iFileID = static_cast<int>(in[1]->getAs<types::Double>()->get(0));
56     }
57     else if (in[1]->isString() && in[1]->getAs<types::String>()->getSize() == 1)
58     {
59         char* expandedFileName = expandPathVariable(in[1]->getAs<types::String>()->get(0));
60
61         iErr = mopen(expandedFileName, "wt", 0, &iFileID);
62         FREE(expandedFileName);
63
64         if (iErr)
65         {
66             char* pst = in[1]->getAs<types::String>()->get(0);
67             switch (iErr)
68             {
69                 case MOPEN_NO_MORE_LOGICAL_UNIT:
70                     Scierror(66, _("%s: Too many files opened!\n"), "mputl");
71                     break;
72                 case MOPEN_CAN_NOT_OPEN_FILE:
73                     Scierror(999, _("%s: Cannot open file %s.\n"), "mputl", pst);
74                     break;
75                 case MOPEN_NO_MORE_MEMORY:
76                     Scierror(999, _("%s: No more memory.\n"), "mputl");
77                     break;
78                 case MOPEN_INVALID_FILENAME:
79                     Scierror(999, _("%s: invalid filename %s.\n"), "mputl", pst);
80                     break;
81                 default: //MOPEN_INVALID_STATUS
82                     Scierror(999, _("%s: invalid status.\n"), "mputl");
83                     break;
84             }
85
86             return types::Function::Error;
87         }
88
89         bCloseFile = true;
90     }
91     else
92     {
93         //Error
94         Scierror(999, _("%s: Wrong type for input argument #%d: a String or Integer expected.\n"), "mputl", 2);
95         return types::Function::Error;
96     }
97
98     //String vextor, row or col
99     if (in[0]->isString() == false || (in[0]->getAs<types::String>()->getRows() != 1 && in[0]->getAs<types::String>()->getCols() != 1))
100     {
101         Scierror(999, _("%s: Wrong size for input argument #%d: A 1-by-n or m-by-1 array expected.\n"), "mputl", 1);
102         return types::Function::Error;
103     }
104
105     types::String* pS = in[0]->getAs<types::String>();
106
107     switch (iFileID)
108     {
109         case 5: // stdin
110             Scierror(999, _("%s: Wrong file descriptor: %d.\n"), "mputl", iFileID);
111             return types::Function::Error;
112         default :
113             iErr = mputl(iFileID, pS->get(), pS->getSize());
114     }
115
116     out.push_back(new types::Bool(!iErr));
117
118     if (bCloseFile)
119     {
120         mclose(iFileID);
121     }
122
123     return types::Function::OK;
124
125
126     //mputlErr = mputl(fileDescriptor, pStVarOne, mnOne);
127     //freeArrayOfString(pStVarOne, mnOne);
128
129     //if (bCloseFile)
130     //{
131     //    double dErrClose = 0.;
132     //    C2F(mclose)(&fileDescriptor, &dErrClose);
133     //    bCloseFile = FALSE;
134     //}
135
136     //switch (mputlErr)
137     //{
138     //case MPUTL_NO_ERROR:
139     //    createScalarBoolean(pvApiCtx, Rhs + 1, TRUE);
140     //    LhsVar(1) = Rhs + 1;
141     //    PutLhsVar();
142     //    break;
143
144     //case MPUTL_INVALID_FILE_DESCRIPTOR:
145     //    // commented for compatiblity
146     //    // Scierror(999, _("%s: invalid file descriptor.\n"), fname);
147     //    // break;
148     //case MPUTL_ERROR:
149     //case MPUTL_NO_WRITE_RIGHT:
150     //default:
151     //    createScalarBoolean(pvApiCtx, Rhs + 1, FALSE);
152     //    LhsVar(1) = Rhs + 1;
153     //    PutLhsVar();
154     //    break;
155     //}
156
157     //return 0;
158 }
159 /*--------------------------------------------------------------------------*/