summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/standard/url_scanner.c150
1 files changed, 103 insertions, 47 deletions
diff --git a/ext/standard/url_scanner.c b/ext/standard/url_scanner.c
index adfc7837d0..e1b10230fc 100644
--- a/ext/standard/url_scanner.c
+++ b/ext/standard/url_scanner.c
@@ -30,7 +30,9 @@
#include "basic_functions.h"
#include "url_scanner.h"
+#ifndef BUFSIZE
#define BUFSIZE 256
+#endif
PHP_RINIT_FUNCTION(url_scanner) {
url_adapt(NULL,0,NULL,NULL);
@@ -58,18 +60,18 @@ static char *url_attr_addon(const char *tag,const char *attr,const char *val,con
if(flag) {
if(!strstr(val,buf))
{
- char *p = (char *)emalloc(strlen(buf)+strlen(PG(arg_separator))+1);
+ char *result = (char *)emalloc(strlen(buf)+strlen(PG(arg_separator))+1);
int n;
if(strchr(val,'?')) {
- strcpy(p,PG(arg_separator));
+ strcpy(result,PG(arg_separator));
n=strlen(PG(arg_separator));
} else {
- *p='?';
+ *result='?';
n=1;
}
- strcpy(p+n,buf);
- return p;
+ strcpy(result+n,buf);
+ return result;
}
}
return NULL;
@@ -181,10 +183,43 @@ char *url_adapt(const char *src, size_t srclen, const char *data, size_t *newlen
case STATE_TAG_IS:
case STATE_TAG_IS2:
- if(!isspace(*src)) {
+ if(*src=='>'){
+ US.state=STATE_NORMAL;
+ if(! (US.attr_done)) {
+ char *p;
+ p=url_attr_addon(US.tag,US.attr,"",data);
+ if(p) {
+ int l= strlen(p);
+ maxl+=l;
+ out=realloc(out,maxl);
+ outp=out+*newlen;
+ strcpy(outp,p);
+ outp+=l;
+ *newlen+=l;
+ efree(p);
+ }
+ }
+ } else if(*src=='#') {
+ if(! (US.attr_done)) {
+ char *p;
+ US.attr_done=1;
+ p=url_attr_addon(US.tag,US.attr,"#",data);
+ if(p) {
+ int l= strlen(p);
+ maxl+=l;
+ out=realloc(out,maxl);
+ outp=out+*newlen;
+ strcpy(outp,p);
+ outp+=l;
+ *newlen+=l;
+ efree(p);
+ }
+ }
+ } else if(!isspace(*src)&&(*src!='=')) {
US.ml=BUFSIZE;
US.p=US.val=erealloc(US.val,US.ml);
US.l=0;
+ US.attr_done=0;
if((*src=='"')||(*src=='\'')) {
US.state=STATE_TAG_QVAL2;
US.delim=*src;
@@ -198,20 +233,39 @@ char *url_adapt(const char *src, size_t srclen, const char *data, size_t *newlen
case STATE_TAG_QVAL2:
- if(*src==US.delim) {
- char *p;
+ if(*src=='#') {
+ if(! (US.attr_done)) {
+ char *p;
+ US.attr_done=1;
+ *US.p='\0';
+ p=url_attr_addon(US.tag,US.attr,US.val,data);
+ if(p) {
+ int l= strlen(p);
+ maxl+=l;
+ out=realloc(out,maxl);
+ outp=out+*newlen;
+ strcpy(outp,p);
+ outp+=l;
+ *newlen+=l;
+ efree(p);
+ }
+ }
+ } else if(*src==US.delim) {
US.state=STATE_IN_TAG;
*US.p='\0';
- p=url_attr_addon(US.tag,US.attr,US.val,data);
- if(p) {
- int l= strlen(p);
- maxl+=l;
- out=realloc(out,maxl);
- outp=out+*newlen;
- strcpy(outp,p);
- outp+=l;
- *newlen+=l;
- efree(p);
+ if(! (US.attr_done)) {
+ char *p;
+ p=url_attr_addon(US.tag,US.attr,US.val,data);
+ if(p) {
+ int l= strlen(p);
+ maxl+=l;
+ out=realloc(out,maxl);
+ outp=out+*newlen;
+ strcpy(outp,p);
+ outp+=l;
+ *newlen+=l;
+ efree(p);
+ }
}
break;
} else if(*src=='\\') {
@@ -243,38 +297,40 @@ char *url_adapt(const char *src, size_t srclen, const char *data, size_t *newlen
break;
case STATE_TAG_VAL:
- if(!isspace(*src)) {
- if((*src=='"')||(*src=='\'')) {
- US.state=STATE_TAG_QVAL2;
- US.delim=*src;
- } else {
- *US.p++=*src;
- US.l++;
- if(US.l==US.ml) {
- US.ml+=BUFSIZE;
- US.val=erealloc(US.val,US.ml);
- US.p = US.val+US.l;
- }
- US.state=STATE_TAG_VAL2;
- }
- }
- break;
-
case STATE_TAG_VAL2:
- if(isspace(*src)||(*src=='>')) {
- char *p;
+ if(*src=='#') {
+ if(! (US.attr_done)) {
+ char *p;
+ US.attr_done=1;
+ *US.p='\0';
+ p=url_attr_addon(US.tag,US.attr,US.val,data);
+ if(p) {
+ int l= strlen(p);
+ maxl+=l;
+ out=realloc(out,maxl);
+ outp=out+*newlen;
+ strcpy(outp,p);
+ outp+=l;
+ *newlen+=l;
+ efree(p);
+ }
+ }
+ } else if(isspace(*src)||(*src=='>')) {
US.state=(*src=='>')?STATE_NORMAL:STATE_IN_TAG;
*US.p='\0';
- p=url_attr_addon(US.tag,US.attr,US.val,data);
- if(p) {
- int l= strlen(p);
- maxl+=l;
- out=realloc(out,maxl);
- outp=out+*newlen;
- strcpy(outp,p);
- outp+=l;
- *newlen+=l;
- efree(p);
+ if(! (US.attr_done)) {
+ char *p;
+ p=url_attr_addon(US.tag,US.attr,US.val,data);
+ if(p) {
+ int l= strlen(p);
+ maxl+=l;
+ out=realloc(out,maxl);
+ outp=out+*newlen;
+ strcpy(outp,p);
+ outp+=l;
+ *newlen+=l;
+ efree(p);
+ }
}
} else {
*US.p++=*src;