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