#include "mod_perl.h" #include "util_date.h" #define TIME_NOW time(NULL) #define DEFAULT_TIME_FORMAT "%a, %d %b %Y %H:%M:%S %Z" #define parsedate ap_parseHTTPdate #define util_pool() perl_get_util_pool() static SV *size_string(size_t size) { SV *sv = newSVpv(" -", 5); if (size == (size_t)-1) { /**/ } else if (!size) { sv_setpv(sv, " 0k"); } else if (size < 1024) { sv_setpv(sv, " 1k"); } else if (size < 1048576) { sv_setpvf(sv, "%4dk", (size + 512) / 1024); } else if (size < 103809024) { sv_setpvf(sv, "%4.1fM", size / 1048576.0); } else { sv_setpvf(sv, "%4dM", (size + 524288) / 1048576); } return sv; } static SV *my_escape_html(char *s) { int i, j; SV *x; /* first, count the number of extra characters */ for (i = 0, j = 0; s[i] != '\0'; i++) if (s[i] == '<' || s[i] == '>') j += 3; else if (s[i] == '&') j += 4; else if (s[i] == '"') j += 5; if (j == 0) return newSVpv(s,i); x = newSV(i + j + 1); for (i = 0, j = 0; s[i] != '\0'; i++, j++) if (s[i] == '<') { memcpy(&SvPVX(x)[j], "<", 4); j += 3; } else if (s[i] == '>') { memcpy(&SvPVX(x)[j], ">", 4); j += 3; } else if (s[i] == '&') { memcpy(&SvPVX(x)[j], "&", 5); j += 4; } else if (s[i] == '"') { memcpy(&SvPVX(x)[j], """, 6); j += 5; } else SvPVX(x)[j] = s[i]; SvPVX(x)[j] = '\0'; SvCUR_set(x, j); SvPOK_on(x); return x; } #define validate_password(passwd, hash) \ (ap_validate_password(passwd, hash) == NULL) MODULE = Apache::Util PACKAGE = Apache::Util PROTOTYPES: DISABLE BOOT: items = items; /*avoid warning*/ SV * size_string(size) size_t size char * escape_uri(segment) const char *segment CODE: RETVAL = ap_os_escape_path(util_pool(), segment, TRUE); OUTPUT: RETVAL SV * escape_html(s) char *s CODE: RETVAL = my_escape_html(s); OUTPUT: RETVAL char * ht_time(t=TIME_NOW, fmt=DEFAULT_TIME_FORMAT, gmt=TRUE) time_t t const char *fmt int gmt CODE: RETVAL = ap_ht_time(util_pool(), t, fmt, gmt); OUTPUT: RETVAL time_t parsedate(date) const char *date int validate_password(passwd, hash) const char *passwd const char *hash