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;
-
- 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;
+ 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;
+
+ 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;
- }
- }
-
- /* 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, 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);
+ 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;
+ }
+ }
+
+ /* 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, 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;
-
- 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, '"');
+ char f = 0;
+
+ 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, '"');
}
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
#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
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:
+
+ 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; }
+ [<] { PASSTHRU(); STATE = STATE_TAG; continue; }
+ (any\[<]) { PASSTHRU(); continue; }
*/
- break;
-
- case STATE_TAG:
+ break;
+
+ case STATE_TAG:
/*!re2c
- alpha+ { HANDLE_TAG() /* Sets STATE */; PASSTHRU(); continue; }
- any { PASSTHRU(); STATE = STATE_PLAIN; continue; }
+ alpha+ { HANDLE_TAG() /* Sets STATE */; PASSTHRU(); continue; }
+ any { PASSTHRU(); STATE = STATE_PLAIN; continue; }
*/
- break;
-
- case STATE_NEXT_ARG:
+ 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; }
+ ">" { PASSTHRU(); HANDLE_FORM(); STATE = STATE_PLAIN; continue; }
+ [ \n] { PASSTHRU(); continue; }
+ alpha { YYCURSOR--; STATE = STATE_ARG; continue; }
+ any { PASSTHRU(); continue; }
*/
- break;
+ break;
- case STATE_ARG:
+ case STATE_ARG:
/*!re2c
- alpha+ { PASSTHRU(); HANDLE_ARG(); STATE = STATE_BEFORE_VAL; continue; }
- any { PASSTHRU(); STATE = STATE_NEXT_ARG; continue; }
+ 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));
-
- rest = YYLIMIT - start;
+ scdebug(("stopped in state %d at pos %d (%d:%c)\n", STATE, YYCURSOR - ctx->buf.c, *YYCURSOR, *YYCURSOR));
- 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();
-
- ctx = &BG(url_adapt_state_ex);
-
- smart_str_sets(&ctx->q_name, name);
- smart_str_sets(&ctx->q_value, value);
- mainloop(ctx, src, srclen);
-
- *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;
+ char *ret;
+ url_adapt_state_ex_t *ctx;
+ BLS_FETCH();
+
+ ctx = &BG(url_adapt_state_ex);
+
+ smart_str_sets(&ctx->q_name, name);
+ smart_str_sets(&ctx->q_value, value);
+ mainloop(ctx, src, srclen);
+
+ *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;
}
PHP_RINIT_FUNCTION(url_scanner)
{
- url_adapt_state_ex_t *ctx;
- BLS_FETCH();
+ url_adapt_state_ex_t *ctx;
+ BLS_FETCH();
+
+ ctx = &BG(url_adapt_state_ex);
- ctx = &BG(url_adapt_state_ex);
+ memset(ctx, 0, ((size_t) &((url_adapt_state_ex_t *)0)->tags));
- memset(ctx, 0, ((size_t) &((url_adapt_state_ex_t *)0)->tags));
-
- return SUCCESS;
+ 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();
+
+ ctx = &BG(url_adapt_state_ex);
- smart_str_free(&ctx->result);
- smart_str_free(&ctx->buf);
- smart_str_free(&ctx->tag);
- smart_str_free(&ctx->arg);
+ smart_str_free(&ctx->result);
+ smart_str_free(&ctx->buf);
+ smart_str_free(&ctx->tag);
+ smart_str_free(&ctx->arg);
- return SUCCESS;
+ return SUCCESS;
}
PHP_MINIT_FUNCTION(url_scanner)
{
- REGISTER_INI_ENTRIES();
- return SUCCESS;
+ REGISTER_INI_ENTRIES();
+ return SUCCESS;
}
PHP_MSHUTDOWN_FUNCTION(url_scanner)
{
- BLS_FETCH();
+ BLS_FETCH();
- UNREGISTER_INI_ENTRIES();
- zend_hash_destroy(BG(url_adapt_state_ex).tags);
- free(BG(url_adapt_state_ex).tags);
- return SUCCESS;
+ UNREGISTER_INI_ENTRIES();
+ zend_hash_destroy(BG(url_adapt_state_ex).tags);
+ free(BG(url_adapt_state_ex).tags);
+ return SUCCESS;
}
-#endif
\ No newline at end of file
+#endif