php-src/Zend/zend_indent.c

148 lines
3.9 KiB
C
Raw Normal View History

1999-04-08 02:10:10 +08:00
/*
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
2002-01-06 23:21:36 +08:00
| Copyright (c) 1998-2002 Zend Technologies Ltd. (http://www.zend.com) |
1999-04-08 02:10:10 +08:00
+----------------------------------------------------------------------+
2001-12-11 23:16:21 +08:00
| This source file is subject to version 2.00 of the Zend license, |
1999-07-16 22:58:16 +08:00
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
2001-12-11 23:16:21 +08:00
| http://www.zend.com/license/2_00.txt. |
1999-07-16 22:58:16 +08:00
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
1999-04-08 02:10:10 +08:00
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
1999-07-16 22:58:16 +08:00
1999-04-08 02:10:10 +08:00
/* This indenter doesn't really work, it's here for no particular reason. */
#include "zend.h"
#include "zend_language_parser.h"
1999-04-08 02:10:10 +08:00
#include "zend_compile.h"
#include "zend_indent.h"
#define zendtext LANG_SCNG(yy_text)
#define zendleng LANG_SCNG(yy_leng)
1999-04-08 02:10:10 +08:00
static void handle_whitespace(int *emit_whitespace)
{
unsigned char c;
int i;
for (c=0; c<128; c++) {
if (emit_whitespace[c]>0) {
for (i=0; i<emit_whitespace[c]; i++) {
zend_write((char *) &c, 1);
1999-04-08 02:10:10 +08:00
}
}
}
memset(emit_whitespace, 0, sizeof(int)*256);
}
ZEND_API void zend_indent()
1999-04-08 02:10:10 +08:00
{
zval token;
int token_type;
int in_string=0;
int nest_level=0;
int emit_whitespace[256];
int i;
TSRMLS_FETCH();
1999-04-08 02:10:10 +08:00
memset(emit_whitespace, 0, sizeof(int)*256);
/* highlight stuff coming back from zendlex() */
token.type = 0;
while ((token_type=lex_scan(&token TSRMLS_CC))) {
1999-04-08 02:10:10 +08:00
switch (token_type) {
case T_INLINE_HTML:
2001-08-07 07:56:32 +08:00
zend_write(LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
1999-04-08 02:10:10 +08:00
break;
case T_WHITESPACE: {
token.type = 0;
/* eat whitespace, emit newlines */
2001-08-07 07:56:32 +08:00
for (i=0; i<LANG_SCNG(yy_leng); i++) {
emit_whitespace[(unsigned char) LANG_SCNG(yy_text)[i]]++;
1999-04-08 02:10:10 +08:00
}
continue;
}
break;
case '"':
in_string = !in_string;
/* break missing intentionally */
default:
if (token.type==0) {
/* keyword */
2002-11-30 19:20:25 +08:00
switch (token_type) {
1999-04-08 02:10:10 +08:00
case ',':
ZEND_PUTS(", ");
goto dflt_printout;
break;
case '{':
nest_level++;
if (emit_whitespace['\n']>0) {
ZEND_PUTS(" {\n");
memset(emit_whitespace, 0, sizeof(int)*256);
} else {
ZEND_PUTS("{");
}
break;
case '}':
nest_level--;
if (emit_whitespace['\n']==0) {
ZEND_PUTS("\n");
}
for (i=0; i<nest_level; i++) {
ZEND_PUTS(" ");
}
goto dflt_printout;
break;
dflt_printout:
default:
if (emit_whitespace['\n']>0) {
for (i=0; i<emit_whitespace['\n']; i++) {
ZEND_PUTS("\n");
}
memset(emit_whitespace, 0, sizeof(int)*256);
for (i=0; i<nest_level; i++) {
ZEND_PUTS(" ");
}
} else {
handle_whitespace(emit_whitespace);
}
2001-08-07 07:56:32 +08:00
zend_write(LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
1999-04-08 02:10:10 +08:00
break;
}
} else {
handle_whitespace(emit_whitespace);
if (in_string) {
2001-08-07 07:56:32 +08:00
zend_write(LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
1999-04-08 02:10:10 +08:00
/* a part of a string */
} else {
2001-08-07 07:56:32 +08:00
zend_write(LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
1999-04-08 02:10:10 +08:00
}
}
break;
}
if (token.type == IS_STRING) {
switch (token_type) {
case T_OPEN_TAG:
case T_CLOSE_TAG:
1999-04-08 02:10:10 +08:00
case T_WHITESPACE:
break;
default:
efree(token.value.str.val);
break;
}
}
token.type = 0;
}
}