|
| 1 | +/* |
| 2 | + +----------------------------------------------------------------------+ |
| 3 | + | PHP version 4.0 | |
| 4 | + +----------------------------------------------------------------------+ |
| 5 | + | Copyright (c) 1997, 1998, 1999 The PHP Group | |
| 6 | + +----------------------------------------------------------------------+ |
| 7 | + | This source file is subject to version 2.0 of the PHP license, | |
| 8 | + | that is bundled with this package in the file LICENSE, and is | |
| 9 | + | available at through the world-wide-web at | |
| 10 | + | http://www.php.net/license/2_0.txt. | |
| 11 | + | If you did not receive a copy of the PHP license and are unable to | |
| 12 | + | obtain it through the world-wide-web, please send a note to | |
| 13 | + | license@php.net so we can mail you a copy immediately. | |
| 14 | + +----------------------------------------------------------------------+ |
| 15 | + | Author: Thies C. Arntzen (thies@digicol.de) | |
| 16 | + +----------------------------------------------------------------------+ |
| 17 | + */ |
| 18 | + |
| 19 | +/* $Id$ */ |
| 20 | + |
| 21 | +/* {{{ includes/startup/misc */ |
| 22 | + |
| 23 | +#include "php.h" |
| 24 | +#include "php_assert.h" |
| 25 | + |
| 26 | +typedef struct { |
| 27 | + int active; |
| 28 | + int exit; |
| 29 | + char *callback; |
| 30 | +} php_assert_globals; |
| 31 | + |
| 32 | +#ifdef ZTS |
| 33 | +#define ASSERT(v) (assert_globals->v) |
| 34 | +#define ASSERTLS_FETCH() php_assert_globals *assert_globals = ts_resource(assert_globals_id) |
| 35 | +int assert_globals_id; |
| 36 | +#else |
| 37 | +#define ASSERT(v) (assert_globals.v) |
| 38 | +#define ASSERTLS_FETCH() |
| 39 | +php_assert_globals assert_globals; |
| 40 | +#endif |
| 41 | + |
| 42 | +PHP_MINIT_FUNCTION(assert); |
| 43 | +PHP_MSHUTDOWN_FUNCTION(assert); |
| 44 | +PHP_RINIT_FUNCTION(assert); |
| 45 | +PHP_RSHUTDOWN_FUNCTION(assert); |
| 46 | +PHP_MINFO_FUNCTION(assert); |
| 47 | + |
| 48 | +PHP_FUNCTION(assert); |
| 49 | +PHP_FUNCTION(assert_options); |
| 50 | + |
| 51 | +static zend_function_entry php_assert_functions[] = { |
| 52 | + PHP_FE(assert, NULL) |
| 53 | + PHP_FE(assert_options, NULL) |
| 54 | + {NULL, NULL, NULL} |
| 55 | +}; |
| 56 | + |
| 57 | + |
| 58 | +zend_module_entry assert_module_entry = { |
| 59 | + "Assertion", |
| 60 | + php_assert_functions, |
| 61 | + PHP_MINIT(assert), |
| 62 | + PHP_MSHUTDOWN(assert), |
| 63 | + PHP_RINIT(assert), |
| 64 | + PHP_RSHUTDOWN(assert), |
| 65 | + PHP_MINFO(assert), |
| 66 | + STANDARD_MODULE_PROPERTIES |
| 67 | +}; |
| 68 | + |
| 69 | +#define ASSERT_ACTIVE 1 |
| 70 | +#define ASSERT_CALLBACK 2 |
| 71 | +#define ASSERT_EXIT 3 |
| 72 | + |
| 73 | +#ifdef ZTS |
| 74 | +static void php_assert_init_globals(php_assert_globals *assert_globals) |
| 75 | +{ |
| 76 | + ASSERT(active) = 0; |
| 77 | + ASSERT(exit) = 0; |
| 78 | + ASSERT(callback) = 0; |
| 79 | +} |
| 80 | +#endif |
| 81 | + |
| 82 | +PHP_MINIT_FUNCTION(assert) |
| 83 | +{ |
| 84 | + |
| 85 | +#ifdef ZTS |
| 86 | + assert_globals_id = ts_allocate_id(sizeof(php_assert_globals), (ts_allocate_ctor) php_assert_init_globals, NULL); |
| 87 | +#else |
| 88 | + ASSERT(active) = 0; |
| 89 | + ASSERT(exit) = 0; |
| 90 | + ASSERT(callback) = 0; |
| 91 | +#endif |
| 92 | + |
| 93 | + REGISTER_LONG_CONSTANT("ASSERT_ACTIVE", ASSERT_ACTIVE, CONST_CS|CONST_PERSISTENT); |
| 94 | + REGISTER_LONG_CONSTANT("ASSERT_CALLBACK", ASSERT_CALLBACK, CONST_CS|CONST_PERSISTENT); |
| 95 | + REGISTER_LONG_CONSTANT("ASSERT_EXIT", ASSERT_EXIT, CONST_CS|CONST_PERSISTENT); |
| 96 | + |
| 97 | + return SUCCESS; |
| 98 | +} |
| 99 | + |
| 100 | +PHP_MSHUTDOWN_FUNCTION(assert) |
| 101 | +{ |
| 102 | + return SUCCESS; |
| 103 | +} |
| 104 | + |
| 105 | +PHP_RINIT_FUNCTION(assert) |
| 106 | +{ |
| 107 | + return SUCCESS; |
| 108 | +} |
| 109 | + |
| 110 | +PHP_RSHUTDOWN_FUNCTION(assert) |
| 111 | +{ |
| 112 | + return SUCCESS; |
| 113 | +} |
| 114 | + |
| 115 | +PHP_MINFO_FUNCTION(assert) |
| 116 | +{ |
| 117 | +} |
| 118 | + |
| 119 | +/* }}} */ |
| 120 | +/* {{{ internal functions */ |
| 121 | +/* }}} */ |
| 122 | +/* {{{ proto int assert(string|int assertion) |
| 123 | + checks if assertion is false */ |
| 124 | + |
| 125 | +PHP_FUNCTION(assert) |
| 126 | +{ |
| 127 | + pval **assertion; |
| 128 | + int val; |
| 129 | + char *myeval = empty_string; |
| 130 | + ASSERTLS_FETCH(); |
| 131 | + |
| 132 | + if (! ASSERT(active)) { |
| 133 | + RETURN_TRUE; |
| 134 | + } |
| 135 | + |
| 136 | + if (ARG_COUNT(ht) != 1 || getParametersEx(1, &assertion) == FAILURE) { |
| 137 | + WRONG_PARAM_COUNT; |
| 138 | + } |
| 139 | + |
| 140 | + if ((*assertion)->type == IS_STRING) { |
| 141 | + zval retval; |
| 142 | + CLS_FETCH(); |
| 143 | + ELS_FETCH(); |
| 144 | + |
| 145 | + myeval = (*assertion)->value.str.val; |
| 146 | + zend_eval_string(myeval, &retval CLS_CC ELS_CC); |
| 147 | + convert_to_boolean(&retval); |
| 148 | + val = retval.value.lval; |
| 149 | + } else { |
| 150 | + convert_to_boolean_ex(assertion); |
| 151 | + val = (*assertion)->value.lval; |
| 152 | + } |
| 153 | + |
| 154 | + if (val) { |
| 155 | + RETURN_TRUE; |
| 156 | + } |
| 157 | + php_error(E_WARNING,"Assertion \"%s\" failed",myeval); |
| 158 | + |
| 159 | + if (ASSERT(exit)) { |
| 160 | + zend_bailout(); |
| 161 | + } |
| 162 | +} |
| 163 | + |
| 164 | +/* }}} */ |
| 165 | +/* {{{ proto mixed assert_options(int what,mixed value) |
| 166 | + set/get the various assert flags. */ |
| 167 | + |
| 168 | +PHP_FUNCTION(assert_options) |
| 169 | +{ |
| 170 | + pval **what,**value; |
| 171 | + int oldint; |
| 172 | + char *oldstr; |
| 173 | + int ac = ARG_COUNT(ht); |
| 174 | + ASSERTLS_FETCH(); |
| 175 | + |
| 176 | + if (ac < 1 || ac > 2 || getParametersEx(ac, &what, &value) == FAILURE) { |
| 177 | + WRONG_PARAM_COUNT; |
| 178 | + } |
| 179 | + |
| 180 | + convert_to_long_ex(what); |
| 181 | + |
| 182 | + switch ((*what)->value.lval) { |
| 183 | + case ASSERT_ACTIVE: |
| 184 | + oldint = ASSERT(active); |
| 185 | + if (ac == 2) { |
| 186 | + convert_to_long_ex(value); |
| 187 | + ASSERT(active) = (*value)->value.lval; |
| 188 | + } |
| 189 | + RETURN_LONG(oldint); |
| 190 | + break; |
| 191 | + |
| 192 | + case ASSERT_EXIT: |
| 193 | + oldint = ASSERT(exit); |
| 194 | + if (ac == 2) { |
| 195 | + convert_to_long_ex(value); |
| 196 | + ASSERT(exit) = (*value)->value.lval; |
| 197 | + } |
| 198 | + RETURN_LONG(oldint); |
| 199 | + break; |
| 200 | + |
| 201 | + case ASSERT_CALLBACK: |
| 202 | + oldstr = ASSERT(callback); |
| 203 | + RETVAL_STRING(oldstr,1); |
| 204 | + |
| 205 | + if (ac == 2) { |
| 206 | + convert_to_string_ex(value); |
| 207 | + ASSERT(callback) = estrndup((*value)->value.str.val,(*value)->value.str.len); |
| 208 | + } |
| 209 | + if (oldstr) { |
| 210 | + efree(oldstr); |
| 211 | + } |
| 212 | + return; |
| 213 | + break; |
| 214 | + |
| 215 | + default: |
| 216 | + php_error(E_WARNING,"Unknown value %d.",(*what)->value.lval); |
| 217 | + break; |
| 218 | + } |
| 219 | + |
| 220 | + RETURN_FALSE; |
| 221 | +} |
| 222 | + |
| 223 | +/* }}} */ |
| 224 | + |
| 225 | +/* |
| 226 | + * Local variables: |
| 227 | + * tab-width: 4 |
| 228 | + * c-basic-offset: 4 |
| 229 | + * End: |
| 230 | + */ |
0 commit comments