diff options
-rw-r--r-- | ext/standard/url_scanner.c | 150 |
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; |