rfc2045appendurl.c
上传用户:s81996212
上传日期:2007-01-04
资源大小:722k
文件大小:2k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. /*
  2. ** Copyright 2000 Double Precision, Inc.  See COPYING for
  3. ** distribution information.
  4. */
  5. /*
  6. ** $Id: rfc2045appendurl.c,v 1.2 2000/03/28 01:07:21 mrsam Exp $
  7. */
  8. #if    HAVE_CONFIG_H
  9. #include       "config.h"
  10. #endif
  11. #include       <stdlib.h>
  12. #include       <stdio.h>
  13. #include       <string.h>
  14. #if    HAVE_STRINGS_H
  15. #include       <strings.h>
  16. #endif
  17. #include <ctype.h>
  18. #include "rfc2045.h"
  19. extern void rfc2045_enomem();
  20. /*
  21. ** ---------------------------------------------------------------------
  22. ** Attempt to parse Content-Base: and Content-Location:, and return the
  23. ** "base" of all the relative URLs in the section.
  24. ** ---------------------------------------------------------------------
  25. */
  26. static void get_method_path(const char *p,
  27. const char **method,
  28. unsigned *methodl,
  29. const char **path)
  30. {
  31. unsigned i;
  32. for (i=0; p && p[i]; i++)
  33. {
  34. if (p[i] == ':')
  35. {
  36. *method=p;
  37. *methodl= ++i;
  38. *path=p+i;
  39. return;
  40. }
  41. if (!isalpha( (int)(unsigned char)p[i]))
  42. break;
  43. }
  44. *method=0;
  45. *methodl=0;
  46. *path=p;
  47. }
  48. char *rfc2045_append_url(const char *base, const char *loc)
  49. {
  50. const char *base_method;
  51. unsigned base_method_l;
  52. const char *base_path;
  53. const char *loc_method;
  54. unsigned loc_method_l;
  55. const char *loc_path;
  56. char *buf, *q;
  57. get_method_path(base, &base_method, &base_method_l, &base_path);
  58. get_method_path(loc, &loc_method, &loc_method_l, &loc_path);
  59. if (loc_method_l)
  60. {
  61. buf=malloc(strlen(loc)+1);
  62. if (!buf) rfc2045_enomem();
  63. strcpy(buf, loc);
  64. return (buf);
  65. }
  66. loc_method=base_method;
  67. loc_method_l=base_method_l;
  68. if (!base_path) base_path="";
  69. if (!loc_path) loc_path="";
  70. buf=malloc(loc_method_l + strlen(base_path)+strlen(loc_path) + 3);
  71. if (!buf) rfc2045_enomem();
  72. if (loc_method_l)
  73. memcpy(buf, loc_method, loc_method_l);
  74. buf[loc_method_l]=0;
  75. q=buf + loc_method_l;
  76. strcat(strcpy(q, base_path), "/");
  77. if ( loc_path[0] == '/')
  78. {
  79. char *r;
  80. if (loc_path[1] == '/')
  81. /* Location is absolute */
  82. {
  83. *q=0;
  84. }
  85. /* Relative to top of base */
  86. else if ( q[0] == '/' && q[1] == '/' &&
  87. (r=strchr(q+2, '/')) != 0)
  88. {
  89. *r=0;
  90. }
  91. else
  92. *q=0; /* No sys in base, just start with / */
  93. }
  94. strcat(q, loc_path);
  95. return (buf);
  96. }
  97. char *rfc2045_content_base(struct rfc2045 *p)
  98. {
  99. return (rfc2045_append_url(p->content_base, p->content_location));
  100. }