imagemap.c
上传用户:lampled
上传日期:2007-01-07
资源大小:94k
文件大小:6k
源码类别:

Web服务器

开发平台:

Unix_Linux

  1. /*
  2. imagemap.c - taken from the NCSA httpd distribution, which can
  3. be found at http://hoohoo.ncsa.uiuc.edu/cgi/
  4. Previous authors:
  5. - Kevin Hughes (kevinh@pulua.hcc.hawaii.edu)
  6. - Eric Haines (erich@eye.com)
  7. - Rob McCool (robm@ncsa.uiuc.edu)
  8. - Chris Hyams (cgh@rice.edu)
  9. - Craig Milo Rogers (rogers@isi.edu)
  10. - Carlos Varela (cvarela@ncsa.uiuc.edu)
  11. Changes: cleaned up the code, used the XS-HTTPD defines,
  12. removed old code which is no longer needed.
  13. This version by Sven Berkvens (sven@stack.nl).
  14. */
  15. #include "config.h"
  16. #include <stdio.h>
  17. #include <sys/types.h>
  18. #include <stdlib.h>
  19. #include <ctype.h>
  20. #include <sys/stat.h>
  21. #include "string.h"
  22. #define MYBUFSIZ 1024
  23. #define MAXVERTS 1000
  24. #define X 0
  25. #define Y 1
  26. #ifndef NOFORWARDS
  27. static int isname PROTO((int));
  28. static VOID servererr PROTO((const char *));
  29. static int pointinpoly PROTO((void));
  30. static int pointincircle PROTO((void));
  31. static int pointinrect PROTO((void));
  32. static VOID sendmesg PROTO((const char *));
  33. #endif /* NOFORWARDS */
  34. static double testpoint[2], pointarray[MAXVERTS][2];
  35. extern int
  36. main DECL2(int, argc, char **, argv)
  37. {
  38. char input[MYBUFSIZ], *mapname, def[MYBUFSIZ],
  39. errstr[MYBUFSIZ], *t;
  40. const char *query;
  41. int i, j, k, sawpoint = 0;
  42. FILE *fp;
  43. double dist, mindist = 0;
  44. if (!(query = getenv("QUERY_STRING")))
  45. servererr("Invalid usage, client may not support ISMAP");
  46. if (!(t = strchr(query, ',')))
  47. servererr("Your client does not support image mapping");
  48. *t++ = 0;
  49. i = atoi(query);
  50. testpoint[X] = (double)i;
  51. i = atoi(t);
  52. testpoint[Y] = (double)i;
  53. if (!(mapname = getenv("PATH_TRANSLATED")))
  54. servererr("No translated path given by server");
  55. if (!(fp = fopen(mapname, "r")))
  56. {
  57. sprintf(errstr, "Could not open map file: `%s'", mapname);
  58. servererr(errstr);
  59. }
  60. while (fgets(input, MYBUFSIZ, fp))
  61. {
  62. char type[MYBUFSIZ], url[MYBUFSIZ], num[10];
  63. size_t length;
  64. length = strlen(input);
  65. while ((length > 0) && (input[length - 1] <= ' '))
  66. input[--length] = 0;
  67. if ((input[0] == '#') || (!input[0]))
  68. continue;
  69. type[0] = url[0] = 0;
  70. for (i = 0; isname(input[i]) && (input[i]); i++)
  71. type[i] = input[i];
  72. type[i] = 0;
  73. while (isspace(input[i]))
  74. i++;
  75. for (j = 0; input[i] && isname(input[i]); ++i, ++j)
  76. url[j] = input[i];
  77. url[j] = 0;
  78. if (!strcmp(type, "default") && !sawpoint)
  79. {
  80. strcpy(def, url);
  81. continue;
  82. }
  83. k = 0;
  84. while (input[i])
  85. {
  86. while (isspace(input[i]) || (input[i] == ','))
  87. i++;
  88. j = 0;
  89. while (isdigit(input[i]))
  90. num[j++] = input[i++];
  91. num[j] = '';
  92. if (num[0])
  93. {
  94. j = atoi(num);
  95. pointarray[k][X] = (double)j;
  96. } else
  97. break;
  98. while (isspace(input[i]) || (input[i] == ','))
  99. i++;
  100. j = 0;
  101. while (isdigit(input[i]))
  102. num[j++] = input[i++];
  103. num[j] = 0;
  104. if (num[0])
  105. {
  106. j = atoi(num);
  107. pointarray[k++][Y] = (double)j;
  108. } else
  109. servererr("Missing y value.");
  110. if (k == (MAXVERTS - 1))
  111. break;
  112. }
  113. pointarray[k][X] = -1;
  114. if (!strcasecmp(type, "poly"))
  115. {
  116. if (pointinpoly())
  117. sendmesg(url);
  118. }
  119. if (!strcasecmp(type, "circle"))
  120. {
  121. if (pointincircle())
  122. sendmesg(url);
  123. }
  124. if (!strcasecmp(type, "rect"))
  125. {
  126. if (pointinrect())
  127. sendmesg(url);
  128. }
  129. if (!strcasecmp(type, "point"))
  130. {
  131. dist = ((testpoint[X] - pointarray[0][X]) *
  132. (testpoint[X] - pointarray[0][X])) +
  133. ((testpoint[Y] - pointarray[0][Y]) *
  134. (testpoint[Y] - pointarray[0][Y]));
  135. if ((!sawpoint) || (dist < mindist))
  136. {
  137. mindist = dist;
  138. strcpy(def,url);
  139. }
  140. sawpoint++;
  141. }
  142. }
  143. if (def[0])
  144. sendmesg(def);
  145. servererr("No default specified");
  146. return(0);
  147. }
  148. static VOID
  149. sendmesg DECL1C(char *, url)
  150. {
  151. printf("Location: %snContent-type: text/htmlnn", url);
  152. printf("<HTML><HEAD><TITLE>Moved</TITLE></HEAD><BODY><H1>Moved</H1>n");
  153. printf("This document has <A HREF="%s">moved</A>n", url);
  154. printf("</BODY></HTML>n");
  155. exit(1);
  156. }
  157. static int
  158. pointinrect DECL0
  159. {
  160. return ((testpoint[X] >= pointarray[0][X]) &&
  161. (testpoint[X] <= pointarray[1][X]) &&
  162. (testpoint[Y] >= pointarray[0][Y]) &&
  163. (testpoint[Y] <= pointarray[1][Y]));
  164. }
  165. static int
  166. pointincircle DECL0
  167. {
  168. int radius1, radius2;
  169. radius1 = ((pointarray[0][Y] - pointarray[1][Y]) *
  170.  (pointarray[0][Y] - pointarray[1][Y])) +
  171. ((pointarray[0][X] - pointarray[1][X]) *
  172.  (pointarray[0][X] - pointarray[1][X]));
  173. radius2 = ((pointarray[0][Y] - testpoint[Y]) *
  174.  (pointarray[0][Y] - testpoint[Y])) +
  175. ((pointarray[0][X] - testpoint[X]) *
  176.  (pointarray[0][X] - testpoint[X]));
  177. return (radius2 <= radius1);
  178. }
  179. static int
  180. pointinpoly DECL0
  181. {
  182. int i, numverts, xflag0, crossings;
  183. double *p, *stop, tx, ty, y;
  184. for (i = 0; (pointarray[i][X] != -1) && (i < MAXVERTS); i++)
  185. /* NOTHING HERE */;
  186. numverts = i; crossings = 0;
  187. tx = testpoint[X]; ty = testpoint[Y];
  188. y = pointarray[numverts - 1][Y];
  189. p = (double *)pointarray + 1;
  190. if ((y >= ty) != (*p >= ty))
  191. {
  192. if ((xflag0 = (pointarray[numverts - 1][X] >= tx)) ==
  193. (*(double *)pointarray >= tx))
  194. {
  195. if (xflag0)
  196. crossings++;
  197. } else
  198. {
  199. crossings += ((pointarray[numverts - 1][X] - (y - ty) *
  200. (*(double *)pointarray - pointarray[numverts - 1][X]) /
  201. (*p - y)) >= tx);
  202. }
  203. }
  204. stop = pointarray[numverts];
  205. for (y = *p, p += 2; p < stop; y = *p, p += 2)
  206. {
  207. if (y >= ty)
  208. {
  209. while ((p < stop) && (*p >= ty))
  210. p += 2;
  211. if (p >= stop)
  212. break;
  213. if ((xflag0 = (*(p - 3) >= tx)) == (*(p - 1) >= tx))
  214. {
  215. if (xflag0)
  216. crossings++;
  217. } else
  218. {
  219. crossings += ((*(p - 3) - (*(p - 2) - ty) *
  220. (*(p - 1) - *(p - 3)) /
  221. (*p - *(p - 2))) >= tx);
  222. }
  223. } else
  224. {
  225. while ((p < stop) && (*p < ty))
  226. p += 2;
  227. if (p >= stop)
  228. break;
  229. if ((xflag0 = (*(p - 3) >= tx)) == (*(p - 1) >= tx))
  230. {
  231. if (xflag0)
  232. crossings++;
  233. } else
  234. {
  235. crossings += ((*(p - 3) - (*(p - 2) - ty) *
  236. (*(p - 1) - *(p - 3)) /
  237. (*p - *(p - 2))) >= tx);
  238. }
  239. }
  240. }
  241. return(crossings & 1);
  242. }
  243. static VOID
  244. servererr DECL1C(char *, msg)
  245. {
  246. printf("Content-type: text/htmlnn");
  247. printf("<HTML><HEAD><TITLE>Mapping server error</TITLE></HEAD>n");
  248. printf("<BODY><H1>Mapping server error</H1>n");
  249. printf("The mapping server encountered an error:<P>n");
  250. printf("%s", msg);
  251. printf("</BODY></HTML>n");
  252. exit(1);
  253. }
  254. static int
  255. isname DECL1(int, c)
  256. {
  257. return(!isspace(c));
  258. }