Annotation of embedaddon/php/Zend/zend_highlight.c, revision 1.1
1.1 ! misho 1: /*
! 2: +----------------------------------------------------------------------+
! 3: | Zend Engine |
! 4: +----------------------------------------------------------------------+
! 5: | Copyright (c) 1998-2012 Zend Technologies Ltd. (http://www.zend.com) |
! 6: +----------------------------------------------------------------------+
! 7: | This source file is subject to version 2.00 of the Zend 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.zend.com/license/2_00.txt. |
! 11: | If you did not receive a copy of the Zend license and are unable to |
! 12: | obtain it through the world-wide-web, please send a note to |
! 13: | license@zend.com so we can mail you a copy immediately. |
! 14: +----------------------------------------------------------------------+
! 15: | Authors: Andi Gutmans <andi@zend.com> |
! 16: | Zeev Suraski <zeev@zend.com> |
! 17: +----------------------------------------------------------------------+
! 18: */
! 19:
! 20: /* $Id: zend_highlight.c 321634 2012-01-01 13:15:04Z felipe $ */
! 21:
! 22: #include "zend.h"
! 23: #include <zend_language_parser.h>
! 24: #include "zend_compile.h"
! 25: #include "zend_highlight.h"
! 26: #include "zend_ptr_stack.h"
! 27: #include "zend_globals.h"
! 28:
! 29: ZEND_API void zend_html_putc(char c)
! 30: {
! 31: switch (c) {
! 32: case '\n':
! 33: ZEND_PUTS("<br />");
! 34: break;
! 35: case '<':
! 36: ZEND_PUTS("<");
! 37: break;
! 38: case '>':
! 39: ZEND_PUTS(">");
! 40: break;
! 41: case '&':
! 42: ZEND_PUTS("&");
! 43: break;
! 44: case ' ':
! 45: ZEND_PUTS(" ");
! 46: break;
! 47: case '\t':
! 48: ZEND_PUTS(" ");
! 49: break;
! 50: default:
! 51: ZEND_PUTC(c);
! 52: break;
! 53: }
! 54: }
! 55:
! 56:
! 57: ZEND_API void zend_html_puts(const char *s, uint len TSRMLS_DC)
! 58: {
! 59: const char *ptr=s, *end=s+len;
! 60:
! 61: #ifdef ZEND_MULTIBYTE
! 62: char *filtered;
! 63: int filtered_len;
! 64:
! 65: if (LANG_SCNG(output_filter)) {
! 66: LANG_SCNG(output_filter)(&filtered, &filtered_len, s, len TSRMLS_CC);
! 67: ptr = filtered;
! 68: end = filtered + filtered_len;
! 69: }
! 70: #endif /* ZEND_MULTIBYTE */
! 71:
! 72: while (ptr<end) {
! 73: if (*ptr==' ') {
! 74: do {
! 75: zend_html_putc(*ptr);
! 76: } while ((++ptr < end) && (*ptr==' '));
! 77: } else {
! 78: zend_html_putc(*ptr++);
! 79: }
! 80: }
! 81:
! 82: #ifdef ZEND_MULTIBYTE
! 83: if (LANG_SCNG(output_filter)) {
! 84: efree(filtered);
! 85: }
! 86: #endif /* ZEND_MULTIBYTE */
! 87: }
! 88:
! 89:
! 90: ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini TSRMLS_DC)
! 91: {
! 92: zval token;
! 93: int token_type;
! 94: char *last_color = syntax_highlighter_ini->highlight_html;
! 95: char *next_color;
! 96:
! 97: zend_printf("<code>");
! 98: zend_printf("<span style=\"color: %s\">\n", last_color);
! 99: /* highlight stuff coming back from zendlex() */
! 100: token.type = 0;
! 101: while ((token_type=lex_scan(&token TSRMLS_CC))) {
! 102: switch (token_type) {
! 103: case T_INLINE_HTML:
! 104: next_color = syntax_highlighter_ini->highlight_html;
! 105: break;
! 106: case T_COMMENT:
! 107: case T_DOC_COMMENT:
! 108: next_color = syntax_highlighter_ini->highlight_comment;
! 109: break;
! 110: case T_OPEN_TAG:
! 111: case T_OPEN_TAG_WITH_ECHO:
! 112: next_color = syntax_highlighter_ini->highlight_default;
! 113: break;
! 114: case T_CLOSE_TAG:
! 115: next_color = syntax_highlighter_ini->highlight_default;
! 116: break;
! 117: case '"':
! 118: case T_ENCAPSED_AND_WHITESPACE:
! 119: case T_CONSTANT_ENCAPSED_STRING:
! 120: next_color = syntax_highlighter_ini->highlight_string;
! 121: break;
! 122: case T_WHITESPACE:
! 123: zend_html_puts(LANG_SCNG(yy_text), LANG_SCNG(yy_leng) TSRMLS_CC); /* no color needed */
! 124: token.type = 0;
! 125: continue;
! 126: break;
! 127: default:
! 128: if (token.type == 0) {
! 129: next_color = syntax_highlighter_ini->highlight_keyword;
! 130: } else {
! 131: next_color = syntax_highlighter_ini->highlight_default;
! 132: }
! 133: break;
! 134: }
! 135:
! 136: if (last_color != next_color) {
! 137: if (last_color != syntax_highlighter_ini->highlight_html) {
! 138: zend_printf("</span>");
! 139: }
! 140: last_color = next_color;
! 141: if (last_color != syntax_highlighter_ini->highlight_html) {
! 142: zend_printf("<span style=\"color: %s\">", last_color);
! 143: }
! 144: }
! 145:
! 146: zend_html_puts(LANG_SCNG(yy_text), LANG_SCNG(yy_leng) TSRMLS_CC);
! 147:
! 148: if (token.type == IS_STRING) {
! 149: switch (token_type) {
! 150: case T_OPEN_TAG:
! 151: case T_OPEN_TAG_WITH_ECHO:
! 152: case T_CLOSE_TAG:
! 153: case T_WHITESPACE:
! 154: case T_COMMENT:
! 155: case T_DOC_COMMENT:
! 156: break;
! 157: default:
! 158: efree(token.value.str.val);
! 159: break;
! 160: }
! 161: } else if (token_type == T_END_HEREDOC) {
! 162: efree(token.value.str.val);
! 163: }
! 164: token.type = 0;
! 165: }
! 166:
! 167: if (last_color != syntax_highlighter_ini->highlight_html) {
! 168: zend_printf("</span>\n");
! 169: }
! 170: zend_printf("</span>\n");
! 171: zend_printf("</code>");
! 172: }
! 173:
! 174: ZEND_API void zend_strip(TSRMLS_D)
! 175: {
! 176: zval token;
! 177: int token_type;
! 178: int prev_space = 0;
! 179:
! 180: token.type = 0;
! 181: while ((token_type=lex_scan(&token TSRMLS_CC))) {
! 182: switch (token_type) {
! 183: case T_WHITESPACE:
! 184: if (!prev_space) {
! 185: zend_write(" ", sizeof(" ") - 1);
! 186: prev_space = 1;
! 187: }
! 188: /* lack of break; is intentional */
! 189: case T_COMMENT:
! 190: case T_DOC_COMMENT:
! 191: token.type = 0;
! 192: continue;
! 193:
! 194: case T_END_HEREDOC:
! 195: zend_write(LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
! 196: efree(token.value.str.val);
! 197: /* read the following character, either newline or ; */
! 198: if (lex_scan(&token TSRMLS_CC) != T_WHITESPACE) {
! 199: zend_write(LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
! 200: }
! 201: zend_write("\n", sizeof("\n") - 1);
! 202: prev_space = 1;
! 203: token.type = 0;
! 204: continue;
! 205:
! 206: default:
! 207: zend_write(LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
! 208: break;
! 209: }
! 210:
! 211: if (token.type == IS_STRING) {
! 212: switch (token_type) {
! 213: case T_OPEN_TAG:
! 214: case T_OPEN_TAG_WITH_ECHO:
! 215: case T_CLOSE_TAG:
! 216: case T_WHITESPACE:
! 217: case T_COMMENT:
! 218: case T_DOC_COMMENT:
! 219: break;
! 220:
! 221: default:
! 222: efree(token.value.str.val);
! 223: break;
! 224: }
! 225: }
! 226: prev_space = token.type = 0;
! 227: }
! 228: }
! 229:
! 230: /*
! 231: * Local variables:
! 232: * tab-width: 4
! 233: * c-basic-offset: 4
! 234: * indent-tabs-mode: t
! 235: * End:
! 236: */
! 237:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>