From 96559e91fe9c9ba5987d80a9b7776017b23f35cc Mon Sep 17 00:00:00 2001 From: Sascha Schumann Date: Sun, 12 Sep 1999 13:03:10 +0000 Subject: [PATCH] use static buffer for URLs instead of allocating/freeing memory for each one --- ext/standard/Makefile.am | 4 +- ext/standard/url_scanner.c | 226 ++++++++++++++++++------------------ ext/standard/url_scanner.re | 9 +- 3 files changed, 118 insertions(+), 121 deletions(-) diff --git a/ext/standard/Makefile.am b/ext/standard/Makefile.am index e900c01605..e6fe055859 100644 --- a/ext/standard/Makefile.am +++ b/ext/standard/Makefile.am @@ -10,8 +10,8 @@ libphpext_standard_a_SOURCES=\ cyr_convert.c flock_compat.c crypt.c dl.c head.c post.c \ parsedate.y lcg.c url_scanner.c -url_scanner.c: url_scanner.re - re2c -s $< > $@ +$(srcdir)/url_scanner.c: $(srcdir)/url_scanner.re + re2c -b $< > $@ #number.o: number.c # $(CC) $(CFLAGS) -w@WARNING_LEVEL@ -c $< -o $@ diff --git a/ext/standard/url_scanner.c b/ext/standard/url_scanner.c index 4e87233535..a52d095793 100644 --- a/ext/standard/url_scanner.c +++ b/ext/standard/url_scanner.c @@ -1,5 +1,5 @@ -/* Generated by re2c 0.5 on Sun Sep 12 01:52:31 1999 */ -#line 1 "url_scanner.re" +/* Generated by re2c 0.5 on Sun Sep 12 15:02:30 1999 */ +#line 1 "../../../php4/ext/standard/url_scanner.re" /* +----------------------------------------------------------------------+ | PHP version 4.0 | @@ -24,6 +24,9 @@ #include #include +#undef MIN +#define MIN(a,b) (a)<(b)?(a):(b) + #define YYCTYPE char #define YYCURSOR state->crs #define YYLIMIT state->end @@ -73,9 +76,9 @@ typedef struct { static void screw_url(lexdata *state) { - char *url; int len; char buf[URLLEN]; + char url[URLLEN]; const char *p, *q; char c; @@ -97,8 +100,7 @@ static void screw_url(lexdata *state) ATTACH(state->start, p-state->start); /* copy old URI */ - len = q - p; - url = malloc(len + 1); + len = MIN(q - p, sizeof(buf) - 1); memcpy(url, p, len); url[len] = '\0'; @@ -106,7 +108,6 @@ static void screw_url(lexdata *state) len = snprintf(buf, sizeof(buf), "%s%c%s", url, memchr(state->start, '?', len) ? '&' : '?', state->data); - free(url); /* attach new URI */ ATTACH(buf, len); @@ -120,7 +121,7 @@ static void catchup(lexdata *state) ATTACH(state->start, (state->crs - state->start)); } -#line 133 +#line 134 static void url_scanner(lexdata *state) @@ -132,13 +133,47 @@ static void url_scanner(lexdata *state) { YYCTYPE yych; unsigned int yyaccept; + static unsigned char yybm[] = { + 0, 64, 64, 64, 64, 64, 64, 64, + 64, 192, 64, 192, 192, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 192, 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, 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, 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 yy0; yy1: ++YYCURSOR; yy0: if((YYLIMIT - YYCURSOR) < 7) YYFILL(7); yych = *YYCURSOR; + if(yybm[0+yych] & 64) goto yy4; if(yych <= '\000') goto yy7; - if(yych != '<') goto yy4; yy2: yych = *++YYCURSOR; if(yych <= 'F'){ if(yych == 'A') goto yy9; @@ -153,14 +188,13 @@ yy2: yych = *++YYCURSOR; yy3:yy4: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy5: if(yych <= '\000') goto yy6; - if(yych != '<') goto yy4; +yy5: if(yybm[0+yych] & 64) goto yy4; yy6: -#line 144 +#line 145 { BEGIN(INITIAL); } yy7: yych = *++YYCURSOR; yy8: -#line 145 +#line 146 { FINISH; } yy9: yych = *++YYCURSOR; if(yych == 'H') goto yy3; @@ -185,23 +219,9 @@ yy14: yych = *++YYCURSOR; yy15: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy16: if(yych <= '\037'){ - if(yych <= '\t'){ - if(yych <= '\b') goto yy3; - goto yy15; - } else { - if(yych <= '\n') goto yy3; - if(yych <= '\f') goto yy15; - goto yy3; - } - } else { - if(yych <= 'S'){ - if(yych <= ' ') goto yy15; - if(yych <= 'R') goto yy3; - } else { - if(yych != 's') goto yy3; - } - } +yy16: if(yybm[0+yych] & 128) goto yy15; + if(yych == 'S') goto yy17; + if(yych != 's') goto yy3; yy17: yych = *++YYCURSOR; if(yych == 'R') goto yy18; if(yych != 'r') goto yy3; @@ -233,7 +253,7 @@ yy22: if(yych <= '\n'){ if(yych == ' ') goto yy21; } yy23: -#line 142 +#line 143 { BEGIN(REF); } yy24: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); @@ -289,116 +309,92 @@ yy32: if(yych <= '\n'){ if(yych == ' ') goto yy31; } yy33: -#line 143 +#line 144 { BEGIN(REF); } } -#line 146 +#line 147 break; case REF: { YYCTYPE yych; unsigned int yyaccept; + static unsigned char yybm[] = { + 0, 192, 192, 192, 192, 192, 192, 192, + 192, 32, 192, 32, 32, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 32, 192, 0, 0, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 128, 192, 192, 192, 0, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + }; goto yy34; yy35: ++YYCURSOR; yy34: if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych <= ' '){ - if(yych <= '\t'){ - if(yych <= '\000') goto yy36; - if(yych <= '\b') goto yy39; - goto yy37; - } else { - if(yych <= '\n') goto yy39; - if(yych <= '\f') goto yy37; - if(yych <= '\037') goto yy39; - goto yy37; - } - } else { - if(yych <= '9'){ - if(yych <= '!') goto yy39; - if(yych <= '"') goto yy37; - if(yych >= '$') goto yy39; - } else { - if(yych <= ':') goto yy42; - if(yych != '>') goto yy39; - } - } + if(yybm[0+yych] & 64) goto yy39; + if(yych <= '\000') goto yy36; + if(yych <= '"') goto yy37; + if(yych <= '#') goto yy36; + if(yych <= '=') goto yy42; yy36:yy37: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy38: if(yych <= ' '){ - if(yych <= '\t'){ - if(yych <= '\000') goto yy36; - if(yych >= '\t') goto yy37; - } else { - if(yych <= '\n') goto yy39; - if(yych <= '\f') goto yy37; - if(yych >= ' ') goto yy37; - } - } else { - if(yych <= '9'){ - if(yych <= '!') goto yy39; - if(yych <= '#') goto yy36; - } else { - if(yych <= ':') goto yy42; - if(yych == '>') goto yy36; - } - } +yy38: if(yybm[0+yych] & 64) goto yy39; + if(yych <= '\000') goto yy36; + if(yych <= '!') goto yy37; + if(yych == ':') goto yy42; + goto yy36; yy39: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy40: if(yych <= ' '){ - if(yych <= '\t'){ - if(yych <= '\000') goto yy41; - if(yych <= '\b') goto yy39; - goto yy48; - } else { - if(yych <= '\n') goto yy39; - if(yych <= '\f') goto yy48; - if(yych <= '\037') goto yy39; - goto yy48; - } +yy40: if(yybm[0+yych] & 64) goto yy39; + if(yych <= '"'){ + if(yych <= '\000') goto yy41; + if(yych <= '!') goto yy48; + goto yy50; } else { - if(yych <= '9'){ - if(yych <= '!') goto yy39; - if(yych <= '"') goto yy50; - if(yych <= '#') goto yy51; - goto yy39; - } else { - if(yych <= ':') goto yy42; - if(yych != '>') goto yy39; - } + if(yych <= '#') goto yy51; + if(yych <= '=') goto yy42; } yy41: -#line 150 +#line 151 { BEGIN(INITIAL); } yy42: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy43: if(yych <= '\037'){ - if(yych <= '\t'){ - if(yych <= '\000') goto yy44; - if(yych <= '\b') goto yy42; - goto yy45; - } else { - if(yych <= '\n') goto yy42; - if(yych <= '\f') goto yy45; - goto yy42; - } - } else { - if(yych <= '"'){ - if(yych <= ' ') goto yy45; - if(yych <= '!') goto yy42; - goto yy47; - } else { - if(yych <= '#') goto yy44; - if(yych != '>') goto yy42; - } - } +yy43: if(yybm[0+yych] & 128) goto yy42; + if(yych <= '\000') goto yy44; + if(yych <= '!') goto yy45; + if(yych <= '"') goto yy47; yy44: -#line 152 +#line 153 { /* don't modify absolute links */ state->state = INITIAL; BEGIN(INITIAL); @@ -439,10 +435,10 @@ yy50: yych = *++YYCURSOR; goto yy41; yy51: yych = *++YYCURSOR; yy52: YYCURSOR -= 1; -#line 151 +#line 152 { BEGIN(INITIAL); } } -#line 156 +#line 157 break; } diff --git a/ext/standard/url_scanner.re b/ext/standard/url_scanner.re index 7a51fc2785..bc14c2a7df 100644 --- a/ext/standard/url_scanner.re +++ b/ext/standard/url_scanner.re @@ -22,6 +22,9 @@ #include #include +#undef MIN +#define MIN(a,b) (a)<(b)?(a):(b) + #define YYCTYPE char #define YYCURSOR state->crs #define YYLIMIT state->end @@ -71,9 +74,9 @@ typedef struct { static void screw_url(lexdata *state) { - char *url; int len; char buf[URLLEN]; + char url[URLLEN]; const char *p, *q; char c; @@ -95,8 +98,7 @@ static void screw_url(lexdata *state) ATTACH(state->start, p-state->start); /* copy old URI */ - len = q - p; - url = malloc(len + 1); + len = MIN(q - p, sizeof(buf) - 1); memcpy(url, p, len); url[len] = '\0'; @@ -104,7 +106,6 @@ static void screw_url(lexdata *state) len = snprintf(buf, sizeof(buf), "%s%c%s", url, memchr(state->start, '?', len) ? '&' : '?', state->data); - free(url); /* attach new URI */ ATTACH(buf, len); -- 2.40.0