LTP GCOV extension - code coverage report
Current view: directory - Zend - zend_ini_parser.y
Test: PHP Code Coverage
Date: 2007-04-10 Instrumented lines: 123
Code covered: 25.2 % Executed lines: 31
Legend: not executed executed

       1                 : %{
       2                 : /*
       3                 :    +----------------------------------------------------------------------+
       4                 :    | Zend Engine                                                          |
       5                 :    +----------------------------------------------------------------------+
       6                 :    | Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
       7                 :    +----------------------------------------------------------------------+
       8                 :    | This source file is subject to version 2.00 of the Zend license,     |
       9                 :    | that is bundled with this package in the file LICENSE, and is        |
      10                 :    | available through the world-wide-web at the following url:           |
      11                 :    | http://www.zend.com/license/2_00.txt.                                |
      12                 :    | If you did not receive a copy of the Zend license and are unable to  |
      13                 :    | obtain it through the world-wide-web, please send a note to          |
      14                 :    | license@zend.com so we can mail you a copy immediately.              |
      15                 :    +----------------------------------------------------------------------+
      16                 :    | Author: Zeev Suraski <zeev@zend.com>                                 |
      17                 :    +----------------------------------------------------------------------+
      18                 : */
      19                 : 
      20                 : /* $Id: zend_ini_parser.y,v 1.41.2.2.2.1 2006/09/19 20:33:12 dmitry Exp $ */
      21                 : 
      22                 : #define DEBUG_CFG_PARSER 0
      23                 : #include "zend.h"
      24                 : #include "zend_API.h"
      25                 : #include "zend_ini.h"
      26                 : #include "zend_constants.h"
      27                 : #include "zend_ini_scanner.h"
      28                 : #include "zend_extensions.h"
      29                 : 
      30                 : #define YYSTYPE zval
      31                 : 
      32                 : #ifdef ZTS
      33                 : #define YYPARSE_PARAM tsrm_ls
      34                 : #define YYLEX_PARAM tsrm_ls
      35                 : #endif
      36                 : 
      37                 : #define ZEND_INI_PARSER_CB      (CG(ini_parser_param))->ini_parser_cb
      38                 : #define ZEND_INI_PARSER_ARG     (CG(ini_parser_param))->arg
      39                 : 
      40                 : int ini_lex(zval *ini_lval TSRMLS_DC);
      41                 : #ifdef ZTS
      42                 : int ini_parse(void *arg);
      43                 : #else
      44                 : int ini_parse(void);
      45                 : #endif
      46                 : 
      47                 : zval yylval;
      48                 : 
      49                 : #ifndef ZTS
      50                 : extern int ini_lex(zval *ini_lval TSRMLS_DC);
      51                 : extern FILE *ini_in;
      52                 : extern void init_cfg_scanner(void);
      53                 : #endif
      54                 : 
      55                 : void zend_ini_do_op(char type, zval *result, zval *op1, zval *op2)
      56               0 : {
      57                 :         int i_result;
      58                 :         int i_op1, i_op2;
      59                 :         char str_result[MAX_LENGTH_OF_LONG];
      60                 : 
      61               0 :         i_op1 = atoi(op1->value.str.val);
      62               0 :         free(op1->value.str.val);
      63               0 :         if (op2) {
      64               0 :                 i_op2 = atoi(op2->value.str.val);
      65               0 :                 free(op2->value.str.val);
      66                 :         } else {
      67               0 :                 i_op2 = 0;
      68                 :         }
      69                 : 
      70               0 :         switch (type) {
      71                 :                 case '|':
      72               0 :                         i_result = i_op1 | i_op2;
      73               0 :                         break;
      74                 :                 case '&':
      75               0 :                         i_result = i_op1 & i_op2;
      76               0 :                         break;
      77                 :                 case '~':
      78               0 :                         i_result = ~i_op1;
      79               0 :                         break;
      80                 :                 case '!':
      81               0 :                         i_result = !i_op1;
      82               0 :                         break;
      83                 :                 default:
      84               0 :                         i_result = 0;
      85                 :                         break;
      86                 :         }
      87                 : 
      88               0 :         result->value.str.len = zend_sprintf(str_result, "%d", i_result);
      89               0 :         result->value.str.val = (char *) malloc(result->value.str.len+1);
      90               0 :         memcpy(result->value.str.val, str_result, result->value.str.len);
      91               0 :         result->value.str.val[result->value.str.len] = 0;
      92               0 :         result->type = IS_STRING;
      93               0 : }
      94                 : 
      95                 : void zend_ini_init_string(zval *result)
      96            1745 : {
      97            1745 :         result->value.str.val = malloc(1);
      98            1745 :         result->value.str.val[0] = 0;
      99            1745 :         result->value.str.len = 0;
     100            1745 :         result->type = IS_STRING;
     101            1745 : }
     102                 : 
     103                 : void zend_ini_add_string(zval *result, zval *op1, zval *op2)
     104               0 : {           
     105               0 :     int length = op1->value.str.len + op2->value.str.len;
     106                 : 
     107               0 :         result->value.str.val = (char *) realloc(op1->value.str.val, length+1);
     108               0 :     memcpy(result->value.str.val+op1->value.str.len, op2->value.str.val, op2->value.str.len);
     109               0 :     result->value.str.val[length] = 0;
     110               0 :     result->value.str.len = length;
     111               0 :     result->type = IS_STRING;
     112               0 : }
     113                 : 
     114                 : void zend_ini_get_constant(zval *result, zval *name)
     115            2188 : {
     116                 :         zval z_constant;
     117                 :         TSRMLS_FETCH();
     118                 : 
     119            2188 :         if (!memchr(name->value.str.val, ':', name->value.str.len)
     120                 :                         && zend_get_constant(name->value.str.val, name->value.str.len, &z_constant TSRMLS_CC)) {
     121                 :                 /* z_constant is emalloc()'d */
     122               0 :                 convert_to_string(&z_constant);
     123               0 :                 result->value.str.val = zend_strndup(z_constant.value.str.val, z_constant.value.str.len);
     124               0 :                 result->value.str.len = z_constant.value.str.len;
     125               0 :                 result->type = z_constant.type;
     126               0 :                 zval_dtor(&z_constant);
     127               0 :                 free(name->value.str.val);   
     128                 :         } else {
     129            2188 :                 *result = *name;
     130                 :         }
     131            2188 : }
     132                 : 
     133                 : void zend_ini_get_var(zval *result, zval *name)
     134               0 : {
     135                 :         zval curval;
     136                 :         char *envvar;
     137                 :         TSRMLS_FETCH();
     138                 : 
     139               0 :         if (zend_get_configuration_directive(name->value.str.val, name->value.str.len+1, &curval) == SUCCESS) {
     140               0 :                 result->value.str.val = zend_strndup(curval.value.str.val, curval.value.str.len);
     141               0 :                 result->value.str.len = curval.value.str.len;
     142               0 :         } else if ((envvar = zend_getenv(name->value.str.val, name->value.str.len TSRMLS_CC)) != NULL ||
     143                 :                            (envvar = getenv(name->value.str.val)) != NULL) {
     144               0 :                 result->value.str.val = strdup(envvar);
     145               0 :                 result->value.str.len = strlen(envvar);
     146                 :         } else {
     147               0 :                 zend_ini_init_string(result);
     148                 :         }
     149               0 : }
     150                 : 
     151                 : 
     152                 : static void ini_error(char *str)
     153               0 : {
     154                 :         char *error_buf;
     155                 :         int error_buf_len;
     156                 :         char *currently_parsed_filename;
     157                 :         TSRMLS_FETCH();
     158                 : 
     159               0 :         currently_parsed_filename = zend_ini_scanner_get_filename(TSRMLS_C);
     160               0 :         if (currently_parsed_filename) {
     161               0 :                 error_buf_len = 128+strlen(currently_parsed_filename); /* should be more than enough */
     162               0 :                 error_buf = (char *) emalloc(error_buf_len);
     163                 : 
     164               0 :                 sprintf(error_buf, "Error parsing %s on line %d\n", currently_parsed_filename, zend_ini_scanner_get_lineno(TSRMLS_C));
     165                 :         } else {
     166               0 :                 error_buf = estrdup("Invalid configuration directive\n");
     167                 :         }
     168                 : 
     169               0 :         if (CG(ini_parser_unbuffered_errors)) {
     170                 : #ifdef PHP_WIN32
     171                 :                 MessageBox(NULL, error_buf, "PHP Error", MB_OK|MB_TOPMOST|0x00200000L);
     172                 : #else
     173               0 :                 fprintf(stderr, "PHP:  %s", error_buf);
     174                 : #endif
     175                 :         } else {
     176               0 :                 zend_error(E_WARNING, "%s", error_buf);
     177                 :         }
     178               0 :         efree(error_buf);
     179               0 : }
     180                 : 
     181                 : 
     182                 : ZEND_API int zend_parse_ini_file(zend_file_handle *fh, zend_bool unbuffered_errors, zend_ini_parser_cb_t ini_parser_cb, void *arg)
     183               0 : {
     184                 :         int retval;
     185                 :         zend_ini_parser_param ini_parser_param;
     186                 :         TSRMLS_FETCH();
     187                 : 
     188               0 :         ini_parser_param.ini_parser_cb = ini_parser_cb;
     189               0 :         ini_parser_param.arg = arg;
     190                 : 
     191               0 :         CG(ini_parser_param) = &ini_parser_param;
     192               0 :         if (zend_ini_open_file_for_scanning(fh TSRMLS_CC)==FAILURE) {
     193               0 :                 return FAILURE;
     194                 :         }
     195                 : 
     196               0 :         CG(ini_parser_unbuffered_errors) = unbuffered_errors;
     197               0 :         retval = ini_parse(TSRMLS_C);
     198                 : 
     199               0 :         zend_ini_close_file(fh TSRMLS_CC);
     200                 : 
     201               0 :         if (retval==0) {
     202               0 :                 return SUCCESS;
     203                 :         } else {
     204               0 :                 return FAILURE;
     205                 :         }
     206                 : }
     207                 : 
     208                 : 
     209                 : ZEND_API int zend_parse_ini_string(char *str, zend_bool unbuffered_errors, zend_ini_parser_cb_t ini_parser_cb, void *arg)
     210             219 : {
     211                 :         zend_ini_parser_param ini_parser_param;
     212                 :         TSRMLS_FETCH();
     213                 : 
     214             219 :         ini_parser_param.ini_parser_cb = ini_parser_cb;
     215             219 :         ini_parser_param.arg = arg;
     216                 : 
     217             219 :         CG(ini_parser_param) = &ini_parser_param;
     218             219 :         if (zend_ini_prepare_string_for_scanning(str TSRMLS_CC)==FAILURE) {
     219               0 :                 return FAILURE;
     220                 :         }
     221                 : 
     222             219 :         CG(ini_parser_unbuffered_errors) = unbuffered_errors;
     223                 : 
     224             219 :         if (ini_parse(TSRMLS_C)) {
     225               0 :                 return SUCCESS;
     226                 :         } else {
     227             219 :                 return FAILURE;
     228                 :         }
     229                 : }
     230                 : 
     231                 : 
     232                 : %}
     233                 : 
     234                 : %pure_parser
     235                 : %token TC_STRING
     236                 : %token TC_ENCAPSULATED_STRING
     237                 : %token BRACK
     238                 : %token SECTION
     239                 : %token CFG_TRUE
     240                 : %token CFG_FALSE
     241                 : %token TC_DOLLAR_CURLY
     242                 : %left '|' '&'
     243                 : %right '~' '!'
     244                 : 
     245                 : %%
     246                 : 
     247                 : statement_list:
     248                 :                 statement_list statement
     249                 :         |       /* empty */
     250                 : ;
     251                 : 
     252                 : statement:
     253                 :                 TC_STRING '=' string_or_value {
     254                 : #if DEBUG_CFG_PARSER
     255                 :                         printf("'%s' = '%s'\n", $1.value.str.val, $3.value.str.val);
     256                 : #endif
     257            4372 :                         ZEND_INI_PARSER_CB(&$1, &$3, ZEND_INI_PARSER_ENTRY, ZEND_INI_PARSER_ARG);
     258            4372 :                         free($1.value.str.val);
     259            4372 :                         free($3.value.str.val);
     260                 :                 }
     261            4372 :         |       TC_STRING BRACK '=' string_or_value {
     262                 : #if DEBUG_CFG_PARSER
     263                 :                         printf("'%s'[ ] = '%s'\n", $1.value.str.val, $4.value.str.val);
     264                 : #endif
     265               0 :                         ZEND_INI_PARSER_CB(&$1, &$4, ZEND_INI_PARSER_POP_ENTRY, ZEND_INI_PARSER_ARG);
     266               0 :                         free($1.value.str.val);
     267               0 :                         free($4.value.str.val);
     268                 :                 }
     269               0 :         |       TC_STRING { ZEND_INI_PARSER_CB(&$1, NULL, ZEND_INI_PARSER_ENTRY, ZEND_INI_PARSER_ARG); free($1.value.str.val); }
     270               0 :         |       SECTION { ZEND_INI_PARSER_CB(&$1, NULL, ZEND_INI_PARSER_SECTION, ZEND_INI_PARSER_ARG); free($1.value.str.val); }
     271               0 :         |       '\n'
     272                 : ;
     273                 : 
     274                 : 
     275                 : string_or_value:
     276            2409 :                 expr { $$ = $1; }
     277            2409 :         |       CFG_TRUE { $$ = $1; }
     278               0 :         |       CFG_FALSE { $$ = $1; }
     279             218 :         |       '\n' { zend_ini_init_string(&$$); }
     280            1745 :         |       /* empty */ { zend_ini_init_string(&$$); }
     281               0 : ;
     282                 : 
     283                 : 
     284                 : var_string_list:
     285               0 :                 cfg_var_ref { $$ = $1; }
     286               0 :         |       TC_ENCAPSULATED_STRING { $$ = $1; }
     287             221 :         |       constant_string { $$ = $1; }
     288            2188 :         |       var_string_list cfg_var_ref { zend_ini_add_string(&$$, &$1, &$2); free($2.value.str.val); }
     289               0 :         |       var_string_list TC_ENCAPSULATED_STRING { zend_ini_add_string(&$$, &$1, &$2); free($2.value.str.val); }
     290               0 :         |       var_string_list constant_string { zend_ini_add_string(&$$, &$1, &$2); free($2.value.str.val); }
     291               0 : ;
     292                 : 
     293                 : cfg_var_ref:
     294               0 :                 TC_DOLLAR_CURLY TC_STRING '}' { zend_ini_get_var(&$$, &$2); free($2.value.str.val); }
     295               0 : ;
     296                 : 
     297                 : expr:
     298            2409 :                 var_string_list                 { $$ = $1; }
     299            2409 :         |       expr '|' expr                   { zend_ini_do_op('|', &$$, &$1, &$3); }
     300               0 :         |       expr '&' expr                       { zend_ini_do_op('&', &$$, &$1, &$3); }
     301               0 :         |       '~' expr                                { zend_ini_do_op('~', &$$, &$2, NULL); }
     302               0 :         |       '!'     expr                            { zend_ini_do_op('!', &$$, &$2, NULL); }
     303               0 :         |       '(' expr ')'                    { $$ = $2; }
     304               0 : ;
     305                 : 
     306                 : constant_string:
     307            2188 :                 TC_STRING { zend_ini_get_constant(&$$, &$1); }
     308                 : ;
     309                 : 
     310                 : /*
     311                 :  * Local variables:
     312                 :  * tab-width: 4
     313                 :  * c-basic-offset: 4
     314                 :  * indent-tabs-mode: t
     315                 :  * End:
     316                 :  */

Generated by: LTP GCOV extension version 1.5