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>