Annotation of embedaddon/php/ext/standard/type.c, revision 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>