1151497Sru/* Copyright (C) 1989, 1990, 1991, 1992, 2001, 2003, 2004
2114402Sru   Free Software Foundation, Inc.
3114402Sru     Written by James Clark (jjc@jclark.com)
4114402Sru
5114402SruThis file is part of groff.
6114402Sru
7114402Srugroff is free software; you can redistribute it and/or modify it under
8114402Sruthe terms of the GNU General Public License as published by the Free
9114402SruSoftware Foundation; either version 2, or (at your option) any later
10114402Sruversion.
11114402Sru
12114402Srugroff is distributed in the hope that it will be useful, but WITHOUT ANY
13114402SruWARRANTY; without even the implied warranty of MERCHANTABILITY or
14114402SruFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15114402Srufor more details.
16114402Sru
17114402SruYou should have received a copy of the GNU General Public License along
18114402Sruwith groff; see the file COPYING.  If not, write to the Free Software
19151497SruFoundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */
20114402Sru
21114402Sru#include "lib.h"
22114402Sru
23114402Sru#include <stddef.h>
24114402Sru#include <stdlib.h>
25114402Sru
26114402Sru#include "posix.h"
27114402Sru#include "nonposix.h"
28114402Sru
29151497Sruextern "C" const char *program_name;
30114402Sru
31114402Srustatic void ewrite(const char *s)
32114402Sru{
33114402Sru  write(2, s, strlen(s));
34114402Sru}
35114402Sru
36114402Sruvoid *operator new(size_t size)
37114402Sru{
38114402Sru  // Avoid relying on the behaviour of malloc(0).
39114402Sru  if (size == 0)
40114402Sru    size++;
41114402Sru#ifdef COOKIE_BUG
42114402Sru  char *p = (char *)malloc(unsigned(size + 8));
43114402Sru#else /* not COOKIE_BUG */
44114402Sru  char *p = (char *)malloc(unsigned(size));
45114402Sru#endif /* not COOKIE_BUG */
46114402Sru  if (p == 0) {
47114402Sru    if (program_name) {
48114402Sru      ewrite(program_name);
49114402Sru      ewrite(": ");
50114402Sru    }
51114402Sru    ewrite("out of memory\n");
52114402Sru    _exit(-1);
53114402Sru  }
54114402Sru#ifdef COOKIE_BUG
55114402Sru  ((unsigned *)p)[1] = 0;
56114402Sru  return p + 8;
57114402Sru#else /* not COOKIE_BUG */
58114402Sru  return p;
59114402Sru#endif /* not COOKIE_BUG */
60114402Sru}
61114402Sru
62114402Sruvoid operator delete(void *p)
63114402Sru{
64114402Sru#ifdef COOKIE_BUG
65114402Sru  if (p)
66114402Sru    free((void *)((char *)p - 8));
67114402Sru#else
68114402Sru  if (p)
69114402Sru    free(p);
70114402Sru#endif /* COOKIE_BUG */
71114402Sru}
72