/* * FTP/HTTP daemon * imageform.cc Copyright (C) 1995, 96, 97 Alex Belits * * This source/code is public free; you can distribute it and/or modify * it under terms of the GNU General Public License (published by the * Free Software Foundation) either version two of this License, or any * later version. * */ #include "servproc.h" void processimageform(struct request *req,struct httpresponse *response, const char *namevalue,double xvalue,double yvalue){ struct xypair{ double x; double y; }xypairs[256]; int i,npairs,inside=0,url_ok,addremove,insideoutside,counter; double x0,x1,x2,y0,y1,y2,above0,above1, x_center,y_center,w2,h2; char currline[1024],currurl[256],url[256],*p,*p0,savedchar; FILE *f; *url=0; *currurl=0; if(namevalue){ if(namevalue[0]=='/'){ f=fopen(namevalue,"r"); url_ok=0; if(f){ while(fgets(currline,1023,f)&&!*url){ p=currline; while(*p<' '&&*p) p++; p0=p; while(*p>' ') p++; savedchar=*p; *p=0; if(!strcasecmp(p0,"URL")){ *p=savedchar; if(url_ok&&*currurl){ strcpy(url,currurl); }else{ *currurl=0; *p=savedchar; sscanf(p,"%255s",currurl); url_ok=0; } }else{ *p=savedchar; if(*p0=='+'||*p0=='-'){ if(p0[1]=='+'||p0[1]=='-'){ p=p0+2; addremove=(*p0=='+'); insideoutside=(p0[1]=='+'); while(*p<=' '&&*p) p++; p0=p; while(*p>' ') p++; savedchar=*p; *p=0; if(!strcasecmp(p0,"RECTANGLE")){ *p=savedchar; inside=0; if(sscanf(p,"%lg %lg %lg %lg",&x0,&y0,&x1,&y1)==4){ if(x0>x1){ x2=x1; x1=x0; x0=x2; } if(y0>y1){ x2=y1; y1=y0; y0=x2; } inside=(xvalue>=x0&&xvalue<=x1&&yvalue>=y0&&yvalue<=y1); } }else{ if(!strcasecmp(p0,"POLYGON")){ *p=savedchar; npairs=0; do{ p0=p; while(*p<=' '&&*p) p++; while(*p>' ') p++; while(*p<=' '&&*p) p++; while(*p>' ') p++; savedchar=*p; *p=0; if(sscanf(p0,"%lg %lg",&xypairs[npairs].x,&xypairs[npairs].y)==2){ npairs++; *p=savedchar; } }while(*p&&npairs<255); xypairs[npairs].x=xypairs[0].x; xypairs[npairs].y=xypairs[0].y; counter=0; for(i=1;i<=npairs&&!inside;i++){ x0=xypairs[i-1].x; y0=xypairs[i-1].y; x1=xypairs[i].x; y1=xypairs[i].y; if(y0>y1){ y2=y0; y0=y1; y1=y2; x2=x0; x0=x1; x1=x2; } if(y1-y0!=0){ if((xvalue==x0&&yvalue==y0)||(xvalue==x1&&yvalue==y1)){ inside=1; }else{ if(yvalue>y0&&yvalue<=y1){ x2=(x1-x0)/(y1-y0)*(yvalue-y0)+x0; if(x2>=xvalue) counter++; } } }else{ if(yvalue==y0&&xvalue>=x0&&xvalue<=x1) inside=1; } } if(counter&1) inside=1; }else{ if(!strcasecmp(p0,"TRIANGLE")){ *p=savedchar; inside=1; if(sscanf(p,"%lg %lg %lg %lg %lg %lg",&x0,&y0,&x1,&y1,&x2,&y2)==6){ if(x0==x1){ above0=x2-x0; above1=xvalue-x0; }else{ above0=y2-(((y1-y0)/(x1-x0))*(x2-x0)+y0); above1=yvalue-(((y1-y0)/(x1-x0))*(xvalue-x0)+y0); } if(above1*above0<0) inside=0; if(x0==x2){ above0=x1-x0; above1=xvalue-x0; }else{ above0=y1-(((y2-y0)/(x2-x0))*(x1-x0)+y0); above1=yvalue-(((y2-y0)/(x2-x0))*(xvalue-x0)+y0); } if(above1*above0<0) inside=0; if(x2==x1){ above0=x0-x2; above1=xvalue-x2; }else{ above0=y0-(((y1-y2)/(x1-x2))*(x0-x2)+y2); above1=yvalue-(((y1-y2)/(x1-x2))*(xvalue-x2)+y2); } if(above1*above0<0) inside=0; } }else{ if(!strcasecmp(p0,"ELLIPSE")){ *p=savedchar; if(sscanf(p,"%lg %lg %lg %lg",&x0,&y0,&x1,&y1)==4){ x_center=(x0+x1)/2; y_center=(y0+y1)/2; w2=(x1-x0)/2; w2*=w2; h2=(y1-y0)/2; h2*=h2; x2=xvalue-x_center; x2*=x2; y2=yvalue-y_center; y2*=y2; inside=((x2/w2+y2/h2)<=1); } }else{ if(!strcasecmp(p0,"CIRCLE")){ *p=savedchar; if(sscanf(p,"%lg %lg %lg",&x0,&y0,&x1)==3){ x2=xvalue-x0; x2*=x2; y2=yvalue-y0; y2*=y2; x1*=x1; inside=x2+y2<=x1; } } } } } } if(inside==insideoutside){ url_ok=addremove; } } } } } if(!*url&&url_ok&&*currurl){ strcpy(url,currurl); } fclose(f); } } } if(*url){ redirect(req,url); }else{ makestandardheader(response,204,NULL,NULL,req->keepalive); sendresponse(req->httpserver,response); finishresponse(req->httpserver,response); } }