sclang: array primitives - respect mutability when changing object.
[supercollider.git] / lang / LangSource / SimpleStack.cpp
blob18593b8008c2e0434f849a5e624b27dfe7acc2a9
1 /*
2 SuperCollider real time audio synthesis system
3 Copyright (c) 2002 James McCartney. All rights reserved.
4 http://www.audiosynth.com
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 #include <stdlib.h>
22 #include <string.h>
23 //#include <stdio.h>
24 #include "SCBase.h"
25 #include "SimpleStack.h"
26 #include "InitAlloc.h"
28 void initLongStack(LongStack *self)
30 //dbg("initLongStack");
31 self->maxsize = 0;
32 self->stak = NULL;
33 self->num = 0;
36 void freeLongStack(LongStack *self)
38 //dbg("freeLongStack");
39 self->maxsize = 0;
40 self->num = 0;
41 if (self->stak) {
42 pyr_pool_compile->Free((void*)self->stak);
43 self->stak = NULL;
47 void growLongStack(LongStack *self)
49 if (self->maxsize) {
50 long *oldstak;
51 self->maxsize += self->maxsize >> 1; // grow by 50%
52 oldstak = self->stak;
53 // pyrmalloc:
54 // lifetime: kill after compile.
55 self->stak = (long*)pyr_pool_compile->Alloc(self->maxsize * sizeof(long));
56 MEMFAIL(self->stak);
57 //BlockMoveData(oldstak, self->stak, self->num * sizeof(long));
58 memcpy(self->stak, oldstak, self->num * sizeof(long));
59 pyr_pool_compile->Free((void*)oldstak);
60 } else {
61 self->maxsize = 32;
62 self->stak = (long*)pyr_pool_compile->Alloc(self->maxsize * sizeof(long));
63 MEMFAIL(self->stak);
68 void
69 pushls(LongStack *self, long value) {
70 //dbg2("pushls %lX", value);
71 if (self->num+1 > self->maxsize) {
72 growLongStack(self);
74 self->stak[self->num++] = value;
77 long
78 popls(LongStack *self) {
79 if (self->num > 0) return self->stak[--self->num];
80 else {
81 error("stack empty! (pop)\n");
82 return 0;
86 int emptyls(LongStack *self)
88 return self->num <= 0;