1 : /*
2 : +----------------------------------------------------------------------+
3 : | PHP Version 5 |
4 : +----------------------------------------------------------------------+
5 : | Copyright (c) 1997-2007 The PHP Group |
6 : +----------------------------------------------------------------------+
7 : | This source file is subject to version 3.01 of the PHP license, |
8 : | that is bundled with this package in the file LICENSE, and is |
9 : | available through the world-wide-web at the following url: |
10 : | http://www.php.net/license/3_01.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: Rasmus Lerdorf <rasmus@php.net> |
16 : +----------------------------------------------------------------------+
17 : */
18 :
19 : /* $Id: type.c,v 1.30.2.2.2.3 2007/02/24 02:17:27 helly Exp $ */
20 :
21 : #include "php.h"
22 : #include "php_incomplete_class.h"
23 :
24 : /* {{{ proto string gettype(mixed var)
25 : Returns the type of the variable */
26 : PHP_FUNCTION(gettype)
27 0 : {
28 : zval **arg;
29 :
30 0 : if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg) == FAILURE) {
31 0 : WRONG_PARAM_COUNT;
32 : }
33 :
34 0 : switch (Z_TYPE_PP(arg)) {
35 : case IS_NULL:
36 0 : RETVAL_STRING("NULL", 1);
37 0 : break;
38 :
39 : case IS_BOOL:
40 0 : RETVAL_STRING("boolean", 1);
41 0 : break;
42 :
43 : case IS_LONG:
44 0 : RETVAL_STRING("integer", 1);
45 0 : break;
46 :
47 : case IS_DOUBLE:
48 0 : RETVAL_STRING("double", 1);
49 0 : break;
50 :
51 : case IS_STRING:
52 0 : RETVAL_STRING("string", 1);
53 0 : break;
54 :
55 : case IS_ARRAY:
56 0 : RETVAL_STRING("array", 1);
57 0 : break;
58 :
59 : case IS_OBJECT:
60 0 : RETVAL_STRING("object", 1);
61 : /*
62 : {
63 : char *result;
64 : int res_len;
65 :
66 : res_len = sizeof("object of type ")-1 + Z_OBJCE_P(arg)->name_length;
67 : spprintf(&result, 0, "object of type %s", Z_OBJCE_P(arg)->name);
68 : RETVAL_STRINGL(result, res_len, 0);
69 : }
70 : */
71 0 : break;
72 :
73 : case IS_RESOURCE:
74 : {
75 : char *type_name;
76 0 : type_name = zend_rsrc_list_get_rsrc_type(Z_LVAL_PP(arg) TSRMLS_CC);
77 0 : if (type_name) {
78 0 : RETVAL_STRING("resource", 1);
79 0 : break;
80 : }
81 : }
82 :
83 : default:
84 0 : RETVAL_STRING("unknown type", 1);
85 : }
86 : }
87 : /* }}} */
88 :
89 : /* {{{ proto bool settype(mixed var, string type)
90 : Set the type of the variable */
91 : PHP_FUNCTION(settype)
92 0 : {
93 : zval **var, **type;
94 : char *new_type;
95 :
96 0 : if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &var, &type) == FAILURE) {
97 0 : WRONG_PARAM_COUNT;
98 : }
99 :
100 0 : convert_to_string_ex(type);
101 0 : new_type = Z_STRVAL_PP(type);
102 :
103 0 : if (!strcasecmp(new_type, "integer")) {
104 0 : convert_to_long(*var);
105 0 : } else if (!strcasecmp(new_type, "int")) {
106 0 : convert_to_long(*var);
107 0 : } else if (!strcasecmp(new_type, "float")) {
108 0 : convert_to_double(*var);
109 0 : } else if (!strcasecmp(new_type, "double")) { /* deprecated */
110 0 : convert_to_double(*var);
111 0 : } else if (!strcasecmp(new_type, "string")) {
112 0 : convert_to_string(*var);
113 0 : } else if (!strcasecmp(new_type, "array")) {
114 0 : convert_to_array(*var);
115 0 : } else if (!strcasecmp(new_type, "object")) {
116 0 : convert_to_object(*var);
117 0 : } else if (!strcasecmp(new_type, "bool")) {
118 0 : convert_to_boolean(*var);
119 0 : } else if (!strcasecmp(new_type, "boolean")) {
120 0 : convert_to_boolean(*var);
121 0 : } else if (!strcasecmp(new_type, "null")) {
122 0 : convert_to_null(*var);
123 0 : } else if (!strcasecmp(new_type, "resource")) {
124 0 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot convert to resource type");
125 0 : RETURN_FALSE;
126 : } else {
127 0 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid type");
128 0 : RETURN_FALSE;
129 : }
130 0 : RETVAL_TRUE;
131 : }
132 : /* }}} */
133 :
134 : /* {{{ proto int intval(mixed var [, int base])
135 : Get the integer value of a variable using the optional base for the conversion */
136 : PHP_FUNCTION(intval)
137 0 : {
138 : zval **num, **arg_base;
139 : int base;
140 :
141 0 : switch (ZEND_NUM_ARGS()) {
142 : case 1:
143 0 : if (zend_get_parameters_ex(1, &num) == FAILURE) {
144 0 : WRONG_PARAM_COUNT;
145 : }
146 0 : base = 10;
147 0 : break;
148 :
149 : case 2:
150 0 : if (zend_get_parameters_ex(2, &num, &arg_base) == FAILURE) {
151 0 : WRONG_PARAM_COUNT;
152 : }
153 0 : convert_to_long_ex(arg_base);
154 0 : base = Z_LVAL_PP(arg_base);
155 0 : break;
156 :
157 : default:
158 0 : WRONG_PARAM_COUNT;
159 : }
160 :
161 0 : RETVAL_ZVAL(*num, 1, 0);
162 0 : convert_to_long_base(return_value, base);
163 : }
164 : /* }}} */
165 :
166 : /* {{{ proto float floatval(mixed var)
167 : Get the float value of a variable */
168 : PHP_FUNCTION(floatval)
169 0 : {
170 : zval **num;
171 :
172 0 : if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &num) == FAILURE) {
173 0 : WRONG_PARAM_COUNT;
174 : }
175 :
176 0 : RETVAL_ZVAL(*num, 1, 0);
177 0 : convert_to_double(return_value);
178 : }
179 : /* }}} */
180 :
181 : /* {{{ proto string strval(mixed var)
182 : Get the string value of a variable */
183 : PHP_FUNCTION(strval)
184 0 : {
185 : zval **num, *tmp;
186 : zval expr_copy;
187 : int use_copy;
188 :
189 0 : if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &num) == FAILURE) {
190 0 : WRONG_PARAM_COUNT;
191 : }
192 :
193 0 : zend_make_printable_zval(*num, &expr_copy, &use_copy);
194 0 : if (use_copy) {
195 0 : tmp = &expr_copy;
196 0 : RETVAL_ZVAL(tmp, 0, 0);
197 : } else {
198 0 : RETVAL_ZVAL(*num, 1, 0);
199 : }
200 : }
201 : /* }}} */
202 :
203 : static void php_is_type(INTERNAL_FUNCTION_PARAMETERS, int type)
204 4604 : {
205 : zval **arg;
206 :
207 4604 : if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg) == FAILURE) {
208 0 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Only one argument expected");
209 0 : RETURN_FALSE;
210 : }
211 :
212 4604 : if (Z_TYPE_PP(arg) == type) {
213 3 : if (type == IS_OBJECT) {
214 : zend_class_entry *ce;
215 3 : if(Z_OBJ_HT_PP(arg)->get_class_entry == NULL) {
216 : /* if there's no get_class_entry it's not a PHP object, so it can't be INCOMPLETE_CLASS */
217 0 : RETURN_TRUE;
218 : }
219 3 : ce = Z_OBJCE_PP(arg);
220 3 : if (!strcmp(ce->name, INCOMPLETE_CLASS)) {
221 0 : RETURN_FALSE;
222 : }
223 : }
224 3 : if (type == IS_RESOURCE) {
225 : char *type_name;
226 0 : type_name = zend_rsrc_list_get_rsrc_type(Z_LVAL_PP(arg) TSRMLS_CC);
227 0 : if (!type_name) {
228 0 : RETURN_FALSE;
229 : }
230 : }
231 3 : RETURN_TRUE;
232 : } else {
233 4601 : RETURN_FALSE;
234 : }
235 : }
236 :
237 :
238 : /* {{{ proto bool is_null(mixed var)
239 : Returns true if variable is null */
240 : PHP_FUNCTION(is_null)
241 8 : {
242 8 : php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_NULL);
243 8 : }
244 : /* }}} */
245 :
246 : /* {{{ proto bool is_resource(mixed var)
247 : Returns true if variable is a resource */
248 : PHP_FUNCTION(is_resource)
249 0 : {
250 0 : php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_RESOURCE);
251 0 : }
252 : /* }}} */
253 :
254 : /* {{{ proto bool is_bool(mixed var)
255 : Returns true if variable is a boolean */
256 : PHP_FUNCTION(is_bool)
257 0 : {
258 0 : php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_BOOL);
259 0 : }
260 : /* }}} */
261 :
262 : /* {{{ proto bool is_long(mixed var)
263 : Returns true if variable is a long (integer) */
264 : PHP_FUNCTION(is_long)
265 0 : {
266 0 : php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_LONG);
267 0 : }
268 : /* }}} */
269 :
270 : /* {{{ proto bool is_float(mixed var)
271 : Returns true if variable is float point*/
272 : PHP_FUNCTION(is_float)
273 0 : {
274 0 : php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_DOUBLE);
275 0 : }
276 : /* }}} */
277 :
278 : /* {{{ proto bool is_string(mixed var)
279 : Returns true if variable is a string */
280 : PHP_FUNCTION(is_string)
281 216 : {
282 216 : php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_STRING);
283 216 : }
284 : /* }}} */
285 :
286 : /* {{{ proto bool is_array(mixed var)
287 : Returns true if variable is an array */
288 : PHP_FUNCTION(is_array)
289 4377 : {
290 4377 : php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_ARRAY);
291 4377 : }
292 : /* }}} */
293 :
294 : /* {{{ proto bool is_object(mixed var)
295 : Returns true if variable is an object */
296 : PHP_FUNCTION(is_object)
297 3 : {
298 3 : php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_OBJECT);
299 3 : }
300 : /* }}} */
301 :
302 : /* {{{ proto bool is_numeric(mixed value)
303 : Returns true if value is a number or a numeric string */
304 : PHP_FUNCTION(is_numeric)
305 0 : {
306 : zval **arg;
307 :
308 0 : if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg) == FAILURE) {
309 0 : WRONG_PARAM_COUNT;
310 : }
311 :
312 0 : switch (Z_TYPE_PP(arg)) {
313 : case IS_LONG:
314 : case IS_DOUBLE:
315 0 : RETURN_TRUE;
316 : break;
317 :
318 : case IS_STRING:
319 0 : if (is_numeric_string(Z_STRVAL_PP(arg), Z_STRLEN_PP(arg), NULL, NULL, 0)) {
320 0 : RETURN_TRUE;
321 : } else {
322 0 : RETURN_FALSE;
323 : }
324 : break;
325 :
326 : default:
327 0 : RETURN_FALSE;
328 : break;
329 : }
330 : }
331 : /* }}} */
332 :
333 : /* {{{ proto bool is_scalar(mixed value)
334 : Returns true if value is a scalar */
335 : PHP_FUNCTION(is_scalar)
336 0 : {
337 : zval **arg;
338 :
339 0 : if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg) == FAILURE) {
340 0 : WRONG_PARAM_COUNT;
341 : }
342 :
343 0 : switch (Z_TYPE_PP(arg)) {
344 : case IS_BOOL:
345 : case IS_DOUBLE:
346 : case IS_LONG:
347 : case IS_STRING:
348 0 : RETURN_TRUE;
349 : break;
350 :
351 : default:
352 0 : RETURN_FALSE;
353 : break;
354 : }
355 : }
356 : /* }}} */
357 :
358 : /* {{{ proto bool is_callable(mixed var [, bool syntax_only [, string callable_name]])
359 : Returns true if var is callable. */
360 : PHP_FUNCTION(is_callable)
361 0 : {
362 : zval **var, **syntax_only, **callable_name;
363 : char *name;
364 : zend_bool retval;
365 0 : zend_bool syntax = 0;
366 0 : int argc=ZEND_NUM_ARGS();
367 :
368 0 : if (argc < 1 || argc > 3 || zend_get_parameters_ex(argc, &var, &syntax_only, &callable_name) == FAILURE) {
369 0 : WRONG_PARAM_COUNT;
370 : }
371 :
372 0 : if (argc > 1) {
373 0 : convert_to_boolean_ex(syntax_only);
374 0 : syntax = Z_BVAL_PP(syntax_only);
375 : }
376 :
377 0 : if (argc > 2) {
378 0 : retval = zend_is_callable(*var, syntax, &name);
379 0 : zval_dtor(*callable_name);
380 0 : ZVAL_STRING(*callable_name, name, 0);
381 : } else {
382 0 : retval = zend_is_callable(*var, syntax, NULL);
383 : }
384 :
385 0 : RETURN_BOOL(retval);
386 : }
387 : /* }}} */
388 :
389 : /*
390 : * Local variables:
391 : * tab-width: 4
392 : * c-basic-offset: 4
393 : * End:
394 : * vim600: sw=4 ts=4 fdm=marker
395 : * vim<600: sw=4 ts=4
396 : */
|