Annotation of embedaddon/php/ext/standard/type.c, revision 1.1.1.1
1.1 misho 1: /*
2: +----------------------------------------------------------------------+
3: | PHP Version 5 |
4: +----------------------------------------------------------------------+
5: | Copyright (c) 1997-2012 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 321634 2012-01-01 13:15:04Z felipe $ */
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: {
75: char *type_name;
76: type_name = zend_rsrc_list_get_rsrc_type(Z_LVAL_PP(arg) TSRMLS_CC);
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) {
222: char *type_name;
223: type_name = zend_rsrc_list_get_rsrc_type(Z_LVAL_PP(arg) TSRMLS_CC);
224: if (!type_name) {
225: RETURN_FALSE;
226: }
227: }
228: RETURN_TRUE;
229: } else {
230: RETURN_FALSE;
231: }
232: }
233:
234:
235: /* {{{ proto bool is_null(mixed var)
236: Returns true if variable is null */
237: PHP_FUNCTION(is_null)
238: {
239: php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_NULL);
240: }
241: /* }}} */
242:
243: /* {{{ proto bool is_resource(mixed var)
244: Returns true if variable is a resource */
245: PHP_FUNCTION(is_resource)
246: {
247: php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_RESOURCE);
248: }
249: /* }}} */
250:
251: /* {{{ proto bool is_bool(mixed var)
252: Returns true if variable is a boolean */
253: PHP_FUNCTION(is_bool)
254: {
255: php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_BOOL);
256: }
257: /* }}} */
258:
259: /* {{{ proto bool is_long(mixed var)
260: Returns true if variable is a long (integer) */
261: PHP_FUNCTION(is_long)
262: {
263: php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_LONG);
264: }
265: /* }}} */
266:
267: /* {{{ proto bool is_float(mixed var)
268: Returns true if variable is float point*/
269: PHP_FUNCTION(is_float)
270: {
271: php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_DOUBLE);
272: }
273: /* }}} */
274:
275: /* {{{ proto bool is_string(mixed var)
276: Returns true if variable is a string */
277: PHP_FUNCTION(is_string)
278: {
279: php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_STRING);
280: }
281: /* }}} */
282:
283: /* {{{ proto bool is_array(mixed var)
284: Returns true if variable is an array */
285: PHP_FUNCTION(is_array)
286: {
287: php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_ARRAY);
288: }
289: /* }}} */
290:
291: /* {{{ proto bool is_object(mixed var)
292: Returns true if variable is an object */
293: PHP_FUNCTION(is_object)
294: {
295: php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_OBJECT);
296: }
297: /* }}} */
298:
299: /* {{{ proto bool is_numeric(mixed value)
300: Returns true if value is a number or a numeric string */
301: PHP_FUNCTION(is_numeric)
302: {
303: zval **arg;
304:
305: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &arg) == FAILURE) {
306: return;
307: }
308:
309: switch (Z_TYPE_PP(arg)) {
310: case IS_LONG:
311: case IS_DOUBLE:
312: RETURN_TRUE;
313: break;
314:
315: case IS_STRING:
316: if (is_numeric_string(Z_STRVAL_PP(arg), Z_STRLEN_PP(arg), NULL, NULL, 0)) {
317: RETURN_TRUE;
318: } else {
319: RETURN_FALSE;
320: }
321: break;
322:
323: default:
324: RETURN_FALSE;
325: break;
326: }
327: }
328: /* }}} */
329:
330: /* {{{ proto bool is_scalar(mixed value)
331: Returns true if value is a scalar */
332: PHP_FUNCTION(is_scalar)
333: {
334: zval **arg;
335:
336: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &arg) == FAILURE) {
337: return;
338: }
339:
340: switch (Z_TYPE_PP(arg)) {
341: case IS_BOOL:
342: case IS_DOUBLE:
343: case IS_LONG:
344: case IS_STRING:
345: RETURN_TRUE;
346: break;
347:
348: default:
349: RETURN_FALSE;
350: break;
351: }
352: }
353: /* }}} */
354:
355: /* {{{ proto bool is_callable(mixed var [, bool syntax_only [, string callable_name]])
356: Returns true if var is callable. */
357: PHP_FUNCTION(is_callable)
358: {
359: zval *var, **callable_name = NULL;
360: char *name;
361: char *error;
362: zend_bool retval;
363: zend_bool syntax_only = 0;
364: int check_flags = 0;
365:
366: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|bZ", &var,
367: &syntax_only, &callable_name) == FAILURE) {
368: return;
369: }
370:
371: if (syntax_only) {
372: check_flags |= IS_CALLABLE_CHECK_SYNTAX_ONLY;
373: }
374: if (ZEND_NUM_ARGS() > 2) {
375: retval = zend_is_callable_ex(var, NULL, check_flags, &name, NULL, NULL, &error TSRMLS_CC);
376: zval_dtor(*callable_name);
377: ZVAL_STRING(*callable_name, name, 0);
378: } else {
379: retval = zend_is_callable_ex(var, NULL, check_flags, NULL, NULL, NULL, &error TSRMLS_CC);
380: }
381: if (error) {
382: /* ignore errors */
383: efree(error);
384: }
385:
386: RETURN_BOOL(retval);
387: }
388: /* }}} */
389:
390: /*
391: * Local variables:
392: * tab-width: 4
393: * c-basic-offset: 4
394: * End:
395: * vim600: sw=4 ts=4 fdm=marker
396: * vim<600: sw=4 ts=4
397: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>