Mercurial > hg > octave-lyh
diff liboctave/oct-alloc.cc @ 2475:1d7925d6bede
[project @ 1996-11-07 04:36:00 by jwe]
author | jwe |
---|---|
date | Thu, 07 Nov 1996 04:46:54 +0000 |
parents | |
children | 9aeba8e006a4 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/liboctave/oct-alloc.cc @@ -0,0 +1,110 @@ +/* + +Copyright (C) 1996 John W. Eaton + +This file is part of Octave. + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with Octave; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#if defined (__GNUG__) +#pragma implementation +#endif + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <new> + +#include "oct-alloc.h" + +void * +octave_allocator::alloc (size_t size) +{ + if (size != item_size) + return ::new char [size]; + + if (! head) + { + if (! grow ()) + return 0; + } + + link *tmp = head; + head = head->next; + return tmp; +} + +void +octave_allocator::free (void *p, size_t size) +{ + if (size != item_size) + ::delete [] ((char *) p); + else + { + link *tmp = (link *) p; + tmp->next = head; + head = tmp; + } +} + +// Return TRUE for successful allocation, FALSE otherwise. + +bool +octave_allocator::grow (void) +{ + bool retval = true; + + char *start = new char [grow_size * item_size]; + + if (start) + { + char *last = &start[(grow_size - 1) * item_size]; + + char *p = start; + while (p < last) + { + char *next = p + item_size; + ((link *) p) -> next = (link *) next; + p = next; + } + + ((link *) last) -> next = 0; + + head = (link *) start; + } + else + { + typedef void (*error_handler_function) (void); + + error_handler_function f = set_new_handler (0); + set_new_handler (f); + + if (f) + f (); + + retval = false; + } + + return retval; +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/