Merge remote-tracking branch 'origin/master' into jit
[scilab.git] / scilab / modules / ast / src / cpp / types / file.cpp
1 /*
2 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 *  Copyright (C) 2010-2010 - DIGITEO - Antoine ELIAS
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 #include <fstream>
13 #include "file.hxx"
14
15 extern "C"
16 {
17 #include "charEncoding.h"
18 #include "sci_malloc.h"
19 }
20
21 namespace types
22 {
23
24 File::File()
25 {
26     m_fileDesc = NULL;
27     m_iSwap = 0;
28     m_pstMode = L"";
29     m_iFortranMode = -1; // see clunit.f
30     m_iType = 0; // 1 : fortran open   2 : c open   3 : std::err std::out std::in
31     m_stFilename = L"";
32 }
33
34 File::~File()
35 {
36 }
37
38 void File::setFileDesc(FILE* _fileDesc)
39 {
40     m_fileDesc = _fileDesc;
41 }
42
43 FILE* File::getFiledesc()
44 {
45     return m_fileDesc;
46 }
47
48 void File::setFileMode(const std::wstring& _pstMode)
49 {
50     m_pstMode = _pstMode;
51 }
52
53 std::wstring& File::getFileMode()
54 {
55     return m_pstMode;
56 }
57
58 int File::getFileModeAsInt()
59 {
60     int iMode  = 0;
61     int iPlus  = 0;
62     int iBin   = 0;
63
64     for (int i = 0 ; i < (int)wcslen(m_pstMode.c_str()) ; i++)
65     {
66         if (m_pstMode[i] == L'r')
67         {
68             iMode = 1;
69         }
70         else if (m_pstMode[i] == L'w')
71         {
72             iMode = 2;
73         }
74         else if (m_pstMode[i] == L'a')
75         {
76             iMode = 3;
77         }
78         else if (m_pstMode[i] == L'+')
79         {
80             iPlus = 1;
81         }
82         else if (m_pstMode[i] == L'b')
83         {
84             iBin = 1;
85         }
86     }
87
88     return 100 * iMode + 10 * iPlus + iBin;
89 }
90
91 void File::setFileModeAsInt(int _iMode)
92 {
93     int iMode  = (int)(_iMode / 100);
94     int iPlus  = (int)((_iMode - iMode * 100) / 10);
95     int iBin   = _iMode - iMode * 100 - iPlus * 10;
96
97     m_pstMode = L"";
98
99     switch (iMode)
100     {
101         case 2 :
102             m_pstMode += L"w";
103             break;
104         case 3 :
105             m_pstMode += L"a";
106             break;
107         default:
108             m_pstMode += L"r"; // default mode "rb"
109     }
110
111     if (iPlus)
112     {
113         m_pstMode += L"+";
114     }
115
116     if (iBin)
117     {
118         m_pstMode += L"b";
119     }
120 }
121
122 void File::setFileFortranMode(int _iMode)
123 {
124     m_iFortranMode = _iMode;
125 }
126
127 int File::getFileFortranMode()
128 {
129     return m_iFortranMode;
130 }
131
132 void File::setFileSwap(int _iSwap)
133 {
134     m_iSwap = _iSwap;
135 }
136
137 int File::getFileSwap()
138 {
139     return m_iSwap;
140 }
141
142 void File::setFileType(int _iType)
143 {
144     m_iType = _iType;
145 }
146
147 int File::getFileType()
148 {
149     return m_iType;
150 }
151
152 std::wstring File::getFileTypeAsString()
153 {
154     switch (getFileType())
155     {
156         case 1 :
157             return L"F";
158             break;
159         case 2 :
160             return L"C";
161             break;
162         case 3 :
163             return L"STD";
164             break;
165         default :
166             return L"Error";
167             break;
168     }
169 }
170
171 void File::setFilename(const std::wstring& _stFilename)
172 {
173     m_stFilename = _stFilename;
174 }
175
176 std::wstring& File::getFilename()
177 {
178     return m_stFilename;
179 }
180
181 int File::getCountLines()
182 {
183     char* pstFileName = wide_string_to_UTF8(m_stFilename.c_str());
184     std::ifstream in(pstFileName);
185     std::string stLine;
186     int iLines = 0;
187
188     while (std::getline(in, stLine))
189     {
190         iLines++;
191     }
192
193     in.close();
194     FREE(pstFileName);
195     return iLines;
196 }
197
198 }