]> git.donarmstrong.com Git - lilypond.git/blob - lily/debug.cc
release: 1.2.7
[lilypond.git] / lily / debug.cc
1 /*   
2   debug.cc --  implement debugging routines
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 1996,98 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7   
8  */
9 #include <fstream.h>
10 #include <signal.h>
11
12 // libg++ 2.8.0
13 // #include <std/new.h>
14 #include <stdlib.h>
15
16
17 #include "debug.hh"
18 #include "dstream.hh"
19 #include "flower-debug.hh"
20 #include "moment.hh"
21 #include "misc.hh"
22 #include "main.hh"
23
24 Dstream *lily_monitor=0;
25 ostream * nulldev =0;
26
27
28 // ugh
29 struct _Dinit {
30   _Dinit()
31     {
32         nulldev = new ofstream ("/dev/null");
33         lily_monitor = new Dstream (&cout,".dstreamrc");
34     }
35   ~_Dinit()
36     {
37         delete nulldev;
38         delete lily_monitor;
39     }
40 } dinit;
41
42
43
44 /*
45   want to do a stacktrace .
46   */
47 void
48 mynewhandler()
49 {
50   assert (false);
51 }
52
53 void
54 float_handler (int)
55 {
56   cerr << _ ("Floating point exception") << endl;
57   assert (false);
58 }
59
60
61 void
62 debug_init()
63 {
64 #ifndef NDEBUG
65   // libg++ 2.8.0 doesn't have set_new_handler
66   // set_new_handler (&mynewhandler);
67 #endif
68   set_flower_debug (*lily_monitor, check_debug);
69
70   signal (SIGFPE, float_handler);
71 }
72
73 bool check_debug=false;
74
75
76 bool check_malloc_b = false;
77
78 // #define MEMORY_PARANOID
79
80 #ifdef MEMORY_PARANOID
81
82 #include <malloc.h>
83
84 void
85 frobnify (void *p, size_t s)
86 {
87   char *cp = (char*)p;
88   char *e  = cp + s;
89   while (cp < e)
90     {
91       *cp++ ^=42;
92     }
93 }
94
95
96 void *
97 operator new (size_t size)
98 {
99   void *result;
100   result = malloc (size);
101   if (check_malloc_b)
102     frobnify (result, size);
103   return result;
104 }
105
106 void *to_frob; int frob_size;
107
108 void
109 set_frobnify (void * p, size_t sz)
110 {
111   to_frob = p;
112   frob_size = sz;
113 }
114
115 void 
116 operator delete (void *p)
117 {
118   if (!p)
119     return ;
120   if (p == to_frob)
121     {
122       frobnify (p, frob_size);
123       to_frob = 0;
124       frob_size=0;
125     }
126
127   free (p);
128 }
129 #endif // MEMORY_PARANOID
130
131 void
132 set_debug (bool b)
133 {
134   check_debug =b;
135   set_flower_debug (*lily_monitor, check_debug);
136 #ifdef MEMORY_PARANOID
137   if (check_malloc_b)
138     if (mcheck (0))
139       warning (_ ("can't set mem-checking") + "!");
140 #endif
141 }
142