Merge remote-tracking branch 'origin/master' into windows
[scilab.git] / scilab / modules / fileio / src / cpp / mgetstr.cpp
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2011 - DIGITEO - 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 #include <string.h>
17 #include "filemanager.hxx"
18
19 extern "C"
20 {
21 #include "mgetstr.h"
22 #include "sci_malloc.h"
23 #include "charEncoding.h"
24 }
25
26 char* mgetstr(int _iFileId, int _iSizeToRead)
27 {
28     char* pstOut = NULL;
29     types::File* pF = FileManager::getFile(_iFileId);
30
31     if (pF != NULL)
32     {
33         if (pF->getFileModeAsInt() % 2 == 0) //to determine if the file have been opened with binary or text mode
34         {
35             int iSizeRead = 0;
36             pstOut = (char*)MALLOC((_iSizeToRead + 1) * sizeof(char));
37             memset(pstOut, 0x00, (_iSizeToRead + 1) * sizeof(char));
38
39             while (_iSizeToRead > iSizeRead)
40             {
41                 char* pstRes = fgets(&pstOut[iSizeRead], _iSizeToRead - iSizeRead + 1, pF->getFiledesc());//fgetws need length to read + 1
42                 if (feof(pF->getFiledesc()))
43                 {
44                     return pstOut;
45                 }
46                 if (pstRes == NULL)
47                 {
48                     FREE(pstOut);
49                     return NULL;
50                 }
51                 iSizeRead += (int)strlen(pstRes);
52             }
53         }
54         else
55         {
56             int iSizeRead = 0;
57             char* buffer = (char*)MALLOC((_iSizeToRead + 1) * sizeof(char));
58             memset(buffer, 0x00, (_iSizeToRead + 1) * sizeof(char));
59
60             while (_iSizeToRead > iSizeRead)
61             {
62                 char* pstRes = fgets(&buffer[iSizeRead], _iSizeToRead - iSizeRead + 1, pF->getFiledesc());//fgets need length to read + 1
63                 if (feof(pF->getFiledesc()))
64                 {
65                     return buffer;
66                 }
67                 if (pstRes == NULL)
68                 {
69                     FREE(buffer);
70                     return NULL;
71                 }
72                 iSizeRead += (int)strlen(pstRes);
73             }
74
75             pstOut = buffer;
76         }
77     }
78
79     return pstOut;
80 }