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>