1/* Copyright (C) 1989, 1990, 1991, 1992, 2001, 2003, 2004 2 Free Software Foundation, Inc. 3 Written by James Clark (jjc@jclark.com) 4 5This file is part of groff. 6 7groff is free software; you can redistribute it and/or modify it under 8the terms of the GNU General Public License as published by the Free 9Software Foundation; either version 2, or (at your option) any later 10version. 11 12groff is distributed in the hope that it will be useful, but WITHOUT ANY 13WARRANTY; without even the implied warranty of MERCHANTABILITY or 14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15for more details. 16 17You should have received a copy of the GNU General Public License along 18with groff; see the file COPYING. If not, write to the Free Software 19Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ 20 21#include "lib.h" 22 23#include <stddef.h> 24#include <stdlib.h> 25 26#include "posix.h" 27#include "nonposix.h" 28 29extern "C" const char *program_name; 30 31static void ewrite(const char *s) 32{ 33 write(2, s, strlen(s)); 34} 35 36void *operator new(size_t size) 37{ 38 // Avoid relying on the behaviour of malloc(0). 39 if (size == 0) 40 size++; 41#ifdef COOKIE_BUG 42 char *p = (char *)malloc(unsigned(size + 8)); 43#else /* not COOKIE_BUG */ 44 char *p = (char *)malloc(unsigned(size)); 45#endif /* not COOKIE_BUG */ 46 if (p == 0) { 47 if (program_name) { 48 ewrite(program_name); 49 ewrite(": "); 50 } 51 ewrite("out of memory\n"); 52 _exit(-1); 53 } 54#ifdef COOKIE_BUG 55 ((unsigned *)p)[1] = 0; 56 return p + 8; 57#else /* not COOKIE_BUG */ 58 return p; 59#endif /* not COOKIE_BUG */ 60} 61 62void operator delete(void *p) 63{ 64#ifdef COOKIE_BUG 65 if (p) 66 free((void *)((char *)p - 8)); 67#else 68 if (p) 69 free(p); 70#endif /* COOKIE_BUG */ 71} 72