php-src/Zend/zend_indent.c

157 lines
4.1 KiB
C
Raw Normal View History

1999-04-08 02:10:10 +08:00
/*
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
2012-01-01 21:15:04 +08:00
| Copyright (c) 1998-2012 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 through the world-wide-web at the following url: |
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> |
+----------------------------------------------------------------------+
*/
/* $Id$ */
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)
2010-03-12 18:28:59 +08:00
static void handle_whitespace(int *emit_whitespace)
1999-04-08 02:10:10 +08:00
{
unsigned char c;
2010-03-12 18:28:59 +08:00
int i;
1999-04-08 02:10:10 +08:00
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);
}
2010-03-12 18:28:59 +08:00
ZEND_API void zend_indent()
1999-04-08 02:10:10 +08:00
{
zval token;
int token_type;
int in_string=0;
2010-03-12 18:28:59 +08:00
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() */
2010-03-12 18:28:59 +08:00
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:
zend_write((char*)LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
1999-04-08 02:10:10 +08:00
break;
case T_WHITESPACE: {
2010-03-12 18:28:59 +08:00
token.type = 0;
1999-04-08 02:10:10 +08:00
/* 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:
2010-03-12 18:28:59 +08:00
if (token.type==0) {
1999-04-08 02:10:10 +08:00
/* 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);
}
zend_write((char*)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) {
zend_write((char*)LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
1999-04-08 02:10:10 +08:00
/* a part of a string */
} else {
zend_write((char*)LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
1999-04-08 02:10:10 +08:00
}
}
break;
}
2010-03-12 18:28:59 +08:00
if (token.type == IS_STRING) {
1999-04-08 02:10:10 +08:00
switch (token_type) {
case T_OPEN_TAG:
case T_CLOSE_TAG:
1999-04-08 02:10:10 +08:00
case T_WHITESPACE:
break;
default:
2010-03-12 18:28:59 +08:00
efree(token.value.str.val);
1999-04-08 02:10:10 +08:00
break;
}
}
2010-03-12 18:28:59 +08:00
token.type = 0;
1999-04-08 02:10:10 +08:00
}
}
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* indent-tabs-mode: t
* End:
*/