Coverity: history_manager module memory errors fixed
[scilab.git] / scilab / modules / history_manager / sci_gateway / cpp / sci_removelinehistory.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
17 #include "history_manager_gw.hxx"
18 #include "function.hxx"
19 #include "HistoryManager.hxx"
20 #include "double.hxx"
21
22 extern "C"
23 {
24 #include "localization.h"
25 #include "Scierror.h"
26 }
27 /*--------------------------------------------------------------------------*/
28
29 types::Function::ReturnValue sci_removelinehistory(types::typed_list &in, int _iRetCount, types::typed_list &out)
30 {
31     if (in.size() == 1)
32     {
33         if ((in[0]->isDouble() == false) || (in[0]->getAs<types::Double>()->isScalar() == false))
34         {
35             Scierror(999, _("%s: Wrong type for input argument #%d: A double expected.\n"), "removelinehistory", 1);
36             return types::Function::Error;
37         }
38
39         types::Double* pDbl = in[0]->getAs<types::Double>();
40         int size = HistoryManager::getInstance()->getNumberOfLines() - 1;
41
42         if ((pDbl->get(0) < 0) || (pDbl->get(0) > size))
43         {
44             Scierror(999, _("%s: Wrong value for input argument #%d: Must be in the interval [%d, %d].\n"), "removelinehistory", 1, 0, size);
45             return types::Function::Error;
46         }
47         char* pcLigne = HistoryManager::getInstance()->getNthLine(pDbl->get(0));
48         if (HistoryManager::getInstance()->isBeginningSessionLine(pcLigne))
49         {
50             do
51             {
52                 HistoryManager::getInstance()->deleteNthLine(pDbl->get(0));
53                 FREE(pcLigne);
54                 pcLigne = HistoryManager::getInstance()->getNthLine(pDbl->get(0));
55                 size = HistoryManager::getInstance()->getNumberOfLines();
56             }
57             while ((!HistoryManager::getInstance()->isBeginningSessionLine(pcLigne)) && (pDbl->get(0) < size));
58         }
59         else
60         {
61             HistoryManager::getInstance()->deleteNthLine(pDbl->get(0));
62         }
63         FREE(pcLigne);
64     }
65     else
66     {
67         Scierror(77, _("%s: Wrong number of input argument(s): %d expected.\n"), "removelinehistory", 1);
68         return types::Function::Error;
69     }
70     return types::Function::OK;
71 }
72 /*--------------------------------------------------------------------------*/
73