summaryrefslogtreecommitdiff
path: root/ext/standard/url_scanner_ex.c
diff options
context:
space:
mode:
authorSascha Schumann <sas@php.net>2000-09-19 17:32:27 +0000
committerSascha Schumann <sas@php.net>2000-09-19 17:32:27 +0000
commit4b3fb7b05ecdb583f26bec1fb2f994e57dc5f5a3 (patch)
tree9af0dc8927c44f6ff5a98d022c70a207fd490a01 /ext/standard/url_scanner_ex.c
parentd9d65f18e9eec078f76cbf3bc95833cde055c8a3 (diff)
downloadphp-git-4b3fb7b05ecdb583f26bec1fb2f994e57dc5f5a3.tar.gz
Add new URL scanner. This version is up to 20% faster. It will be
enabled by default once I'm sure that it works in every case. To enable it, apply s/url_adapt_ext/url_adapt_ext_ex/ to session.c
Diffstat (limited to 'ext/standard/url_scanner_ex.c')
-rw-r--r--ext/standard/url_scanner_ex.c756
1 files changed, 756 insertions, 0 deletions
diff --git a/ext/standard/url_scanner_ex.c b/ext/standard/url_scanner_ex.c
new file mode 100644
index 0000000000..8ae8a4d217
--- /dev/null
+++ b/ext/standard/url_scanner_ex.c
@@ -0,0 +1,756 @@
+/* Generated by re2c 0.5 on Tue Sep 19 19:28:00 2000 */
+#line 1 "/home/sas/src/php4/ext/standard/url_scanner_ex.re"
+/*
+ +----------------------------------------------------------------------+
+ | PHP version 4.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 2.02 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available at through the world-wide-web at |
+ | http://www.php.net/license/2_02.txt. |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: Sascha Schumann <sascha@schumann.cx> |
+ +----------------------------------------------------------------------+
+*/
+
+#include "php.h"
+
+#ifdef TRANS_SID
+
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "php_globals.h"
+#define STATE_TAG SOME_OTHER_STATE_TAG
+#include "basic_functions.h"
+#undef STATE_TAG
+
+#define url_adapt_ext url_adapt_ext_ex
+#define url_scanner url_scanner_ex
+#define url_adapt_state url_adapt_state_ex
+#define url_adapt_state_t url_adapt_state_ex_t
+
+static inline void smart_str_append(smart_str *dest, smart_str *src)
+{
+ size_t newlen;
+
+ if (!dest->c)
+ dest->len = dest->a = 0;
+
+ newlen = dest->len + src->len;
+ if (newlen >= dest->a) {
+ dest->c = realloc(dest->c, newlen + 101);
+ dest->a = newlen + 100;
+ }
+ memcpy(dest->c + dest->len, src->c, src->len);
+ dest->c[dest->len = newlen] = '\0';
+}
+
+static inline void smart_str_free(smart_str *s)
+{
+ if (s->c) {
+ free(s->c);
+ s->c = NULL;
+ }
+ s->len = 0;
+}
+
+static inline void smart_str_copyl(smart_str *dest, const char *src, size_t len)
+{
+ dest->c = realloc(dest->c, len + 1);
+ memcpy(dest->c, src, len);
+ dest->c[len] = '\0';
+ dest->a = dest->len = len;
+}
+
+static inline void smart_str_appendl(smart_str *dest, const char *src, size_t len)
+{
+ smart_str s;
+
+ s.c = (char *) src;
+ s.len = len;
+
+ smart_str_append(dest, &s);
+}
+
+static inline void smart_str_appends(smart_str *dest, char *src)
+{
+ smart_str_appendl(dest, src, strlen(src));
+}
+
+static inline void attach_url(smart_str *url, smart_str *name, smart_str *val, char *separator)
+{
+ if (strchr(url->c, ':')) return;
+
+ if (strchr(url->c, '?'))
+ smart_str_appendl(url, separator, 1);
+ else
+ smart_str_appendl(url, "?", 1);
+
+ smart_str_append(url, name);
+ smart_str_appendl(url, "=", 1);
+ smart_str_append(url, val);
+}
+
+static char *check_tag_arg[] = {
+ "a", "href",
+ "area", "href",
+ "frame", "source",
+ "img", "src",
+ NULL
+};
+
+static inline void tag_arg(url_adapt_state_t *ctx PLS_CC)
+{
+ char f = 0;
+ int i;
+
+ for (i = 0; check_tag_arg[i]; i += 2) {
+ if (strcasecmp(ctx->tag.c, check_tag_arg[i]) == 0
+ && strcasecmp(ctx->arg.c, check_tag_arg[i + 1]) == 0) {
+ f = 1;
+ break;
+ }
+ }
+
+ smart_str_appends(&ctx->result, "\"");
+ if (f) {
+ attach_url(&ctx->para, &ctx->name, &ctx->value, PG(arg_separator));
+ }
+ smart_str_append(&ctx->result, &ctx->para);
+ smart_str_appends(&ctx->result, "\"");
+}
+
+#line 131
+
+
+#define NEXT goto nextiter
+
+#define COPY_ALL \
+ smart_str_appendl(&ctx->result, start, YYCURSOR - start); \
+ start = NULL; \
+ NEXT
+
+#define YYFILL(n) goto finish
+#define YYCTYPE unsigned char
+#define YYLIMIT (ctx->work.c+ctx->work.len)
+#define YYCURSOR cursor
+#define YYMARKER marker
+
+#define HANDLE_FORM \
+ if (strcasecmp(ctx->tag.c, "form") == 0) { \
+ smart_str_appends(&ctx->result, "><INPUT TYPE=HIDDEN NAME=\""); \
+ smart_str_append(&ctx->result, &ctx->name); \
+ smart_str_appends(&ctx->result, "\" VALUE=\""); \
+ smart_str_append(&ctx->result, &ctx->value); \
+ smart_str_appends(&ctx->result, "\""); \
+ }
+
+#define GO(n) ctx->state = n
+
+enum {
+ STATE_PLAIN,
+ STATE_TAG,
+ STATE_NEXT_ARG,
+ STATE_ARG,
+ STATE_PARA
+};
+
+static void mainloop(url_adapt_state_t *ctx, smart_str *newstuff)
+{
+ char *para_start, *arg_start, *tag_start;
+ char *start;
+ char *cursor, *marker;
+ PLS_FETCH();
+
+ arg_start = para_start = tag_start = NULL;
+ smart_str_append(&ctx->work, newstuff);
+ smart_str_free(&ctx->result);
+
+ cursor = ctx->work.c;
+
+ while (YYCURSOR < YYLIMIT) {
+ start = YYCURSOR;
+
+// printf("state %d:%s'\n", ctx->state, YYCURSOR);
+ switch (ctx->state) {
+
+ case STATE_PLAIN:
+{
+ YYCTYPE yych;
+ unsigned int yyaccept;
+ static unsigned char yybm[] = {
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 0, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ };
+ goto yy0;
+yy1: ++YYCURSOR;
+yy0:
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+ if(yybm[0+yych] & 128) goto yy4;
+yy2: yych = *++YYCURSOR;
+yy3:
+#line 186
+ { tag_start = YYCURSOR; GO(STATE_TAG); COPY_ALL;}
+yy4: ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+yy5: if(yybm[0+yych] & 128) goto yy4;
+yy6:
+#line 187
+ { COPY_ALL; }
+}
+#line 188
+
+ break;
+
+ case STATE_TAG:
+{
+ YYCTYPE yych;
+ unsigned int yyaccept;
+ static unsigned char yybm[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 0, 0, 0, 0, 0,
+ 0, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ };
+ goto yy7;
+yy8: ++YYCURSOR;
+yy7:
+ if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+ yych = *YYCURSOR;
+ if(yych <= '@') goto yy11;
+ if(yych <= 'Z') goto yy9;
+ if(yych <= '`') goto yy11;
+ if(yych >= '{') goto yy11;
+yy9: yyaccept = 0;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if(yybm[0+yych] & 128) goto yy14;
+ if(yych == ' ') goto yy12;
+ if(yych == '>') goto yy12;
+yy10:
+#line 203
+ {
+ YYCURSOR--;
+ GO(STATE_PLAIN);
+ tag_start = NULL;
+ NEXT;
+ }
+yy11: yych = *++YYCURSOR;
+ goto yy10;
+yy12: yych = *++YYCURSOR;
+yy13:
+#line 193
+ {
+ YYCURSOR--;
+ arg_start = YYCURSOR;
+ smart_str_copyl(&ctx->tag, start, YYCURSOR - start);
+#ifdef DEBUG
+ printf("TAG(%s)\n", ctx->tag.c);
+#endif
+ GO(STATE_NEXT_ARG);
+ COPY_ALL;
+ }
+yy14: ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+yy15: if(yybm[0+yych] & 128) goto yy14;
+ if(yych == ' ') goto yy12;
+ if(yych == '>') goto yy12;
+yy16: YYCURSOR = YYMARKER;
+ switch(yyaccept){
+ case 0: goto yy10;
+ }
+}
+#line 209
+
+ break;
+
+ case STATE_NEXT_ARG:
+{
+ YYCTYPE yych;
+ unsigned int yyaccept;
+ static unsigned char yybm[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 128, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ };
+ goto yy17;
+yy18: ++YYCURSOR;
+yy17:
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+ if(yybm[0+yych] & 128) goto yy20;
+ if(yych == '>') goto yy23;
+yy19:yy20: ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+yy21: if(yybm[0+yych] & 128) goto yy20;
+yy22:
+#line 214
+ {
+ GO(STATE_ARG);
+ NEXT;
+ }
+yy23: yych = *++YYCURSOR;
+yy24:
+#line 218
+ {
+ HANDLE_FORM;
+ GO(STATE_PLAIN);
+ tag_start = NULL;
+ COPY_ALL;
+ }
+}
+#line 224
+
+ break;
+
+ case STATE_ARG:
+ smart_str_appendl(&ctx->result, " ", 1);
+{
+ YYCTYPE yych;
+ unsigned int yyaccept;
+ static unsigned char yybm[] = {
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 128, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 0, 0, 64,
+ 64, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 64, 64, 64, 64, 64,
+ 64, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ };
+ goto yy25;
+yy26: ++YYCURSOR;
+yy25:
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+ if(yybm[0+yych] & 32) goto yy28;
+ if(yych == ' ') goto yy27;
+ if(yych <= '<') goto yy30;
+ if(yych >= '?') goto yy30;
+yy27:
+#line 239
+ {
+ arg_start = YYCURSOR;
+ ctx->state--;
+ COPY_ALL;
+ }
+yy28: yyaccept = 0;
+ YYMARKER = ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+yy29: if(yybm[0+yych] & 128) goto yy32;
+ if(yych <= '@'){
+ if(yych <= '<') goto yy30;
+ if(yych <= '=') goto yy35;
+ if(yych <= '>') goto yy27;
+ } else {
+ if(yych <= 'Z') goto yy28;
+ if(yych <= '`') goto yy30;
+ if(yych <= 'z') goto yy28;
+ }
+yy30: ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+yy31: if(yybm[0+yych] & 64) goto yy30;
+ goto yy27;
+yy32: ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+yy33: if(yybm[0+yych] & 128) goto yy32;
+ if(yych == '=') goto yy35;
+yy34: YYCURSOR = YYMARKER;
+ switch(yyaccept){
+ case 0: goto yy27;
+ }
+yy35: ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+yy36: if(yych == ' ') goto yy35;
+yy37:
+#line 230
+ {
+ smart_str_copyl(&ctx->arg, start, YYCURSOR - start - 1);
+#ifdef DEBUG
+ printf("ARG(%s)\n", ctx->arg.c);
+#endif
+ para_start = YYCURSOR;
+ ctx->state++;
+ COPY_ALL;
+ }
+}
+#line 244
+
+ break;
+
+ case STATE_PARA:
+{
+ YYCTYPE yych;
+ unsigned int yyaccept;
+ static unsigned char yybm[] = {
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 128, 224, 32, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 0, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 0, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ };
+ goto yy38;
+yy39: ++YYCURSOR;
+yy38:
+ if((YYLIMIT - YYCURSOR) < 4) YYFILL(4);
+ yych = *YYCURSOR;
+ if(yych <= '"'){
+ if(yych == ' ') goto yy43;
+ if(yych <= '!') goto yy42;
+ } else {
+ if(yych <= '>'){
+ if(yych <= '=') goto yy42;
+ goto yy43;
+ } else {
+ if(yych == '^') goto yy43;
+ goto yy42;
+ }
+ }
+yy40: yyaccept = 0;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if(yych != '^') goto yy51;
+yy41:
+#line 273
+ {
+ YYCURSOR--;
+ ctx->state = 2;
+ NEXT;
+ }
+yy42: yyaccept = 0;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if(yych == '^') goto yy41;
+ goto yy47;
+yy43: yych = *++YYCURSOR;
+ goto yy41;
+yy44: yych = *++YYCURSOR;
+yy45:
+#line 261
+ {
+ YYCURSOR--;
+ para_start = NULL;
+ smart_str_copyl(&ctx->para, start, YYCURSOR - start);
+#ifdef DEBUG
+ printf("PARA(%s)\n", ctx->para.c);
+#endif
+ tag_arg(ctx PLS_DC);
+ arg_start = YYCURSOR;
+ GO(STATE_NEXT_ARG);
+ NEXT;
+ }
+yy46: ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+yy47: if(yybm[0+yych] & 32) goto yy46;
+ if(yych <= ']') goto yy44;
+yy48: YYCURSOR = YYMARKER;
+ switch(yyaccept){
+ case 1: goto yy45;
+ case 0: goto yy41;
+ }
+yy49: yyaccept = 1;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if(yych == '>') goto yy45;
+ if(yych == '^') goto yy45;
+ goto yy57;
+yy50: ++YYCURSOR;
+ if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+ yych = *YYCURSOR;
+yy51: if(yybm[0+yych] & 64) goto yy50;
+ if(yych <= '!') goto yy49;
+ if(yych <= '"') goto yy52;
+ if(yych <= ']') goto yy44;
+ goto yy48;
+yy52: yych = *++YYCURSOR;
+ if(yych == ' ') goto yy53;
+ if(yych != '>') goto yy47;
+yy53: yych = *++YYCURSOR;
+yy54:
+#line 249
+ {
+ YYCURSOR--;
+ para_start = NULL;
+ smart_str_copyl(&ctx->para, start + 1, YYCURSOR - start - 2);
+#ifdef DEBUG
+ printf("PARA(%s)\n", ctx->para.c);
+#endif
+ tag_arg(ctx PLS_DC);
+ arg_start = YYCURSOR;
+ GO(STATE_NEXT_ARG);
+ NEXT;
+ }
+yy55: yych = *++YYCURSOR;
+ if(yych == ' ') goto yy58;
+ if(yych == '>') goto yy58;
+ goto yy48;
+yy56: ++YYCURSOR;
+ if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+ yych = *YYCURSOR;
+yy57: if(yybm[0+yych] & 128) goto yy56;
+ if(yych <= '=') goto yy55;
+ goto yy48;
+yy58: yych = *++YYCURSOR;
+ goto yy54;
+}
+#line 278
+
+ break;
+ }
+nextiter:
+ }
+
+#define PRESERVE(s) \
+ size_t n = ctx->work.len - (s - ctx->work.c); \
+ memmove(ctx->work.c, s, n + 1); \
+ ctx->work.len = n
+
+finish:
+ if (ctx->state >= 2) {
+ if (para_start) {
+ PRESERVE(para_start);
+ ctx->state = 4;
+ } else {
+ if (arg_start) { PRESERVE(arg_start); }
+ ctx->state = 2;
+ }
+ } else if (tag_start) {
+ PRESERVE(tag_start);
+ ctx->state = 1;
+ } else {
+ ctx->state = 0;
+ if (start) smart_str_appendl(&ctx->result, start, YYCURSOR - start);
+ smart_str_free(&ctx->work);
+ }
+
+#ifdef DEBUG
+ if (ctx->work.c) {
+ printf("PRESERVING %s'\n", ctx->work.c);
+ }
+#endif
+}
+
+#define smart_str_copys(a,b) smart_str_copyl(a,b,strlen(b))
+
+char *url_adapt_ext(const char *src, size_t srclen, const char *name, const char *value, size_t *newlen)
+{
+ smart_str str = {0,0};
+ char *ret;
+ BLS_FETCH();
+
+ smart_str_copys(&BG(url_adapt_state).name, name);
+ smart_str_copys(&BG(url_adapt_state).value, value);
+ str.c = (char *) src;
+ str.len = srclen;
+ mainloop(&BG(url_adapt_state), &str);
+
+ *newlen = BG(url_adapt_state).result.len;
+
+ //printf("(%d)NEW(%d): %s'\n", srclen, BG(url_adapt_state).result.len, BG(url_adapt_state).result.c);
+
+ ret = BG(url_adapt_state).result.c;
+ BG(url_adapt_state).result.c = NULL;
+ return ret;
+}
+
+PHP_RINIT_FUNCTION(url_scanner)
+{
+ BLS_FETCH();
+
+ memset(&BG(url_adapt_state), 0, sizeof(BG(url_adapt_state)));
+
+ return SUCCESS;
+}
+
+PHP_RSHUTDOWN_FUNCTION(url_scanner)
+{
+ BLS_FETCH();
+
+ smart_str_free(&BG(url_adapt_state).name);
+ smart_str_free(&BG(url_adapt_state).value);
+ smart_str_free(&BG(url_adapt_state).result);
+ smart_str_free(&BG(url_adapt_state).work);
+ smart_str_free(&BG(url_adapt_state).arg);
+ smart_str_free(&BG(url_adapt_state).tag);
+ smart_str_free(&BG(url_adapt_state).para);
+
+ return SUCCESS;
+}
+
+#if 0
+void main()
+{
+ url_adapt_state_t ctx;
+ smart_str str = {0};
+
+ memset(&ctx, 0, sizeof(ctx));
+
+ smart_str_copys(&ctx.name, "PHPSESSID");
+ smart_str_copys(&ctx.value, "FOOBAR");
+ smart_str_copys(&str, "blabla<HTML>asdasd<a c=d target=_b foobar=x");
+ mainloop(&ctx, &str);
+ smart_str_copys(&str, "lank dontblink href=someurl onclick=\"xxx\">bla</a>\n<");
+ mainloop(&ctx, &str);
+ smart_str_copys(&str, "area href=foobar>");
+ mainloop(&ctx, &str);
+ smart_str_copys(&str, "<form action=blabla ");
+ mainloop(&ctx, &str);
+ smart_str_copys(&str, "method=post>");
+ mainloop(&ctx, &str);
+
+ printf("\n%s\n", ctx.result.c);
+}
+#endif
+
+#endif