Annotation of embedaddon/php/Zend/zend_indent.c, revision 1.1.1.4

1.1       misho       1: /*
                      2:    +----------------------------------------------------------------------+
                      3:    | Zend Engine                                                          |
                      4:    +----------------------------------------------------------------------+
1.1.1.4 ! misho       5:    | Copyright (c) 1998-2014 Zend Technologies Ltd. (http://www.zend.com) |
1.1       misho       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: 
1.1.1.2   misho      20: /* $Id$ */
1.1       misho      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:
1.1.1.2   misho      67:                                zend_write((char*)LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
1.1       misho      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:                                                        }
1.1.1.2   misho     121:                                                        zend_write((char*)LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
1.1       misho     122:                                                        break;
                    123:                                        }
                    124:                                } else {
                    125:                                        handle_whitespace(emit_whitespace);
                    126:                                        if (in_string) {
1.1.1.2   misho     127:                                                zend_write((char*)LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
1.1       misho     128:                                                /* a part of a string */
                    129:                                        } else {
1.1.1.2   misho     130:                                                zend_write((char*)LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
1.1       misho     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>