c2a4061997-02-06Fredrik Hübinette (Hubbe) #define error(X) throw( ({ (X), backtrace()[0..sizeof(backtrace())-2] }) ) class stack { int ptr;
7c4c381998-11-14Henrik Grubbström (Grubba)  mixed *arr;
c2a4061997-02-06Fredrik Hübinette (Hubbe)  void push(mixed val) {
7c4c381998-11-14Henrik Grubbström (Grubba)  if(ptr == sizeof(arr)) { arr += allocate(ptr); } arr[ptr++] = val;
c2a4061997-02-06Fredrik Hübinette (Hubbe)  }
1bbfe11997-06-20Henrik Grubbström (Grubba)  mixed top() { if (ptr) { return(arr[ptr-1]); } error("Stack underflow\n"); }
7c4c381998-11-14Henrik Grubbström (Grubba)  void quick_pop(void|int val) { if (val) { if (ptr < val) { ptr = 0; } else { ptr -= val; } } else { if (ptr > 0) { ptr--; } } }
3cda061997-03-08Henrik Grubbström (Grubba)  mixed pop(void|int val)
c2a4061997-02-06Fredrik Hübinette (Hubbe)  { mixed foo;
3cda061997-03-08Henrik Grubbström (Grubba)  if (val) { if (ptr <= 0) { error("Stack underflow\n"); } if (ptr < val) { val = ptr; } ptr -= val; foo = arr[ptr..ptr + val - 1]; for (int i=0; i < val; i++) { arr[ptr + i] = 0; /* Don't waste references */ } } else { if(--ptr < 0) error("Stack underflow\n");
c2a4061997-02-06Fredrik Hübinette (Hubbe) 
3cda061997-03-08Henrik Grubbström (Grubba)  foo=arr[ptr]; arr[ptr]=0; /* Don't waste references */ }
c2a4061997-02-06Fredrik Hübinette (Hubbe)  return foo; }
7c4c381998-11-14Henrik Grubbström (Grubba)  void reset(int|void initial_size) { arr = allocate(initial_size || 32); ptr = 0; } void create(int|void initial_size)
c2a4061997-02-06Fredrik Hübinette (Hubbe)  {
7c4c381998-11-14Henrik Grubbström (Grubba)  arr = allocate(initial_size || 32);
c2a4061997-02-06Fredrik Hübinette (Hubbe)  } };