diff --git a/CHANGELOG b/CHANGELOG index 6500ba8347c..b245b9c6aa9 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,7 +1,7 @@ 1.3.0 - Make the source code compatible with PHP 5.6-dev and PHP 5.7-dev (#1762) - Code cleanup: get rid of compiler warnings, dead code elimination, code deduplication, use static code analysers to eliminate possible bugs - (#801, #802, #810, #825, #827, #838, #849, #942, #968, #1001, #1093, #1169, #1214, #1223, #1224, #1375, #1430) + (#801, #802, #810, #825, #827, #838, #849, #942, #968, #1001, #1093, #1169, #1214, #1223, #1224, #1375, #1430, #1787) - Fixed various memory leaks (#469, #860, #910, #914, #916, #1031, #1067, #1249, #1273, #1291, #1309, #1345, #1455, #1470, #1700) - Fixed memory access violations / segmentation faults / etc (#469, #849, #851, #852, #858, #860, #861, #895, #911, #918, #927, #928, #1000, #1077, #1112, #1113, #1131, #1149, #1173, #1272, #1284, #1302, #1340, #1343, #1368, #1369, #1371, #1376, #1379, #1392, #1451, #1466, #1485, #1494, #1501, #1504, #1509, #1567, #1607) diff --git a/ext/annotations/parser.c b/ext/annotations/parser.c index f203798220e..7071f74ca5c 100644 --- a/ext/annotations/parser.c +++ b/ext/annotations/parser.c @@ -6,6 +6,7 @@ #include /* #line 28 "parser.y" */ + #include "php_phalcon.h" #include @@ -128,7 +129,7 @@ static zval *phannot_ret_annotation(phannot_parser_token *name, zval *arguments, } -/* #line 139 "parser.c" */ +/* #line 133 "parser.c" */ /* Next is all token values, in a form suitable for use by makeheaders. ** This section will be null unless lemon is run with the -m switch. */ @@ -422,7 +423,7 @@ static const char *jjRuleName[] = { */ const char *phannot_TokenName(int tokenType){ #ifndef NDEBUG - if( tokenType>0 && tokenType<(sizeof(jjTokenName)/sizeof(jjTokenName[0])) ){ + if( tokenType>0 && (size_t)tokenType<(sizeof(jjTokenName)/sizeof(jjTokenName[0])) ){ return jjTokenName[tokenType]; }else{ return "Unknown"; @@ -487,7 +488,7 @@ static void jj_destructor(JJCODETYPE jjmajor, JJMINORTYPE *jjpminor){ case 15: case 16: case 17: -/* #line 222 "parser.y" */ +/* #line 216 "parser.y" */ { if ((jjpminor->jj0)) { if ((jjpminor->jj0)->free_flag) { @@ -496,7 +497,7 @@ static void jj_destructor(JJCODETYPE jjmajor, JJMINORTYPE *jjpminor){ efree((jjpminor->jj0)); } } -/* #line 507 "parser.c" */ +/* #line 501 "parser.c" */ break; case 20: case 21: @@ -504,9 +505,9 @@ static void jj_destructor(JJCODETYPE jjmajor, JJMINORTYPE *jjpminor){ case 23: case 24: case 25: -/* #line 235 "parser.y" */ +/* #line 229 "parser.y" */ { zval_ptr_dtor(&(jjpminor->jj36)); } -/* #line 517 "parser.c" */ +/* #line 511 "parser.c" */ break; default: break; /* If no destructor action specified: do nothing */ } @@ -584,7 +585,7 @@ static int jj_find_shift_action( return JJ_NO_ACTION; } i += iLookAhead; - if( i<0 || i>=JJ_SZ_ACTTAB || jj_lookahead[i]!=iLookAhead ){ + if( i<0 || i>=(int)JJ_SZ_ACTTAB || jj_lookahead[i]!=iLookAhead ){ #ifdef JJFALLBACK int iFallback; /* Fallback token */ if( iLookAhead=JJ_SZ_ACTTAB || jj_lookahead[i]!=iLookAhead ){ + if( i<0 || i>=(int)JJ_SZ_ACTTAB || jj_lookahead[i]!=iLookAhead ){ return jj_default[stateno]; }else{ return jj_action[i]; @@ -728,7 +729,7 @@ static void jj_reduce( jjmsp = &jjpParser->jjstack[jjpParser->jjidx]; #ifndef NDEBUG if( jjTraceFILE && jjruleno>=0 - && jjrulenoret = jjmsp[0].minor.jj36; } -/* #line 759 "parser.c" */ +/* #line 753 "parser.c" */ break; case 1: case 14: case 15: -/* #line 237 "parser.y" */ +/* #line 231 "parser.y" */ { jjgotominor.jj36 = jjmsp[0].minor.jj36; } -/* #line 768 "parser.c" */ +/* #line 762 "parser.c" */ break; case 2: -/* #line 243 "parser.y" */ +/* #line 237 "parser.y" */ { jjgotominor.jj36 = phannot_ret_zval_list(jjmsp[-1].minor.jj36, jjmsp[0].minor.jj36); } -/* #line 775 "parser.c" */ +/* #line 769 "parser.c" */ break; case 3: case 8: -/* #line 247 "parser.y" */ +/* #line 241 "parser.y" */ { jjgotominor.jj36 = phannot_ret_zval_list(NULL, jjmsp[0].minor.jj36); } -/* #line 783 "parser.c" */ +/* #line 777 "parser.c" */ break; case 4: -/* #line 254 "parser.y" */ +/* #line 248 "parser.y" */ { jjgotominor.jj36 = phannot_ret_annotation(jjmsp[-3].minor.jj0, jjmsp[-1].minor.jj36, status->scanner_state); jj_destructor(2,&jjmsp[-4].minor); jj_destructor(4,&jjmsp[-2].minor); jj_destructor(5,&jjmsp[0].minor); } -/* #line 793 "parser.c" */ +/* #line 787 "parser.c" */ break; case 5: -/* #line 258 "parser.y" */ +/* #line 252 "parser.y" */ { jjgotominor.jj36 = phannot_ret_annotation(jjmsp[-2].minor.jj0, NULL, status->scanner_state); jj_destructor(2,&jjmsp[-3].minor); jj_destructor(4,&jjmsp[-1].minor); jj_destructor(5,&jjmsp[0].minor); } -/* #line 803 "parser.c" */ +/* #line 797 "parser.c" */ break; case 6: -/* #line 262 "parser.y" */ +/* #line 256 "parser.y" */ { jjgotominor.jj36 = phannot_ret_annotation(jjmsp[0].minor.jj0, NULL, status->scanner_state); jj_destructor(2,&jjmsp[-1].minor); } -/* #line 811 "parser.c" */ +/* #line 805 "parser.c" */ break; case 7: -/* #line 268 "parser.y" */ +/* #line 262 "parser.y" */ { jjgotominor.jj36 = phannot_ret_zval_list(jjmsp[-2].minor.jj36, jjmsp[0].minor.jj36); jj_destructor(1,&jjmsp[-1].minor); } -/* #line 819 "parser.c" */ +/* #line 813 "parser.c" */ break; case 9: -/* #line 278 "parser.y" */ +/* #line 272 "parser.y" */ { jjgotominor.jj36 = phannot_ret_named_item(NULL, jjmsp[0].minor.jj36); } -/* #line 826 "parser.c" */ +/* #line 820 "parser.c" */ break; case 10: case 12: -/* #line 282 "parser.y" */ +/* #line 276 "parser.y" */ { jjgotominor.jj36 = phannot_ret_named_item(jjmsp[-2].minor.jj0, jjmsp[0].minor.jj36); jj_destructor(7,&jjmsp[-1].minor); } -/* #line 835 "parser.c" */ +/* #line 829 "parser.c" */ break; case 11: case 13: -/* #line 286 "parser.y" */ +/* #line 280 "parser.y" */ { jjgotominor.jj36 = phannot_ret_named_item(jjmsp[-2].minor.jj0, jjmsp[0].minor.jj36); jj_destructor(8,&jjmsp[-1].minor); } -/* #line 844 "parser.c" */ +/* #line 838 "parser.c" */ break; case 16: -/* #line 308 "parser.y" */ +/* #line 302 "parser.y" */ { jjgotominor.jj36 = phannot_ret_literal_zval(PHANNOT_T_IDENTIFIER, jjmsp[0].minor.jj0); } -/* #line 851 "parser.c" */ +/* #line 845 "parser.c" */ break; case 17: -/* #line 312 "parser.y" */ +/* #line 306 "parser.y" */ { jjgotominor.jj36 = phannot_ret_literal_zval(PHANNOT_T_INTEGER, jjmsp[0].minor.jj0); } -/* #line 858 "parser.c" */ +/* #line 852 "parser.c" */ break; case 18: -/* #line 316 "parser.y" */ +/* #line 310 "parser.y" */ { jjgotominor.jj36 = phannot_ret_literal_zval(PHANNOT_T_STRING, jjmsp[0].minor.jj0); } -/* #line 865 "parser.c" */ +/* #line 859 "parser.c" */ break; case 19: -/* #line 320 "parser.y" */ +/* #line 314 "parser.y" */ { jjgotominor.jj36 = phannot_ret_literal_zval(PHANNOT_T_DOUBLE, jjmsp[0].minor.jj0); } -/* #line 872 "parser.c" */ +/* #line 866 "parser.c" */ break; case 20: -/* #line 324 "parser.y" */ +/* #line 318 "parser.y" */ { jjgotominor.jj36 = phannot_ret_literal_zval(PHANNOT_T_NULL, NULL); jj_destructor(11,&jjmsp[0].minor); } -/* #line 880 "parser.c" */ +/* #line 874 "parser.c" */ break; case 21: -/* #line 328 "parser.y" */ +/* #line 322 "parser.y" */ { jjgotominor.jj36 = phannot_ret_literal_zval(PHANNOT_T_FALSE, NULL); jj_destructor(12,&jjmsp[0].minor); } -/* #line 888 "parser.c" */ +/* #line 882 "parser.c" */ break; case 22: -/* #line 332 "parser.y" */ +/* #line 326 "parser.y" */ { jjgotominor.jj36 = phannot_ret_literal_zval(PHANNOT_T_TRUE, NULL); jj_destructor(13,&jjmsp[0].minor); } -/* #line 896 "parser.c" */ +/* #line 890 "parser.c" */ break; case 23: -/* #line 336 "parser.y" */ +/* #line 330 "parser.y" */ { jjgotominor.jj36 = phannot_ret_array(jjmsp[-1].minor.jj36); jj_destructor(14,&jjmsp[-2].minor); jj_destructor(15,&jjmsp[0].minor); } -/* #line 905 "parser.c" */ +/* #line 899 "parser.c" */ break; case 24: -/* #line 340 "parser.y" */ +/* #line 334 "parser.y" */ { jjgotominor.jj36 = phannot_ret_array(jjmsp[-1].minor.jj36); jj_destructor(16,&jjmsp[-2].minor); jj_destructor(17,&jjmsp[0].minor); } -/* #line 914 "parser.c" */ +/* #line 908 "parser.c" */ break; }; jjgoto = jjRuleInfo[jjruleno].lhs; @@ -945,7 +946,7 @@ static void jj_syntax_error( ){ phannot_ARG_FETCH; #define JTOKEN (jjminor.jj0) -/* #line 159 "parser.y" */ +/* #line 153 "parser.y" */ if (status->scanner_state->start_length) { { @@ -953,8 +954,8 @@ static void jj_syntax_error( char *token_name = NULL; const phannot_token_names *tokens = phannot_tokens; int token_found = 0; - int active_token = status->scanner_state->active_token; - int near_length = status->scanner_state->start_length; + uint active_token = status->scanner_state->active_token; + uint near_length = status->scanner_state->start_length; if (active_token) { do { @@ -1008,7 +1009,7 @@ static void jj_syntax_error( status->status = PHANNOT_PARSING_FAILED; -/* #line 1019 "parser.c" */ +/* #line 1013 "parser.c" */ phannot_ARG_STORE; /* Suppress warning about unused %extra_argument variable */ } diff --git a/ext/annotations/parser.h b/ext/annotations/parser.h index 2ff04b95476..b97c9642172 100644 --- a/ext/annotations/parser.h +++ b/ext/annotations/parser.h @@ -1,6 +1,3 @@ -#ifndef PHALCON_ANNOTATIONS_PARSER_H -#define PHALCON_ANNOTATIONS_PARSER_H - #define PHANNOT_COMMA 1 #define PHANNOT_AT 2 #define PHANNOT_IDENTIFIER 3 @@ -18,5 +15,3 @@ #define PHANNOT_BRACKET_CLOSE 15 #define PHANNOT_SBRACKET_OPEN 16 #define PHANNOT_SBRACKET_CLOSE 17 - -#endif /* PHALCON_ANNOTATIONS_PARSER_H */ diff --git a/ext/annotations/parser.y b/ext/annotations/parser.y index 0c36f0ce005..8c4c3277d59 100644 --- a/ext/annotations/parser.y +++ b/ext/annotations/parser.y @@ -157,8 +157,8 @@ static zval *phannot_ret_annotation(phannot_parser_token *name, zval *arguments, char *token_name = NULL; const phannot_token_names *tokens = phannot_tokens; int token_found = 0; - int active_token = status->scanner_state->active_token; - int near_length = status->scanner_state->start_length; + uint active_token = status->scanner_state->active_token; + uint near_length = status->scanner_state->start_length; if (active_token) { do { diff --git a/ext/annotations/scanner.c b/ext/annotations/scanner.c index 4a4a65cc1aa..72826509d06 100644 --- a/ext/annotations/scanner.c +++ b/ext/annotations/scanner.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.13.5 on Sun Dec 1 23:47:17 2013 */ +/* Generated by re2c 0.13.5 on Sat Jan 11 18:45:29 2014 */ /* #line 1 "scanner.re" */ /* @@ -57,7 +57,7 @@ int phannot_get_token(phannot_scanner_state *s, phannot_scanner_token *token) { } else { -/* #line 66 "scanner.c" */ +/* #line 61 "scanner.c" */ { JJCTYPE jjch; unsigned int jjaccept = 0; @@ -188,18 +188,18 @@ int phannot_get_token(phannot_scanner_state *s, phannot_scanner_token *token) { goto jj71; } jj3: -/* #line 183 "scanner.re" */ +/* #line 178 "scanner.re" */ { status = PHANNOT_SCANNER_RETCODE_ERR; break; } -/* #line 202 "scanner.c" */ +/* #line 197 "scanner.c" */ jj4: jjaccept = 0; jjch = *(JJMARKER = ++JJCURSOR); goto jj72; jj5: -/* #line 67 "scanner.re" */ +/* #line 62 "scanner.re" */ { token->opcode = PHANNOT_T_INTEGER; token->value = estrndup(start, JJCURSOR - start); @@ -207,7 +207,7 @@ int phannot_get_token(phannot_scanner_state *s, phannot_scanner_token *token) { q = JJCURSOR; return 0; } -/* #line 216 "scanner.c" */ +/* #line 211 "scanner.c" */ jj6: jjaccept = 1; jjch = *(JJMARKER = ++JJCURSOR); @@ -215,7 +215,7 @@ int phannot_get_token(phannot_scanner_state *s, phannot_scanner_token *token) { if (jjch == 'u') goto jj66; goto jj44; jj7: -/* #line 109 "scanner.re" */ +/* #line 104 "scanner.re" */ { token->opcode = PHANNOT_T_IDENTIFIER; token->value = estrndup(start, JJCURSOR - start); @@ -223,7 +223,7 @@ int phannot_get_token(phannot_scanner_state *s, phannot_scanner_token *token) { q = JJCURSOR; return 0; } -/* #line 232 "scanner.c" */ +/* #line 227 "scanner.c" */ jj8: jjaccept = 1; jjch = *(JJMARKER = ++JJCURSOR); @@ -263,112 +263,112 @@ int phannot_get_token(phannot_scanner_state *s, phannot_scanner_token *token) { goto jj44; jj14: ++JJCURSOR; -/* #line 117 "scanner.re" */ +/* #line 112 "scanner.re" */ { token->opcode = PHANNOT_T_PARENTHESES_OPEN; return 0; } -/* #line 277 "scanner.c" */ +/* #line 272 "scanner.c" */ jj16: ++JJCURSOR; -/* #line 122 "scanner.re" */ +/* #line 117 "scanner.re" */ { token->opcode = PHANNOT_T_PARENTHESES_CLOSE; return 0; } -/* #line 285 "scanner.c" */ +/* #line 280 "scanner.c" */ jj18: ++JJCURSOR; -/* #line 127 "scanner.re" */ +/* #line 122 "scanner.re" */ { token->opcode = PHANNOT_T_BRACKET_OPEN; return 0; } -/* #line 293 "scanner.c" */ +/* #line 288 "scanner.c" */ jj20: ++JJCURSOR; -/* #line 132 "scanner.re" */ +/* #line 127 "scanner.re" */ { token->opcode = PHANNOT_T_BRACKET_CLOSE; return 0; } -/* #line 301 "scanner.c" */ +/* #line 296 "scanner.c" */ jj22: ++JJCURSOR; -/* #line 137 "scanner.re" */ +/* #line 132 "scanner.re" */ { token->opcode = PHANNOT_T_SBRACKET_OPEN; return 0; } -/* #line 309 "scanner.c" */ +/* #line 304 "scanner.c" */ jj24: ++JJCURSOR; -/* #line 142 "scanner.re" */ +/* #line 137 "scanner.re" */ { token->opcode = PHANNOT_T_SBRACKET_CLOSE; return 0; } -/* #line 317 "scanner.c" */ +/* #line 312 "scanner.c" */ jj26: ++JJCURSOR; -/* #line 147 "scanner.re" */ +/* #line 142 "scanner.re" */ { token->opcode = PHANNOT_T_AT; return 0; } -/* #line 325 "scanner.c" */ +/* #line 320 "scanner.c" */ jj28: ++JJCURSOR; -/* #line 152 "scanner.re" */ +/* #line 147 "scanner.re" */ { token->opcode = PHANNOT_T_EQUALS; return 0; } -/* #line 333 "scanner.c" */ +/* #line 328 "scanner.c" */ jj30: ++JJCURSOR; -/* #line 157 "scanner.re" */ +/* #line 152 "scanner.re" */ { token->opcode = PHANNOT_T_COLON; return 0; } -/* #line 341 "scanner.c" */ +/* #line 336 "scanner.c" */ jj32: ++JJCURSOR; -/* #line 162 "scanner.re" */ +/* #line 157 "scanner.re" */ { token->opcode = PHANNOT_T_COMMA; return 0; } -/* #line 349 "scanner.c" */ +/* #line 344 "scanner.c" */ jj34: ++JJCURSOR; jjch = *JJCURSOR; goto jj42; jj35: -/* #line 167 "scanner.re" */ +/* #line 162 "scanner.re" */ { token->opcode = PHANNOT_T_IGNORE; return 0; } -/* #line 360 "scanner.c" */ +/* #line 355 "scanner.c" */ jj36: ++JJCURSOR; -/* #line 172 "scanner.re" */ +/* #line 167 "scanner.re" */ { s->active_line++; token->opcode = PHANNOT_T_IGNORE; return 0; } -/* #line 369 "scanner.c" */ +/* #line 364 "scanner.c" */ jj38: ++JJCURSOR; -/* #line 178 "scanner.re" */ +/* #line 173 "scanner.re" */ { status = PHANNOT_SCANNER_RETCODE_EOF; break; } -/* #line 377 "scanner.c" */ +/* #line 372 "scanner.c" */ jj40: jjch = *++JJCURSOR; goto jj3; @@ -461,7 +461,7 @@ int phannot_get_token(phannot_scanner_state *s, phannot_scanner_token *token) { goto jj49; jj52: ++JJCURSOR; -/* #line 100 "scanner.re" */ +/* #line 95 "scanner.re" */ { token->opcode = PHANNOT_T_STRING; token->value = estrndup(q, JJCURSOR - q - 1); @@ -469,7 +469,7 @@ int phannot_get_token(phannot_scanner_state *s, phannot_scanner_token *token) { q = JJCURSOR; return 0; } -/* #line 478 "scanner.c" */ +/* #line 473 "scanner.c" */ jj54: ++JJCURSOR; jjch = *JJCURSOR; @@ -501,12 +501,12 @@ int phannot_get_token(phannot_scanner_state *s, phannot_scanner_token *token) { } if (jjch == '\\') goto jj45; jj60: -/* #line 94 "scanner.re" */ +/* #line 89 "scanner.re" */ { token->opcode = PHANNOT_T_TRUE; return 0; } -/* #line 515 "scanner.c" */ +/* #line 510 "scanner.c" */ jj61: jjaccept = 1; jjch = *(JJMARKER = ++JJCURSOR); @@ -530,12 +530,12 @@ int phannot_get_token(phannot_scanner_state *s, phannot_scanner_token *token) { } if (jjch == '\\') goto jj45; jj65: -/* #line 89 "scanner.re" */ +/* #line 84 "scanner.re" */ { token->opcode = PHANNOT_T_FALSE; return 0; } -/* #line 544 "scanner.c" */ +/* #line 539 "scanner.c" */ jj66: jjaccept = 1; jjch = *(JJMARKER = ++JJCURSOR); @@ -554,12 +554,12 @@ int phannot_get_token(phannot_scanner_state *s, phannot_scanner_token *token) { } if (jjch == '\\') goto jj45; jj69: -/* #line 84 "scanner.re" */ +/* #line 79 "scanner.re" */ { token->opcode = PHANNOT_T_NULL; return 0; } -/* #line 568 "scanner.c" */ +/* #line 563 "scanner.c" */ jj70: jjch = *++JJCURSOR; if (jjch <= '/') goto jj46; @@ -581,7 +581,7 @@ int phannot_get_token(phannot_scanner_state *s, phannot_scanner_token *token) { if (jjch <= '/') goto jj75; if (jjch <= '9') goto jj73; jj75: -/* #line 76 "scanner.re" */ +/* #line 71 "scanner.re" */ { token->opcode = PHANNOT_T_DOUBLE; token->value = estrndup(start, JJCURSOR - start); @@ -589,9 +589,9 @@ int phannot_get_token(phannot_scanner_state *s, phannot_scanner_token *token) { q = JJCURSOR; return 0; } -/* #line 598 "scanner.c" */ +/* #line 593 "scanner.c" */ } -/* #line 188 "scanner.re" */ +/* #line 183 "scanner.re" */ } diff --git a/ext/assets/collection.c b/ext/assets/collection.c index 490d3a4b0e2..1b1315d43b3 100644 --- a/ext/assets/collection.c +++ b/ext/assets/collection.c @@ -17,10 +17,6 @@ +------------------------------------------------------------------------+ */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - #include "php_phalcon.h" #include "assets/collection.h" #include "assets/exception.h" diff --git a/ext/cache/backend/apc.c b/ext/cache/backend/apc.c index 5e89c4bf008..a05f051f0a7 100644 --- a/ext/cache/backend/apc.c +++ b/ext/cache/backend/apc.c @@ -155,7 +155,7 @@ PHP_METHOD(Phalcon_Cache_Backend_Apc, save){ zval *key_name = NULL, *content = NULL, *lifetime = NULL, *stop_buffer = NULL; zval *cached_content; - zval *prepared_content, *ttl = NULL, *is_buffering; + zval *prepared_content = NULL, *ttl = NULL, *is_buffering; zval *last_key, *prefix, *frontend; PHALCON_MM_GROW(); @@ -210,7 +210,7 @@ PHP_METHOD(Phalcon_Cache_Backend_Apc, save){ * Call apc_store in the PHP userland since most of the time it isn't available at * compile time */ - if (phalcon_is_numeric(cached_content)) { + if (!prepared_content) { phalcon_call_func_p3_noret("apc_store", last_key, cached_content, ttl); } else { phalcon_call_func_p3_noret("apc_store", last_key, prepared_content, ttl); diff --git a/ext/cache/backend/libmemcached.c b/ext/cache/backend/libmemcached.c index 16a6fc6f74a..2bda93dc66d 100644 --- a/ext/cache/backend/libmemcached.c +++ b/ext/cache/backend/libmemcached.c @@ -281,7 +281,7 @@ PHP_METHOD(Phalcon_Cache_Backend_Libmemcached, save){ zval *key_name = NULL, *content = NULL, *lifetime = NULL, *stop_buffer = NULL; zval *last_key, *frontend, *memcache, *cached_content; - zval *prepared_content, *ttl, *success; + zval *prepared_content = NULL, *ttl, *success; zval *options, *special_key, *keys = NULL, *is_buffering; PHALCON_MM_GROW(); @@ -343,7 +343,7 @@ PHP_METHOD(Phalcon_Cache_Backend_Libmemcached, save){ } PHALCON_OBS_VAR(success); - if (phalcon_is_numeric(cached_content)) { + if (!prepared_content) { phalcon_call_method_p3_ex(success, &success, memcache, "set", last_key, cached_content, ttl); } else { phalcon_call_method_p3_ex(success, &success, memcache, "set", last_key, prepared_content, ttl); diff --git a/ext/cache/backend/memory.c b/ext/cache/backend/memory.c index 7c7edb51d93..d7479f59bdb 100644 --- a/ext/cache/backend/memory.c +++ b/ext/cache/backend/memory.c @@ -260,7 +260,7 @@ PHP_METHOD(Phalcon_Cache_Backend_Memory, queryKeys){ (type = zend_hash_get_current_key_ex(Z_ARRVAL_P(data), &str_index, &str_index_len, &num_index, 0, &pos)) != HASH_KEY_NON_EXISTANT; zend_hash_move_forward_ex(Z_ARRVAL_P(data), &pos) ) { - if (type == HASH_KEY_IS_STRING && str_index_len > Z_STRLEN_P(prefix) && !memcmp(Z_STRVAL_P(prefix), str_index, str_index_len-1)) { + if (type == HASH_KEY_IS_STRING && str_index_len > (uint)(Z_STRLEN_P(prefix)) && !memcmp(Z_STRVAL_P(prefix), str_index, str_index_len-1)) { add_next_index_stringl(return_value, str_index, str_index_len-1, 1); } else if (unlikely(type == HASH_KEY_IS_LONG)) { diff --git a/ext/cache/backend/mongo.c b/ext/cache/backend/mongo.c index 07c82f097ba..78df72ae3b4 100644 --- a/ext/cache/backend/mongo.c +++ b/ext/cache/backend/mongo.c @@ -298,7 +298,7 @@ PHP_METHOD(Phalcon_Cache_Backend_Mongo, save){ zval *key_name = NULL, *content = NULL, *lifetime = NULL, *stop_buffer = NULL; zval *last_key, *frontend, *cached_content = NULL; - zval *prepared_content, *ttl = NULL, *collection, *timestamp; + zval *prepared_content = NULL, *ttl = NULL, *collection, *timestamp; zval *conditions, *document, *data, *is_buffering; PHALCON_MM_GROW(); @@ -361,7 +361,7 @@ PHP_METHOD(Phalcon_Cache_Backend_Mongo, save){ if (Z_TYPE_P(document) == IS_ARRAY) { phalcon_array_update_string(&document, SL("time"), ×tamp, PH_COPY); - if (!phalcon_is_numeric(cached_content)) { + if (prepared_content) { phalcon_array_update_string(&document, SL("data"), &prepared_content, PH_COPY); } else { phalcon_array_update_string(&document, SL("data"), &cached_content, PH_COPY); @@ -373,7 +373,7 @@ PHP_METHOD(Phalcon_Cache_Backend_Mongo, save){ phalcon_array_update_string(&data, SL("key"), &last_key, PH_COPY); phalcon_array_update_string(&data, SL("time"), ×tamp, PH_COPY); - if (!phalcon_is_numeric(cached_content)) { + if (prepared_content) { phalcon_array_update_string(&data, SL("data"), &prepared_content, PH_COPY); } else { phalcon_array_update_string(&data, SL("data"), &cached_content, PH_COPY); diff --git a/ext/cache/backend/xcache.c b/ext/cache/backend/xcache.c index 23ee117eed3..b1b0e4840a3 100644 --- a/ext/cache/backend/xcache.c +++ b/ext/cache/backend/xcache.c @@ -185,7 +185,7 @@ PHP_METHOD(Phalcon_Cache_Backend_Xcache, save){ zval *key_name = NULL, *content = NULL, *lifetime = NULL, *stop_buffer = NULL; zval *cached_content, *keys, *last_key, *frontend; - zval *prepared_content, *ttl, *success, *is_buffering; + zval *prepared_content = NULL, *ttl, *success, *is_buffering; zval *prefix, *options, *special_key, *z_zero, *tmp; PHALCON_MM_GROW(); @@ -238,7 +238,7 @@ PHP_METHOD(Phalcon_Cache_Backend_Xcache, save){ PHALCON_OBS_VAR(success); - if (phalcon_is_numeric(cached_content)) { + if (!prepared_content) { phalcon_call_func_p3_ex(success, &success, "xcache_set", last_key, cached_content, ttl); } else { phalcon_call_func_p3_ex(success, &success, "xcache_set", last_key, prepared_content, ttl); diff --git a/ext/cache/exception.h b/ext/cache/exception.h index 9b84176d3d8..c203226406f 100644 --- a/ext/cache/exception.h +++ b/ext/cache/exception.h @@ -20,7 +20,7 @@ #ifndef PHALCON_CACHE_EXCEPTION_H #define PHALCON_CACHE_EXCEPTION_H -#include "php_config.h" +#include "php_phalcon.h" extern zend_class_entry *phalcon_cache_exception_ce; diff --git a/ext/config.m4 b/ext/config.m4 index 7f759478b71..40c5982f946 100644 --- a/ext/config.m4 +++ b/ext/config.m4 @@ -353,6 +353,8 @@ image/adapter/imagick.c" PHP_NEW_EXTENSION(phalcon, $phalcon_sources, $ext_shared) PHP_ADD_EXTENSION_DEP([phalcon], [spl]) + PHP_C_BIGENDIAN + old_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $INCLUDES" diff --git a/ext/crypt.c b/ext/crypt.c index 4056d21f931..b5dcb411daa 100644 --- a/ext/crypt.c +++ b/ext/crypt.c @@ -316,7 +316,7 @@ static void phalcon_crypt_unpad_text(zval *return_value, zval *text, zval *mode, int i; char *str_mode; char *str_text; - int text_len; + uint text_len; assert(Z_TYPE_P(text) == IS_STRING); assert(Z_TYPE_P(mode) == IS_STRING); @@ -324,12 +324,12 @@ static void phalcon_crypt_unpad_text(zval *return_value, zval *text, zval *mode, padding_size = 0; str_mode = Z_STRVAL_P(mode); str_text = Z_STRVAL_P(text); - text_len = Z_STRLEN_P(text); + text_len = Z_STRLEN_P(text); if (text_len && (text_len % block_size == 0) && (!strcmp(str_mode, "ecb") || !strcmp(str_mode, "cbc"))) { switch (padding_type) { case PHALCON_CRYPT_PADDING_ANSI_X_923: - if (str_text[text_len-1] <= block_size) { + if ((unsigned char)(str_text[text_len-1]) <= block_size) { padding_size = str_text[text_len-1]; memset(padding, 0, padding_size - 1); @@ -343,7 +343,7 @@ static void phalcon_crypt_unpad_text(zval *return_value, zval *text, zval *mode, break; case PHALCON_CRYPT_PADDING_PKCS7: - if (str_text[text_len-1] <= block_size) { + if ((unsigned char)(str_text[text_len-1]) <= block_size) { padding_size = str_text[text_len-1]; memset(padding, padding_size, padding_size); diff --git a/ext/image/adapter/gd.c b/ext/image/adapter/gd.c index fdb05ea63cb..1ae9597388a 100644 --- a/ext/image/adapter/gd.c +++ b/ext/image/adapter/gd.c @@ -722,7 +722,7 @@ PHP_METHOD(Phalcon_Image_Adapter_GD, _sharpen) { } PHALCON_INIT_NVAR(tmp_amount); - ZVAL_LONG(tmp_amount, floor(a*100+0.5)/100); + ZVAL_LONG(tmp_amount, (long int)(floor(a*100.0+0.5)/100)); PHALCON_INIT_VAR(matrix); array_init_size(matrix, 3); @@ -931,13 +931,13 @@ PHP_METHOD(Phalcon_Image_Adapter_GD, _watermark) { int_opacity = Z_LVAL_P(opacity); if (int_opacity < 100) { - num = (int_opacity * 127 / 100) - 127; + num = (int_opacity * 127.0 / 100) - 127; if (num < 0) { - num = num * -1; + num = -num; } - int_opacity = num; + int_opacity = (int)num; PHALCON_INIT_VAR(op); ZVAL_LONG(op, int_opacity); @@ -1288,13 +1288,13 @@ PHP_METHOD(Phalcon_Image_Adapter_GD, _background) { int_opacity = Z_LVAL_P(opacity); - num = (int_opacity * 127 / 100) - 127; + num = (int_opacity * 127.0 / 100) - 127; if (num < 0) { num = -num; } - int_opacity = num; + int_opacity = (int)num; PHALCON_OBS_VAR(background); phalcon_call_method_p2_ex(background, &background, this_ptr, "_create", width, height); diff --git a/ext/kernel/alternative/fcall.c b/ext/kernel/alternative/fcall.c index cba4f64c660..062e3bc7c4b 100644 --- a/ext/kernel/alternative/fcall.c +++ b/ext/kernel/alternative/fcall.c @@ -17,15 +17,9 @@ +------------------------------------------------------------------------+ */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "php.h" #include "php_phalcon.h" #include - #include #include #include diff --git a/ext/kernel/array.c b/ext/kernel/array.c index a4c18f7590d..c1b64a9e3bd 100644 --- a/ext/kernel/array.c +++ b/ext/kernel/array.c @@ -25,18 +25,6 @@ #include "kernel/operators.h" #include "kernel/hash.h" -/** - * @brief Fetches @a index if it exists from the array @a arr - * @param[out] fetched &$arr[$index]; @a fetched is modified only when the function returns 1 - * @param arr Array - * @param index Index - * @return isset($arr[$index]) - * @retval 0 Not exists, @a arr is not an array or @a index is of not supported type - * @retval 1 Exists - * @note @c index will be handled as follows: @c NULL is treated as an empty string, @c double values are cast to @c integer, @c bool or @c resource are treated as @c integer - * @note $arr[$index] is returned as is: no copying occurs, reference copunt is not updated - * @throw E_WARNING if @a offset is not a scalar - */ int phalcon_array_isset_fetch(zval **fetched, const zval *arr, zval *index) { HashTable *h; @@ -80,7 +68,7 @@ int phalcon_array_isset_fetch(zval **fetched, const zval *arr, zval *index) { return 0; } -int phalcon_array_isset_quick_string_fetch(zval **fetched, zval *arr, const char *index, uint index_length, unsigned long key) { +int phalcon_array_isset_quick_string_fetch(zval **fetched, zval *arr, const char *index, uint index_length, ulong key) { zval **zv; @@ -94,12 +82,7 @@ int phalcon_array_isset_quick_string_fetch(zval **fetched, zval *arr, const char return 0; } -int phalcon_array_isset_string_fetch(zval **fetched, zval *arr, const char *index, uint index_length) { - - return phalcon_array_isset_quick_string_fetch(fetched, arr, index, index_length, zend_inline_hash_func(index, index_length)); -} - -int phalcon_array_isset_long_fetch(zval **fetched, zval *arr, unsigned long index) { +int phalcon_array_isset_long_fetch(zval **fetched, zval *arr, ulong index) { zval **zv; @@ -113,17 +96,7 @@ int phalcon_array_isset_long_fetch(zval **fetched, zval *arr, unsigned long inde return 0; } -/** - * @brief Checks whether @a index exists in array @a arr - * @param arr Array - * @param index Index - * @return isset($arr[$index]) - * @retval 0 Not exists, @a arr is not an array or @a index is of not supported type - * @retval 1 Exists - * @note @c index will be handled as follows: @c NULL is treated as an empty string, @c double values are cast to @c integer, @c bool or @c resource are treated as @c integer - * @throw E_WARNING if @a offset is not a scalar - */ -int ZEND_FASTCALL phalcon_array_isset(const zval *arr, zval *index) { +int phalcon_array_isset(const zval *arr, zval *index) { HashTable *h; @@ -153,33 +126,7 @@ int ZEND_FASTCALL phalcon_array_isset(const zval *arr, zval *index) { } } -/** - * @brief Checks whether string @a index exists in array @a arr - * @param arr Array - * @param index Index - * @param index_length strlen(index)+1 - * @return isset($arr[$index]) - * @retval 0 Not exists, @a arr is not an array - * @retval 1 Exists - * @note The function is a wrapper around phalcon_array_isset_quick_string() - * @see phalcon_array_isset_quick_string() - */ -int ZEND_FASTCALL phalcon_array_isset_string(const zval *arr, const char *index, uint index_length) { - - return phalcon_array_isset_quick_string(arr, index, index_length, zend_inline_hash_func(index, index_length)); -} - -/** - * @brief Checks whether string @a index exists in array @a arr using a precomputed key @a key - * @param arr Array - * @param index Index - * @param index_length strlen(index)+1 - * @param key Precomputed key - * @return isset($arr[$index]) - * @retval 0 Not exists or @a arr is not an array - * @retval 1 Exists - */ -int ZEND_FASTCALL phalcon_array_isset_quick_string(const zval *arr, const char *index, uint index_length, unsigned long key) { +int phalcon_array_isset_quick_string(const zval *arr, const char *index, uint index_length, ulong key) { if (likely(Z_TYPE_P(arr) == IS_ARRAY)) { return zend_hash_quick_exists(Z_ARRVAL_P(arr), index, index_length, key); @@ -188,15 +135,7 @@ int ZEND_FASTCALL phalcon_array_isset_quick_string(const zval *arr, const char * return 0; } -/** - * @brief Checks whether numeric @a index exists in array @a arr using a precomputed key @a key - * @param arr Array - * @param index Index - * @return isset($arr[$index]) - * @retval 0 Not exists or @a arr is not an array - * @retval 1 Exists - */ -int ZEND_FASTCALL phalcon_array_isset_long(const zval *arr, unsigned long index) { +int phalcon_array_isset_long(const zval *arr, ulong index) { if (likely(Z_TYPE_P(arr) == IS_ARRAY)) { return zend_hash_index_exists(Z_ARRVAL_P(arr), index); @@ -205,23 +144,12 @@ int ZEND_FASTCALL phalcon_array_isset_long(const zval *arr, unsigned long index) return 0; } -/** - * @brief Unsets @a index from array @a arr - * @param[in,out] arr Array - * @param index Index - * @param flags Flags (@c PH_SEPARATE: separate array if its reference count is greater than 1; @c arr will contain the separated array) - * @return Whether the operation succeeded - * @retval @c FAILURE Failure, @a arr is not an array or @a index is of not supported type - * @retval @c SUCCESS Success - * @note @c index will be handled as follows: @c NULL is treated as an empty string, @c double values are cast to @c integer, @c bool or @c resource are treated as @c integer - * @throw @c E_WARNING if @a offset is not a scalar - */ -int ZEND_FASTCALL phalcon_array_unset(zval **arr, zval *index, int flags) { +int phalcon_array_unset(zval **arr, zval *index, int flags) { HashTable *ht; if (Z_TYPE_PP(arr) != IS_ARRAY) { - return 0; + return FAILURE; } if ((flags & PH_SEPARATE) == PH_SEPARATE) { @@ -251,20 +179,10 @@ int ZEND_FASTCALL phalcon_array_unset(zval **arr, zval *index, int flags) { } } -/** - * @brief Unsets string @a index from array @a arr - * @param[in,out] arr Array - * @param index Index - * @param index_length strlen(index)+1 - * @param flags Flags (@c PH_SEPARATE: separate array if its reference count is greater than 1; @c arr will contain the separated array) - * @return Whether the operation succeeded - * @retval @c FAILURE Failure or @a arr is not an array - * @retval @c SUCCESS Success - */ -int ZEND_FASTCALL phalcon_array_unset_string(zval **arr, const char *index, uint index_length, int flags) { +int phalcon_array_unset_string(zval **arr, const char *index, uint index_length, int flags) { if (Z_TYPE_PP(arr) != IS_ARRAY) { - return 0; + return FAILURE; } if ((flags & PH_SEPARATE) == PH_SEPARATE) { @@ -274,19 +192,10 @@ int ZEND_FASTCALL phalcon_array_unset_string(zval **arr, const char *index, uint return zend_hash_del(Z_ARRVAL_PP(arr), index, index_length); } -/** - * @brief Unsets numeric @a index from array @a arr - * @param[in,out] arr Array - * @param index Index - * @param flags Flags (@c PH_SEPARATE: separate array if its reference count is greater than 1; @c arr will contain the separated array) - * @return Whether the operation succeeded - * @retval @c FAILURE Failure or @a arr is not an array - * @retval @c SUCCESS Success - */ -int ZEND_FASTCALL phalcon_array_unset_long(zval **arr, unsigned long index, int flags) { +int phalcon_array_unset_long(zval **arr, ulong index, int flags) { if (Z_TYPE_PP(arr) != IS_ARRAY) { - return 0; + return FAILURE; } if ((flags & PH_SEPARATE) == PH_SEPARATE) { @@ -296,16 +205,6 @@ int ZEND_FASTCALL phalcon_array_unset_long(zval **arr, unsigned long index, int return zend_hash_index_del(Z_ARRVAL_PP(arr), index); } -/** - * @brief Pushes @a value onto the end of @a arr - * @param[in,out] arr Array - * @param[in,out] value Value to add; reference counter of @c *value will be incrememnted - * @param flags Flags (@c PH_SEPARATE: separate array if its reference count is greater than 1; @c arr will contain the separated array) - * @return Whether the operation succeeded - * @retval @c FAILURE Failure or @a arr is not an array - * @retval @c SUCCESS Success - * @throw @c E_WARNING if @a is not an array - */ int phalcon_array_append(zval **arr, zval *value, int flags) { if (Z_TYPE_PP(arr) != IS_ARRAY) { @@ -321,73 +220,6 @@ int phalcon_array_append(zval **arr, zval *value, int flags) { return add_next_index_zval(*arr, value); } -/** - * @brief Appends a long integer @a value to @a arr - * @param[in,out] arr Array - * @param value Value - * @param separate Flags (@c PH_SEPARATE: separate array if its reference count is greater than 1; @c arr will contain the separated array) - * @return Whether the operation succeeded - * @retval @c FAILURE Failure or @a arr is not an array - * @retval @c SUCCESS Success - * @throw @c E_WARNING if @a is not an array - * @see phalcon_array_append() - * - * Equivalent to $arr[] = $value in PHP, where @c $value is an integer. - */ -int phalcon_array_append_long(zval **arr, long value, int separate) { - - zval *zvalue; - - MAKE_STD_ZVAL(zvalue); - Z_SET_REFCOUNT_P(zvalue, 0); - ZVAL_LONG(zvalue, value); - - return phalcon_array_append(arr, zvalue, separate); -} - -/** - * @brief Appends a string @a value to @a arr - * @param[in,out] arr Array - * @param value Value - * @param value_length Length of the value (usually strlen(value)) - * @param separate Flags (@c PH_SEPARATE: separate array if its reference count is greater than 1; @c arr will contain the separated array) - * @return Whether the operation succeeded - * @retval @c FAILURE Failure or @a arr is not an array - * @retval @c SUCCESS Success - * @throw @c E_WARNING if @a is not an array - * @see phalcon_array_append() - * - * Equivalent to $arr[] = $value in PHP, where @c $value is a string. - */ -int phalcon_array_append_string(zval **arr, char *value, uint value_length, int separate) { - - zval *zvalue; - - MAKE_STD_ZVAL(zvalue); - Z_SET_REFCOUNT_P(zvalue, 0); - ZVAL_STRINGL(zvalue, value, value_length, 1); - - return phalcon_array_append(arr, zvalue, separate); -} - -/** - * @brief Updates value in @a arr at position @a index with @a value - * @param[in,out] arr Array - * @param index Index - * @param[in,out] value Value - * @param flags Flags - * @return Whether the operation succeeded - * @retval @c FAILURE Failure, @a arr is not an array or @a index is of not supported type - * @retval @c SUCCESS Success - * @note @c index will be handled as follows: @c NULL is treated as an empty string, @c double values are cast to @c integer, @c bool or @c resource are treated as @c integer - * @throw @c E_WARNING if @a offset is not a scalar or @c arr is not an array - * - * Equivalent to $arr[$index] = $value in PHP. - * Flags may be a bitwise OR of the following values: - * @arg @c PH_CTOR: create a copy of @a value and work with that copy; @c *value will be updated with the newly constructed value - * @arg @c PH_SEPARATE: separate @a arr if its reference count is greater than 1; @c *arr will contain the separated version - * @arg @c PH_COPY: increment the reference count on @c **value - */ int phalcon_array_update_zval(zval **arr, zval *index, zval **value, int flags) { HashTable *ht; @@ -437,118 +269,7 @@ int phalcon_array_update_zval(zval **arr, zval *index, zval **value, int flags) } } -/** - * @brief Updates value in @a arr at position @a index with boolean @a value - * @param[in,out] arr Array - * @param index Index - * @param value Value - * @param flags Flags - * @return Whether the operation succeeded - * @retval @c FAILURE Failure, @a arr is not an array or @a index is of not supported type - * @retval @c SUCCESS Success - * @throw @c E_WARNING if @a arr is not an array - * @see phalcon_array_update_zval() - * - * Equivalent to $arr[$index] = $value in PHP, where @c $value is a boolean. - * Flags may be a bitwise OR of the following values: - * @arg @c PH_CTOR: create a copy of @a value and work with that copy - * @arg @c PH_SEPARATE: separate @a arr if its reference count is greater than 1; @c *arr will contain the separated version - * @arg @c PH_COPY: increment the reference count on the internally constructed value - * - * Only @c PH_SEPARATE is meaningful with this function - */ -int phalcon_array_update_zval_bool(zval **arr, zval *index, int value, int flags) { - - zval *zvalue; - - MAKE_STD_ZVAL(zvalue); - ZVAL_BOOL(zvalue, value); - - return phalcon_array_update_zval(arr, index, &zvalue, flags); -} - -/** - * @brief Updates value in @a arr at position @a index with boolean @a value - * @param[in,out] arr Array - * @param index Index - * @param value Value - * @param value_length Length of value (usually strlen(value)) - * @param flags Flags - * @return Whether the operation succeeded - * @retval @c FAILURE Failure, @a arr is not an array or @a index is of not supported type - * @retval @c SUCCESS Success - * @throw @c E_WARNING if @a arr is not an array - * @see phalcon_array_update_zval() - * - * Equivalent to $arr[$index] = $value in PHP, where @c $value is a string. - * Flags may be a bitwise OR of the following values: - * @arg @c PH_CTOR: create a copy of @a value and work with that copy - * @arg @c PH_SEPARATE: separate @a arr if its reference count is greater than 1; @c *arr will contain the separated version - * @arg @c PH_COPY: increment the reference count on the internally constructed value - * - * Only @c PH_SEPARATE is meaningful with this function - */ -int phalcon_array_update_zval_string(zval **arr, zval *index, char *value, uint value_length, int flags) { - - zval *zvalue; - - MAKE_STD_ZVAL(zvalue); - ZVAL_STRINGL(zvalue, value, value_length, 1); - - return phalcon_array_update_zval(arr, index, &zvalue, flags); -} - -/** - * @brief Updates value in @a arr at position @a index with long integer @a value - * @param[in,out] arr Array - * @param index Index - * @param value Value - * @param flags Flags - * @return Whether the operation succeeded - * @retval @c FAILURE Failure, @a arr is not an array or @a index is of not supported type - * @retval @c SUCCESS Success - * @throw @c E_WARNING if @a arr is not an array - * @see phalcon_array_update_zval() - * - * Equivalent to $arr[$index] = $value in PHP, where @c $value is an integer. - * Flags may be a bitwise OR of the following values: - * @arg @c PH_CTOR: create a copy of @a value and work with that copy - * @arg @c PH_SEPARATE: separate @a arr if its reference count is greater than 1; @c *arr will contain the separated version - * @arg @c PH_COPY: increment the reference count on the internally constructed value - * - * Only @c PH_SEPARATE is meaningful with this function. - */ -int phalcon_array_update_zval_long(zval **arr, zval *index, long value, int flags) { - - zval *zvalue; - - MAKE_STD_ZVAL(zvalue); - ZVAL_LONG(zvalue, value); - - return phalcon_array_update_zval(arr, index, &zvalue, flags); -} - -/** - * @brief Updates value in @a arr at position @a index with @a value using the precomputed hash @a key - * @param[in,out] arr Array - * @param index Index - * @param index_length Length of the index, should include the trailing zero - * @param key Precomputed hash of @c value - * @param value Value - * @param flags Flags - * @return Whether the operation succeeded - * @retval @c FAILURE Failure, @a arr is not an array - * @retval @c SUCCESS Success - * @throw @c E_WARNING if @a arr is not an array - * - * Equivalent to $arr[$index] = $value in PHP. - * - * Flags may be a bitwise OR of the following values: - * @arg @c PH_CTOR: create a copy of @a value and work with that copy; @c *value will be updated with the newly constructed value - * @arg @c PH_SEPARATE: separate @a arr if its reference count is greater than 1; @c *arr will contain the separated version - * @arg @c PH_COPY: increment the reference count on @c **value - */ -int phalcon_array_update_quick_string(zval **arr, const char *index, uint index_length, unsigned long key, zval **value, int flags){ +int phalcon_array_update_quick_string(zval **arr, const char *index, uint index_length, ulong key, zval **value, int flags){ if (Z_TYPE_PP(arr) != IS_ARRAY) { zend_error(E_WARNING, "Cannot use a scalar value as an array"); @@ -575,146 +296,7 @@ int phalcon_array_update_quick_string(zval **arr, const char *index, uint index_ return zend_hash_quick_update(Z_ARRVAL_PP(arr), index, index_length, key, value, sizeof(zval *), NULL); } -/** - * @brief Updates value in @a arr at position @a index with @a value - * @param[in,out] arr Array - * @param index Index - * @param index_length Length of the index, should NOT include the trailing zero - * @param value Value - * @param flags Flags - * @return Whether the operation succeeded - * @retval @c FAILURE Failure, @a arr is not an array - * @retval @c SUCCESS Success - * @throw @c E_WARNING if @a arr is not an array - * @see phalcon_array_update_quick_string() - * - * The function is a wrapper over @c phalcon_array_update_quick_string() - * - * Flags may be a bitwise OR of the following values: - * @arg @c PH_CTOR: create a copy of @a value and work with that copy; @c *value will be updated with the newly constructed value - * @arg @c PH_SEPARATE: separate @a arr if its reference count is greater than 1; @c *arr will contain the separated version - * @arg @c PH_COPY: increment the reference count on @c **value - */ -int phalcon_array_update_string(zval **arr, const char *index, uint index_length, zval **value, int flags) { - - return phalcon_array_update_quick_string(arr, index, index_length + 1, zend_inline_hash_func(index, index_length + 1), value, flags); -} - -/** - * @brief Updates value in @a arr at position @a index with boolean @a value - * @param[in,out] arr Array - * @param index Index - * @param index_length Length of the index, should include the trailing zero - * @param value Value - * @param flags Flags - * @return Whether the operation succeeded - * @retval @c FAILURE Failure, @a arr is not an array - * @retval @c SUCCESS Success - * @throw @c E_WARNING if @a arr is not an array - * @see phalcon_array_update_string() - * - * Equivalent to $arr[$index] = $value in PHP, where @c $index is a string key and $value is a boolean. - * - * Flags may be a bitwise OR of the following values: - * @arg @c PH_CTOR: create a copy of @a value and work with that copy - * @arg @c PH_SEPARATE: separate @a arr if its reference count is greater than 1; @c *arr will contain the separated version - * @arg @c PH_COPY: increment the reference count on the internally constructed value - * - * Only @c PH_SEPARATE is meaningful with this function. - */ -int phalcon_array_update_string_bool(zval **arr, const char *index, uint index_length, int value, int flags){ - - zval *zvalue; - - MAKE_STD_ZVAL(zvalue); - ZVAL_BOOL(zvalue, value); - - return phalcon_array_update_string(arr, index, index_length, &zvalue, flags); -} - -/** - * @brief Updates value in @a arr at position @a index with integer @a value - * @param[in,out] arr Array - * @param index Index - * @param index_length Length of the index, should include the trailing zero - * @param value Value - * @param flags Flags - * @return Whether the operation succeeded - * @retval @c FAILURE Failure, @a arr is not an array - * @retval @c SUCCESS Success - * @throw @c E_WARNING if @a arr is not an array - * @see phalcon_array_update_string() - * - * Equivalent to $arr[$index] = $value in PHP, where @c $index is a string key and $value is an integer. - * - * Flags may be a bitwise OR of the following values: - * @arg @c PH_CTOR: create a copy of @a value and work with that copy - * @arg @c PH_SEPARATE: separate @a arr if its reference count is greater than 1; @c *arr will contain the separated version - * @arg @c PH_COPY: increment the reference count on the internally constructed value - * - * Only @c PH_SEPARATE is meaningful with this function. - */ -int phalcon_array_update_string_long(zval **arr, const char *index, uint index_length, long value, int flags){ - - zval *zvalue; - - MAKE_STD_ZVAL(zvalue); - ZVAL_LONG(zvalue, value); - - return phalcon_array_update_string(arr, index, index_length, &zvalue, flags); -} - -/** - * @brief Updates value in @a arr at position @a index with string @a value - * @param[in,out] arr Array - * @param index Index - * @param index_length Length of the index, should include the trailing zero - * @param value Value - * @param value_length Length of the @a value; usually @c strlen() - * @param flags Flags - * @return Whether the operation succeeded - * @retval @c FAILURE Failure, @a arr is not an array - * @retval @c SUCCESS Success - * @throw @c E_WARNING if @a arr is not an array - * @see phalcon_array_update_string() - * - * Equivalent to $arr[$index] = $value in PHP, where @c $index is a string key and $value is a boolean. - * - * Flags may be a bitwise OR of the following values: - * @arg @c PH_CTOR: create a copy of @a value and work with that copy - * @arg @c PH_SEPARATE: separate @a arr if its reference count is greater than 1; @c *arr will contain the separated version - * @arg @c PH_COPY: increment the reference count on the internally constructed value - * - * Only @c PH_SEPARATE is meaningful with this function. - */ -int phalcon_array_update_string_string(zval **arr, const char *index, uint index_length, char *value, uint value_length, int flags){ - - zval *zvalue; - - MAKE_STD_ZVAL(zvalue); - ZVAL_STRINGL(zvalue, value, value_length, 1); - - return phalcon_array_update_string(arr, index, index_length, &zvalue, flags); -} - -/** - * @brief Updates value in @a arr at position @a index with @a value - * @param[in,out] arr Array - * @param index Index - * @param[in,out] value Value - * @param flags Flags - * @return Whether the operation succeeded - * @retval @c FAILURE Failure, @a arr is not an array - * @retval @c SUCCESS Success - * @throw @c E_WARNING if @c arr is not an array - * - * Equivalent to $arr[$index] = $value in PHP where @c $index is an integer. - * Flags may be a bitwise OR of the following values: - * @arg @c PH_CTOR: create a copy of @a value and work with that copy; @c *value will be updated with the newly constructed value - * @arg @c PH_SEPARATE: separate @a arr if its reference count is greater than 1; @c *arr will contain the separated version - * @arg @c PH_COPY: increment the reference count on @c **value - */ -int phalcon_array_update_long(zval **arr, unsigned long index, zval **value, int flags){ +int phalcon_array_update_long(zval **arr, ulong index, zval **value, int flags){ if (Z_TYPE_PP(arr) != IS_ARRAY) { zend_error(E_WARNING, "Cannot use a scalar value as an array"); @@ -741,112 +323,6 @@ int phalcon_array_update_long(zval **arr, unsigned long index, zval **value, int return zend_hash_index_update(Z_ARRVAL_PP(arr), index, value, sizeof(zval *), NULL); } -/** - * @brief Updates value in @a arr at position @a index with string @a value - * @param[in,out] arr Array - * @param index Index - * @param value Value - * @param value_length Value lenth, usually strlen(value) - * @param flags Flags - * @return Whether the operation succeeded - * @retval @c FAILURE Failure, @a arr is not an array - * @retval @c SUCCESS Success - * @throw @c E_WARNING if @c arr is not an array - * @see phalcon_array_update_long() - * - * Equivalent to $arr[$index] = $value in PHP where @c $index is an integer and @c $value is a string. - * Flags may be a bitwise OR of the following values: - * @arg @c PH_CTOR: create a copy of @a value and work with that copy - * @arg @c PH_SEPARATE: separate @a arr if its reference count is greater than 1; @c *arr will contain the separated version - * @arg @c PH_COPY: increment the reference count on the internally constructed value - * - * Only @c PH_SEPARATE is meaningful with this function. - */ -int phalcon_array_update_long_string(zval **arr, unsigned long index, char *value, uint value_length, int flags){ - - zval *zvalue; - - MAKE_STD_ZVAL(zvalue); - ZVAL_STRINGL(zvalue, value, value_length, 1); - - return phalcon_array_update_long(arr, index, &zvalue, flags); -} - -/** - * @brief Updates value in @a arr at position @a index with integer @a value - * @param[in,out] arr Array - * @param index Index - * @param value Value - * @param flags Flags - * @return Whether the operation succeeded - * @retval @c FAILURE Failure, @a arr is not an array - * @retval @c SUCCESS Success - * @throw @c E_WARNING if @c arr is not an array - * @see phalcon_array_update_long() - * - * Equivalent to $arr[$index] = $value in PHP where @c $index is an integer and @c $value is an integer. - * Flags may be a bitwise OR of the following values: - * @arg @c PH_CTOR: create a copy of @a value and work with that copy - * @arg @c PH_SEPARATE: separate @a arr if its reference count is greater than 1; @c *arr will contain the separated version - * @arg @c PH_COPY: increment the reference count on the internally constructed value - * - * Only @c PH_SEPARATE is meaningful with this function. - */ -int phalcon_array_update_long_long(zval **arr, unsigned long index, long value, int flags){ - - zval *zvalue; - - MAKE_STD_ZVAL(zvalue); - ZVAL_LONG(zvalue, value); - - return phalcon_array_update_long(arr, index, &zvalue, flags); -} - -/** - * @brief Updates value in @a arr at position @a index with boolean @a value - * @param[in,out] arr Array - * @param index Index - * @param value Value - * @param flags Flags - * @return Whether the operation succeeded - * @retval @c FAILURE Failure, @a arr is not an array - * @retval @c SUCCESS Success - * @throw @c E_WARNING if @c arr is not an array - * @see phalcon_array_update_long() - * - * Equivalent to $arr[$index] = $value in PHP where @c $index is an integer and @c $value is an integer. - * Flags may be a bitwise OR of the following values: - * @arg @c PH_CTOR: create a copy of @a value and work with that copy - * @arg @c PH_SEPARATE: separate @a arr if its reference count is greater than 1; @c *arr will contain the separated version - * @arg @c PH_COPY: increment the reference count on the internally constructed value - * - * Only @c PH_SEPARATE is meaningful with this function. - */ -int phalcon_array_update_long_bool(zval **arr, unsigned long index, int value, int flags){ - - zval *zvalue; - - MAKE_STD_ZVAL(zvalue); - ZVAL_BOOL(zvalue, value); - - return phalcon_array_update_long(arr, index, &zvalue, flags); -} - -/** - * @brief Reads an item from @a arr at position @a index and stores it to @a return_value - * @param return_value[out] Return value - * @param arr Array - * @param index Index - * @param silent 0 to suppress all warnings, @c PH_NOISY to enable - * @return Whether the operation succeeded - * @retval @c FAILURE Failure, @a arr is not an array - * @retval @c SUCCESS Success - * @throw @c E_WARNING if @c arr is not an array and @c silent = @c PH_NOISY - * @throw @c E_WARNING if @c index is not of the supported type and @c silent = @c PH_NOISY - * @throw @c E_NOTICE if @c index does not exist and @c silent = @c PH_NOISY - * @warning @c *return_value should be either @c NULL (preferred) or point to not initialized memory; if @c *return_value points to a valid variable, mmemory leak is possible - * @note @c index will be handled as follows: @c NULL is treated as an empty string, @c double values are cast to @c integer, @c bool or @c resource are treated as @c integer - */ int phalcon_array_fetch(zval **return_value, zval *arr, zval *index, int silent){ zval **zv; @@ -908,22 +384,7 @@ int phalcon_array_fetch(zval **return_value, zval *arr, zval *index, int silent) return FAILURE; } -/** - * @brief Reads an item from @a arr at position @a index using the precomputed hash @c key and stores it to @a return_value - * @param return_value[out] Return value - * @param arr Array - * @param index Index - * @param index Index length; must contain the trailing zero, if any - * @param key Precomputed hash of @c index - * @param silent 0 to suppress all warnings, @c PH_NOISY to enable - * @return Whether the operation succeeded - * @retval @c FAILURE Failure, @a arr is not an array - * @retval @c SUCCESS Success - * @throw @c E_WARNING if @c arr is not an array and @c silent = @c PH_NOISY - * @throw @c E_NOTICE if @c index does not exist and @c silent = @c PH_NOISY - * @warning @c *return_value should be either @c NULL (preferred) or point to not initialized memory; if @c *return_value points to a valid variable, mmemory leak is possible - */ -int phalcon_array_fetch_quick_string(zval **return_value, zval *arr, const char *index, uint index_length, unsigned long key, int silent){ +int phalcon_array_fetch_quick_string(zval **return_value, zval *arr, const char *index, uint index_length, ulong key, int silent){ zval **zv; @@ -948,42 +409,7 @@ int phalcon_array_fetch_quick_string(zval **return_value, zval *arr, const char return FAILURE; } -/** - * @brief Reads an item from @a arr at position @a index and stores it to @a return_value - * @param return_value[out] Return value - * @param arr Array - * @param index Index - * @param index Index length; must contain the trailing zero, if any - * @param silent 0 to suppress all warnings, @c PH_NOISY to enable - * @return Whether the operation succeeded - * @retval @c FAILURE Failure, @a arr is not an array - * @retval @c SUCCESS Success - * @throw @c E_WARNING if @c arr is not an array and @c silent = @c PH_NOISY - * @throw @c E_NOTICE if @c index does not exist and @c silent = @c PH_NOISY - * @warning @c *return_value should be either @c NULL (preferred) or point to not initialized memory; if @c *return_value points to a valid variable, mmemory leak is possible - * @see phalcon_array_fetch_quick_string() - * - * The function is a wrapper over @c phalcon_array_fetch_quick_string() - */ -int phalcon_array_fetch_string(zval **return_value, zval *arr, const char *index, uint index_length, int silent){ - - return phalcon_array_fetch_quick_string(return_value, arr, index, index_length + 1, zend_inline_hash_func(index, index_length + 1), silent); -} - -/** - * @brief Reads an item from @a arr at position @a index and stores it to @a return_value - * @param return_value[out] Return value - * @param arr Array - * @param index Index - * @param silent 0 to suppress all warnings, @c PH_NOISY to enable - * @return Whether the operation succeeded - * @retval @c FAILURE Failure, @a arr is not an array - * @retval @c SUCCESS Success - * @throw @c E_WARNING if @c arr is not an array and @c silent = @c PH_NOISY - * @throw @c E_NOTICE if @c index does not exist and @c silent = @c PH_NOISY - * @warning @c *return_value should be either @c NULL (preferred) or point to not initialized memory; if @c *return_value points to a valid variable, mmemory leak is possible - */ -int phalcon_array_fetch_long(zval **return_value, zval *arr, unsigned long index, int silent){ +int phalcon_array_fetch_long(zval **return_value, zval *arr, ulong index, int silent){ zval **zv; @@ -1008,9 +434,6 @@ int phalcon_array_fetch_long(zval **return_value, zval *arr, unsigned long index return FAILURE; } -/** - * Append a zval to a multi-dimensional array with two indexes - */ void phalcon_array_append_multi_2(zval **arr, zval *index, zval *value, int flags){ zval *temp; @@ -1030,9 +453,6 @@ void phalcon_array_append_multi_2(zval **arr, zval *index, zval *value, int flag } -/** - * Updates multi-dimensional array with two zval indexes - */ void phalcon_array_update_multi_2(zval **arr, zval *index1, zval *index2, zval **value, int flags){ zval *temp; @@ -1052,9 +472,6 @@ void phalcon_array_update_multi_2(zval **arr, zval *index1, zval *index2, zval * } -/** - * Updates multi-dimensional array with two zval indexes - */ void phalcon_array_update_string_multi_2(zval **arr, zval *index1, char *index2, uint index2_length, zval **value, int flags){ zval *temp; @@ -1074,11 +491,6 @@ void phalcon_array_update_string_multi_2(zval **arr, zval *index1, char *index2, } -/** - * Updates multi-dimensional arrays with two long indices - * - * $foo[10][4] = $x - */ void phalcon_array_update_long_long_multi_2(zval **arr, long index1, long index2, zval **value, int flags){ zval *temp = NULL; @@ -1098,11 +510,6 @@ void phalcon_array_update_long_long_multi_2(zval **arr, long index1, long index2 } -/** - * Updates multi-dimensional arrays with one long index and other string - * - * $foo[10]["lol"] = $x - */ void phalcon_array_update_long_string_multi_2(zval **arr, long index1, char *index2, uint index2_length, zval **value, int flags){ zval *temp; @@ -1122,9 +529,6 @@ void phalcon_array_update_long_string_multi_2(zval **arr, long index1, char *ind } -/** - * $x[$a][] = 1 - */ void phalcon_array_update_append_multi_2(zval **arr, zval *index1, zval *value, int flags){ zval *temp; @@ -1144,9 +548,6 @@ void phalcon_array_update_append_multi_2(zval **arr, zval *index1, zval *value, } -/** - * $x[$a]["hello"][] = $v - */ void phalcon_array_update_zval_string_append_multi_3(zval **arr, zval *index1, char *index2, uint index2_length, zval **value, int flags){ zval *temp1 = NULL, *temp2 = NULL; @@ -1183,9 +584,6 @@ void phalcon_array_update_zval_string_append_multi_3(zval **arr, zval *index1, c } -/** - * $x[$a][$b][$c] = $v - */ void phalcon_array_update_zval_zval_zval_multi_3(zval **arr, zval *index1, zval *index2, zval *index3, zval **value, int flags){ zval *temp1 = NULL, *temp2 = NULL; @@ -1222,9 +620,6 @@ void phalcon_array_update_zval_zval_zval_multi_3(zval **arr, zval *index1, zval } -/** - * $x[$a][$b]["str"] = $v - */ void phalcon_array_update_string_zval_zval_multi_3(zval **arr, zval *index1, zval *index2, char *index3, uint index3_length, zval **value, int flags){ zval *temp1 = NULL, *temp2 = NULL; @@ -1261,9 +656,6 @@ void phalcon_array_update_string_zval_zval_multi_3(zval **arr, zval *index1, zva } -/** - * $x[$a]["a-str"]["str"] = 1 - */ void phalcon_array_update_zval_string_string_multi_3(zval **arr, zval *index1, char *index2, uint index2_length, char *index3, uint index3_length, zval **value, int flags){ zval *temp1 = NULL, *temp2 = NULL; @@ -1299,42 +691,32 @@ void phalcon_array_update_zval_string_string_multi_3(zval **arr, zval *index1, c } } -/** - * Appends every element of an array at the end of the left array - */ void phalcon_merge_append(zval *left, zval *values){ - zval **tmp; - HashTable *arr_values; - HashPosition pos; - if (Z_TYPE_P(left) != IS_ARRAY) { - zend_error(E_NOTICE, "First parameter of phalcon_merge_append must be an array"); + zend_error(E_NOTICE, "The first parameter of phalcon_merge_append must be an array"); return; } if (Z_TYPE_P(values) == IS_ARRAY) { + HashPosition pos; + zval **tmp; + HashTable *arr_values = Z_ARRVAL_P(values); - arr_values = Z_ARRVAL_P(values); - zend_hash_internal_pointer_reset_ex(arr_values, &pos); - - while (zend_hash_get_current_data_ex(arr_values, (void **) &tmp, &pos) == SUCCESS) { - + for ( + zend_hash_internal_pointer_reset_ex(arr_values, &pos); + zend_hash_get_current_data_ex(arr_values, (void**)&tmp, &pos) == SUCCESS; + zend_hash_move_forward_ex(arr_values, &pos) + ) { Z_ADDREF_PP(tmp); add_next_index_zval(left, *tmp); - - zend_hash_move_forward_ex(arr_values, &pos); } - } else { Z_ADDREF_P(values); add_next_index_zval(left, values); } } -/** - * Gets the current element in a zval hash - */ void phalcon_array_get_current(zval *return_value, zval *array){ zval **entry; @@ -1349,18 +731,6 @@ void phalcon_array_get_current(zval *return_value, zval *array){ RETURN_FALSE; } -/** - * Gets the current element in a zval hash - */ -void phalcon_array_next(zval *array){ - if (Z_TYPE_P(array) == IS_ARRAY) { - zend_hash_move_forward(Z_ARRVAL_P(array)); - } -} - -/** - * Fast in_array function - */ int phalcon_fast_in_array(zval *needle, zval *haystack TSRMLS_DC) { zval **tmp; @@ -1382,7 +752,7 @@ int phalcon_fast_in_array(zval *needle, zval *haystack TSRMLS_DC) { zend_hash_internal_pointer_reset_ex(arr, &pos); while (zend_hash_get_current_data_ex(arr, (void **) &tmp, &pos) == SUCCESS) { - if (PHALCON_IS_EQUAL(needle, *tmp)) { + if (phalcon_is_equal(needle, *tmp TSRMLS_CC)) { return 1; } zend_hash_move_forward_ex(arr, &pos); @@ -1391,9 +761,6 @@ int phalcon_fast_in_array(zval *needle, zval *haystack TSRMLS_DC) { return 0; } -/** - * Fast array merge - */ void phalcon_fast_array_merge(zval *return_value, zval **array1, zval **array2 TSRMLS_DC) { int init_size, num; @@ -1422,15 +789,6 @@ void phalcon_fast_array_merge(zval *return_value, zval **array1, zval **array2 T } -/** - * @brief Merge @a a1 and @a a2 recursively preserving all keys - * @warning Both @a a1 and @a a2 are assumed to be arrays, no checks are performed - * @param[in,out] a1 LHS operand - * @param a2 RHS operand - * - * Equivalent to $a1 = array_merge_recursive($a1, $a2) in PHP with the only exception - * that Phalcon's version preserves numeric keys - */ void phalcon_array_merge_recursive_n(zval **a1, zval *a2) { HashPosition hp; @@ -1458,12 +816,6 @@ void phalcon_array_merge_recursive_n(zval **a1, zval *a2) } } -/** - * @brief array_unshift($arr, $arg) - * @param arr - * @param arg - * @note Reference count of @c arg will be incremented - */ void phalcon_array_unshift(zval *arr, zval *arg) { if (likely(Z_TYPE_P(arr) == IS_ARRAY)) { @@ -1549,33 +901,3 @@ int phalcon_array_key_exists(zval *arr, zval *key TSRMLS_DC) return 0; } - -int phalcon_array_is_associative(zval *arr) { - - if (likely(Z_TYPE_P(arr) == IS_ARRAY)) { - HashPosition pos; - zval **entry; - char *skey; - uint skey_len; - ulong nkey; - ulong expected = 0; - - zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(arr), &pos); - while (zend_hash_get_current_data_ex(Z_ARRVAL_P(arr), (void**)&entry, &pos) == SUCCESS) { - - if (HASH_KEY_IS_LONG == zend_hash_get_current_key_ex(Z_ARRVAL_P(arr), &skey, &skey_len, &nkey, 1, &pos)) { - if (expected != nkey) { - return 1; - } - } - else { - return 1; - } - - ++expected; - zend_hash_move_forward_ex(Z_ARRVAL_P(arr), &pos); - } - } - - return 0; -} diff --git a/ext/kernel/array.h b/ext/kernel/array.h index 626c5bbb28f..acf403056a4 100644 --- a/ext/kernel/array.h +++ b/ext/kernel/array.h @@ -20,87 +20,731 @@ #ifndef PHALCON_KERNEL_ARRAY_H #define PHALCON_KERNEL_ARRAY_H -#include #include "php_phalcon.h" +#include -/** Combined isset/fetch */ +/** + * @brief Fetches @a index if it exists from the array @a arr + * @param[out] fetched &$arr[$index]; @a fetched is modified only when the function returns 1 + * @param arr Array + * @param index Index + * @return isset($arr[$index]) + * @retval 0 Not exists, @a arr is not an array or @a index is of not supported type + * @retval 1 Exists + * @note @c index will be handled as follows: @c NULL is treated as an empty string, @c double values are cast to @c integer, @c bool or @c resource are treated as @c integer + * @note $arr[$index] is returned as is: no copying occurs, reference count is not updated + * @throw E_WARNING if @a offset is not a scalar + */ int phalcon_array_isset_fetch(zval **fetched, const zval *arr, zval *index) PHALCON_ATTR_NONNULL; -int phalcon_array_isset_quick_string_fetch(zval **fetched, zval *arr, const char *index, uint index_length, unsigned long key) PHALCON_ATTR_NONNULL; -int phalcon_array_isset_string_fetch(zval **fetched, zval *arr, const char *index, uint index_length) PHALCON_ATTR_NONNULL; -int phalcon_array_isset_long_fetch(zval **fetched, zval *arr, unsigned long index) PHALCON_ATTR_NONNULL; -/** Check for index existence */ +/** + * @brief Fetches @a index if it exists from the array @a arr using the precomputed key @a key + * @param[out] fetched &$arr[$index]; @a fetched is modified only when the function returns 1 + * @param arr Array + * @param index Index + * @param index_length strlen(index)+1 + * @param key Precomputed hash of @a index + * @return isset($arr[$index]) + * @retval 0 Not exists, @a arr is not an array or @a index is of not supported type + * @retval 1 Exists + * @note $arr[$index] is returned as is: no copying occurs, reference count is not updated + */ +int phalcon_array_isset_quick_string_fetch(zval **fetched, zval *arr, const char *index, uint index_length, ulong key) PHALCON_ATTR_NONNULL; + +/** + * @brief Fetches @a index if it exists from the array @a arr + * @param[out] fetched &$arr[$index]; @a fetched is modified only when the function returns 1 + * @param arr Array + * @param index Index + * @return isset($arr[$index]) + * @retval 0 Not exists, @a arr is not an array or @a index is of not supported type + * @retval 1 Exists + * @note $arr[$index] is returned as is: no copying occurs, reference count is not updated + */ +int phalcon_array_isset_long_fetch(zval **fetched, zval *arr, ulong index) PHALCON_ATTR_NONNULL; + +/** + * @brief Fetches @a index if it exists from the array @a arr + * @param[out] fetched &$arr[$index]; @a fetched is modified only when the function returns 1 + * @param arr Array + * @param index Index + * @param index_length strlen(index)+1 + * @return isset($arr[$index]) + * @retval 0 Not exists, @a arr is not an array or @a index is of not supported type + * @retval 1 Exists + * @note $arr[$index] is returned as is: no copying occurs, reference count is not updated + * @see phalcon_array_isset_quick_string_fetch + */ +PHALCON_ATTR_NONNULL static inline int phalcon_array_isset_string_fetch(zval **fetched, zval *arr, const char *index, uint index_length) +{ +#ifdef __GNUC__ + if (__builtin_constant_p(index) && __builtin_constant_p(index_length)) { + return phalcon_array_isset_quick_string_fetch(fetched, arr, index, index_length, zend_inline_hash_func(index, index_length)); + } +#endif + + return phalcon_array_isset_quick_string_fetch(fetched, arr, index, index_length, zend_hash_func(index, index_length)); +} + + +/** + * @brief Checks whether @a index exists in array @a arr + * @param arr Array + * @param index Index + * @return isset($arr[$index]) + * @retval 0 Not exists, @a arr is not an array or @a index is of not supported type + * @retval 1 Exists + * @note @c index will be handled as follows: @c NULL is treated as an empty string, @c double values are cast to @c integer, @c bool or @c resource are treated as @c integer + * @throw E_WARNING if @a offset is not a scalar + */ int phalcon_array_isset(const zval *arr, zval *index) PHALCON_ATTR_NONNULL; -int phalcon_array_isset_long(const zval *arr, unsigned long index) PHALCON_ATTR_NONNULL; -int phalcon_array_isset_string(const zval *arr, const char *index, uint index_length) PHALCON_ATTR_NONNULL; -/** Fast index existence checking */ -int phalcon_array_isset_quick_string(const zval *arr, const char *index, uint index_length, unsigned long key) PHALCON_ATTR_NONNULL; +/** + * @brief Checks whether numeric @a index exists in array @a arr + * @param arr Array + * @param index Index + * @return isset($arr[$index]) + * @retval 0 Not exists or @a arr is not an array + * @retval 1 Exists + */ +int phalcon_array_isset_long(const zval *arr, ulong index) PHALCON_ATTR_NONNULL; + +/** + * @brief Checks whether string @a index exists in array @a arr using the precomputed key @a key + * @param arr Array + * @param index Index + * @param index_length strlen(index)+1 + * @param key Precomputed key + * @return isset($arr[$index]) + * @retval 0 Not exists or @a arr is not an array + * @retval 1 Exists + */ +int phalcon_array_isset_quick_string(const zval *arr, const char *index, uint index_length, ulong key) PHALCON_ATTR_NONNULL; -/** Unset existing indexes */ +/** + * @brief Checks whether string @a index exists in array @a arr + * @param arr Array + * @param index Index + * @param index_length strlen(index)+1 + * @return isset($arr[$index]) + * @retval 0 Not exists, @a arr is not an array + * @retval 1 Exists + * @note The function is a wrapper around phalcon_array_isset_quick_string() + * @see phalcon_array_isset_quick_string() + */ +PHALCON_ATTR_NONNULL static inline int phalcon_array_isset_string(const zval *arr, const char *index, uint index_length) +{ +#ifdef __GNUC__ + if (__builtin_constant_p(index) && __builtin_constant_p(index_length)) { + return phalcon_array_isset_quick_string(arr, index, index_length, zend_inline_hash_func(index, index_length)); + } +#endif + + return phalcon_array_isset_quick_string(arr, index, index_length, zend_hash_func(index, index_length)); +} + +/** + * @brief Unsets @a index from array @a arr + * @param[in,out] arr Array + * @param index Index + * @param flags Flags (@c PH_SEPARATE: separate array if its reference count is greater than 1; @c arr will contain the separated array) + * @return Whether the operation succeeded + * @retval @c FAILURE Failure, @a arr is not an array or @a index is of not supported type + * @retval @c SUCCESS Success + * @note @c index will be handled as follows: @c NULL is treated as an empty string, @c double values are cast to @c integer, @c bool or @c resource are treated as @c integer + * @throw @c E_WARNING if @a offset is not a scalar + */ int phalcon_array_unset(zval **arr, zval *index, int flags) PHALCON_ATTR_NONNULL; -int phalcon_array_unset_long(zval **arr, unsigned long index, int flags) PHALCON_ATTR_NONNULL; + +/** + * @brief Unsets numeric @a index from array @a arr + * @param[in,out] arr Array + * @param index Index + * @param flags Flags (@c PH_SEPARATE: separate array if its reference count is greater than 1; @c arr will contain the separated array) + * @return Whether the operation succeeded + * @retval @c FAILURE Failure or @a arr is not an array + * @retval @c SUCCESS Success + */ +int phalcon_array_unset_long(zval **arr, ulong index, int flags) PHALCON_ATTR_NONNULL; + +/** + * @brief Unsets string @a index from array @a arr + * @param[in,out] arr Array + * @param index Index + * @param index_length strlen(index)+1 + * @param flags Flags (@c PH_SEPARATE: separate array if its reference count is greater than 1; @c arr will contain the separated array) + * @return Whether the operation succeeded + * @retval @c FAILURE Failure or @a arr is not an array + * @retval @c SUCCESS Success + */ int phalcon_array_unset_string(zval **arr, const char *index, uint index_length, int flags) PHALCON_ATTR_NONNULL; -/** Append elements to arrays */ +/** + * @brief Pushes @a value onto the end of @a arr + * @param[in,out] arr Array + * @param[in,out] value Value to add; reference counter of @c *value will be incrememnted + * @param flags Flags (@c PH_SEPARATE: separate array if its reference count is greater than 1; @c arr will contain the separated array) + * @return Whether the operation succeeded + * @retval @c FAILURE Failure or @a arr is not an array + * @retval @c SUCCESS Success + * @throw @c E_WARNING if @a is not an array + * + * Equivalent to $arr[] = $value in PHP + */ int phalcon_array_append(zval **arr, zval *value, int separate) PHALCON_ATTR_NONNULL; -int phalcon_array_append_long(zval **arr, long value, int separate) PHALCON_ATTR_NONNULL; -int phalcon_array_append_string(zval **arr, char *value, uint value_length, int separate) PHALCON_ATTR_NONNULL; -/** Modify arrays */ +/** + * @brief Appends a long integer @a value to @a arr + * @param[in,out] arr Array + * @param value Value + * @param separate Flags (@c PH_SEPARATE: separate array if its reference count is greater than 1; @c arr will contain the separated array) + * @return Whether the operation succeeded + * @retval @c FAILURE Failure or @a arr is not an array + * @retval @c SUCCESS Success + * @throw @c E_WARNING if @a is not an array + * @see phalcon_array_append() + * + * Equivalent to $arr[] = $value in PHP, where @c $value is an integer. + */ +PHALCON_ATTR_NONNULL static inline int phalcon_array_append_long(zval **arr, long value, int separate) +{ + zval *zvalue; + + PHALCON_ALLOC_GHOST_ZVAL(zvalue); + ZVAL_LONG(zvalue, value); + + return phalcon_array_append(arr, zvalue, separate); +} + +/** + * @brief Appends a string @a value to @a arr + * @param[in,out] arr Array + * @param value Value + * @param value_length Length of the value (usually strlen(value)) + * @param separate Flags (@c PH_SEPARATE: separate array if its reference count is greater than 1; @c arr will contain the separated array) + * @return Whether the operation succeeded + * @retval @c FAILURE Failure or @a arr is not an array + * @retval @c SUCCESS Success + * @throw @c E_WARNING if @a is not an array + * @see phalcon_array_append() + * + * Equivalent to $arr[] = $value in PHP, where @c $value is a string. + */ +PHALCON_ATTR_NONNULL static inline int phalcon_array_append_string(zval **arr, char *value, uint value_length, int separate) +{ + zval *zvalue; + + PHALCON_ALLOC_GHOST_ZVAL(zvalue); + ZVAL_STRINGL(zvalue, value, value_length, 1); + + return phalcon_array_append(arr, zvalue, separate); +} + +/** + * @brief Updates value in @a arr at position @a index with @a value + * @param[in,out] arr Array + * @param index Index + * @param[in,out] value Value + * @param flags Flags + * @return Whether the operation succeeded + * @retval @c FAILURE Failure, @a arr is not an array or @a index is of not supported type + * @retval @c SUCCESS Success + * @note @c index will be handled as follows: @c NULL is treated as an empty string, @c double values are cast to @c integer, @c bool or @c resource are treated as @c integer + * @throw @c E_WARNING if @a offset is not a scalar or @c arr is not an array + * + * Equivalent to $arr[$index] = $value in PHP. + * Flags may be a bitwise OR of the following values: + * @arg @c PH_CTOR: create a copy of @a value and work with that copy; @c *value will be updated with the newly constructed value + * @arg @c PH_SEPARATE: separate @a arr if its reference count is greater than 1; @c *arr will contain the separated version + * @arg @c PH_COPY: increment the reference count on @c **value + */ int phalcon_array_update_zval(zval **arr, zval *index, zval **value, int flags) PHALCON_ATTR_NONNULL; -int phalcon_array_update_zval_bool(zval **arr, zval *index, int value, int flags) PHALCON_ATTR_NONNULL; -int phalcon_array_update_zval_long(zval **arr, zval *index, long value, int flags) PHALCON_ATTR_NONNULL; -int phalcon_array_update_zval_string(zval **arr, zval *index, char *value, uint value_length, int flags) PHALCON_ATTR_NONNULL; -int phalcon_array_update_string(zval **arr, const char *index, uint index_length, zval **value, int flags) PHALCON_ATTR_NONNULL; -int phalcon_array_update_string_bool(zval **arr, const char *index, uint index_length, int value, int flags) PHALCON_ATTR_NONNULL; -int phalcon_array_update_string_long(zval **arr, const char *index, uint index_length, long value, int flags) PHALCON_ATTR_NONNULL; -int phalcon_array_update_string_string(zval **arr, const char *index, uint index_length, char *value, uint value_length, int flags) PHALCON_ATTR_NONNULL; +/** + * @brief Updates value in @a arr at position @a index with boolean @a value + * @param[in,out] arr Array + * @param index Index + * @param value Value + * @param flags Flags (@c PH_SEPARATE: separate @a arr if its reference count is greater than 1; @c *arr will contain the separated version) + * @return Whether the operation succeeded + * @retval @c FAILURE Failure, @a arr is not an array or @a index is of not supported type + * @retval @c SUCCESS Success + * @throw @c E_WARNING if @a arr is not an array + * @see phalcon_array_update_zval() + * + * Equivalent to $arr[$index] = $value in PHP, where @c $value is a boolean. + */ +PHALCON_ATTR_NONNULL static inline int phalcon_array_update_zval_bool(zval **arr, zval *index, int value, int flags) +{ + zval *zvalue; + + MAKE_STD_ZVAL(zvalue); + ZVAL_BOOL(zvalue, value); + + return phalcon_array_update_zval(arr, index, &zvalue, flags & PH_SEPARATE); +} + +/** + * @brief Updates value in @a arr at position @a index with long integer @a value + * @param[in,out] arr Array + * @param index Index + * @param value Value + * @param flags Flags (@c PH_SEPARATE: separate @a arr if its reference count is greater than 1; @c *arr will contain the separated version) + * @return Whether the operation succeeded + * @retval @c FAILURE Failure, @a arr is not an array or @a index is of not supported type + * @retval @c SUCCESS Success + * @throw @c E_WARNING if @a arr is not an array + * @see phalcon_array_update_zval() + * + * Equivalent to $arr[$index] = $value in PHP, where @c $value is an integer. + */ +PHALCON_ATTR_NONNULL static inline int phalcon_array_update_zval_long(zval **arr, zval *index, long value, int flags) +{ + zval *zvalue; + + MAKE_STD_ZVAL(zvalue); + ZVAL_LONG(zvalue, value); + + return phalcon_array_update_zval(arr, index, &zvalue, flags & PH_SEPARATE); +} + +/** + * @brief Updates value in @a arr at position @a index with boolean @a value + * @param[in,out] arr Array + * @param index Index + * @param value Value + * @param value_length Length of value (usually strlen(value)) + * @param flags Flags (@c PH_SEPARATE: separate @a arr if its reference count is greater than 1; @c *arr will contain the separated version) + * @return Whether the operation succeeded + * @retval @c FAILURE Failure, @a arr is not an array or @a index is of not supported type + * @retval @c SUCCESS Success + * @throw @c E_WARNING if @a arr is not an array + * @see phalcon_array_update_zval() + * + * Equivalent to $arr[$index] = $value in PHP, where @c $value is a string. + */ +PHALCON_ATTR_NONNULL static inline int phalcon_array_update_zval_string(zval **arr, zval *index, char *value, uint value_length, int flags) +{ + zval *zvalue; + + MAKE_STD_ZVAL(zvalue); + ZVAL_STRINGL(zvalue, value, value_length, 1); + + return phalcon_array_update_zval(arr, index, &zvalue, flags & PH_SEPARATE); +} + +/** + * @brief Updates value in @a arr at position @a index with @a value using the precomputed hash @a key + * @param[in,out] arr Array + * @param index Index + * @param index_length Length of the index, should include the trailing zero + * @param key Precomputed hash of @c value + * @param value Value + * @param flags Flags + * @return Whether the operation succeeded + * @retval @c FAILURE Failure, @a arr is not an array + * @retval @c SUCCESS Success + * @throw @c E_WARNING if @a arr is not an array + * + * Equivalent to $arr[$index] = $value in PHP. + * + * Flags may be a bitwise OR of the following values: + * @arg @c PH_CTOR: create a copy of @a value and work with that copy; @c *value will be updated with the newly constructed value + * @arg @c PH_SEPARATE: separate @a arr if its reference count is greater than 1; @c *arr will contain the separated version + * @arg @c PH_COPY: increment the reference count on @c **value + */ +int phalcon_array_update_quick_string(zval **arr, const char *index, uint index_length, ulong key, zval **value, int flags) PHALCON_ATTR_NONNULL; + +/** + * @brief Updates value in @a arr at position @a index with @a value + * @param[in,out] arr Array + * @param index Index + * @param index_length Length of the index, should NOT include the trailing zero + * @param value Value + * @param flags Flags + * @return Whether the operation succeeded + * @retval @c FAILURE Failure, @a arr is not an array + * @retval @c SUCCESS Success + * @throw @c E_WARNING if @a arr is not an array + * @see phalcon_array_update_quick_string() + * + * The function is a wrapper over @c phalcon_array_update_quick_string() + * + * Flags may be a bitwise OR of the following values: + * @arg @c PH_CTOR: create a copy of @a value and work with that copy; @c *value will be updated with the newly constructed value + * @arg @c PH_SEPARATE: separate @a arr if its reference count is greater than 1; @c *arr will contain the separated version + * @arg @c PH_COPY: increment the reference count on @c **value + */ +PHALCON_ATTR_NONNULL static inline int phalcon_array_update_string(zval **arr, const char *index, uint index_length, zval **value, int flags) +{ +#ifdef __GNUC__ + if (__builtin_constant_p(index) && __builtin_constant_p(index_length)) { + return phalcon_array_update_quick_string(arr, index, index_length + 1, zend_inline_hash_func(index, index_length + 1), value, flags); + } +#endif + + return phalcon_array_update_quick_string(arr, index, index_length + 1, zend_hash_func(index, index_length + 1), value, flags); +} + +/** + * @brief Updates value in @a arr at position @a index with boolean @a value + * @param[in,out] arr Array + * @param index Index + * @param index_length Length of the index, should include the trailing zero + * @param value Value + * @param flags Flags (@c PH_SEPARATE: separate @a arr if its reference count is greater than 1; @c *arr will contain the separated version) + * @return Whether the operation succeeded + * @retval @c FAILURE Failure, @a arr is not an array + * @retval @c SUCCESS Success + * @throw @c E_WARNING if @a arr is not an array + * @see phalcon_array_update_string() + * + * Equivalent to $arr[$index] = $value in PHP, where @c $index is a string key and $value is a boolean. + */ +PHALCON_ATTR_NONNULL static inline int phalcon_array_update_string_bool(zval **arr, const char *index, uint index_length, int value, int flags) +{ + zval *zvalue; + + MAKE_STD_ZVAL(zvalue); + ZVAL_BOOL(zvalue, value); + + return phalcon_array_update_string(arr, index, index_length, &zvalue, flags & PH_SEPARATE); +} -int phalcon_array_update_long(zval **arr, unsigned long index, zval **value, int flags) PHALCON_ATTR_NONNULL; -int phalcon_array_update_long_string(zval **arr, unsigned long index, char *value, uint value_length, int flags) PHALCON_ATTR_NONNULL; -int phalcon_array_update_long_long(zval **arr, unsigned long index, long value, int flags) PHALCON_ATTR_NONNULL; -int phalcon_array_update_long_bool(zval **arr, unsigned long index, int value, int flags) PHALCON_ATTR_NONNULL; +/** + * @brief Updates value in @a arr at position @a index with integer @a value + * @param[in,out] arr Array + * @param index Index + * @param index_length Length of the index, should include the trailing zero + * @param value Value + * @param flags Flags (@c PH_SEPARATE: separate @a arr if its reference count is greater than 1; @c *arr will contain the separated version) + * @return Whether the operation succeeded + * @retval @c FAILURE Failure, @a arr is not an array + * @retval @c SUCCESS Success + * @throw @c E_WARNING if @a arr is not an array + * @see phalcon_array_update_string() + * + * Equivalent to $arr[$index] = $value in PHP, where @c $index is a string key and $value is an integer. + */ +PHALCON_ATTR_NONNULL static inline int phalcon_array_update_string_long(zval **arr, const char *index, uint index_length, long value, int flags) +{ + zval *zvalue; -/** Update/Append two dimension arrays */ + MAKE_STD_ZVAL(zvalue); + ZVAL_LONG(zvalue, value); + + return phalcon_array_update_string(arr, index, index_length, &zvalue, flags & PH_SEPARATE); +} + +/** + * @brief Updates value in @a arr at position @a index with string @a value + * @param[in,out] arr Array + * @param index Index + * @param index_length Length of the index, should include the trailing zero + * @param value Value + * @param value_length Length of the @a value; usually @c strlen() + * @param flags Flags (@c PH_SEPARATE: separate @a arr if its reference count is greater than 1; @c *arr will contain the separated version) + * @return Whether the operation succeeded + * @retval @c FAILURE Failure, @a arr is not an array + * @retval @c SUCCESS Success + * @throw @c E_WARNING if @a arr is not an array + * @see phalcon_array_update_string() + * + * Equivalent to $arr[$index] = $value in PHP, where @c $index is a string key and $value is a boolean. + */ +PHALCON_ATTR_NONNULL static inline int phalcon_array_update_string_string(zval **arr, const char *index, uint index_length, char *value, uint value_length, int flags) +{ + zval *zvalue; + + MAKE_STD_ZVAL(zvalue); + ZVAL_STRINGL(zvalue, value, value_length, 1); + + return phalcon_array_update_string(arr, index, index_length, &zvalue, flags & PH_SEPARATE); +} + +/** + * @brief Updates value in @a arr at position @a index with @a value + * @param[in,out] arr Array + * @param index Index + * @param[in,out] value Value + * @param flags Flags + * @return Whether the operation succeeded + * @retval @c FAILURE Failure, @a arr is not an array + * @retval @c SUCCESS Success + * @throw @c E_WARNING if @c arr is not an array + * + * Equivalent to $arr[$index] = $value in PHP where @c $index is an integer. + * Flags may be a bitwise OR of the following values: + * @arg @c PH_CTOR: create a copy of @a value and work with that copy; @c *value will be updated with the newly constructed value + * @arg @c PH_SEPARATE: separate @a arr if its reference count is greater than 1; @c *arr will contain the separated version + * @arg @c PH_COPY: increment the reference count on @c **value + */ +int phalcon_array_update_long(zval **arr, ulong index, zval **value, int flags) PHALCON_ATTR_NONNULL; + +/** + * @brief Updates value in @a arr at position @a index with string @a value + * @param[in,out] arr Array + * @param index Index + * @param value Value + * @param value_length Value lenth, usually strlen(value) + * @param flags Flags (@c PH_SEPARATE: separate @a arr if its reference count is greater than 1; @c *arr will contain the separated version) + * @return Whether the operation succeeded + * @retval @c FAILURE Failure, @a arr is not an array + * @retval @c SUCCESS Success + * @throw @c E_WARNING if @c arr is not an array + * @see phalcon_array_update_long() + * + * Equivalent to $arr[$index] = $value in PHP where @c $index is an integer and @c $value is a string. + */ +PHALCON_ATTR_NONNULL static inline int phalcon_array_update_long_string(zval **arr, ulong index, char *value, uint value_length, int flags) +{ + zval *zvalue; + + MAKE_STD_ZVAL(zvalue); + ZVAL_STRINGL(zvalue, value, value_length, 1); + + return phalcon_array_update_long(arr, index, &zvalue, flags & PH_SEPARATE); +} + +/** + * @brief Updates value in @a arr at position @a index with integer @a value + * @param[in,out] arr Array + * @param index Index + * @param value Value + * @param flags Flags (@c PH_SEPARATE: separate @a arr if its reference count is greater than 1; @c *arr will contain the separated version) + * @return Whether the operation succeeded + * @retval @c FAILURE Failure, @a arr is not an array + * @retval @c SUCCESS Success + * @throw @c E_WARNING if @c arr is not an array + * @see phalcon_array_update_long() + * + * Equivalent to $arr[$index] = $value in PHP where @c $index is an integer and @c $value is an integer. + */ +PHALCON_ATTR_NONNULL static inline int phalcon_array_update_long_long(zval **arr, ulong index, long value, int flags) +{ + zval *zvalue; + + MAKE_STD_ZVAL(zvalue); + ZVAL_LONG(zvalue, value); + + return phalcon_array_update_long(arr, index, &zvalue, flags & PH_SEPARATE); +} + +/** + * @brief Updates value in @a arr at position @a index with boolean @a value + * @param[in,out] arr Array + * @param index Index + * @param value Value + * @param flags Flags (@c PH_SEPARATE: separate @a arr if its reference count is greater than 1; @c *arr will contain the separated version) + * @return Whether the operation succeeded + * @retval @c FAILURE Failure, @a arr is not an array + * @retval @c SUCCESS Success + * @throw @c E_WARNING if @c arr is not an array + * @see phalcon_array_update_long() + * + * Equivalent to $arr[$index] = $value in PHP where @c $index is an integer and @c $value is an integer. + */ +PHALCON_ATTR_NONNULL static inline int phalcon_array_update_long_bool(zval **arr, ulong index, int value, int flags) +{ + zval *zvalue; + + MAKE_STD_ZVAL(zvalue); + ZVAL_BOOL(zvalue, value); + + return phalcon_array_update_long(arr, index, &zvalue, flags & PH_SEPARATE); +} + +/** + * Append a zval to a multi-dimensional array with two indexes + */ +void phalcon_array_append_multi_2(zval **arr, zval *index, zval *value, int flags) PHALCON_ATTR_NONNULL; + +/** + * Updates multi-dimensional array with two zval indexes + */ void phalcon_array_update_multi_2(zval **config, zval *index1, zval *index2, zval **value, int flags) PHALCON_ATTR_NONNULL; + +/** + * Updates multi-dimensional array with two string indexes + */ void phalcon_array_update_string_multi_2(zval **arr, zval *index1, char *index2, uint index2_length, zval **value, int flags) PHALCON_ATTR_NONNULL; + +/** + * Updates multi-dimensional arrays with two long indices + * + * $foo[10][4] = $x + */ void phalcon_array_update_long_long_multi_2(zval **arr, long index1, long index2, zval **value, int flags) PHALCON_ATTR_NONNULL; + +/** + * Updates multi-dimensional arrays with one long index and other string + * + * $foo[10]["lol"] = $x + */ void phalcon_array_update_long_string_multi_2(zval **arr, long index1, char *index2, uint index2_length, zval **value, int flags) PHALCON_ATTR_NONNULL; + +/** + * $x[$a][] = 1 + */ void phalcon_array_update_append_multi_2(zval **arr, zval *index1, zval *value, int flags) PHALCON_ATTR_NONNULL; -/** Update/Append three dimension arrays */ +/** + * $x[$a]["hello"][] = $v + */ void phalcon_array_update_zval_string_append_multi_3(zval **arr, zval *index1, char *index2, uint index2_length, zval **value, int flags) PHALCON_ATTR_NONNULL; + +/** + * $x[$a][$b][$c] = $v + */ void phalcon_array_update_zval_zval_zval_multi_3(zval **arr, zval *index1, zval *index2, zval *index3, zval **value, int flags) PHALCON_ATTR_NONNULL; + +/** + * $x[$a][$b]["str"] = $v + */ void phalcon_array_update_string_zval_zval_multi_3(zval **arr, zval *index1, zval *index2, char *index3, uint index3_length, zval **value, int flags) PHALCON_ATTR_NONNULL; + +/** + * $x[$a]["a-str"]["str"] = 1 + */ void phalcon_array_update_zval_string_string_multi_3(zval **arr, zval *index1, char *index2, uint index2_length, char *index3, uint index3_length, zval **value, int flags) PHALCON_ATTR_NONNULL; -/** Fetch items from arrays */ +/** + * @brief Reads an item from @a arr at position @a index and stores it to @a return_value + * @param return_value[out] Return value + * @param arr Array + * @param index Index + * @param silent 0 to suppress all warnings, @c PH_NOISY to enable + * @return Whether the operation succeeded + * @retval @c FAILURE Failure, @a arr is not an array + * @retval @c SUCCESS Success + * @throw @c E_WARNING if @c arr is not an array and @c silent = @c PH_NOISY + * @throw @c E_WARNING if @c index is not of the supported type and @c silent = @c PH_NOISY + * @throw @c E_NOTICE if @c index does not exist and @c silent = @c PH_NOISY + * @warning @c *return_value should be either @c NULL (preferred) or point to not initialized memory; if @c *return_value points to a valid variable, mmemory leak is possible + * @note @c index will be handled as follows: @c NULL is treated as an empty string, @c double values are cast to @c integer, @c bool or @c resource are treated as @c integer + */ int phalcon_array_fetch(zval **return_value, zval *arr, zval *index, int silent) PHALCON_ATTR_NONNULL; -int phalcon_array_fetch_string(zval **return_value, zval *arr, const char *index, uint index_length, int silent) PHALCON_ATTR_NONNULL; -int phalcon_array_fetch_long(zval **return_value, zval *arr, unsigned long index, int silent) PHALCON_ATTR_NONNULL; -/** Merge+Append */ +/** + * @brief Reads an item from @a arr at position @a index and stores it to @a return_value + * @param return_value[out] Return value + * @param arr Array + * @param index Index + * @param silent 0 to suppress all warnings, @c PH_NOISY to enable + * @return Whether the operation succeeded + * @retval @c FAILURE Failure, @a arr is not an array + * @retval @c SUCCESS Success + * @throw @c E_WARNING if @c arr is not an array and @c silent = @c PH_NOISY + * @throw @c E_NOTICE if @c index does not exist and @c silent = @c PH_NOISY + * @warning @c *return_value should be either @c NULL (preferred) or point to not initialized memory; if @c *return_value points to a valid variable, mmemory leak is possible + */ +int phalcon_array_fetch_long(zval **return_value, zval *arr, ulong index, int silent) PHALCON_ATTR_NONNULL; + +/** + * @brief Reads an item from @a arr at position @a index using the precomputed hash @c key and stores it to @a return_value + * @param return_value[out] Return value + * @param arr Array + * @param index Index + * @param index Index length; must contain the trailing zero, if any + * @param key Precomputed hash of @c index + * @param silent 0 to suppress all warnings, @c PH_NOISY to enable + * @return Whether the operation succeeded + * @retval @c FAILURE Failure, @a arr is not an array + * @retval @c SUCCESS Success + * @throw @c E_WARNING if @c arr is not an array and @c silent = @c PH_NOISY + * @throw @c E_NOTICE if @c index does not exist and @c silent = @c PH_NOISY + * @warning @c *return_value should be either @c NULL (preferred) or point to not initialized memory; if @c *return_value points to a valid variable, mmemory leak is possible + */ +int phalcon_array_fetch_quick_string(zval **return_value, zval *arr, const char *index, uint index_length, ulong key, int silent) PHALCON_ATTR_NONNULL; + +/** + * @brief Reads an item from @a arr at position @a index and stores it to @a return_value + * @param return_value[out] Return value + * @param arr Array + * @param index Index + * @param index Index length (strlen(index)) + * @param silent 0 to suppress all warnings, @c PH_NOISY to enable + * @return Whether the operation succeeded + * @retval @c FAILURE Failure, @a arr is not an array + * @retval @c SUCCESS Success + * @throw @c E_WARNING if @c arr is not an array and @c silent = @c PH_NOISY + * @throw @c E_NOTICE if @c index does not exist and @c silent = @c PH_NOISY + * @warning @c *return_value should be either @c NULL (preferred) or point to not initialized memory; if @c *return_value points to a valid variable, mmemory leak is possible + * @see phalcon_array_fetch_quick_string() + * + * The function is a wrapper over @c phalcon_array_fetch_quick_string() + */ +PHALCON_ATTR_NONNULL static inline int phalcon_array_fetch_string(zval **return_value, zval *arr, const char *index, uint index_length, int silent) +{ +#ifdef __GNUC__ + if (__builtin_constant_p(index) && __builtin_constant_p(index_length)) { + return phalcon_array_fetch_quick_string(return_value, arr, index, index_length + 1, zend_inline_hash_func(index, index_length + 1), silent); + } +#endif + + return phalcon_array_fetch_quick_string(return_value, arr, index, index_length + 1, zend_hash_func(index, index_length + 1), silent); +} + + +/** + * Appends every element of an array at the end of the left array + */ void phalcon_merge_append(zval *left, zval *values) PHALCON_ATTR_NONNULL; -/* Traversing Arays */ +/** + * Gets the current element in a zval hash + */ void phalcon_array_get_current(zval *return_value, zval *array) PHALCON_ATTR_NONNULL; -void phalcon_array_next(zval *array) PHALCON_ATTR_NONNULL; -/* In Array */ +/** + * Fast in_array() function + */ int phalcon_fast_in_array(zval *needle, zval *haystack TSRMLS_DC) PHALCON_ATTR_NONNULL; -/** Fast Array Merge */ +/** + * Fast array merge + */ void phalcon_fast_array_merge(zval *return_value, zval **array1, zval **array2 TSRMLS_DC) PHALCON_ATTR_NONNULL; -/** Recursive merge */ +/** + * @brief Merge @a a1 and @a a2 recursively preserving all keys + * @warning Both @a a1 and @a a2 are assumed to be arrays, no checks are performed + * @param[in,out] a1 LHS operand + * @param a2 RHS operand + * + * Equivalent to $a1 = array_merge_recursive($a1, $a2) in PHP with the only exception + * that Phalcon's version preserves numeric keys + */ void phalcon_array_merge_recursive_n(zval **a1, zval *a2) PHALCON_ATTR_NONNULL; +/** + * @brief array_unshift($arr, $arg) + * @param arr + * @param arg + * @note Reference count of @c arg will be incremented + */ void phalcon_array_unshift(zval *arr, zval *arg) PHALCON_ATTR_NONNULL; + +/** + * @brief $return_value = array_keys($arr) + * @param return_value + * @param arr + */ void phalcon_array_keys(zval *return_value, zval *arr) PHALCON_ATTR_NONNULL; + +/** + * @brief $return_value = array_values($arr) + * @param return_value + * @param arr + */ void phalcon_array_values(zval *return_value, zval *arr) PHALCON_ATTR_NONNULL; + +/** + * @brief array_key_exists($arr, $key) + * @param arr + * @param key + * @return Whether @a key exists in @ arr + */ int phalcon_array_key_exists(zval *arr, zval *key TSRMLS_DC) PHALCON_ATTR_NONNULL; -int phalcon_array_is_associative(zval *arr) PHALCON_ATTR_NONNULL; #endif /* PHALCON_KERNEL_ARRAY_H */ diff --git a/ext/kernel/fcall.c b/ext/kernel/fcall.c index fb6b58691c8..93beb40ebb5 100644 --- a/ext/kernel/fcall.c +++ b/ext/kernel/fcall.c @@ -17,11 +17,6 @@ +------------------------------------------------------------------------+ */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "php.h" #include "php_phalcon.h" #include diff --git a/ext/kernel/file.c b/ext/kernel/file.c index 4cf4e940867..dafb11a0eda 100644 --- a/ext/kernel/file.c +++ b/ext/kernel/file.c @@ -17,14 +17,11 @@ +------------------------------------------------------------------------+ */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "php.h" #include "php_phalcon.h" -#include "php_main.h" -#include "main/php_streams.h" + +#include
+#include +#include #include #include #include @@ -36,9 +33,6 @@ #include "kernel/operators.h" #include "kernel/file.h" -#include -#include - /** * Checks if a file exist * @@ -128,7 +122,7 @@ void phalcon_fix_path(zval **return_value, zval *path, zval *directory_separator */ void phalcon_prepare_virtual_path(zval *return_value, zval *path, zval *virtual_separator TSRMLS_DC) { - unsigned int i; + int i; unsigned char ch; smart_str virtual_str = {0}; @@ -195,7 +189,7 @@ void phalcon_realpath(zval *return_value, zval *filename TSRMLS_DC) { RETURN_FALSE; } - if (strlen(Z_STRVAL_P(filename)) != Z_STRLEN_P(filename)) { + if (strlen(Z_STRVAL_P(filename)) != (size_t)(Z_STRLEN_P(filename))) { RETURN_FALSE; } @@ -211,7 +205,7 @@ void phalcon_realpath(zval *return_value, zval *filename TSRMLS_DC) { */ void phalcon_possible_autoload_filepath(zval *return_value, zval *prefix, zval *class_name, zval *virtual_separator, zval *separator TSRMLS_DC) { - unsigned int i, length; + int i, length; unsigned char ch; smart_str virtual_str = {0}; @@ -421,7 +415,7 @@ void phalcon_unlink(zval *return_value, zval *path TSRMLS_DC) php_stream_wrapper *wrapper; zval *zctx = NULL; - if (unlikely(strlen(Z_STRVAL_P(path)) != Z_STRLEN_P(path))) { + if (unlikely(strlen(Z_STRVAL_P(path)) != (size_t)(Z_STRLEN_P(path)))) { ZVAL_FALSE(return_value); return; } diff --git a/ext/kernel/filter.c b/ext/kernel/filter.c index 73d3ccae227..d50e6e2b69a 100644 --- a/ext/kernel/filter.c +++ b/ext/kernel/filter.c @@ -17,15 +17,11 @@ +------------------------------------------------------------------------+ */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif +#include "php_phalcon.h" #include - -#include "php.h" -#include "php_phalcon.h" -#include "php_main.h" +#include +#include #include #include #include @@ -33,16 +29,13 @@ #include "kernel/main.h" #include "kernel/memory.h" -#include -#include - /** * Filter alphanum string */ void phalcon_filter_alphanum(zval *return_value, zval *param){ - unsigned int i; - unsigned char ch; + int i; + char ch; smart_str filtered_str = {0}; zval copy; int use_copy = 0; @@ -82,8 +75,8 @@ void phalcon_filter_alphanum(zval *return_value, zval *param){ */ void phalcon_filter_identifier(zval *return_value, zval *param){ - unsigned int i; - unsigned char ch; + int i; + char ch; zval copy; smart_str filtered_str = {0}; int use_copy = 0; @@ -124,17 +117,17 @@ void phalcon_filter_identifier(zval *return_value, zval *param){ */ void phalcon_is_basic_charset(zval *return_value, const zval *param){ - unsigned int i; - unsigned int ch; + int i; + unsigned char ch; int iso88591 = 0; for (i = 0; i < Z_STRLEN_P(param); i++) { - ch = Z_STRVAL_P(param)[i]; + ch = (unsigned char)(Z_STRVAL_P(param)[i]); if (ch != '\0') { if (ch == 172 || (ch >= 128 && ch <= 159)) { continue; } - if (ch >= 160 && ch <= 255) { + if (ch >= 160) { iso88591 = 1; continue; } @@ -188,14 +181,14 @@ static inline char *phalcon_longtohex(unsigned long value) { */ void phalcon_escape_multi(zval *return_value, zval *param, const char *escape_char, unsigned int escape_length, char escape_extra, int use_whitelist) { - unsigned int i; + int i; zval copy; smart_str escaped_str = {0}; - char machine_little_endian, *hex; + char *hex; int big_endian_long_map[4]; - int use_copy = 0, machine_endian_check = 1; + int use_copy = 0; int issigned = 0; - long value; + long int value; if (Z_TYPE_P(param) != IS_STRING) { zend_make_printable_zval(param, ©, &use_copy); @@ -211,19 +204,17 @@ void phalcon_escape_multi(zval *return_value, zval *param, const char *escape_ch /** * This is how the big_ending_long_map is calculated as in 'pack' */ - machine_little_endian = ((char *) &machine_endian_check)[0]; - if (machine_little_endian) { - big_endian_long_map[0] = 3; - big_endian_long_map[1] = 2; - big_endian_long_map[2] = 1; - big_endian_long_map[3] = 0; - } else { - int size = sizeof(Z_LVAL_P(param)); - big_endian_long_map[0] = size - 4; - big_endian_long_map[1] = size - 3; - big_endian_long_map[2] = size - 2; - big_endian_long_map[3] = size - 1; - } +#ifndef WORDS_BIGENDIAN + big_endian_long_map[0] = 3; + big_endian_long_map[1] = 2; + big_endian_long_map[2] = 1; + big_endian_long_map[3] = 0; +#else + big_endian_long_map[0] = 0; + big_endian_long_map[1] = 1; + big_endian_long_map[2] = 2; + big_endian_long_map[3] = 3; +#endif /** * The input must be a valid UTF-32 string diff --git a/ext/kernel/framework/orm.c b/ext/kernel/framework/orm.c index 2607ea5d218..13f7b7f6d1a 100644 --- a/ext/kernel/framework/orm.c +++ b/ext/kernel/framework/orm.c @@ -17,11 +17,6 @@ +------------------------------------------------------------------------+ */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "php.h" #include "php_phalcon.h" #include @@ -135,4 +130,4 @@ void phalcon_orm_singlequotes(zval *return_value, zval *str TSRMLS_DC) { smart_str_free(&escaped_str); RETURN_EMPTY_STRING(); } -} \ No newline at end of file +} diff --git a/ext/kernel/framework/router.c b/ext/kernel/framework/router.c index 78de48bf15e..224f4eb2fac 100644 --- a/ext/kernel/framework/router.c +++ b/ext/kernel/framework/router.c @@ -28,9 +28,9 @@ zval *phalcon_replace_marker(int named, zval *paths, zval *replacements, unsigne zval **zv, **tmp; int result = FAILURE; - unsigned int length = 0, variable_length, ch; + unsigned int length = 0, variable_length, ch, j; char *item = NULL, *cursor_var, *variable = NULL; - int not_valid = 0, j; + int not_valid = 0; if (named) { length = cursor - marker - 1; @@ -107,10 +107,11 @@ zval *phalcon_replace_marker(int named, zval *paths, zval *replacements, unsigne void phalcon_replace_paths(zval *return_value, zval *pattern, zval *paths, zval *replacements TSRMLS_DC){ char *cursor, *marker = NULL; - unsigned int i, bracket_count = 0, parentheses_count = 0, intermediate = 0; + unsigned int bracket_count = 0, parentheses_count = 0, intermediate = 0; unsigned char ch; smart_str route_str = {0}; - unsigned long position = 1; + ulong position = 1; + int i; zval *replace, replace_copy; int use_copy, looking_placeholder = 0; @@ -268,8 +269,9 @@ void phalcon_replace_paths(zval *return_value, zval *pattern, zval *paths, zval */ void phalcon_extract_named_params(zval *return_value, zval *str, zval *matches){ - unsigned int i, j, k, bracket_count = 0, parentheses_count = 0, ch; - unsigned int intermediate = 0, length, number_matches = 0, found_pattern; + int i, k; + uint j, bracket_count = 0, parentheses_count = 0, ch; + uint intermediate = 0, length, number_matches = 0, found_pattern; int variable_length, regexp_length = 0, not_valid = 0; char *cursor, *cursor_var, *marker = NULL; char *item, *variable = NULL, *regexp = NULL; diff --git a/ext/kernel/hash.c b/ext/kernel/hash.c index db436e00800..1988106568b 100644 --- a/ext/kernel/hash.c +++ b/ext/kernel/hash.c @@ -201,7 +201,7 @@ void phalcon_hash_update_or_insert(HashTable *ht, zval *key, zval *value) case IS_DOUBLE: case IS_BOOL: case IS_LONG: - zend_hash_index_update(ht, ((Z_TYPE_P(key) == IS_DOUBLE) ? (ulong)Z_DVAL_P(key) : Z_LVAL_P(key)), (void*)&value, sizeof(zval*), NULL); + zend_hash_index_update(ht, ((Z_TYPE_P(key) == IS_DOUBLE) ? (ulong)Z_DVAL_P(key) : (ulong)Z_LVAL_P(key)), (void*)&value, sizeof(zval*), NULL); return; default: diff --git a/ext/kernel/main.c b/ext/kernel/main.c index 248282a2ef3..e1abed1eb34 100644 --- a/ext/kernel/main.c +++ b/ext/kernel/main.c @@ -17,22 +17,17 @@ +------------------------------------------------------------------------+ */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "php.h" #include "php_phalcon.h" -#include "php_main.h" + #include +#include +#include #include "kernel/main.h" #include "kernel/memory.h" #include "kernel/fcall.h" #include "kernel/exception.h" -#include -#include /** * Initialize globals on each request or each thread started diff --git a/ext/kernel/memory.c b/ext/kernel/memory.c index bc5e541a158..4d8853f5ff0 100644 --- a/ext/kernel/memory.c +++ b/ext/kernel/memory.c @@ -17,11 +17,6 @@ +------------------------------------------------------------------------+ */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "main/php.h" #include "php_phalcon.h" #include @@ -196,7 +191,7 @@ void phalcon_dump_current_frame(TSRMLS_D) { zend_phalcon_globals *phalcon_globals_ptr = PHALCON_VGLOBAL; phalcon_memory_entry *active_memory; - int i; + size_t i; if (unlikely(phalcon_globals_ptr->active_memory == NULL)) { fprintf(stderr, "WARNING: calling phalcon_dump_current_frame() without an active memory frame!\n"); @@ -212,14 +207,14 @@ void phalcon_dump_current_frame(TSRMLS_D) if (active_memory->hash_pointer) { for (i = 0; i < active_memory->hash_pointer; ++i) { assert(active_memory->hash_addresses[i] != NULL && *(active_memory->hash_addresses[i]) != NULL); - fprintf(stderr, "Hash ptr %d (%p => %p), type=%u, refcnt=%u\n", i, active_memory->hash_addresses[i], *active_memory->hash_addresses[i], Z_TYPE_PP(active_memory->hash_addresses[i]), Z_REFCOUNT_PP(active_memory->hash_addresses[i])); + fprintf(stderr, "Hash ptr %lu (%p => %p), type=%u, refcnt=%u\n", (ulong)i, active_memory->hash_addresses[i], *active_memory->hash_addresses[i], Z_TYPE_PP(active_memory->hash_addresses[i]), Z_REFCOUNT_PP(active_memory->hash_addresses[i])); } } for (i = 0; i < active_memory->pointer; ++i) { if (likely(active_memory->addresses[i] != NULL && *(active_memory->addresses[i]) != NULL)) { zval **var = active_memory->addresses[i]; - fprintf(stderr, "Obs var %d (%p => %p), type=%u, refcnt=%u; ", i, var, *var, Z_TYPE_PP(var), Z_REFCOUNT_PP(var)); + fprintf(stderr, "Obs var %lu (%p => %p), type=%u, refcnt=%u; ", (ulong)i, var, *var, Z_TYPE_PP(var), Z_REFCOUNT_PP(var)); switch (Z_TYPE_PP(var)) { case IS_NULL: fprintf(stderr, "value=NULL\n"); break; case IS_LONG: fprintf(stderr, "value=%ld\n", Z_LVAL_PP(var)); break; diff --git a/ext/kernel/operators.c b/ext/kernel/operators.c index b018df416ce..67961591fd2 100644 --- a/ext/kernel/operators.c +++ b/ext/kernel/operators.c @@ -17,17 +17,14 @@ +------------------------------------------------------------------------+ */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif +#include "php_phalcon.h" -#include "php.h" #include -#include "php_phalcon.h" +#include + #include "kernel/main.h" #include "kernel/memory.h" -#include void phalcon_make_printable_zval(zval *expr, zval *expr_copy, int *use_copy){ zend_make_printable_zval(expr, expr_copy, use_copy); diff --git a/ext/kernel/output.c b/ext/kernel/output.c index 0d93bb74b23..fc9c0ead873 100644 --- a/ext/kernel/output.c +++ b/ext/kernel/output.c @@ -17,18 +17,14 @@ +------------------------------------------------------------------------+ */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "php.h" #include "php_phalcon.h" -#include "kernel/memory.h" -#include "kernel/output.h" #include #include
+#include "kernel/memory.h" +#include "kernel/output.h" + void phalcon_ob_start(TSRMLS_D) { #if PHP_VERSION_ID < 50400 diff --git a/ext/kernel/persistent.c b/ext/kernel/persistent.c deleted file mode 100644 index 09854d913e8..00000000000 --- a/ext/kernel/persistent.c +++ /dev/null @@ -1,58 +0,0 @@ - -/* - +------------------------------------------------------------------------+ - | Phalcon Framework | - +------------------------------------------------------------------------+ - | Copyright (c) 2011-2014 Phalcon Team (http://www.phalconphp.com) | - +------------------------------------------------------------------------+ - | This source file is subject to the New BSD License that is bundled | - | with this package in the file docs/LICENSE.txt. | - | | - | If you did not receive a copy of the license and are unable to | - | obtain it through the world-wide-web, please send an email | - | to license@phalconphp.com so we can send you a copy immediately. | - +------------------------------------------------------------------------+ - | Authors: Andres Gutierrez | - | Eduar Carvajal | - +------------------------------------------------------------------------+ -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "php.h" -#include "php_phalcon.h" - -/* represents a connection to a database */ -struct _phalcon_persist_obj { - char *data; -} phalcon_persist_obj; - -int phalcon_persistent_fetch(zval *return_value, zval *service TSRMLS_DC){ - zend_rsrc_list_entry *le; - - /* try to find if we already have this link in our persistent list */ - if (zend_hash_find(&EG(persistent_list), Z_STRVAL_P(service), Z_STRLEN_P(service)+1, (void **) &le)==FAILURE) { - - } -} - -int phalcon_persistent_store(zval *service, zval *object TSRMLS_DC){ - - //pdo_dbh_t *dbh = NULL; - - //zend_object_store_set_object(object, dbh TSRMLS_CC); - - - zend_rsrc_list_entry new_le; - - Z_TYPE(new_le) = 1; - new_le.ptr = pestrdup("hello", 1); - if (zend_hash_update(&EG(persistent_list), Z_STRVAL_P(service), Z_STRLEN_P(service)+1, (void *) &new_le, sizeof(zend_rsrc_list_entry), NULL)==FAILURE) { - //goto err; - } - - //phalcon_persistent_store - -} diff --git a/ext/kernel/persistent.h b/ext/kernel/persistent.h deleted file mode 100644 index 468415ccc65..00000000000 --- a/ext/kernel/persistent.h +++ /dev/null @@ -1,3 +0,0 @@ - -int phalcon_persistent_store(zval *service, zval *object TSRMLS_DC); -int phalcon_persistent_fetch(zval *return_value, zval *service TSRMLS_DC); diff --git a/ext/kernel/require.c b/ext/kernel/require.c index 6b770713255..f08e7bc16f9 100644 --- a/ext/kernel/require.c +++ b/ext/kernel/require.c @@ -17,18 +17,15 @@ +------------------------------------------------------------------------+ */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "php.h" #include "php_phalcon.h" -#include "php_main.h" + +#include
+#include + #include "kernel/main.h" #include "kernel/require.h" #include "kernel/memory.h" #include "kernel/debug.h" -#include int ZEND_FASTCALL phalcon_internal_require(zval *return_value, const zval *require_path TSRMLS_DC){ diff --git a/ext/kernel/session.c b/ext/kernel/session.c index 7a04d28473c..01bd1f5b550 100644 --- a/ext/kernel/session.c +++ b/ext/kernel/session.c @@ -17,21 +17,16 @@ +------------------------------------------------------------------------+ */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "php.h" #include "php_phalcon.h" -#include "kernel/main.h" -#include "kernel/fcall.h" -#include "kernel/session.h" - #ifdef PHALCON_USE_PHP_SESSION #include #endif +#include "kernel/main.h" +#include "kernel/fcall.h" +#include "kernel/session.h" + void phalcon_session_start(TSRMLS_D) { #ifdef PHALCON_USE_PHP_SESSION diff --git a/ext/kernel/string.c b/ext/kernel/string.c index 4d5b2704fd4..5bb3c0e384a 100644 --- a/ext/kernel/string.c +++ b/ext/kernel/string.c @@ -274,7 +274,7 @@ void phalcon_camelize(zval *return_value, const zval *str){ */ void phalcon_uncamelize(zval *return_value, const zval *str){ - unsigned int i; + int i; smart_str uncamelize_str = {0}; char *marker, ch; @@ -369,7 +369,7 @@ int phalcon_memnstr_str(const zval *haystack, char *needle, unsigned int needle_ return 0; } - if (Z_STRLEN_P(haystack) >= needle_length) { + if ((uint)(Z_STRLEN_P(haystack)) >= needle_length) { return php_memnstr(Z_STRVAL_P(haystack), needle, needle_length, Z_STRVAL_P(haystack) + Z_STRLEN_P(haystack)) ? 1 : 0; } @@ -655,7 +655,7 @@ int phalcon_start_with(const zval *str, const zval *compared, zval *case_sensiti */ int phalcon_start_with_str(const zval *str, char *compared, unsigned int compared_length){ - if (Z_TYPE_P(str) != IS_STRING || compared_length > Z_STRLEN_P(str)) { + if (Z_TYPE_P(str) != IS_STRING || compared_length > (uint)(Z_STRLEN_P(str))) { return 0; } @@ -723,7 +723,7 @@ int phalcon_end_with_str(const zval *str, char *compared, unsigned int compared_ return 0; } - if (!compared_length || !Z_STRLEN_P(str) || compared_length > Z_STRLEN_P(str)) { + if (!compared_length || !Z_STRLEN_P(str) || compared_length > (uint)(Z_STRLEN_P(str))) { return 0; } @@ -873,6 +873,7 @@ int phalcon_spprintf(char **message, int max_len, char *format, ...) */ void phalcon_substr(zval *return_value, zval *str, unsigned long from, unsigned long length) { + uint str_len = (uint)(Z_STRLEN_P(str)); if (Z_TYPE_P(str) != IS_STRING) { if (Z_TYPE_P(str) == IS_NULL || Z_TYPE_P(str) == IS_BOOL) { @@ -887,19 +888,19 @@ void phalcon_substr(zval *return_value, zval *str, unsigned long from, unsigned RETURN_FALSE; } - if (Z_STRLEN_P(str) < from){ + if (str_len < from){ RETURN_FALSE; } - if (!length || (Z_STRLEN_P(str) < (length + from))) { - length = Z_STRLEN_P(str) - from; + if (!length || (str_len < length + from)) { + length = str_len - from; } - if (length <= 0){ + if (!length){ RETURN_EMPTY_STRING(); } - RETURN_STRINGL(Z_STRVAL_P(str) + from, length, 1); + RETURN_STRINGL(Z_STRVAL_P(str) + from, (int)length, 1); } void phalcon_append_printable_array(smart_str *implstr, zval *value TSRMLS_DC) { diff --git a/ext/logger/adapter/firephp.c b/ext/logger/adapter/firephp.c index b385fb1e6dd..01d212918b8 100644 --- a/ext/logger/adapter/firephp.c +++ b/ext/logger/adapter/firephp.c @@ -111,8 +111,9 @@ PHP_METHOD(Phalcon_Logger_Adapter_Firephp, logInternal){ zval *initialized, *index; sapi_header_line h = { NULL, 0, 0 }; smart_str str = { NULL, 0, 0 }; - int size, offset, num_bytes; + int size, offset; int separate_index = 0; + size_t num_bytes; const int chunk = 4500; /* If headers has already been sent, we can do nothing. Exit early. */ @@ -171,7 +172,7 @@ PHP_METHOD(Phalcon_Logger_Adapter_Firephp, logInternal){ * We need to send the data in chunks not exceeding 5,000 bytes. * Allocate the smart string once to avoid performance penalties. */ - smart_str_alloc4(&str, (size > chunk ? chunk : size), 0, num_bytes); + smart_str_alloc4(&str, (uint)(size > chunk ? chunk : size), 0, num_bytes); while (size > 0) { smart_str_appends(&str, "X-Wf-1-1-1-"); diff --git a/ext/logger/formatter/firephp.c b/ext/logger/formatter/firephp.c index c87652e6ea3..2fe0ab30012 100644 --- a/ext/logger/formatter/firephp.c +++ b/ext/logger/formatter/firephp.c @@ -130,7 +130,7 @@ PHP_METHOD(Phalcon_Logger_Formatter_Firephp, format) { zval *payload, *body, *backtrace, *meta, *encoded; zval *show_backtrace; smart_str result = { NULL, 0, 0 }; - int i; + uint i; Bucket *p; phalcon_fetch_params(0, 3, 0, &message, &type, ×tamp); @@ -299,7 +299,7 @@ PHP_METHOD(Phalcon_Logger_Formatter_Firephp, format) { * memory reallocations. */ if (Z_TYPE_P(encoded) == IS_STRING && Z_STRVAL_P(encoded) != NULL) { - smart_str_alloc4(&result, Z_STRLEN_P(encoded) + 2 + 5, 0, i); + smart_str_alloc4(&result, (uint)(Z_STRLEN_P(encoded) + 2 + 5), 0, i); /** * The format is: diff --git a/ext/mvc/model.c b/ext/mvc/model.c index 02fee608095..a211f882fc7 100644 --- a/ext/mvc/model.c +++ b/ext/mvc/model.c @@ -3599,6 +3599,7 @@ PHP_METHOD(Phalcon_Mvc_Model, _doLowUpdate){ HashTable *ah0, *ah1; HashPosition hp0, hp1; zval **hd; + int i_use_dynamic_update; /* To keep static code analyzer happy */ PHALCON_MM_GROW(); @@ -3626,13 +3627,13 @@ PHP_METHOD(Phalcon_Mvc_Model, _doLowUpdate){ */ PHALCON_INIT_VAR(use_dynamic_update); phalcon_call_method_p1(use_dynamic_update, manager, "isusingdynamicupdate", this_ptr); - if (zend_is_true(use_dynamic_update)) { + i_use_dynamic_update = zend_is_true(use_dynamic_update); + if (i_use_dynamic_update) { PHALCON_OBS_VAR(snapshot); phalcon_read_property_this(&snapshot, this_ptr, SL("_snapshot"), PH_NOISY_CC); if (Z_TYPE_P(snapshot) != IS_ARRAY) { - PHALCON_INIT_NVAR(use_dynamic_update); - ZVAL_BOOL(use_dynamic_update, 0); + i_use_dynamic_update = 0; } } @@ -3704,7 +3705,7 @@ PHP_METHOD(Phalcon_Mvc_Model, _doLowUpdate){ /** * When dynamic update is not used we pass every field to the update */ - if (!zend_is_true(use_dynamic_update)) { + if (!i_use_dynamic_update) { phalcon_array_append(&fields, field, PH_SEPARATE); phalcon_array_append(&values, value, PH_SEPARATE); @@ -4787,7 +4788,7 @@ PHP_METHOD(Phalcon_Mvc_Model, update){ PHALCON_INIT_VAR(messages); array_init_size(messages, 1); - phalcon_array_append(&messages, model_message, PH_SEPARATE); + phalcon_array_append(&messages, model_message, 0); phalcon_update_property_this(this_ptr, SL("_errorMessages"), messages TSRMLS_CC); RETURN_MM_FALSE; } diff --git a/ext/mvc/model/manager.c b/ext/mvc/model/manager.c index a34a5f06fe7..2adcd0723cc 100644 --- a/ext/mvc/model/manager.c +++ b/ext/mvc/model/manager.c @@ -2381,20 +2381,18 @@ PHP_METHOD(Phalcon_Mvc_Model_Manager, getRelationRecords){ PHALCON_INIT_VAR(type); phalcon_call_method(type, relation, "gettype"); + PHALCON_INIT_VAR(retrieve_method); switch (phalcon_get_intval(type)) { case 0: - PHALCON_INIT_VAR(retrieve_method); ZVAL_STRING(retrieve_method, "findFirst", 1); break; case 1: - PHALCON_INIT_NVAR(retrieve_method); ZVAL_STRING(retrieve_method, "findFirst", 1); break; case 2: - PHALCON_INIT_NVAR(retrieve_method); ZVAL_STRING(retrieve_method, "find", 1); break; diff --git a/ext/mvc/model/query/parser.c b/ext/mvc/model/query/parser.c index 6e753451039..e7c670dc3b1 100644 --- a/ext/mvc/model/query/parser.c +++ b/ext/mvc/model/query/parser.c @@ -1028,7 +1028,7 @@ static const char *yyRuleName[] = { */ const char *phql_TokenName(int tokenType){ #ifndef NDEBUG - if( tokenType>0 && tokenType<(sizeof(yyTokenName)/sizeof(yyTokenName[0])) ){ + if( tokenType>0 && (size_t)tokenType<(sizeof(yyTokenName)/sizeof(yyTokenName[0])) ){ return yyTokenName[tokenType]; }else{ return "Unknown"; @@ -1282,7 +1282,7 @@ static int yy_find_shift_action( return YY_NO_ACTION; } i += iLookAhead; - if( i<0 || i>=YY_SZ_ACTTAB || yy_lookahead[i]!=iLookAhead ){ + if( i<0 || i>=(int)YY_SZ_ACTTAB || yy_lookahead[i]!=iLookAhead ){ #ifdef YYFALLBACK int iFallback; /* Fallback token */ if( iLookAhead=YY_SZ_ACTTAB || yy_lookahead[i]!=iLookAhead ){ + if( i<0 || i>=(int)YY_SZ_ACTTAB || yy_lookahead[i]!=iLookAhead ){ return yy_default[stateno]; }else{ return yy_action[i]; @@ -1540,7 +1540,7 @@ static void yy_reduce( yymsp = &yypParser->yystack[yypParser->yyidx]; #ifndef NDEBUG if( yyTraceFILE && yyruleno>=0 - && yyrulenoscanner_state->active_token; - int near_length = status->scanner_state->start_length; + uint active_token = status->scanner_state->active_token; + uint near_length = status->scanner_state->start_length; if (active_token) { diff --git a/ext/mvc/model/query/parser.y b/ext/mvc/model/query/parser.y index 257e7205510..87db1f8fd3d 100644 --- a/ext/mvc/model/query/parser.y +++ b/ext/mvc/model/query/parser.y @@ -466,8 +466,8 @@ static zval *phql_ret_func_call(phql_parser_token *name, zval *arguments, zval * int token_found = 0; unsigned int token_length; const phql_token_names *tokens = phql_tokens; - int active_token = status->scanner_state->active_token; - int near_length = status->scanner_state->start_length; + uint active_token = status->scanner_state->active_token; + uint near_length = status->scanner_state->start_length; if (active_token) { diff --git a/ext/mvc/model/query/scanner.c b/ext/mvc/model/query/scanner.c index 6d60ccf4327..465f7e15131 100644 --- a/ext/mvc/model/query/scanner.c +++ b/ext/mvc/model/query/scanner.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.13.5 on Thu Jan 9 23:51:52 2014 */ +/* Generated by re2c 0.13.5 on Sat Jan 11 18:45:50 2014 */ /* #line 1 "scanner.re" */ /* diff --git a/ext/mvc/model/resultset/complex.c b/ext/mvc/model/resultset/complex.c index b55efa3232b..bf8ce0577e4 100644 --- a/ext/mvc/model/resultset/complex.c +++ b/ext/mvc/model/resultset/complex.c @@ -179,7 +179,7 @@ PHP_METHOD(Phalcon_Mvc_Model_Resultset_Complex, valid){ if (Z_TYPE_P(rows) == IS_ARRAY) { phalcon_array_get_current(row, rows); if (Z_TYPE_P(row) == IS_OBJECT) { - phalcon_array_next(rows); + zend_hash_move_forward(Z_ARRVAL_P(rows)); } } else { ZVAL_FALSE(row); diff --git a/ext/mvc/model/resultset/simple.c b/ext/mvc/model/resultset/simple.c index 7a1e1b81936..123df4975c3 100644 --- a/ext/mvc/model/resultset/simple.c +++ b/ext/mvc/model/resultset/simple.c @@ -204,7 +204,7 @@ PHP_METHOD(Phalcon_Mvc_Model_Resultset_Simple, valid){ PHALCON_INIT_NVAR(row); phalcon_array_get_current(row, rows); if (PHALCON_IS_NOT_FALSE(row)) { - phalcon_array_next(rows); + zend_hash_move_forward(Z_ARRVAL_P(rows)); } } else { PHALCON_INIT_NVAR(row); diff --git a/ext/mvc/model/row.c b/ext/mvc/model/row.c index effc91c486d..ce8d738d00e 100644 --- a/ext/mvc/model/row.c +++ b/ext/mvc/model/row.c @@ -135,7 +135,8 @@ static void phalcon_mvc_model_row_write_dimension(zval *object, zval *offset, zv phalcon_mvc_model_row_object* obj = phalcon_mvc_model_row_get_object(object TSRMLS_CC); if (UNEXPECTED(obj->obj.ce->type != ZEND_INTERNAL_CLASS)) { - return zend_get_std_object_handlers()->write_dimension(object, offset, value TSRMLS_CC); + zend_get_std_object_handlers()->write_dimension(object, offset, value TSRMLS_CC); + return; } zend_throw_exception_ex(phalcon_mvc_model_exception_ce, 0 TSRMLS_CC, "Phalcon\\Mvc\\Row is an immutable ArrayAccess object"); diff --git a/ext/mvc/view/engine/volt/base.c b/ext/mvc/view/engine/volt/base.c index e722533dcb1..8bc64376131 100644 --- a/ext/mvc/view/engine/volt/base.c +++ b/ext/mvc/view/engine/volt/base.c @@ -211,10 +211,10 @@ int phvolt_parse_view(zval *result, zval *view_code, zval *template_path TSRMLS_ int phvolt_is_blank_string(phvolt_scanner_token *token){ char *marker = token->value; - unsigned int ch, i; + int i; for (i = 0; i < token->len; i++) { - ch = *marker; + char ch = *marker; if (ch != ' ' && ch != '\t' && ch != '\n' && ch != '\r' && ch != 11) { return 0; } diff --git a/ext/mvc/view/engine/volt/parser.c b/ext/mvc/view/engine/volt/parser.c index df5a8f6a4a5..d0d1c25c26b 100644 --- a/ext/mvc/view/engine/volt/parser.c +++ b/ext/mvc/view/engine/volt/parser.c @@ -1555,7 +1555,7 @@ static const char *kkRuleName[] = { */ const char *phvolt_TokenName(int tokenType){ #ifndef NDEBUG - if( tokenType>0 && tokenType<(sizeof(kkTokenName)/sizeof(kkTokenName[0])) ){ + if( tokenType>0 && (size_t)tokenType<(sizeof(kkTokenName)/sizeof(kkTokenName[0])) ){ return kkTokenName[tokenType]; }else{ return "Unknown"; @@ -1802,7 +1802,7 @@ static int kk_find_shift_action( return KK_NO_ACTION; } i += iLookAhead; - if( i<0 || i>=KK_SZ_ACTTAB || kk_lookahead[i]!=iLookAhead ){ + if( i<0 || i>=(int)KK_SZ_ACTTAB || kk_lookahead[i]!=iLookAhead ){ #ifdef KKFALLBACK int iFallback; /* Fallback token */ if( iLookAhead=KK_SZ_ACTTAB || kk_lookahead[i]!=iLookAhead ){ + if( i<0 || i>=(int)KK_SZ_ACTTAB || kk_lookahead[i]!=iLookAhead ){ return kk_default[stateno]; }else{ return kk_action[i]; @@ -2054,7 +2054,7 @@ static void kk_reduce( kkmsp = &kkpParser->kkstack[kkpParser->kkidx]; #ifndef NDEBUG if( kkTraceFILE && kkruleno>=0 - && kkrulenoscanner_state->active_token; + uint active_token = status->scanner_state->active_token; if (status->scanner_state->start_length) { @@ -3551,10 +3551,10 @@ int phvolt_parse_view(zval *result, zval *view_code, zval *template_path TSRMLS_ int phvolt_is_blank_string(phvolt_scanner_token *token){ char *marker = token->value; - unsigned int ch, i; + int i; for (i = 0; i < token->len; i++) { - ch = *marker; + char ch = *marker; if (ch != ' ' && ch != '\t' && ch != '\n' && ch != '\r' && ch != 11) { return 0; } diff --git a/ext/mvc/view/engine/volt/parser.y b/ext/mvc/view/engine/volt/parser.y index 30b6a549bb0..76e31b98b0d 100644 --- a/ext/mvc/view/engine/volt/parser.y +++ b/ext/mvc/view/engine/volt/parser.y @@ -604,7 +604,7 @@ static zval *phvolt_ret_macro_call_statement(zval *expr, zval *arguments, zval * char *token_name = NULL; const phvolt_token_names *tokens = phvolt_tokens; int token_len = 0; - int active_token = status->scanner_state->active_token; + uint active_token = status->scanner_state->active_token; if (status->scanner_state->start_length) { diff --git a/ext/mvc/view/engine/volt/scanner.c b/ext/mvc/view/engine/volt/scanner.c index c874af5ad2b..daab033d27d 100644 --- a/ext/mvc/view/engine/volt/scanner.c +++ b/ext/mvc/view/engine/volt/scanner.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.13.5 on Thu Jan 9 22:18:31 2014 */ +/* Generated by re2c 0.13.5 on Sat Jan 11 18:49:23 2014 */ /* #line 1 "scanner.re" */ /* @@ -30,8 +30,8 @@ void phvolt_rtrim(phvolt_scanner_token *token) { char *cursor, *removed_str; - unsigned int i; - unsigned char ch; + int i; + char ch; if (token->len > 0) { @@ -60,14 +60,13 @@ void phvolt_rtrim(phvolt_scanner_token *token) { void phvolt_ltrim(phvolt_scanner_token *token) { char *cursor, *removed_str; - unsigned int i; - unsigned char ch; + int i; if (token->len > 0) { cursor = token->value; for (i = 0; i < token->len; i++) { - ch = (*cursor); + char ch = (*cursor); if (ch == '\t' || ch == '\n' || ch == '\r' || ch == ' ' || ch == '\v') { cursor++; continue; @@ -174,7 +173,7 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { } else { -/* #line 178 "scanner.c" */ +/* #line 177 "scanner.c" */ { KKCTYPE kkch; unsigned int kkaccept = 0; @@ -314,7 +313,7 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { kkch = *(KKMARKER = ++KKCURSOR); goto kk292; kk3: -/* #line 179 "scanner.re" */ +/* #line 178 "scanner.re" */ { token->opcode = PHVOLT_T_INTEGER; token->value = estrndup(start, KKCURSOR - start); @@ -322,7 +321,7 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { q = KKCURSOR; return 0; } -/* #line 326 "scanner.c" */ +/* #line 325 "scanner.c" */ kk4: ++KKCURSOR; if ((kkch = *KKCURSOR) <= 'S') { @@ -345,7 +344,7 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { } } kk5: -/* #line 444 "scanner.re" */ +/* #line 443 "scanner.re" */ { token->opcode = PHVOLT_T_IDENTIFIER; token->value = estrndup(start, KKCURSOR - start); @@ -353,7 +352,7 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { q = KKCURSOR; return 0; } -/* #line 357 "scanner.c" */ +/* #line 356 "scanner.c" */ kk6: kkch = *++KKCURSOR; if (kkch <= 'X') { @@ -499,21 +498,21 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { ++KKCURSOR; if ((kkch = *KKCURSOR) == '%') goto kk126; if (kkch == '{') goto kk124; -/* #line 527 "scanner.re" */ +/* #line 526 "scanner.re" */ { token->opcode = PHVOLT_T_CBRACKET_OPEN; return 0; } -/* #line 508 "scanner.c" */ +/* #line 507 "scanner.c" */ kk21: ++KKCURSOR; if ((kkch = *KKCURSOR) == '}') goto kk122; -/* #line 472 "scanner.re" */ +/* #line 471 "scanner.re" */ { token->opcode = PHVOLT_T_MOD; return 0; } -/* #line 517 "scanner.c" */ +/* #line 516 "scanner.c" */ kk23: kkaccept = 1; kkch = *(KKMARKER = ++KKCURSOR); @@ -528,32 +527,32 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { } } kk24: -/* #line 457 "scanner.re" */ +/* #line 456 "scanner.re" */ { token->opcode = PHVOLT_T_SUB; return 0; } -/* #line 537 "scanner.c" */ +/* #line 536 "scanner.c" */ kk25: ++KKCURSOR; if ((kkch = *KKCURSOR) == '}') goto kk110; -/* #line 532 "scanner.re" */ +/* #line 531 "scanner.re" */ { token->opcode = PHVOLT_T_CBRACKET_CLOSE; return 0; } -/* #line 546 "scanner.c" */ +/* #line 545 "scanner.c" */ kk27: kkaccept = 2; kkch = *(KKMARKER = ++KKCURSOR); if (kkch >= 0x01) goto kk108; kk28: -/* #line 643 "scanner.re" */ +/* #line 642 "scanner.re" */ { status = PHVOLT_SCANNER_RETCODE_ERR; break; } -/* #line 557 "scanner.c" */ +/* #line 556 "scanner.c" */ kk29: kkaccept = 2; kkch = *(KKMARKER = ++KKCURSOR); @@ -577,178 +576,178 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { ++KKCURSOR; if ((kkch = *KKCURSOR) == '+') goto kk97; if (kkch == '=') goto kk95; -/* #line 452 "scanner.re" */ +/* #line 451 "scanner.re" */ { token->opcode = PHVOLT_T_ADD; return 0; } -/* #line 586 "scanner.c" */ +/* #line 585 "scanner.c" */ kk34: ++KKCURSOR; if ((kkch = *KKCURSOR) == '=') goto kk93; -/* #line 462 "scanner.re" */ +/* #line 461 "scanner.re" */ { token->opcode = PHVOLT_T_MUL; return 0; } -/* #line 595 "scanner.c" */ +/* #line 594 "scanner.c" */ kk36: ++KKCURSOR; if ((kkch = *KKCURSOR) == '=') goto kk91; -/* #line 467 "scanner.re" */ +/* #line 466 "scanner.re" */ { token->opcode = PHVOLT_T_DIV; return 0; } -/* #line 604 "scanner.c" */ +/* #line 603 "scanner.c" */ kk38: ++KKCURSOR; -/* #line 487 "scanner.re" */ +/* #line 486 "scanner.re" */ { token->opcode = PHVOLT_T_CONCAT; return 0; } -/* #line 612 "scanner.c" */ +/* #line 611 "scanner.c" */ kk40: ++KKCURSOR; if ((kkch = *KKCURSOR) == '.') goto kk89; -/* #line 497 "scanner.re" */ +/* #line 496 "scanner.re" */ { token->opcode = PHVOLT_T_DOT; return 0; } -/* #line 621 "scanner.c" */ +/* #line 620 "scanner.c" */ kk42: ++KKCURSOR; -/* #line 502 "scanner.re" */ +/* #line 501 "scanner.re" */ { token->opcode = PHVOLT_T_COMMA; return 0; } -/* #line 629 "scanner.c" */ +/* #line 628 "scanner.c" */ kk44: ++KKCURSOR; -/* #line 507 "scanner.re" */ +/* #line 506 "scanner.re" */ { token->opcode = PHVOLT_T_PARENTHESES_OPEN; return 0; } -/* #line 637 "scanner.c" */ +/* #line 636 "scanner.c" */ kk46: ++KKCURSOR; -/* #line 512 "scanner.re" */ +/* #line 511 "scanner.re" */ { token->opcode = PHVOLT_T_PARENTHESES_CLOSE; return 0; } -/* #line 645 "scanner.c" */ +/* #line 644 "scanner.c" */ kk48: ++KKCURSOR; -/* #line 517 "scanner.re" */ +/* #line 516 "scanner.re" */ { token->opcode = PHVOLT_T_SBRACKET_OPEN; return 0; } -/* #line 653 "scanner.c" */ +/* #line 652 "scanner.c" */ kk50: ++KKCURSOR; -/* #line 522 "scanner.re" */ +/* #line 521 "scanner.re" */ { token->opcode = PHVOLT_T_SBRACKET_CLOSE; return 0; } -/* #line 661 "scanner.c" */ +/* #line 660 "scanner.c" */ kk52: ++KKCURSOR; if ((kkch = *KKCURSOR) <= '<') goto kk53; if (kkch <= '=') goto kk87; if (kkch <= '>') goto kk85; kk53: -/* #line 602 "scanner.re" */ +/* #line 601 "scanner.re" */ { token->opcode = PHVOLT_T_LESS; return 0; } -/* #line 673 "scanner.c" */ +/* #line 672 "scanner.c" */ kk54: ++KKCURSOR; if ((kkch = *KKCURSOR) == '=') goto kk81; -/* #line 542 "scanner.re" */ +/* #line 541 "scanner.re" */ { token->opcode = PHVOLT_T_ASSIGN; return 0; } -/* #line 682 "scanner.c" */ +/* #line 681 "scanner.c" */ kk56: ++KKCURSOR; if ((kkch = *KKCURSOR) == '=') goto kk79; -/* #line 607 "scanner.re" */ +/* #line 606 "scanner.re" */ { token->opcode = PHVOLT_T_GREATER; return 0; } -/* #line 691 "scanner.c" */ +/* #line 690 "scanner.c" */ kk58: ++KKCURSOR; if ((kkch = *KKCURSOR) == '=') goto kk75; -/* #line 597 "scanner.re" */ +/* #line 596 "scanner.re" */ { token->opcode = PHVOLT_T_NOT; return 0; } -/* #line 700 "scanner.c" */ +/* #line 699 "scanner.c" */ kk60: ++KKCURSOR; -/* #line 612 "scanner.re" */ +/* #line 611 "scanner.re" */ { token->opcode = PHVOLT_T_PIPE; return 0; } -/* #line 708 "scanner.c" */ +/* #line 707 "scanner.c" */ kk62: ++KKCURSOR; -/* #line 617 "scanner.re" */ +/* #line 616 "scanner.re" */ { token->opcode = PHVOLT_T_COLON; return 0; } -/* #line 716 "scanner.c" */ +/* #line 715 "scanner.c" */ kk64: ++KKCURSOR; -/* #line 622 "scanner.re" */ +/* #line 621 "scanner.re" */ { token->opcode = PHVOLT_T_QUESTION; return 0; } -/* #line 724 "scanner.c" */ +/* #line 723 "scanner.c" */ kk66: ++KKCURSOR; kkch = *KKCURSOR; goto kk74; kk67: -/* #line 627 "scanner.re" */ +/* #line 626 "scanner.re" */ { token->opcode = PHVOLT_T_IGNORE; return 0; } -/* #line 735 "scanner.c" */ +/* #line 734 "scanner.c" */ kk68: ++KKCURSOR; -/* #line 632 "scanner.re" */ +/* #line 631 "scanner.re" */ { s->active_line++; token->opcode = PHVOLT_T_IGNORE; return 0; } -/* #line 744 "scanner.c" */ +/* #line 743 "scanner.c" */ kk70: ++KKCURSOR; -/* #line 638 "scanner.re" */ +/* #line 637 "scanner.re" */ { status = PHVOLT_SCANNER_RETCODE_EOF; break; } -/* #line 752 "scanner.c" */ +/* #line 751 "scanner.c" */ kk72: kkch = *++KKCURSOR; goto kk28; @@ -763,101 +762,101 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { kk75: ++KKCURSOR; if ((kkch = *KKCURSOR) == '=') goto kk77; -/* #line 577 "scanner.re" */ +/* #line 576 "scanner.re" */ { token->opcode = PHVOLT_T_NOTEQUALS; return 0; } -/* #line 772 "scanner.c" */ +/* #line 771 "scanner.c" */ kk77: ++KKCURSOR; -/* #line 592 "scanner.re" */ +/* #line 591 "scanner.re" */ { token->opcode = PHVOLT_T_NOTIDENTICAL; return 0; } -/* #line 780 "scanner.c" */ +/* #line 779 "scanner.c" */ kk79: ++KKCURSOR; -/* #line 567 "scanner.re" */ +/* #line 566 "scanner.re" */ { token->opcode = PHVOLT_T_GREATEREQUAL; return 0; } -/* #line 788 "scanner.c" */ +/* #line 787 "scanner.c" */ kk81: ++KKCURSOR; if ((kkch = *KKCURSOR) == '=') goto kk83; -/* #line 572 "scanner.re" */ +/* #line 571 "scanner.re" */ { token->opcode = PHVOLT_T_EQUALS; return 0; } -/* #line 797 "scanner.c" */ +/* #line 796 "scanner.c" */ kk83: ++KKCURSOR; -/* #line 587 "scanner.re" */ +/* #line 586 "scanner.re" */ { token->opcode = PHVOLT_T_IDENTICAL; return 0; } -/* #line 805 "scanner.c" */ +/* #line 804 "scanner.c" */ kk85: ++KKCURSOR; -/* #line 582 "scanner.re" */ +/* #line 581 "scanner.re" */ { token->opcode = PHVOLT_T_NOTEQUALS; return 0; } -/* #line 813 "scanner.c" */ +/* #line 812 "scanner.c" */ kk87: ++KKCURSOR; -/* #line 537 "scanner.re" */ +/* #line 536 "scanner.re" */ { token->opcode = PHVOLT_T_LESSEQUAL; return 0; } -/* #line 821 "scanner.c" */ +/* #line 820 "scanner.c" */ kk89: ++KKCURSOR; -/* #line 492 "scanner.re" */ +/* #line 491 "scanner.re" */ { token->opcode = PHVOLT_T_RANGE; return 0; } -/* #line 829 "scanner.c" */ +/* #line 828 "scanner.c" */ kk91: ++KKCURSOR; -/* #line 562 "scanner.re" */ +/* #line 561 "scanner.re" */ { token->opcode = PHVOLT_T_DIV_ASSIGN; return 0; } -/* #line 837 "scanner.c" */ +/* #line 836 "scanner.c" */ kk93: ++KKCURSOR; -/* #line 557 "scanner.re" */ +/* #line 556 "scanner.re" */ { token->opcode = PHVOLT_T_MUL_ASSIGN; return 0; } -/* #line 845 "scanner.c" */ +/* #line 844 "scanner.c" */ kk95: ++KKCURSOR; -/* #line 547 "scanner.re" */ +/* #line 546 "scanner.re" */ { token->opcode = PHVOLT_T_ADD_ASSIGN; return 0; } -/* #line 853 "scanner.c" */ +/* #line 852 "scanner.c" */ kk97: ++KKCURSOR; -/* #line 477 "scanner.re" */ +/* #line 476 "scanner.re" */ { token->opcode = PHVOLT_T_INCR; return 0; } -/* #line 861 "scanner.c" */ +/* #line 860 "scanner.c" */ kk99: ++KKCURSOR; kkch = *KKCURSOR; @@ -894,7 +893,7 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { goto kk101; kk105: ++KKCURSOR; -/* #line 435 "scanner.re" */ +/* #line 434 "scanner.re" */ { token->opcode = PHVOLT_T_STRING; token->value = estrndup(q, KKCURSOR - q - 1); @@ -902,7 +901,7 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { q = KKCURSOR; return 0; } -/* #line 906 "scanner.c" */ +/* #line 905 "scanner.c" */ kk107: ++KKCURSOR; kkch = *KKCURSOR; @@ -918,29 +917,29 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { goto kk107; kk110: ++KKCURSOR; -/* #line 414 "scanner.re" */ +/* #line 413 "scanner.re" */ { s->mode = PHVOLT_MODE_RAW; token->opcode = PHVOLT_T_CLOSE_EDELIMITER; return 0; } -/* #line 928 "scanner.c" */ +/* #line 927 "scanner.c" */ kk112: ++KKCURSOR; -/* #line 552 "scanner.re" */ +/* #line 551 "scanner.re" */ { token->opcode = PHVOLT_T_SUB_ASSIGN; return 0; } -/* #line 936 "scanner.c" */ +/* #line 935 "scanner.c" */ kk114: ++KKCURSOR; -/* #line 482 "scanner.re" */ +/* #line 481 "scanner.re" */ { token->opcode = PHVOLT_T_DECR; return 0; } -/* #line 944 "scanner.c" */ +/* #line 943 "scanner.c" */ kk116: kkch = *++KKCURSOR; if (kkch == '}') goto kk120; @@ -949,73 +948,73 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { kkch = *++KKCURSOR; if (kkch != '}') goto kk103; ++KKCURSOR; -/* #line 400 "scanner.re" */ +/* #line 399 "scanner.re" */ { s->mode = PHVOLT_MODE_RAW; s->whitespace_control = 1; token->opcode = PHVOLT_T_CLOSE_DELIMITER; return 0; } -/* #line 960 "scanner.c" */ +/* #line 959 "scanner.c" */ kk120: ++KKCURSOR; -/* #line 427 "scanner.re" */ +/* #line 426 "scanner.re" */ { s->mode = PHVOLT_MODE_RAW; s->whitespace_control = 1; token->opcode = PHVOLT_T_CLOSE_EDELIMITER; return 0; } -/* #line 970 "scanner.c" */ +/* #line 969 "scanner.c" */ kk122: ++KKCURSOR; -/* #line 388 "scanner.re" */ +/* #line 387 "scanner.re" */ { s->mode = PHVOLT_MODE_RAW; token->opcode = PHVOLT_T_CLOSE_DELIMITER; return 0; } -/* #line 979 "scanner.c" */ +/* #line 978 "scanner.c" */ kk124: ++KKCURSOR; if ((kkch = *KKCURSOR) == '-') goto kk130; -/* #line 407 "scanner.re" */ +/* #line 406 "scanner.re" */ { s->whitespace_control = 0; s->statement_position++; token->opcode = PHVOLT_T_OPEN_EDELIMITER; return 0; } -/* #line 990 "scanner.c" */ +/* #line 989 "scanner.c" */ kk126: ++KKCURSOR; if ((kkch = *KKCURSOR) == '-') goto kk128; -/* #line 382 "scanner.re" */ +/* #line 381 "scanner.re" */ { s->whitespace_control = 0; token->opcode = PHVOLT_T_OPEN_DELIMITER; return 0; } -/* #line 1000 "scanner.c" */ +/* #line 999 "scanner.c" */ kk128: ++KKCURSOR; -/* #line 394 "scanner.re" */ +/* #line 393 "scanner.re" */ { s->whitespace_control = 0; token->opcode = PHVOLT_T_OPEN_DELIMITER; return 0; } -/* #line 1009 "scanner.c" */ +/* #line 1008 "scanner.c" */ kk130: ++KKCURSOR; -/* #line 420 "scanner.re" */ +/* #line 419 "scanner.re" */ { s->whitespace_control = 0; s->statement_position++; token->opcode = PHVOLT_T_OPEN_EDELIMITER; return 0; } -/* #line 1019 "scanner.c" */ +/* #line 1018 "scanner.c" */ kk132: kkch = *++KKCURSOR; if (kkch == 'F') goto kk135; @@ -1026,13 +1025,13 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 352 "scanner.re" */ +/* #line 351 "scanner.re" */ { s->statement_position++; token->opcode = PHVOLT_T_DO; return 0; } -/* #line 1036 "scanner.c" */ +/* #line 1035 "scanner.c" */ kk135: kkch = *++KKCURSOR; if (kkch == 'I') goto kk136; @@ -1054,13 +1053,13 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 329 "scanner.re" */ +/* #line 328 "scanner.re" */ { s->statement_position++; token->opcode = PHVOLT_T_DEFINED; return 0; } -/* #line 1064 "scanner.c" */ +/* #line 1063 "scanner.c" */ kk141: kkch = *++KKCURSOR; if (kkch == 'T') goto kk142; @@ -1082,12 +1081,12 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 306 "scanner.re" */ +/* #line 305 "scanner.re" */ { token->opcode = PHVOLT_T_RETURN; return 0; } -/* #line 1091 "scanner.c" */ +/* #line 1090 "scanner.c" */ kk147: kkch = *++KKCURSOR; if (kkch == 'T') goto kk148; @@ -1101,12 +1100,12 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 301 "scanner.re" */ +/* #line 300 "scanner.re" */ { token->opcode = PHVOLT_T_WITH; return 0; } -/* #line 1110 "scanner.c" */ +/* #line 1109 "scanner.c" */ kk151: kkch = *++KKCURSOR; if (kkch <= 'L') { @@ -1151,13 +1150,13 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 370 "scanner.re" */ +/* #line 369 "scanner.re" */ { s->statement_position++; token->opcode = PHVOLT_T_CONTINUE; return 0; } -/* #line 1161 "scanner.c" */ +/* #line 1160 "scanner.c" */ kk160: kkch = *++KKCURSOR; if (kkch == 'L') goto kk165; @@ -1176,25 +1175,25 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 341 "scanner.re" */ +/* #line 340 "scanner.re" */ { s->statement_position++; token->opcode = PHVOLT_T_CACHE; return 0; } -/* #line 1186 "scanner.c" */ +/* #line 1185 "scanner.c" */ kk165: ++KKCURSOR; if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 290 "scanner.re" */ +/* #line 289 "scanner.re" */ { s->statement_position++; token->opcode = PHVOLT_T_CALL; return 0; } -/* #line 1198 "scanner.c" */ +/* #line 1197 "scanner.c" */ kk167: kkch = *++KKCURSOR; if (kkch == 'C') goto kk168; @@ -1212,13 +1211,13 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 279 "scanner.re" */ +/* #line 278 "scanner.re" */ { s->statement_position++; token->opcode = PHVOLT_T_MACRO; return 0; } -/* #line 1222 "scanner.c" */ +/* #line 1221 "scanner.c" */ kk172: kkch = *++KKCURSOR; if (kkch == 'O') goto kk178; @@ -1241,13 +1240,13 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 376 "scanner.re" */ +/* #line 375 "scanner.re" */ { s->statement_position++; token->opcode = PHVOLT_T_BREAK; return 0; } -/* #line 1251 "scanner.c" */ +/* #line 1250 "scanner.c" */ kk178: kkch = *++KKCURSOR; if (kkch == 'C') goto kk179; @@ -1261,24 +1260,24 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 268 "scanner.re" */ +/* #line 267 "scanner.re" */ { s->statement_position++; token->opcode = PHVOLT_T_BLOCK; return 0; } -/* #line 1271 "scanner.c" */ +/* #line 1270 "scanner.c" */ kk182: ++KKCURSOR; if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 263 "scanner.re" */ +/* #line 262 "scanner.re" */ { token->opcode = PHVOLT_T_OR; return 0; } -/* #line 1282 "scanner.c" */ +/* #line 1281 "scanner.c" */ kk184: kkch = *++KKCURSOR; if (kkch == 'D') goto kk195; @@ -1321,24 +1320,24 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 358 "scanner.re" */ +/* #line 357 "scanner.re" */ { s->statement_position++; token->opcode = PHVOLT_T_AUTOESCAPE; return 0; } -/* #line 1331 "scanner.c" */ +/* #line 1330 "scanner.c" */ kk195: ++KKCURSOR; if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 258 "scanner.re" */ +/* #line 257 "scanner.re" */ { token->opcode = PHVOLT_T_AND; return 0; } -/* #line 1342 "scanner.c" */ +/* #line 1341 "scanner.c" */ kk197: kkch = *++KKCURSOR; if (kkch == 'U') goto kk198; @@ -1352,12 +1351,12 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 253 "scanner.re" */ +/* #line 252 "scanner.re" */ { token->opcode = PHVOLT_T_TRUE; return 0; } -/* #line 1361 "scanner.c" */ +/* #line 1360 "scanner.c" */ kk201: kkch = *++KKCURSOR; if (kkch == 'T') goto kk206; @@ -1376,24 +1375,24 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 243 "scanner.re" */ +/* #line 242 "scanner.re" */ { token->opcode = PHVOLT_T_NULL; return 0; } -/* #line 1385 "scanner.c" */ +/* #line 1384 "scanner.c" */ kk206: ++KKCURSOR; if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 323 "scanner.re" */ +/* #line 322 "scanner.re" */ { s->statement_position++; token->opcode = PHVOLT_T_NOT; return 0; } -/* #line 1397 "scanner.c" */ +/* #line 1396 "scanner.c" */ kk208: kkch = *++KKCURSOR; if (kkch == 'T') goto kk209; @@ -1403,12 +1402,12 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 238 "scanner.re" */ +/* #line 237 "scanner.re" */ { token->opcode = PHVOLT_T_SET; return 0; } -/* #line 1412 "scanner.c" */ +/* #line 1411 "scanner.c" */ kk211: kkch = *++KKCURSOR; if (kkch == 'L') goto kk215; @@ -1423,13 +1422,13 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 222 "scanner.re" */ +/* #line 221 "scanner.re" */ { s->statement_position++; token->opcode = PHVOLT_T_FOR; return 0; } -/* #line 1433 "scanner.c" */ +/* #line 1432 "scanner.c" */ kk215: kkch = *++KKCURSOR; if (kkch == 'S') goto kk216; @@ -1443,12 +1442,12 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 248 "scanner.re" */ +/* #line 247 "scanner.re" */ { token->opcode = PHVOLT_T_FALSE; return 0; } -/* #line 1452 "scanner.c" */ +/* #line 1451 "scanner.c" */ kk219: kkch = *++KKCURSOR; if (kkch == 'S') goto kk268; @@ -1484,13 +1483,13 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 311 "scanner.re" */ +/* #line 310 "scanner.re" */ { s->statement_position++; token->opcode = PHVOLT_T_EXTENDS; return 0; } -/* #line 1494 "scanner.c" */ +/* #line 1493 "scanner.c" */ kk228: kkch = *++KKCURSOR; switch (kkch) { @@ -1554,23 +1553,23 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 285 "scanner.re" */ +/* #line 284 "scanner.re" */ { token->opcode = PHVOLT_T_ENDMACRO; return 0; } -/* #line 1563 "scanner.c" */ +/* #line 1562 "scanner.c" */ kk240: ++KKCURSOR; if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 217 "scanner.re" */ +/* #line 216 "scanner.re" */ { token->opcode = PHVOLT_T_ENDIF; return 0; } -/* #line 1574 "scanner.c" */ +/* #line 1573 "scanner.c" */ kk242: kkch = *++KKCURSOR; if (kkch == 'R') goto kk243; @@ -1580,12 +1579,12 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 228 "scanner.re" */ +/* #line 227 "scanner.re" */ { token->opcode = PHVOLT_T_ENDFOR; return 0; } -/* #line 1589 "scanner.c" */ +/* #line 1588 "scanner.c" */ kk245: kkch = *++KKCURSOR; if (kkch <= 'L') { @@ -1614,12 +1613,12 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 296 "scanner.re" */ +/* #line 295 "scanner.re" */ { token->opcode = PHVOLT_T_ENDCALL; return 0; } -/* #line 1623 "scanner.c" */ +/* #line 1622 "scanner.c" */ kk250: kkch = *++KKCURSOR; if (kkch == 'E') goto kk251; @@ -1629,12 +1628,12 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 347 "scanner.re" */ +/* #line 346 "scanner.re" */ { token->opcode = PHVOLT_T_ENDCACHE; return 0; } -/* #line 1638 "scanner.c" */ +/* #line 1637 "scanner.c" */ kk253: kkch = *++KKCURSOR; if (kkch == 'O') goto kk254; @@ -1652,12 +1651,12 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 274 "scanner.re" */ +/* #line 273 "scanner.re" */ { token->opcode = PHVOLT_T_ENDBLOCK; return 0; } -/* #line 1661 "scanner.c" */ +/* #line 1660 "scanner.c" */ kk258: kkch = *++KKCURSOR; if (kkch == 'T') goto kk259; @@ -1695,13 +1694,13 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 364 "scanner.re" */ +/* #line 363 "scanner.re" */ { s->statement_position++; token->opcode = PHVOLT_T_ENDAUTOESCAPE; return 0; } -/* #line 1705 "scanner.c" */ +/* #line 1704 "scanner.c" */ kk268: kkch = *++KKCURSOR; if (kkch == 'E') goto kk269; @@ -1740,12 +1739,12 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { } } kk270: -/* #line 202 "scanner.re" */ +/* #line 201 "scanner.re" */ { token->opcode = PHVOLT_T_ELSE; return 0; } -/* #line 1749 "scanner.c" */ +/* #line 1748 "scanner.c" */ kk271: kkch = *++KKCURSOR; if (kkch == 'O') goto kk275; @@ -1760,12 +1759,12 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 212 "scanner.re" */ +/* #line 211 "scanner.re" */ { token->opcode = PHVOLT_T_ELSEIF; return 0; } -/* #line 1769 "scanner.c" */ +/* #line 1768 "scanner.c" */ kk275: kkch = *++KKCURSOR; if (kkch == 'R') goto kk276; @@ -1775,24 +1774,24 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 207 "scanner.re" */ +/* #line 206 "scanner.re" */ { token->opcode = PHVOLT_T_ELSEFOR; return 0; } -/* #line 1784 "scanner.c" */ +/* #line 1783 "scanner.c" */ kk278: ++KKCURSOR; if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 196 "scanner.re" */ +/* #line 195 "scanner.re" */ { s->statement_position++; token->opcode = PHVOLT_T_IF; return 0; } -/* #line 1796 "scanner.c" */ +/* #line 1795 "scanner.c" */ kk280: ++KKCURSOR; if ((kkch = *KKCURSOR) <= '[') { @@ -1813,24 +1812,24 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { } } kk281: -/* #line 233 "scanner.re" */ +/* #line 232 "scanner.re" */ { token->opcode = PHVOLT_T_IN; return 0; } -/* #line 1822 "scanner.c" */ +/* #line 1821 "scanner.c" */ kk282: ++KKCURSOR; if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 317 "scanner.re" */ +/* #line 316 "scanner.re" */ { s->statement_position++; token->opcode = PHVOLT_T_IS; return 0; } -/* #line 1834 "scanner.c" */ +/* #line 1833 "scanner.c" */ kk284: kkch = *++KKCURSOR; if (kkch == 'L') goto kk285; @@ -1852,13 +1851,13 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { if (kkbm[0+(kkch = *KKCURSOR)] & 16) { goto kk99; } -/* #line 335 "scanner.re" */ +/* #line 334 "scanner.re" */ { s->statement_position++; token->opcode = PHVOLT_T_INCLUDE; return 0; } -/* #line 1862 "scanner.c" */ +/* #line 1861 "scanner.c" */ kk290: kkch = *++KKCURSOR; if (kkch <= '/') goto kk103; @@ -1880,7 +1879,7 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { if (kkch <= '/') goto kk295; if (kkch <= '9') goto kk293; kk295: -/* #line 188 "scanner.re" */ +/* #line 187 "scanner.re" */ { token->opcode = PHVOLT_T_DOUBLE; token->value = estrndup(start, KKCURSOR - start); @@ -1888,9 +1887,9 @@ int phvolt_get_token(phvolt_scanner_state *s, phvolt_scanner_token *token) { q = KKCURSOR; return 0; } -/* #line 1892 "scanner.c" */ +/* #line 1891 "scanner.c" */ } -/* #line 648 "scanner.re" */ +/* #line 647 "scanner.re" */ } diff --git a/ext/mvc/view/engine/volt/scanner.re b/ext/mvc/view/engine/volt/scanner.re index ae806dbce48..94f5da72470 100644 --- a/ext/mvc/view/engine/volt/scanner.re +++ b/ext/mvc/view/engine/volt/scanner.re @@ -28,8 +28,8 @@ void phvolt_rtrim(phvolt_scanner_token *token) { char *cursor, *removed_str; - unsigned int i; - unsigned char ch; + int i; + char ch; if (token->len > 0) { @@ -58,14 +58,13 @@ void phvolt_rtrim(phvolt_scanner_token *token) { void phvolt_ltrim(phvolt_scanner_token *token) { char *cursor, *removed_str; - unsigned int i; - unsigned char ch; + int i; if (token->len > 0) { cursor = token->value; for (i = 0; i < token->len; i++) { - ch = (*cursor); + char ch = (*cursor); if (ch == '\t' || ch == '\n' || ch == '\r' || ch == ' ' || ch == '\v') { cursor++; continue; diff --git a/ext/paginator/adapter/model.c b/ext/paginator/adapter/model.c index 611a2438724..f6f99d350e8 100644 --- a/ext/paginator/adapter/model.c +++ b/ext/paginator/adapter/model.c @@ -23,6 +23,8 @@ #include "paginator/adapterinterface.h" #include "paginator/exception.h" +#include + #include "kernel/main.h" #include "kernel/memory.h" #include "kernel/object.h" @@ -157,7 +159,7 @@ PHP_METHOD(Phalcon_Paginator_Adapter_Model, getPaginate){ } PHALCON_INIT_VAR(total_pages); - ZVAL_LONG(total_pages, ceil(Z_DVAL_P(possible_pages))); + ZVAL_LONG(total_pages, (long int)ceil(Z_DVAL_P(possible_pages))); if (Z_TYPE_P(items) != IS_OBJECT) { PHALCON_THROW_EXCEPTION_STR(phalcon_paginator_exception_ce, "Invalid data for paginator"); return; diff --git a/ext/phalcon.c b/ext/phalcon.c index 43557f48fb5..d234394cff0 100644 --- a/ext/phalcon.c +++ b/ext/phalcon.c @@ -32,20 +32,6 @@ int nusphere_dbg_present; -zend_class_entry *phalcon_mvc_model_row_ce; -zend_class_entry *phalcon_mvc_model_criteria_ce; -zend_class_entry *phalcon_mvc_model_message_ce; -zend_class_entry *phalcon_mvc_model_manager_ce; -zend_class_entry *phalcon_mvc_model_relation_ce; -zend_class_entry *phalcon_mvc_model_exception_ce; -zend_class_entry *phalcon_mvc_model_queryinterface_ce; -zend_class_entry *phalcon_mvc_model_resultinterface_ce; -zend_class_entry *phalcon_mvc_model_managerinterface_ce; -zend_class_entry *phalcon_mvc_model_criteriainterface_ce; -zend_class_entry *phalcon_mvc_model_relationinterface_ce; -zend_class_entry *phalcon_mvc_model_messageinterface_ce; -zend_class_entry *phalcon_mvc_model_validationfailed_ce; - ZEND_DECLARE_MODULE_GLOBALS(phalcon) #if PHP_VERSION_ID >= 50500 @@ -676,6 +662,7 @@ const #endif zend_module_dep phalcon_deps[] = { ZEND_MOD_REQUIRED("spl") + ZEND_MOD_REQUIRED("date") #if PHALCON_USE_PHP_JSON ZEND_MOD_REQUIRED("json") #else diff --git a/ext/security.c b/ext/security.c index 129c0b89c64..0415f937b70 100644 --- a/ext/security.c +++ b/ext/security.c @@ -24,7 +24,7 @@ #include "http/requestinterface.h" #include "session/adapterinterface.h" -#include +#include #ifdef PHALCON_USE_PHP_HASH #include @@ -751,6 +751,7 @@ PHP_METHOD(Phalcon_Security, pbkdf2) int i_hash_len, block_count, i, j, k; int salt_len = Z_STRLEN_PP(salt); char *s; + div_t d; PHALCON_MM_GROW(); @@ -776,7 +777,9 @@ PHP_METHOD(Phalcon_Security, pbkdf2) PHALCON_INIT_VAR(result); - block_count = ceil((float)i_size / i_hash_len); + d = div(i_size, i_hash_len); + block_count = d.quot + (d.rem ? 1 : 0); + for (i=1; i<=block_count; ++i) { s[salt_len+0] = (unsigned char)(i >> 24); s[salt_len+1] = (unsigned char)(i >> 16); @@ -865,7 +868,7 @@ PHP_METHOD(Phalcon_Security, deriveKey) #if defined(PHALCON_USE_PHP_HASH) { - const php_hash_ops *ops = php_hash_fetch_ops(s_hash, Z_STRLEN_PP(hash)); + const php_hash_ops *ops = php_hash_fetch_ops(s_hash, hash ? (size_t)(Z_STRLEN_PP(hash)) : strlen(s_hash)); void *context; unsigned char *K1, *K2, *digest, *temp, *result, *computed_salt; long int i, j, loops, digest_length; diff --git a/ext/tag.c b/ext/tag.c index d981faf3f9c..b92d27c9827 100644 --- a/ext/tag.c +++ b/ext/tag.c @@ -331,7 +331,7 @@ PHALCON_STATIC void phalcon_tag_render_attributes(zval *code, zval *attributes T zval *escaper, *escaped = NULL, *attrs; zval **value; HashPosition hp; - int i; + uint i; struct str_size_t { const char *str; diff --git a/ext/tests/scanbuild-8.phpt b/ext/tests/scanbuild-8.phpt new file mode 100644 index 00000000000..93e53c11af2 --- /dev/null +++ b/ext/tests/scanbuild-8.phpt @@ -0,0 +1,9 @@ +--TEST-- +Dereference of null pointer in zim_Phalcon_Security_deriveKey() +--SKIPIF-- + +--FILE-- + +--EXPECT-- diff --git a/lemon/lempar.c b/lemon/lempar.c index ee1edbfa7c6..4bd0e6ba140 100644 --- a/lemon/lempar.c +++ b/lemon/lempar.c @@ -210,7 +210,7 @@ static const char *yyRuleName[] = { */ const char *ParseTokenName(int tokenType){ #ifndef NDEBUG - if( tokenType>0 && tokenType<(sizeof(yyTokenName)/sizeof(yyTokenName[0])) ){ + if( tokenType>0 && (size_t)tokenType<(sizeof(yyTokenName)/sizeof(yyTokenName[0])) ){ return yyTokenName[tokenType]; }else{ return "Unknown"; @@ -335,7 +335,7 @@ static int yy_find_shift_action( return YY_NO_ACTION; } i += iLookAhead; - if( i<0 || i>=YY_SZ_ACTTAB || yy_lookahead[i]!=iLookAhead ){ + if( i<0 || i>=(int)YY_SZ_ACTTAB || yy_lookahead[i]!=iLookAhead ){ #ifdef YYFALLBACK int iFallback; /* Fallback token */ if( iLookAhead=YY_SZ_ACTTAB || yy_lookahead[i]!=iLookAhead ){ + if( i<0 || i>=(int)YY_SZ_ACTTAB || yy_lookahead[i]!=iLookAhead ){ return yy_default[stateno]; }else{ return yy_action[i]; @@ -456,7 +456,7 @@ static void yy_reduce( yymsp = &yypParser->yystack[yypParser->yyidx]; #ifndef NDEBUG if( yyTraceFILE && yyruleno>=0 - && yyruleno