Return to type.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / standard |
1.1 misho 1: /*
2: +----------------------------------------------------------------------+
3: | PHP Version 5 |
4: +----------------------------------------------------------------------+
1.1.1.3 ! misho 5: | Copyright (c) 1997-2013 The PHP Group |
1.1 misho 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:
1.1.1.2 misho 19: /* $Id$ */
1.1 misho 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: {
28: zval **arg;
29:
30: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &arg) == FAILURE) {
31: return;
32: }
33:
34: switch (Z_TYPE_PP(arg)) {
35: case IS_NULL:
36: RETVAL_STRING("NULL", 1);
37: break;
38:
39: case IS_BOOL:
40: RETVAL_STRING("boolean", 1);
41: break;
42:
43: case IS_LONG:
44: RETVAL_STRING("integer", 1);
45: break;
46:
47: case IS_DOUBLE:
48: RETVAL_STRING("double", 1);
49: break;
50:
51: case IS_STRING:
52: RETVAL_STRING("string", 1);
53: break;
54:
55: case IS_ARRAY:
56: RETVAL_STRING("array", 1);
57: break;
58:
59: case IS_OBJECT:
60: 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: break;
72:
73: case IS_RESOURCE:
74: {
1.1.1.2 misho 75: const char *type_name = zend_rsrc_list_get_rsrc_type(Z_LVAL_PP(arg) TSRMLS_CC);
76:
1.1 misho 77: if (type_name) {
78: RETVAL_STRING("resource", 1);
79: break;
80: }
81: }
82:
83: default:
84: 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: {
93: zval **var;
94: char *type;
95: int type_len = 0;
96:
97: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zs", &var, &type, &type_len) == FAILURE) {
98: return;
99: }
100:
101: if (!strcasecmp(type, "integer")) {
102: convert_to_long(*var);
103: } else if (!strcasecmp(type, "int")) {
104: convert_to_long(*var);
105: } else if (!strcasecmp(type, "float")) {
106: convert_to_double(*var);
107: } else if (!strcasecmp(type, "double")) { /* deprecated */
108: convert_to_double(*var);
109: } else if (!strcasecmp(type, "string")) {
110: convert_to_string(*var);
111: } else if (!strcasecmp(type, "array")) {
112: convert_to_array(*var);
113: } else if (!strcasecmp(type, "object")) {
114: convert_to_object(*var);
115: } else if (!strcasecmp(type, "bool")) {
116: convert_to_boolean(*var);
117: } else if (!strcasecmp(type, "boolean")) {
118: convert_to_boolean(*var);
119: } else if (!strcasecmp(type, "null")) {
120: convert_to_null(*var);
121: } else if (!strcasecmp(type, "resource")) {
122: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot convert to resource type");
123: RETURN_FALSE;
124: } else {
125: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid type");
126: RETURN_FALSE;
127: }
128: RETVAL_TRUE;
129: }
130: /* }}} */
131:
132: /* {{{ proto int intval(mixed var [, int base])
133: Get the integer value of a variable using the optional base for the conversion */
134: PHP_FUNCTION(intval)
135: {
136: zval **num;
137: long arg_base;
138: int base;
139:
140: switch (ZEND_NUM_ARGS()) {
141: case 1:
142: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &num) == FAILURE) {
143: return;
144: }
145: base = 10;
146: break;
147:
148: case 2:
149: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zl", &num, &arg_base) == FAILURE) {
150: return;
151: }
152: base = arg_base;
153: break;
154:
155: default:
156: WRONG_PARAM_COUNT;
157: }
158:
159: RETVAL_ZVAL(*num, 1, 0);
160: convert_to_long_base(return_value, base);
161: }
162: /* }}} */
163:
164: /* {{{ proto float floatval(mixed var)
165: Get the float value of a variable */
166: PHP_FUNCTION(floatval)
167: {
168: zval **num;
169:
170: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &num) == FAILURE) {
171: return;
172: }
173:
174: RETVAL_ZVAL(*num, 1, 0);
175: convert_to_double(return_value);
176: }
177: /* }}} */
178:
179: /* {{{ proto string strval(mixed var)
180: Get the string value of a variable */
181: PHP_FUNCTION(strval)
182: {
183: zval **num, *tmp;
184: zval expr_copy;
185: int use_copy;
186:
187: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &num) == FAILURE) {
188: return;
189: }
190:
191: zend_make_printable_zval(*num, &expr_copy, &use_copy);
192: if (use_copy) {
193: tmp = &expr_copy;
194: RETVAL_ZVAL(tmp, 0, 0);
195: } else {
196: RETVAL_ZVAL(*num, 1, 0);
197: }
198: }
199: /* }}} */
200:
201: static void php_is_type(INTERNAL_FUNCTION_PARAMETERS, int type)
202: {
203: zval **arg;
204:
205: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &arg) == FAILURE) {
206: RETURN_FALSE;
207: }
208:
209: if (Z_TYPE_PP(arg) == type) {
210: if (type == IS_OBJECT) {
211: zend_class_entry *ce;
212: if(Z_OBJ_HT_PP(arg)->get_class_entry == NULL) {
213: /* if there's no get_class_entry it's not a PHP object, so it can't be INCOMPLETE_CLASS */
214: RETURN_TRUE;
215: }
216: ce = Z_OBJCE_PP(arg);
217: if (!strcmp(ce->name, INCOMPLETE_CLASS)) {
218: RETURN_FALSE;
219: }
220: }
221: if (type == IS_RESOURCE) {
1.1.1.2 misho 222: const char *type_name = zend_rsrc_list_get_rsrc_type(Z_LVAL_PP(arg) TSRMLS_CC);
1.1 misho 223: if (!type_name) {
224: RETURN_FALSE;
225: }
226: }
227: RETURN_TRUE;
228: } else {
229: RETURN_FALSE;
230: }
231: }
232:
233:
234: /* {{{ proto bool is_null(mixed var)
235: Returns true if variable is null */
236: PHP_FUNCTION(is_null)
237: {
238: php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_NULL);
239: }
240: /* }}} */
241:
242: /* {{{ proto bool is_resource(mixed var)
243: Returns true if variable is a resource */
244: PHP_FUNCTION(is_resource)
245: {
246: php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_RESOURCE);
247: }
248: /* }}} */
249:
250: /* {{{ proto bool is_bool(mixed var)
251: Returns true if variable is a boolean */
252: PHP_FUNCTION(is_bool)
253: {
254: php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_BOOL);
255: }
256: /* }}} */
257:
258: /* {{{ proto bool is_long(mixed var)
259: Returns true if variable is a long (integer) */
260: PHP_FUNCTION(is_long)
261: {
262: php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_LONG);
263: }
264: /* }}} */
265:
266: /* {{{ proto bool is_float(mixed var)
267: Returns true if variable is float point*/
268: PHP_FUNCTION(is_float)
269: {
270: php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_DOUBLE);
271: }
272: /* }}} */
273:
274: /* {{{ proto bool is_string(mixed var)
275: Returns true if variable is a string */
276: PHP_FUNCTION(is_string)
277: {
278: php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_STRING);
279: }
280: /* }}} */
281:
282: /* {{{ proto bool is_array(mixed var)
283: Returns true if variable is an array */
284: PHP_FUNCTION(is_array)
285: {
286: php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_ARRAY);
287: }
288: /* }}} */
289:
290: /* {{{ proto bool is_object(mixed var)
291: Returns true if variable is an object */
292: PHP_FUNCTION(is_object)
293: {
294: php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_OBJECT);
295: }
296: /* }}} */
297:
298: /* {{{ proto bool is_numeric(mixed value)
299: Returns true if value is a number or a numeric string */
300: PHP_FUNCTION(is_numeric)
301: {
302: zval **arg;
303:
304: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &arg) == FAILURE) {
305: return;
306: }
307:
308: switch (Z_TYPE_PP(arg)) {
309: case IS_LONG:
310: case IS_DOUBLE:
311: RETURN_TRUE;
312: break;
313:
314: case IS_STRING:
315: if (is_numeric_string(Z_STRVAL_PP(arg), Z_STRLEN_PP(arg), NULL, NULL, 0)) {
316: RETURN_TRUE;
317: } else {
318: RETURN_FALSE;
319: }
320: break;
321:
322: default:
323: RETURN_FALSE;
324: break;
325: }
326: }
327: /* }}} */
328:
329: /* {{{ proto bool is_scalar(mixed value)
330: Returns true if value is a scalar */
331: PHP_FUNCTION(is_scalar)
332: {
333: zval **arg;
334:
335: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &arg) == FAILURE) {
336: return;
337: }
338:
339: switch (Z_TYPE_PP(arg)) {
340: case IS_BOOL:
341: case IS_DOUBLE:
342: case IS_LONG:
343: case IS_STRING:
344: RETURN_TRUE;
345: break;
346:
347: default:
348: RETURN_FALSE;
349: break;
350: }
351: }
352: /* }}} */
353:
354: /* {{{ proto bool is_callable(mixed var [, bool syntax_only [, string callable_name]])
355: Returns true if var is callable. */
356: PHP_FUNCTION(is_callable)
357: {
358: zval *var, **callable_name = NULL;
359: char *name;
360: char *error;
361: zend_bool retval;
362: zend_bool syntax_only = 0;
363: int check_flags = 0;
364:
365: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|bZ", &var,
366: &syntax_only, &callable_name) == FAILURE) {
367: return;
368: }
369:
370: if (syntax_only) {
371: check_flags |= IS_CALLABLE_CHECK_SYNTAX_ONLY;
372: }
373: if (ZEND_NUM_ARGS() > 2) {
374: retval = zend_is_callable_ex(var, NULL, check_flags, &name, NULL, NULL, &error TSRMLS_CC);
375: zval_dtor(*callable_name);
376: ZVAL_STRING(*callable_name, name, 0);
377: } else {
378: retval = zend_is_callable_ex(var, NULL, check_flags, NULL, NULL, NULL, &error TSRMLS_CC);
379: }
380: if (error) {
381: /* ignore errors */
382: efree(error);
383: }
384:
385: 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: */