* Force the usage of the dynamic stack on all !Windows
[scilab.git] / scilab / modules / core / src / c / scimem.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) INRIA
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.1-en.txt
10  *
11  */
12 #include <stdlib.h>
13 #include "MALLOC.h"
14 #include "stack-def.h"
15 #include "scimem.h"
16 #include "sciprint.h"
17 #include "localization.h"
18 #include "BOOL.h"
19 /*--------------------------------------------------------------------------*/
20 extern int scimem64(int *n, int newsize, BOOL isglobal);
21 extern void freemem64(BOOL isglobal);
22 /*--------------------------------------------------------------------------*/
23 int C2F(scimem) (int *newsize, int *ptr)
24 {
25 #ifndef _MSC_VER
26     return scimem64(ptr, *newsize, FALSE);
27 #else
28     register char *p1 = NULL;
29
30     if (*newsize > 0)
31     {
32         /* add 1 for alignment problems */
33         /* the last +2 is to overcome a problem with adjuststack. */
34         /* Which appears on OpenSolaris and on mandriva + EEEPC. */
35         /* To be corrected. Thanks Jonathan */
36         p1 = (char *)SCISTACKMALLOC(((unsigned long)sizeof(double)) * (*newsize + 1 + 2));
37
38         if (p1 != NULL)
39         {
40             the_ps = the_p;
41             the_p = p1;
42             /* add 1 for alignment problems */
43             *ptr = ((int)(the_p - (char *)C2F(stack).Stk)) / sizeof(double) + 1;
44         }
45         else
46         {
47             /* We could not create a new stack, so, we are using the previous one */
48             if (the_p == NULL)
49             {
50                 /* The stack never been created */
51                 sciprint(_("No space to allocate Scilab stack.\n"));
52                 exit(1);
53             }
54             *ptr = 0;
55         }
56     }
57     return (0);
58 #endif
59 }
60
61 /*--------------------------------------------------------------------------*/
62 int C2F(scigmem) (int *n, int *ptr)
63 {
64 #ifndef _MSC_VER
65     return scimem64(ptr, *n, TRUE);
66 #else
67     register char *p1 = NULL;
68
69     if (*n > 0)
70     {
71         /* add 1 for alignment problems */
72         /* YC: Same comment as above */
73         p1 = (char *)SCISTACKMALLOC((unsigned)sizeof(double) * (*n + 1 + 2));
74         if (p1 != NULL)
75         {
76             the_gps = the_gp;
77             the_gp = p1;
78             /* add 1 for alignment problems */
79             *ptr = ((int)(the_gp - (char *)C2F(stack).Stk)) / sizeof(double) + 1;
80         }
81         else
82         {
83             if (the_gp == NULL)
84             {
85                 sciprint(_("No space to allocate Scilab stack.\n"));
86                 exit(1);
87             }
88             *ptr = 0;
89         }
90     }
91     return (0);
92 #endif
93 }
94
95 /*--------------------------------------------------------------------------*/
96 void C2F(freeglobalstacklastmemory) (void)
97 {
98 #ifdef _MSC_VER
99     if (the_gps != NULL)
100     {
101         SCISTACKFREE(the_gps);
102     }
103     the_gps = NULL;
104 #endif
105 }
106
107 /*--------------------------------------------------------------------------*/
108 void C2F(freestacklastmemory) (void)
109 {
110 #ifdef _MSC_VER
111     if (the_ps != NULL)
112     {
113         SCISTACKFREE(the_ps);
114     }
115     the_ps = NULL;
116 #endif
117 }
118
119 /*--------------------------------------------------------------------------*/
120 void freeGlobalStackCurrentMemory()
121 {
122 #ifndef _MSC_VER
123     freemem64(TRUE);
124 #else
125     if (the_gp != NULL)
126     {
127         SCISTACKFREE(the_gp);
128     }
129     the_gp = NULL;
130 #endif
131 }
132
133 void freeStackCurrentMemory()
134 {
135 #ifndef _MSC_VER
136     freemem64(FALSE);
137 #else
138     if (the_p != NULL)
139     {
140         SCISTACKFREE(the_p);
141     }
142     the_p = NULL;
143 #endif
144 }