1 /*
2 +----------------------------------------------------------------------+
3 | Zend Engine |
4 +----------------------------------------------------------------------+
5 | Copyright (c) 1998-2016 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$ */
21
22 /* This indenter doesn't really work, it's here for no particular reason. */
23
24
25 #include "zend.h"
26 #include <zend_language_parser.h>
27 #include "zend_compile.h"
28 #include "zend_indent.h"
29
30 #define zendtext LANG_SCNG(yy_text)
31 #define zendleng LANG_SCNG(yy_leng)
32
33
handle_whitespace(int * emit_whitespace)34 static void handle_whitespace(int *emit_whitespace)
35 {
36 unsigned char c;
37 int i;
38
39 for (c=0; c<128; c++) {
40 if (emit_whitespace[c]>0) {
41 for (i=0; i<emit_whitespace[c]; i++) {
42 zend_write((char *) &c, 1);
43 }
44 }
45 }
46 memset(emit_whitespace, 0, sizeof(int)*256);
47 }
48
49
zend_indent()50 ZEND_API void zend_indent()
51 {
52 zval token;
53 int token_type;
54 int in_string=0;
55 int nest_level=0;
56 int emit_whitespace[256];
57 int i;
58 TSRMLS_FETCH();
59
60 memset(emit_whitespace, 0, sizeof(int)*256);
61
62 /* highlight stuff coming back from zendlex() */
63 token.type = 0;
64 while ((token_type=lex_scan(&token TSRMLS_CC))) {
65 switch (token_type) {
66 case T_INLINE_HTML:
67 zend_write((char*)LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
68 break;
69 case T_WHITESPACE: {
70 token.type = 0;
71 /* eat whitespace, emit newlines */
72 for (i=0; i<LANG_SCNG(yy_leng); i++) {
73 emit_whitespace[(unsigned char) LANG_SCNG(yy_text)[i]]++;
74 }
75 continue;
76 }
77 break;
78 case '"':
79 in_string = !in_string;
80 /* break missing intentionally */
81 default:
82 if (token.type==0) {
83 /* keyword */
84 switch (token_type) {
85 case ',':
86 ZEND_PUTS(", ");
87 goto dflt_printout;
88 break;
89 case '{':
90 nest_level++;
91 if (emit_whitespace['\n']>0) {
92 ZEND_PUTS(" {\n");
93 memset(emit_whitespace, 0, sizeof(int)*256);
94 } else {
95 ZEND_PUTS("{");
96 }
97 break;
98 case '}':
99 nest_level--;
100 if (emit_whitespace['\n']==0) {
101 ZEND_PUTS("\n");
102 }
103 for (i=0; i<nest_level; i++) {
104 ZEND_PUTS(" ");
105 }
106 goto dflt_printout;
107 break;
108 dflt_printout:
109 default:
110 if (emit_whitespace['\n']>0) {
111 for (i=0; i<emit_whitespace['\n']; i++) {
112 ZEND_PUTS("\n");
113 }
114 memset(emit_whitespace, 0, sizeof(int)*256);
115 for (i=0; i<nest_level; i++) {
116 ZEND_PUTS(" ");
117 }
118 } else {
119 handle_whitespace(emit_whitespace);
120 }
121 zend_write((char*)LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
122 break;
123 }
124 } else {
125 handle_whitespace(emit_whitespace);
126 if (in_string) {
127 zend_write((char*)LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
128 /* a part of a string */
129 } else {
130 zend_write((char*)LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
131 }
132 }
133 break;
134 }
135 if (token.type == IS_STRING) {
136 switch (token_type) {
137 case T_OPEN_TAG:
138 case T_CLOSE_TAG:
139 case T_WHITESPACE:
140 break;
141 default:
142 str_efree(token.value.str.val);
143 break;
144 }
145 }
146 token.type = 0;
147 }
148 }
149
150 /*
151 * Local variables:
152 * tab-width: 4
153 * c-basic-offset: 4
154 * indent-tabs-mode: t
155 * End:
156 */
157