mirror of
https://github.com/php/php-src.git
synced 2026-04-14 11:32:11 +02:00
make compile again
This commit is contained in:
@@ -703,6 +703,8 @@ PHP_MINIT_FUNCTION(url_scanner)
|
||||
|
||||
PHP_MSHUTDOWN_FUNCTION(url_scanner)
|
||||
{
|
||||
BLS_FETCH();
|
||||
|
||||
UNREGISTER_INI_ENTRIES();
|
||||
zend_hash_destroy(BG(url_adapt_state_ex).tags);
|
||||
free(BG(url_adapt_state_ex).tags);
|
||||
|
||||
@@ -41,117 +41,117 @@
|
||||
|
||||
static PHP_INI_MH(OnUpdateTags)
|
||||
{
|
||||
url_adapt_state_ex_t *ctx;
|
||||
char *key;
|
||||
char *lasts;
|
||||
char *tmp;
|
||||
BLS_FETCH();
|
||||
|
||||
ctx = &BG(url_adapt_state_ex);
|
||||
|
||||
tmp = estrndup(new_value, new_value_length);
|
||||
|
||||
if (ctx->tags)
|
||||
zend_hash_destroy(ctx->tags);
|
||||
else
|
||||
ctx->tags = malloc(sizeof(HashTable));
|
||||
|
||||
zend_hash_init(ctx->tags, 0, NULL, NULL, 1);
|
||||
|
||||
for (key = php_strtok_r(tmp, ",", &lasts);
|
||||
key;
|
||||
key = php_strtok_r(NULL, ",", &lasts)) {
|
||||
char *val;
|
||||
url_adapt_state_ex_t *ctx;
|
||||
char *key;
|
||||
char *lasts;
|
||||
char *tmp;
|
||||
BLS_FETCH();
|
||||
|
||||
val = strchr(key, '=');
|
||||
if (val) {
|
||||
char *q;
|
||||
int keylen;
|
||||
|
||||
*val++ = '\0';
|
||||
for (q = key; *q; q++)
|
||||
*q = tolower(*q);
|
||||
keylen = q - key;
|
||||
/* key is stored withOUT NUL
|
||||
val is stored WITH NUL */
|
||||
zend_hash_add(ctx->tags, key, keylen, val, strlen(val)+1, NULL);
|
||||
}
|
||||
}
|
||||
ctx = &BG(url_adapt_state_ex);
|
||||
|
||||
efree(tmp);
|
||||
tmp = estrndup(new_value, new_value_length);
|
||||
|
||||
return SUCCESS;
|
||||
if (ctx->tags)
|
||||
zend_hash_destroy(ctx->tags);
|
||||
else
|
||||
ctx->tags = malloc(sizeof(HashTable));
|
||||
|
||||
zend_hash_init(ctx->tags, 0, NULL, NULL, 1);
|
||||
|
||||
for (key = php_strtok_r(tmp, ",", &lasts);
|
||||
key;
|
||||
key = php_strtok_r(NULL, ",", &lasts)) {
|
||||
char *val;
|
||||
|
||||
val = strchr(key, '=');
|
||||
if (val) {
|
||||
char *q;
|
||||
int keylen;
|
||||
|
||||
*val++ = '\0';
|
||||
for (q = key; *q; q++)
|
||||
*q = tolower(*q);
|
||||
keylen = q - key;
|
||||
/* key is stored withOUT NUL
|
||||
val is stored WITH NUL */
|
||||
zend_hash_add(ctx->tags, key, keylen, val, strlen(val)+1, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
efree(tmp);
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
PHP_INI_BEGIN()
|
||||
STD_PHP_INI_ENTRY("url_rewriter.tags", "a=href,area=href,frame=src,form=fakeentry", PHP_INI_ALL, OnUpdateTags, url_adapt_state_ex, php_basic_globals, basic_globals)
|
||||
STD_PHP_INI_ENTRY("url_rewriter.tags", "a=href,area=href,frame=src,form=fakeentry", PHP_INI_ALL, OnUpdateTags, url_adapt_state_ex, php_basic_globals, basic_globals)
|
||||
PHP_INI_END()
|
||||
|
||||
static inline void append_modified_url(smart_str *url, smart_str *dest, smart_str *name, smart_str *val, const char *separator)
|
||||
{
|
||||
register const char *p, *q;
|
||||
const char *bash = NULL;
|
||||
char sep = '?';
|
||||
|
||||
q = url->c + url->len;
|
||||
|
||||
for (p = url->c; p < q; p++) {
|
||||
switch(*p) {
|
||||
case ':':
|
||||
smart_str_append(dest, url);
|
||||
return;
|
||||
case '?':
|
||||
sep = *separator;
|
||||
break;
|
||||
case '#':
|
||||
bash = p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
register const char *p, *q;
|
||||
const char *bash = NULL;
|
||||
char sep = '?';
|
||||
|
||||
/* Don't modify URLs of the format "#mark" */
|
||||
if (bash - url->c == 0) {
|
||||
smart_str_append(dest, url);
|
||||
return;
|
||||
}
|
||||
q = url->c + url->len;
|
||||
|
||||
if (bash)
|
||||
smart_str_appendl(dest, url->c, bash - url->c);
|
||||
else
|
||||
smart_str_append(dest, url);
|
||||
for (p = url->c; p < q; p++) {
|
||||
switch(*p) {
|
||||
case ':':
|
||||
smart_str_append(dest, url);
|
||||
return;
|
||||
case '?':
|
||||
sep = *separator;
|
||||
break;
|
||||
case '#':
|
||||
bash = p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
smart_str_appendc(dest, sep);
|
||||
smart_str_append(dest, name);
|
||||
smart_str_appendc(dest, '=');
|
||||
smart_str_append(dest, val);
|
||||
/* Don't modify URLs of the format "#mark" */
|
||||
if (bash - url->c == 0) {
|
||||
smart_str_append(dest, url);
|
||||
return;
|
||||
}
|
||||
|
||||
if (bash)
|
||||
smart_str_appendl(dest, bash, q - bash);
|
||||
if (bash)
|
||||
smart_str_appendl(dest, url->c, bash - url->c);
|
||||
else
|
||||
smart_str_append(dest, url);
|
||||
|
||||
smart_str_appendc(dest, sep);
|
||||
smart_str_append(dest, name);
|
||||
smart_str_appendc(dest, '=');
|
||||
smart_str_append(dest, val);
|
||||
|
||||
if (bash)
|
||||
smart_str_appendl(dest, bash, q - bash);
|
||||
}
|
||||
|
||||
static inline void tag_arg(url_adapt_state_ex_t *ctx PLS_DC)
|
||||
{
|
||||
char f = 0;
|
||||
char f = 0;
|
||||
|
||||
if (strncasecmp(ctx->arg.c, ctx->lookup_data, ctx->arg.len) == 0)
|
||||
f = 1;
|
||||
if (strncasecmp(ctx->arg.c, ctx->lookup_data, ctx->arg.len) == 0)
|
||||
f = 1;
|
||||
|
||||
smart_str_appendc(&ctx->result, '"');
|
||||
if (f) {
|
||||
append_modified_url(&ctx->val, &ctx->result, &ctx->q_name, &ctx->q_value, PG(arg_separator));
|
||||
} else {
|
||||
smart_str_append(&ctx->result, &ctx->val);
|
||||
}
|
||||
smart_str_appendc(&ctx->result, '"');
|
||||
smart_str_appendc(&ctx->result, '"');
|
||||
if (f) {
|
||||
append_modified_url(&ctx->val, &ctx->result, &ctx->q_name, &ctx->q_value, PG(arg_separator));
|
||||
} else {
|
||||
smart_str_append(&ctx->result, &ctx->val);
|
||||
}
|
||||
smart_str_appendc(&ctx->result, '"');
|
||||
}
|
||||
|
||||
enum {
|
||||
STATE_PLAIN,
|
||||
STATE_TAG,
|
||||
STATE_NEXT_ARG,
|
||||
STATE_ARG,
|
||||
STATE_BEFORE_VAL,
|
||||
STATE_VAL
|
||||
STATE_PLAIN,
|
||||
STATE_TAG,
|
||||
STATE_NEXT_ARG,
|
||||
STATE_ARG,
|
||||
STATE_BEFORE_VAL,
|
||||
STATE_VAL
|
||||
};
|
||||
|
||||
#define YYFILL(n) goto stop
|
||||
@@ -162,43 +162,43 @@ enum {
|
||||
#define STATE ctx->state
|
||||
|
||||
#define PASSTHRU() {\
|
||||
smart_str_appendl(&ctx->result, start, YYCURSOR - start); \
|
||||
smart_str_appendl(&ctx->result, start, YYCURSOR - start); \
|
||||
}
|
||||
|
||||
#define HANDLE_FORM() {\
|
||||
if (ctx->tag.len == 4 && strncasecmp(ctx->tag.c, "form", 4) == 0) {\
|
||||
smart_str_appends(&ctx->result, "<INPUT TYPE=HIDDEN NAME=\""); \
|
||||
smart_str_append(&ctx->result, &ctx->q_name); \
|
||||
smart_str_appends(&ctx->result, "\" VALUE=\""); \
|
||||
smart_str_append(&ctx->result, &ctx->q_value); \
|
||||
smart_str_appends(&ctx->result, "\">"); \
|
||||
} \
|
||||
if (ctx->tag.len == 4 && strncasecmp(ctx->tag.c, "form", 4) == 0) {\
|
||||
smart_str_appends(&ctx->result, "<INPUT TYPE=HIDDEN NAME=\""); \
|
||||
smart_str_append(&ctx->result, &ctx->q_name); \
|
||||
smart_str_appends(&ctx->result, "\" VALUE=\""); \
|
||||
smart_str_append(&ctx->result, &ctx->q_value); \
|
||||
smart_str_appends(&ctx->result, "\">"); \
|
||||
} \
|
||||
}
|
||||
|
||||
/*
|
||||
* HANDLE_TAG copies the HTML Tag and checks whether we
|
||||
* HANDLE_TAG copies the HTML Tag and checks whether we
|
||||
* have that tag in our table. If we might modify it,
|
||||
* we continue to scan the tag, otherwise we simply copy the complete
|
||||
* HTML stuff to the result buffer.
|
||||
*/
|
||||
|
||||
#define HANDLE_TAG() {\
|
||||
int ok = 0; \
|
||||
int i; \
|
||||
smart_str_copyl(&ctx->tag, start, YYCURSOR - start); \
|
||||
for (i = 0; i < ctx->tag.len; i++) \
|
||||
ctx->tag.c[i] = tolower(ctx->tag.c[i]); \
|
||||
if (zend_hash_find(ctx->tags, ctx->tag.c, ctx->tag.len, &ctx->lookup_data) == SUCCESS) \
|
||||
ok = 1; \
|
||||
STATE = ok ? STATE_NEXT_ARG : STATE_PLAIN; \
|
||||
int ok = 0; \
|
||||
int i; \
|
||||
smart_str_copyl(&ctx->tag, start, YYCURSOR - start); \
|
||||
for (i = 0; i < ctx->tag.len; i++) \
|
||||
ctx->tag.c[i] = tolower(ctx->tag.c[i]); \
|
||||
if (zend_hash_find(ctx->tags, ctx->tag.c, ctx->tag.len, &ctx->lookup_data) == SUCCESS) \
|
||||
ok = 1; \
|
||||
STATE = ok ? STATE_NEXT_ARG : STATE_PLAIN; \
|
||||
}
|
||||
|
||||
#define HANDLE_ARG() {\
|
||||
smart_str_copyl(&ctx->arg, start, YYCURSOR - start); \
|
||||
smart_str_copyl(&ctx->arg, start, YYCURSOR - start); \
|
||||
}
|
||||
#define HANDLE_VAL(quotes) {\
|
||||
smart_str_setl(&ctx->val, start + quotes, YYCURSOR - start - quotes * 2); \
|
||||
tag_arg(ctx PLS_CC); \
|
||||
smart_str_setl(&ctx->val, start + quotes, YYCURSOR - start - quotes * 2); \
|
||||
tag_arg(ctx PLS_CC); \
|
||||
}
|
||||
|
||||
#ifdef SCANNER_DEBUG
|
||||
@@ -209,147 +209,149 @@ enum {
|
||||
|
||||
static inline void mainloop(url_adapt_state_ex_t *ctx, const char *newdata, size_t newlen)
|
||||
{
|
||||
char *end, *q;
|
||||
char *xp;
|
||||
char *start;
|
||||
int rest;
|
||||
PLS_FETCH();
|
||||
char *end, *q;
|
||||
char *xp;
|
||||
char *start;
|
||||
int rest;
|
||||
PLS_FETCH();
|
||||
|
||||
smart_str_appendl(&ctx->buf, newdata, newlen);
|
||||
|
||||
YYCURSOR = ctx->buf.c;
|
||||
YYLIMIT = ctx->buf.c + ctx->buf.len;
|
||||
smart_str_appendl(&ctx->buf, newdata, newlen);
|
||||
|
||||
YYCURSOR = ctx->buf.c;
|
||||
YYLIMIT = ctx->buf.c + ctx->buf.len;
|
||||
|
||||
/*!re2c
|
||||
any = [\000-\377];
|
||||
alpha = [a-zA-Z];
|
||||
*/
|
||||
|
||||
while(1) {
|
||||
start = YYCURSOR;
|
||||
scdebug(("state %d at %s\n", STATE, YYCURSOR));
|
||||
switch(STATE) {
|
||||
|
||||
case STATE_PLAIN:
|
||||
/*!re2c
|
||||
[<] { PASSTHRU(); STATE = STATE_TAG; continue; }
|
||||
(any\[<]) { PASSTHRU(); continue; }
|
||||
*/
|
||||
break;
|
||||
|
||||
case STATE_TAG:
|
||||
/*!re2c
|
||||
alpha+ { HANDLE_TAG() /* Sets STATE */; PASSTHRU(); continue; }
|
||||
any { PASSTHRU(); STATE = STATE_PLAIN; continue; }
|
||||
*/
|
||||
break;
|
||||
|
||||
case STATE_NEXT_ARG:
|
||||
/*!re2c
|
||||
">" { PASSTHRU(); HANDLE_FORM(); STATE = STATE_PLAIN; continue; }
|
||||
[ \n] { PASSTHRU(); continue; }
|
||||
alpha { YYCURSOR--; STATE = STATE_ARG; continue; }
|
||||
any { PASSTHRU(); continue; }
|
||||
*/
|
||||
break;
|
||||
|
||||
case STATE_ARG:
|
||||
while(1) {
|
||||
start = YYCURSOR;
|
||||
scdebug(("state %d at %s\n", STATE, YYCURSOR));
|
||||
switch(STATE) {
|
||||
|
||||
case STATE_PLAIN:
|
||||
/*!re2c
|
||||
alpha+ { PASSTHRU(); HANDLE_ARG(); STATE = STATE_BEFORE_VAL; continue; }
|
||||
any { PASSTHRU(); STATE = STATE_NEXT_ARG; continue; }
|
||||
[<] { PASSTHRU(); STATE = STATE_TAG; continue; }
|
||||
(any\[<]) { PASSTHRU(); continue; }
|
||||
*/
|
||||
break;
|
||||
|
||||
case STATE_TAG:
|
||||
/*!re2c
|
||||
alpha+ { HANDLE_TAG() /* Sets STATE */; PASSTHRU(); continue; }
|
||||
any { PASSTHRU(); STATE = STATE_PLAIN; continue; }
|
||||
*/
|
||||
break;
|
||||
|
||||
case STATE_NEXT_ARG:
|
||||
/*!re2c
|
||||
">" { PASSTHRU(); HANDLE_FORM(); STATE = STATE_PLAIN; continue; }
|
||||
[ \n] { PASSTHRU(); continue; }
|
||||
alpha { YYCURSOR--; STATE = STATE_ARG; continue; }
|
||||
any { PASSTHRU(); continue; }
|
||||
*/
|
||||
break;
|
||||
|
||||
case STATE_ARG:
|
||||
/*!re2c
|
||||
alpha+ { PASSTHRU(); HANDLE_ARG(); STATE = STATE_BEFORE_VAL; continue; }
|
||||
any { PASSTHRU(); STATE = STATE_NEXT_ARG; continue; }
|
||||
*/
|
||||
|
||||
case STATE_BEFORE_VAL:
|
||||
case STATE_BEFORE_VAL:
|
||||
/*!re2c
|
||||
[ ]* "=" [ ]* { PASSTHRU(); STATE = STATE_VAL; continue; }
|
||||
any { YYCURSOR--; STATE = STATE_NEXT_ARG; continue; }
|
||||
[ ]* "=" [ ]* { PASSTHRU(); STATE = STATE_VAL; continue; }
|
||||
any { YYCURSOR--; STATE = STATE_NEXT_ARG; continue; }
|
||||
*/
|
||||
break;
|
||||
break;
|
||||
|
||||
case STATE_VAL:
|
||||
case STATE_VAL:
|
||||
/*!re2c
|
||||
["] (any\[">])* ["] { HANDLE_VAL(1); STATE = STATE_NEXT_ARG; continue; }
|
||||
['] (any\['>])* ['] { HANDLE_VAL(1); STATE = STATE_NEXT_ARG; continue; }
|
||||
(any\[ \n>"])+ { HANDLE_VAL(0); STATE = STATE_NEXT_ARG; continue; }
|
||||
any { PASSTHRU(); STATE = STATE_NEXT_ARG; continue; }
|
||||
["] (any\[">])* ["] { HANDLE_VAL(1); STATE = STATE_NEXT_ARG; continue; }
|
||||
['] (any\['>])* ['] { HANDLE_VAL(1); STATE = STATE_NEXT_ARG; continue; }
|
||||
(any\[ \n>"])+ { HANDLE_VAL(0); STATE = STATE_NEXT_ARG; continue; }
|
||||
any { PASSTHRU(); STATE = STATE_NEXT_ARG; continue; }
|
||||
*/
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
stop:
|
||||
scdebug(("stopped in state %d at pos %d (%d:%c)\n", STATE, YYCURSOR - ctx->buf.c, *YYCURSOR, *YYCURSOR));
|
||||
scdebug(("stopped in state %d at pos %d (%d:%c)\n", STATE, YYCURSOR - ctx->buf.c, *YYCURSOR, *YYCURSOR));
|
||||
|
||||
rest = YYLIMIT - start;
|
||||
|
||||
if (rest) memmove(ctx->buf.c, start, rest);
|
||||
ctx->buf.len = rest;
|
||||
rest = YYLIMIT - start;
|
||||
|
||||
if (rest) memmove(ctx->buf.c, start, rest);
|
||||
ctx->buf.len = rest;
|
||||
}
|
||||
|
||||
char *url_adapt_ext(const char *src, size_t srclen, const char *name, const char *value, size_t *newlen)
|
||||
{
|
||||
char *ret;
|
||||
url_adapt_state_ex_t *ctx;
|
||||
BLS_FETCH();
|
||||
char *ret;
|
||||
url_adapt_state_ex_t *ctx;
|
||||
BLS_FETCH();
|
||||
|
||||
ctx = &BG(url_adapt_state_ex);
|
||||
ctx = &BG(url_adapt_state_ex);
|
||||
|
||||
smart_str_sets(&ctx->q_name, name);
|
||||
smart_str_sets(&ctx->q_value, value);
|
||||
mainloop(ctx, src, srclen);
|
||||
smart_str_sets(&ctx->q_name, name);
|
||||
smart_str_sets(&ctx->q_value, value);
|
||||
mainloop(ctx, src, srclen);
|
||||
|
||||
*newlen = ctx->result.len;
|
||||
*newlen = ctx->result.len;
|
||||
|
||||
if (ctx->result.len == 0) {
|
||||
return strdup("");
|
||||
}
|
||||
smart_str_0(&ctx->result);
|
||||
ret = malloc(ctx->result.len + 1);
|
||||
memcpy(ret, ctx->result.c, ctx->result.len + 1);
|
||||
|
||||
ctx->result.len = 0;
|
||||
return ret;
|
||||
if (ctx->result.len == 0) {
|
||||
return strdup("");
|
||||
}
|
||||
smart_str_0(&ctx->result);
|
||||
ret = malloc(ctx->result.len + 1);
|
||||
memcpy(ret, ctx->result.c, ctx->result.len + 1);
|
||||
|
||||
ctx->result.len = 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
PHP_RINIT_FUNCTION(url_scanner)
|
||||
{
|
||||
url_adapt_state_ex_t *ctx;
|
||||
BLS_FETCH();
|
||||
|
||||
ctx = &BG(url_adapt_state_ex);
|
||||
url_adapt_state_ex_t *ctx;
|
||||
BLS_FETCH();
|
||||
|
||||
memset(ctx, 0, ((size_t) &((url_adapt_state_ex_t *)0)->tags));
|
||||
ctx = &BG(url_adapt_state_ex);
|
||||
|
||||
return SUCCESS;
|
||||
memset(ctx, 0, ((size_t) &((url_adapt_state_ex_t *)0)->tags));
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
PHP_RSHUTDOWN_FUNCTION(url_scanner)
|
||||
{
|
||||
url_adapt_state_ex_t *ctx;
|
||||
BLS_FETCH();
|
||||
|
||||
ctx = &BG(url_adapt_state_ex);
|
||||
url_adapt_state_ex_t *ctx;
|
||||
BLS_FETCH();
|
||||
|
||||
smart_str_free(&ctx->result);
|
||||
smart_str_free(&ctx->buf);
|
||||
smart_str_free(&ctx->tag);
|
||||
smart_str_free(&ctx->arg);
|
||||
ctx = &BG(url_adapt_state_ex);
|
||||
|
||||
return SUCCESS;
|
||||
smart_str_free(&ctx->result);
|
||||
smart_str_free(&ctx->buf);
|
||||
smart_str_free(&ctx->tag);
|
||||
smart_str_free(&ctx->arg);
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
PHP_MINIT_FUNCTION(url_scanner)
|
||||
{
|
||||
REGISTER_INI_ENTRIES();
|
||||
return SUCCESS;
|
||||
REGISTER_INI_ENTRIES();
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
PHP_MSHUTDOWN_FUNCTION(url_scanner)
|
||||
{
|
||||
UNREGISTER_INI_ENTRIES();
|
||||
zend_hash_destroy(BG(url_adapt_state_ex).tags);
|
||||
free(BG(url_adapt_state_ex).tags);
|
||||
return SUCCESS;
|
||||
BLS_FETCH();
|
||||
|
||||
UNREGISTER_INI_ENTRIES();
|
||||
zend_hash_destroy(BG(url_adapt_state_ex).tags);
|
||||
free(BG(url_adapt_state_ex).tags);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
Reference in New Issue
Block a user