Annotation of embedaddon/php/ext/tokenizer/tokenizer.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: Andrei Zmievski <andrei@php.net>                             |
        !            16:    +----------------------------------------------------------------------+
        !            17: */
        !            18: 
        !            19: /* $Id: tokenizer.c 321634 2012-01-01 13:15:04Z felipe $ */
        !            20: 
        !            21: #ifdef HAVE_CONFIG_H
        !            22: #include "config.h"
        !            23: #endif
        !            24: 
        !            25: #include "php.h"
        !            26: #include "php_ini.h"
        !            27: #include "ext/standard/info.h"
        !            28: #include "php_tokenizer.h"
        !            29: 
        !            30: #include "zend.h"
        !            31: #include "zend_language_scanner.h"
        !            32: #include "zend_language_scanner_defs.h"
        !            33: #include <zend_language_parser.h>
        !            34: 
        !            35: #define zendtext LANG_SCNG(yy_text)
        !            36: #define zendleng LANG_SCNG(yy_leng)
        !            37: 
        !            38: /* {{{ arginfo */
        !            39: ZEND_BEGIN_ARG_INFO_EX(arginfo_token_get_all, 0, 0, 1)
        !            40:        ZEND_ARG_INFO(0, source)
        !            41: ZEND_END_ARG_INFO()
        !            42: 
        !            43: ZEND_BEGIN_ARG_INFO_EX(arginfo_token_name, 0, 0, 1)
        !            44:        ZEND_ARG_INFO(0, token)
        !            45: ZEND_END_ARG_INFO()
        !            46: /* }}} */
        !            47: 
        !            48: /* {{{ tokenizer_functions[]
        !            49:  *
        !            50:  * Every user visible function must have an entry in tokenizer_functions[].
        !            51:  */
        !            52: const zend_function_entry tokenizer_functions[] = {
        !            53:        PHP_FE(token_get_all,   arginfo_token_get_all)
        !            54:        PHP_FE(token_name,              arginfo_token_name)
        !            55:        PHP_FE_END
        !            56: };
        !            57: /* }}} */
        !            58: 
        !            59: /* {{{ tokenizer_module_entry
        !            60:  */
        !            61: zend_module_entry tokenizer_module_entry = {
        !            62: #if ZEND_MODULE_API_NO >= 20010901
        !            63:        STANDARD_MODULE_HEADER,
        !            64: #endif
        !            65:        "tokenizer",
        !            66:        tokenizer_functions,
        !            67:        PHP_MINIT(tokenizer),
        !            68:        NULL,
        !            69:        NULL,
        !            70:        NULL,
        !            71:        PHP_MINFO(tokenizer),
        !            72: #if ZEND_MODULE_API_NO >= 20010901
        !            73:        "0.1", /* Replace with version number for your extension */
        !            74: #endif
        !            75:        STANDARD_MODULE_PROPERTIES
        !            76: };
        !            77: /* }}} */
        !            78: 
        !            79: #ifdef COMPILE_DL_TOKENIZER
        !            80: ZEND_GET_MODULE(tokenizer)
        !            81: #endif
        !            82: 
        !            83: /* {{{ PHP_MINIT_FUNCTION
        !            84:  */
        !            85: PHP_MINIT_FUNCTION(tokenizer)
        !            86: {
        !            87:        tokenizer_register_constants(INIT_FUNC_ARGS_PASSTHRU);
        !            88:        return SUCCESS;
        !            89: }
        !            90: /* }}} */
        !            91: 
        !            92: /* {{{ PHP_MINFO_FUNCTION
        !            93:  */
        !            94: PHP_MINFO_FUNCTION(tokenizer)
        !            95: {
        !            96:        php_info_print_table_start();
        !            97:        php_info_print_table_row(2, "Tokenizer Support", "enabled");
        !            98:        php_info_print_table_end();
        !            99: }
        !           100: /* }}} */
        !           101: 
        !           102: static void tokenize(zval *return_value TSRMLS_DC)
        !           103: {
        !           104:        zval token;
        !           105:        zval *keyword;
        !           106:        int token_type;
        !           107:        zend_bool destroy;
        !           108:        int token_line = 1;
        !           109: 
        !           110:        array_init(return_value);
        !           111: 
        !           112:        ZVAL_NULL(&token);
        !           113:        while ((token_type = lex_scan(&token TSRMLS_CC))) {
        !           114:                destroy = 1;
        !           115:                switch (token_type) {
        !           116:                        case T_CLOSE_TAG:
        !           117:                                if (zendtext[zendleng - 1] != '>') {
        !           118:                                        CG(zend_lineno)++;
        !           119:                                }
        !           120:                        case T_OPEN_TAG:
        !           121:                        case T_OPEN_TAG_WITH_ECHO:
        !           122:                        case T_WHITESPACE:
        !           123:                        case T_COMMENT:
        !           124:                        case T_DOC_COMMENT:
        !           125:                                destroy = 0;
        !           126:                                break;
        !           127:                }
        !           128: 
        !           129:                if (token_type >= 256) {
        !           130:                        MAKE_STD_ZVAL(keyword);
        !           131:                        array_init(keyword);
        !           132:                        add_next_index_long(keyword, token_type);
        !           133:                        if (token_type == T_END_HEREDOC) {
        !           134:                                if (CG(increment_lineno)) {
        !           135:                                        token_line = ++CG(zend_lineno);
        !           136:                                        CG(increment_lineno) = 0;
        !           137:                                }
        !           138:                                add_next_index_stringl(keyword, Z_STRVAL(token), Z_STRLEN(token), 1);
        !           139:                                efree(Z_STRVAL(token));
        !           140:                        } else {
        !           141:                                add_next_index_stringl(keyword, (char *)zendtext, zendleng, 1);
        !           142:                        }
        !           143:                        add_next_index_long(keyword, token_line);
        !           144:                        add_next_index_zval(return_value, keyword);
        !           145:                } else {
        !           146:                        add_next_index_stringl(return_value, (char *)zendtext, zendleng, 1);
        !           147:                }
        !           148:                if (destroy && Z_TYPE(token) != IS_NULL) {
        !           149:                        zval_dtor(&token);
        !           150:                }
        !           151:                ZVAL_NULL(&token);
        !           152: 
        !           153:                token_line = CG(zend_lineno);
        !           154: 
        !           155:                if (token_type == T_HALT_COMPILER) {
        !           156:                        break;
        !           157:                }
        !           158:        }
        !           159: }
        !           160: 
        !           161: /* {{{ proto array token_get_all(string source)
        !           162:  */
        !           163: PHP_FUNCTION(token_get_all)
        !           164: {
        !           165:        char *source = NULL;
        !           166:        int argc = ZEND_NUM_ARGS();
        !           167:        int source_len;
        !           168:        zval source_z;
        !           169:        zend_lex_state original_lex_state;
        !           170: 
        !           171:        if (zend_parse_parameters(argc TSRMLS_CC, "s", &source, &source_len) == FAILURE) 
        !           172:                return;
        !           173: 
        !           174:        ZVAL_STRINGL(&source_z, source, source_len, 1);
        !           175:        zend_save_lexical_state(&original_lex_state TSRMLS_CC);
        !           176: 
        !           177:        if (zend_prepare_string_for_scanning(&source_z, "" TSRMLS_CC) == FAILURE) {
        !           178:                zend_restore_lexical_state(&original_lex_state TSRMLS_CC);
        !           179:                RETURN_EMPTY_STRING();
        !           180:        }
        !           181: 
        !           182:        LANG_SCNG(yy_state) = yycINITIAL;
        !           183: 
        !           184:        tokenize(return_value TSRMLS_CC);
        !           185:        
        !           186:        zend_restore_lexical_state(&original_lex_state TSRMLS_CC);
        !           187:        zval_dtor(&source_z);
        !           188: }
        !           189: /* }}} */
        !           190: 
        !           191: /* {{{ proto string token_name(int type)
        !           192:  */
        !           193: PHP_FUNCTION(token_name)
        !           194: {
        !           195:        int argc = ZEND_NUM_ARGS();
        !           196:        long type;
        !           197: 
        !           198:        if (zend_parse_parameters(argc TSRMLS_CC, "l", &type) == FAILURE) {
        !           199:                return;
        !           200:        }
        !           201:        RETVAL_STRING(get_token_type_name(type), 1);
        !           202: }
        !           203: /* }}} */
        !           204: 
        !           205: /*
        !           206:  * Local variables:
        !           207:  * tab-width: 4
        !           208:  * c-basic-offset: 4
        !           209:  * End:
        !           210:  * vim600: noet sw=4 ts=4 fdm=marker
        !           211:  * vim<600: noet sw=4 ts=4
        !           212:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>