diff options
Diffstat (limited to 'Zend/zend_highlight.c')
-rw-r--r-- | Zend/zend_highlight.c | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/Zend/zend_highlight.c b/Zend/zend_highlight.c new file mode 100644 index 0000000000..542d1989f0 --- /dev/null +++ b/Zend/zend_highlight.c @@ -0,0 +1,160 @@ +/* + +----------------------------------------------------------------------+ + | Zend Engine | + +----------------------------------------------------------------------+ + | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | + +----------------------------------------------------------------------+ + | This source file is subject to the Zend license, that is bundled | + | with this package in the file LICENSE. If you did not receive a | + | copy of the Zend license, please mail us at zend@zend.com so we can | + | send you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Andi Gutmans <andi@zend.com> | + | Zeev Suraski <zeev@zend.com> | + +----------------------------------------------------------------------+ +*/ + +#include "zend.h" +#include "zend_compile.h" +#include "zend_highlight.h" +#include "zend_ptr_stack.h" +#include "zend_globals.h" + +extern char *zendtext; +extern int zendleng; + + +static void html_putc(char c) +{ + switch (c) { + case '\n': + ZEND_PUTS("<br>"); + break; + case '<': + ZEND_PUTS("<"); + break; + case '>': + ZEND_PUTS(">"); + break; + case '&': + ZEND_PUTS("&"); + break; + case ' ': + ZEND_PUTS(" "); + break; + case '\t': + ZEND_PUTS(" "); + break; + default: + ZEND_PUTC(c); + break; + } +} + + +static void html_puts(char *s, uint len) +{ + register char *ptr=s, *end=s+len; + + while (ptr<end) { + html_putc(*ptr++); + } +} + + + + +void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini) +{ + zval token; + int token_type; + char *last_color = syntax_highlighter_ini->highlight_html; + char *next_color; + int in_string=0; + CLS_FETCH(); + + zend_printf("<font color=\"%s\">\n", last_color); + /* highlight stuff coming back from zendlex() */ + token.type = 0; + while ((token_type=lex_scan(&token CLS_CC))) { + switch (token_type) { + case INLINE_HTML: + next_color = syntax_highlighter_ini->highlight_html; + break; + case ZEND_COMMENT: + next_color = syntax_highlighter_ini->highlight_comment; + break; + case PHP_OPEN_TAG: + next_color = syntax_highlighter_ini->highlight_default; + break; + case PHP_CLOSE_TAG: + next_color = syntax_highlighter_ini->highlight_default; + break; + case CONSTANT_ENCAPSED_STRING: + next_color = syntax_highlighter_ini->highlight_string; + break; + case '"': + next_color = syntax_highlighter_ini->highlight_string; + in_string = !in_string; + break; + case T_WHITESPACE: + html_puts(zendtext, zendleng); /* no color needed */ + token.type = 0; + continue; + break; + default: + if (token.type==0) { + next_color = syntax_highlighter_ini->highlight_keyword; + } else { + if (in_string) { + next_color = syntax_highlighter_ini->highlight_string; + } else { + next_color = syntax_highlighter_ini->highlight_default; + } + } + break; + } + + if (last_color != next_color) { + if (last_color != syntax_highlighter_ini->highlight_html) { + zend_printf("</font>"); + } + last_color = next_color; + if (last_color != syntax_highlighter_ini->highlight_html) { + zend_printf("<font color=\"%s\">", last_color); + } + } + switch (token_type) { + case DOLLAR_OPEN_CURLY_BRACES: + html_puts("{", 1); + break; + default: + html_puts(zendtext, zendleng); + break; + } + + if (token.type == IS_STRING) { + switch (token_type) { + case PHP_OPEN_TAG: + case PHP_CLOSE_TAG: + case T_WHITESPACE: + break; + default: + efree(token.value.str.val); + break; + } + } + token.type = 0; + } + if (last_color != syntax_highlighter_ini->highlight_html) { + zend_printf("</font>\n"); + } + zend_printf("</font>\n"); +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ |