File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / Zend / zend_indent.c
Revision 1.1.1.4 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Sun Jun 15 20:04:03 2014 UTC (10 years, 4 months ago) by misho
Branches: php, MAIN
CVS tags: v5_4_29, HEAD
php 5.4.29

    1: /*
    2:    +----------------------------------------------------------------------+
    3:    | Zend Engine                                                          |
    4:    +----------------------------------------------------------------------+
    5:    | Copyright (c) 1998-2014 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_indent.c,v 1.1.1.4 2014/06/15 20:04:03 misho Exp $ */
   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: 
   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: 
   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: 				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:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>