* Bug 14425 fixed - xpause() set obsolete, merged in sleep(). sleep(,'s') implemented
[scilab.git] / scilab / modules / time / sci_gateway / c / sci_sleep.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) INRIA - 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
17 /*--------------------------------------------------------------------------*/
18 #ifdef _MSC_VER
19 #include <Windows.h>
20 #endif
21 #include "machine.h"
22 #ifdef HAVE_USLEEP
23 #include <unistd.h>
24 #endif
25 #include "gw_time.h"
26 #include "api_scilab.h"
27 #include "Scierror.h"
28 #include "localization.h"
29 /*--------------------------------------------------------------------------*/
30 int sci_sleep(char *fname, void* pvApiCtx)
31 {
32     SciErr sciErr;
33     int m1 = 0, n1 = 0 , iRows = 0, iCols = 0, option = 0;
34     double sec = 0;
35     char * opt = NULL;
36     int * p1_in_address = NULL;
37     int * p2_in_address = NULL;
38     double * pDblReal = NULL;
39
40
41     CheckLhs(0, 1);
42     CheckRhs(1, 2);
43
44     if (Rhs >= 1)
45     {
46         sciErr = getVarAddressFromPosition(pvApiCtx, 1, &p1_in_address);
47         sciErr = getMatrixOfDouble(pvApiCtx, p1_in_address, &m1, &n1, &pDblReal);
48
49         if (isScalar(pvApiCtx, p1_in_address) == 0)
50         {
51             Scierror(999, _("%s: Wrong type for input argument #%d: A real scalar expected.\n"), fname, 1);
52             return 0;
53         }
54         sec = (double)  * pDblReal;
55
56         if (sec <= 0)
57         {
58             Scierror(999, _("%s: Wrong values for input argument #%d: Non-negative integers expected.\n"), fname, 1);
59             return 0;
60         }
61
62         if (Rhs == 2)
63         {
64             sciErr = getVarAddressFromPosition(pvApiCtx, 2, &p2_in_address);
65             getAllocatedSingleString(pvApiCtx, p2_in_address, &opt);
66
67             if (strcmp("s", opt) != 0)
68             {
69                 Scierror(999, _("%s: Wrong value for input argument #%d: 's' expected.\n"), fname, 2);
70                 return 0;
71             }
72             if (strcmp("s", opt) == 0)
73             {
74                 option = 1;
75             }
76         }
77
78
79 #ifdef _MSC_VER
80         {
81             if (option == 1)
82             {
83                 double ms = sec * 1000; /* convert seconds into milliseconds */
84             }
85             else
86             {
87                 double ms = sec;
88             }
89             if (ms > 0)
90             {
91                 Sleep(ms);    /* Number of milliseconds to sleep. */
92             }
93         }
94 #else
95         {
96             unsigned useconds;
97             useconds = (unsigned) sec;
98             if (option == 1)
99             {
100                 useconds = useconds * 1000;
101             }
102             if (useconds != 0)
103 #ifdef HAVE_USLEEP
104             {
105                 usleep(useconds * 1000);
106             }
107 #else
108 #ifdef HAVE_SLEEP
109             {
110                 sleep(useconds * 1000);
111             }
112 #endif
113 #endif
114         }
115 #endif
116     }
117     LhsVar(1) = 0;
118     PutLhsVar();
119
120     return 0;
121 }
122 /*--------------------------------------------------------------------------*/
123