* configure.ac (AC_CHECK_ENABLE_ASSERTION): Added
[cacao.git] / src / vm / assertion.c
1 /* src/vm/assertion.c - assertion options
2
3    Copyright (C) 2007
4    CACAOVM - Verein zu Foerderung der freien virtuellen Machine CACAO
5
6    This file is part of CACAO.
7
8    This program is free software; you can redistribute it and/or
9    modify it under the terms of the GNU General Public License as
10    published by the Free Software Foundation; either version 2, or (at
11    your option) any later version.
12
13    This program is distributed in the hope that it will be useful, but
14    WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16    General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21    02110-1301, USA.
22
23 */
24
25 #include "config.h"
26 #include <stdint.h>
27 #include <errno.h>
28
29 #if defined(HAVE_STRING_H)
30 # include <string.h>
31 #endif
32
33 #include "mm/memory.h"
34
35 #include "vm/global.h"
36 #include "vm/vm.h"
37
38 #include "toolbox/list.h"
39
40 #include "vm/assertion.h"
41
42 /* -ea/-da options ************************************************************/
43
44 list_t  *list_assertion_names     = (list_t *)NULL;
45 int32_t  assertion_class_count    = 0;
46 int32_t  assertion_package_count  = 0;
47 bool     assertion_user_enabled   = false;
48 bool     assertion_system_enabled = false;
49
50 /* assertion_ea_da *************************************************************
51
52    Handle -ea:/-enableassertions: and -da:/-disableassertions: options.
53
54 *******************************************************************************/
55
56 void assertion_ea_da(const char *name, bool enabled) {
57         bool              package;
58         size_t            len;
59         char             *buf;
60         assertion_name_t *item;
61         int32_t           i;
62
63         if (name == NULL) {
64                 assertion_user_enabled = enabled;
65                 return;
66         }
67
68         package = false;
69         len     = strlen(name);
70
71         if (name[len - 1] == '/') {
72                 return;
73         }
74
75         buf = strdup(name);
76         if (buf == NULL) {
77                 vm_abort("assertion_ea_da: strdup failed: %s", strerror(errno));
78         }
79
80         if ((len > 2) && (strcmp(name + (len - 3), "...") == 0)) {
81                 package = true;
82                 assertion_package_count += 1;
83 #if defined(WITH_CLASSPATH_SUN)
84                 buf[len - 2] = '\0';
85                 buf[len - 3] = '/';
86 #else
87                 buf[len - 3] = '\0';
88 #endif
89         }
90         else {
91                 assertion_class_count += 1;
92         }
93
94         len = strlen(buf);
95         for (i = 0; i < len; i++) {
96 #if defined(WITH_CLASSPATH_SUN)
97                 if (buf[i] == '.') {
98                         buf[i] = '/';
99                 }
100 #else
101                 if (buf[i] == '/') {
102                         buf[i] = '.';
103                 }
104 #endif
105         }
106
107         item          = NEW(assertion_name_t);
108         item->name    = buf;
109         item->enabled = enabled;
110         item->package = package;
111
112         if (list_assertion_names == NULL) {
113                 list_assertion_names = list_create(OFFSET(assertion_name_t, linkage));
114         }
115         list_add_last(list_assertion_names, item);
116 }
117
118 /*
119  * These are local overrides for various environment variables in Emacs.
120  * Please do not remove this and leave it at the end of the file, where
121  * Emacs will automagically detect them.
122  * ---------------------------------------------------------------------
123  * Local variables:
124  * mode: c
125  * indent-tabs-mode: t
126  * c-basic-offset: 4
127  * tab-width: 4
128  * End:
129  * vim:noexpandtab:sw=4:ts=4:
130  */