root/Zend/zend_indent.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. handle_whitespace
  2. zend_indent

   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 
  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                                 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  */

/* [<][>][^][v][top][bottom][index][help] */