blob: 96b052f8315d9f14e29c2d2c9ad6145efbbc5176 [file] [log] [blame]
#define CORE_PRIVATE
#include "mod_perl.h"
#ifndef SERVER_BUILT
#define SERVER_BUILT "unknown"
#endif
#ifndef MOD_PERL_STRING_VERSION
#define MOD_PERL_STRING_VERSION "mod_perl/x.xx"
#endif
#ifdef XS_IMPORT
#include "Exports.c"
static void export_cv(SV *pclass, SV *caller, char *sub)
{
GV *gv;
#if 0
fprintf(stderr, "*%s::%s = \\&%s::%s\n",
SvPVX(caller), sub, SvPVX(pclass), sub);
#endif
gv = gv_fetchpv(form("%_::%s", caller, sub), TRUE, SVt_PVCV);
GvCV(gv) = perl_get_cv(form("%_::%s", pclass, sub), TRUE);
GvIMPORTED_CV_on(gv);
}
static void my_import(SV *pclass, SV *caller, SV *sv)
{
char *sym = SvPV(sv,na), **tags;
int i;
switch (*sym) {
case ':':
++sym;
tags = export_tags(sym);
for(i=0; tags[i]; i++) {
export_cv(pclass, caller, tags[i]);
}
break;
case '$':
case '%':
case '*':
case '@':
croak("\"%s\" is not exported by the Apache::Constants module", sym);
case '&':
++sym;
default:
if(isALPHA(sym[0])) {
export_cv(pclass, caller, sym);
break;
}
else {
croak("Can't export symbol: %s", sym);
}
}
}
#endif /*XS_IMPORT*/
/* prevent prototype mismatch warnings */
static void check_proto(HV *stash, char *name)
{
GV **gvp = (GV**)hv_fetch(stash, name, strlen(name), FALSE);
CV *cv;
if (!(gvp && *gvp && (cv = GvCVu(*gvp)))) {
return;
}
if (CvROOT(cv)) {
return;
}
if (!SvPOK(cv)) {
sv_setsv((SV*)cv, &sv_no);
}
}
#ifdef newCONSTSUB
#define my_newCONSTSUB(stash, name, sv) \
check_proto(stash, name); \
newCONSTSUB(stash, name, sv)
#else
static void my_newCONSTSUB(HV *stash, char *name, SV *sv)
{
#ifdef dTHR
dTHR;
#endif
I32 oldhints = hints;
HV *old_cop_stash = curcop->cop_stash;
HV *old_curstash = curstash;
line_t oldline = curcop->cop_line;
hints &= ~HINT_BLOCK_SCOPE;
if(stash) {
save_hptr(&curstash);
save_hptr(&curcop->cop_stash);
curstash = curcop->cop_stash = stash;
}
check_proto(stash, name);
(void)newSUB(start_subparse(FALSE, 0),
newSVOP(OP_CONST, 0, newSVpv(name,0)),
newSVOP(OP_CONST, 0, &sv_no),
newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv)));
hints = oldhints;
curcop->cop_stash = old_cop_stash;
curstash = old_curstash;
curcop->cop_line = oldline;
}
#endif
static enum cmd_how autoload_args_how(char *name) {
if (strEQ(name, "FLAG"))
return FLAG;
if (strEQ(name, "ITERATE"))
return ITERATE;
if (strEQ(name, "ITERATE2"))
return ITERATE2;
if (strEQ(name, "NO_ARGS"))
return NO_ARGS;
if (strEQ(name, "RAW_ARGS"))
return RAW_ARGS;
if (strEQ(name, "TAKE1"))
return TAKE1;
if (strEQ(name, "TAKE12"))
return TAKE12;
if (strEQ(name, "TAKE123"))
return TAKE123;
if (strEQ(name, "TAKE2"))
return TAKE2;
if (strEQ(name, "TAKE23"))
return TAKE23;
if (strEQ(name, "TAKE3"))
return TAKE3;
return (enum cmd_how) -1;
}
static double
constant(char *name)
{
errno = 0;
switch (*name) {
case 'A':
if (strEQ(name, "AUTH_REQUIRED"))
#ifdef AUTH_REQUIRED
return AUTH_REQUIRED;
#else
goto not_there;
#endif
if (strEQ(name, "ACCESS_CONF"))
#ifdef ACCESS_CONF
return ACCESS_CONF;
#else
goto not_there;
#endif
break;
case 'B':
if (strEQ(name, "BAD_GATEWAY"))
#ifdef BAD_GATEWAY
return BAD_GATEWAY;
#else
goto not_there;
#endif
if (strEQ(name, "BAD_REQUEST"))
#ifdef BAD_REQUEST
return BAD_REQUEST;
#else
goto not_there;
#endif
break;
case 'C':
if (strEQ(name, "CONTINUE"))
return DECLINED;
break;
case 'D':
if (strEQ(name, "DECLINED"))
#ifdef DECLINED
return DECLINED;
#else
goto not_there;
#endif
if (strEQ(name, "DOCUMENT_FOLLOWS"))
#ifdef DOCUMENT_FOLLOWS
return DOCUMENT_FOLLOWS;
#else
goto not_there;
#endif
if (strEQ(name, "DONE"))
#ifdef DONE
return DONE;
#else
return -2;
#endif
if (strEQ(name, "DYNAMIC_MODULE_LIMIT"))
#ifdef DYNAMIC_MODULE_LIMIT
return DYNAMIC_MODULE_LIMIT;
#else
goto not_there;
#endif
break;
case 'E':
break;
case 'F':
if (strEQ(name, "FORBIDDEN"))
#ifdef FORBIDDEN
return FORBIDDEN;
#else
goto not_there;
#endif
break;
case 'G':
break;
case 'H':
if (strEQ(name, "HTTP_ACCEPTED"))
#ifdef HTTP_ACCEPTED
return HTTP_ACCEPTED;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_BAD_GATEWAY"))
#ifdef HTTP_BAD_GATEWAY
return HTTP_BAD_GATEWAY;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_BAD_REQUEST"))
#ifdef HTTP_BAD_REQUEST
return HTTP_BAD_REQUEST;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_CONFLICT"))
#ifdef HTTP_CONFLICT
return HTTP_CONFLICT;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_CONTINUE"))
#ifdef HTTP_CONTINUE
return HTTP_CONTINUE;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_CREATED"))
#ifdef HTTP_CREATED
return HTTP_CREATED;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_FORBIDDEN"))
#ifdef HTTP_FORBIDDEN
return HTTP_FORBIDDEN;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_GATEWAY_TIME_OUT"))
#ifdef HTTP_GATEWAY_TIME_OUT
return HTTP_GATEWAY_TIME_OUT;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_GONE"))
#ifdef HTTP_GONE
return HTTP_GONE;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_INTERNAL_SERVER_ERROR"))
#ifdef HTTP_INTERNAL_SERVER_ERROR
return HTTP_INTERNAL_SERVER_ERROR;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_LENGTH_REQUIRED"))
#ifdef HTTP_LENGTH_REQUIRED
return HTTP_LENGTH_REQUIRED;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_METHOD_NOT_ALLOWED"))
#ifdef HTTP_METHOD_NOT_ALLOWED
return HTTP_METHOD_NOT_ALLOWED;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_MOVED_PERMANENTLY"))
#ifdef HTTP_MOVED_PERMANENTLY
return HTTP_MOVED_PERMANENTLY;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_MOVED_TEMPORARILY"))
#ifdef HTTP_MOVED_TEMPORARILY
return HTTP_MOVED_TEMPORARILY;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_MULTIPLE_CHOICES"))
#ifdef HTTP_MULTIPLE_CHOICES
return HTTP_MULTIPLE_CHOICES;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_NON_AUTHORITATIVE"))
#ifdef HTTP_NON_AUTHORITATIVE
return HTTP_NON_AUTHORITATIVE;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_NOT_ACCEPTABLE"))
#ifdef HTTP_NOT_ACCEPTABLE
return HTTP_NOT_ACCEPTABLE;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_NOT_FOUND"))
#ifdef HTTP_NOT_FOUND
return HTTP_NOT_FOUND;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_NOT_IMPLEMENTED"))
#ifdef HTTP_NOT_IMPLEMENTED
return HTTP_NOT_IMPLEMENTED;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_NOT_MODIFIED"))
#ifdef HTTP_NOT_MODIFIED
return HTTP_NOT_MODIFIED;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_NO_CONTENT"))
#ifdef HTTP_NO_CONTENT
return HTTP_NO_CONTENT;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_OK"))
#ifdef HTTP_OK
return HTTP_OK;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_PARTIAL_CONTENT"))
#ifdef HTTP_PARTIAL_CONTENT
return HTTP_PARTIAL_CONTENT;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_PAYMENT_REQUIRED"))
#ifdef HTTP_PAYMENT_REQUIRED
return HTTP_PAYMENT_REQUIRED;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_PRECONDITION_FAILED"))
#ifdef HTTP_PRECONDITION_FAILED
return HTTP_PRECONDITION_FAILED;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_PROXY_AUTHENTICATION_REQUIRED"))
#ifdef HTTP_PROXY_AUTHENTICATION_REQUIRED
return HTTP_PROXY_AUTHENTICATION_REQUIRED;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_REQUEST_ENTITY_TOO_LARGE"))
#ifdef HTTP_REQUEST_ENTITY_TOO_LARGE
return HTTP_REQUEST_ENTITY_TOO_LARGE;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_REQUEST_TIME_OUT"))
#ifdef HTTP_REQUEST_TIME_OUT
return HTTP_REQUEST_TIME_OUT;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_REQUEST_URI_TOO_LARGE"))
#ifdef HTTP_REQUEST_URI_TOO_LARGE
return HTTP_REQUEST_URI_TOO_LARGE;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_RESET_CONTENT"))
#ifdef HTTP_RESET_CONTENT
return HTTP_RESET_CONTENT;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_SEE_OTHER"))
#ifdef HTTP_SEE_OTHER
return HTTP_SEE_OTHER;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_SERVICE_UNAVAILABLE"))
#ifdef HTTP_SERVICE_UNAVAILABLE
return HTTP_SERVICE_UNAVAILABLE;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_SWITCHING_PROTOCOLS"))
#ifdef HTTP_SWITCHING_PROTOCOLS
return HTTP_SWITCHING_PROTOCOLS;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_UNAUTHORIZED"))
#ifdef HTTP_UNAUTHORIZED
return HTTP_UNAUTHORIZED;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_UNSUPPORTED_MEDIA_TYPE"))
#ifdef HTTP_UNSUPPORTED_MEDIA_TYPE
return HTTP_UNSUPPORTED_MEDIA_TYPE;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_USE_PROXY"))
#ifdef HTTP_USE_PROXY
return HTTP_USE_PROXY;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_VARIANT_ALSO_VARIES"))
#ifdef HTTP_VARIANT_ALSO_VARIES
return HTTP_VARIANT_ALSO_VARIES;
#else
goto not_there;
#endif
if (strEQ(name, "HTTP_VERSION_NOT_SUPPORTED"))
#ifdef HTTP_VERSION_NOT_SUPPORTED
return HTTP_VERSION_NOT_SUPPORTED;
#else
goto not_there;
#endif
if (strEQ(name, "HUGE_STRING_LEN"))
#ifdef HUGE_STRING_LEN
return HUGE_STRING_LEN;
#else
goto not_there;
#endif
break;
case 'I':
break;
case 'J':
break;
case 'K':
break;
case 'L':
break;
case 'M':
if (strEQ(name, "MAX_HEADERS"))
#ifdef MAX_HEADERS
return MAX_HEADERS;
#else
goto not_there;
#endif
if (strEQ(name, "MAX_STRING_LEN"))
#ifdef MAX_STRING_LEN
return MAX_STRING_LEN;
#else
goto not_there;
#endif
if (strEQ(name, "METHODS"))
#ifdef METHODS
return METHODS;
#else
goto not_there;
#endif
if (strEQ(name, "MOVED"))
#ifdef MOVED
return MOVED;
#else
goto not_there;
#endif
if (strEQ(name, "M_CONNECT"))
#ifdef M_CONNECT
return M_CONNECT;
#else
goto not_there;
#endif
if (strEQ(name, "MODULE_MAGIC_NUMBER"))
#ifdef MODULE_MAGIC_NUMBER
return MODULE_MAGIC_NUMBER;
#else
goto not_there;
#endif
if (strEQ(name, "M_DELETE"))
#ifdef M_DELETE
return M_DELETE;
#else
goto not_there;
#endif
if (strEQ(name, "M_GET"))
#ifdef M_GET
return M_GET;
#else
goto not_there;
#endif
if (strEQ(name, "M_INVALID"))
#ifdef M_INVALID
return M_INVALID;
#else
goto not_there;
#endif
if (strEQ(name, "M_OPTIONS"))
#ifdef M_OPTIONS
return M_OPTIONS;
#else
goto not_there;
#endif
if (strEQ(name, "M_POST"))
#ifdef M_POST
return M_POST;
#else
goto not_there;
#endif
if (strEQ(name, "M_PUT"))
#ifdef M_PUT
return M_PUT;
#else
goto not_there;
#endif
if (strEQ(name, "M_TRACE"))
#ifdef M_TRACE
return M_TRACE;
#else
goto not_there;
#endif
if (strEQ(name, "M_PATCH"))
#ifdef M_PATCH
return M_PATCH;
#else
goto not_there;
#endif
if (strEQ(name, "M_PROPFIND"))
#ifdef M_PROPFIND
return M_PROPFIND;
#else
goto not_there;
#endif
if (strEQ(name, "M_PROPPATCH"))
#ifdef M_PROPPATCH
return M_PROPPATCH;
#else
goto not_there;
#endif
if (strEQ(name, "M_MKCOL"))
#ifdef M_MKCOL
return M_MKCOL;
#else
goto not_there;
#endif
if (strEQ(name, "M_COPY"))
#ifdef M_COPY
return M_COPY;
#else
goto not_there;
#endif
if (strEQ(name, "M_MOVE"))
#ifdef M_MOVE
return M_MOVE;
#else
goto not_there;
#endif
if (strEQ(name, "M_LOCK"))
#ifdef M_LOCK
return M_LOCK;
#else
goto not_there;
#endif
if (strEQ(name, "M_UNLOCK"))
#ifdef M_UNLOCK
return M_UNLOCK;
#else
goto not_there;
#endif
break;
case 'N':
if (strEQ(name, "NOT_AUTHORITATIVE"))
#ifdef NOT_AUTHORITATIVE
return NOT_AUTHORITATIVE;
#else
return DECLINED;
#endif
if (strEQ(name, "NOT_FOUND"))
#ifdef NOT_FOUND
return NOT_FOUND;
#else
goto not_there;
#endif
if (strEQ(name, "NOT_IMPLEMENTED"))
#ifdef NOT_IMPLEMENTED
return NOT_IMPLEMENTED;
#else
goto not_there;
#endif
break;
case 'O':
if (strEQ(name, "OK"))
#ifdef OK
return OK;
#else
goto not_there;
#endif
if (strEQ(name, "OPT_ALL"))
#ifdef OPT_ALL
return OPT_ALL;
#else
goto not_there;
#endif
if (strEQ(name, "OPT_EXECCGI"))
#ifdef OPT_EXECCGI
return OPT_EXECCGI;
#else
goto not_there;
#endif
if (strEQ(name, "OPT_INCLUDES"))
#ifdef OPT_INCLUDES
return OPT_INCLUDES;
#else
goto not_there;
#endif
if (strEQ(name, "OPT_INCNOEXEC"))
#ifdef OPT_INCNOEXEC
return OPT_INCNOEXEC;
#else
goto not_there;
#endif
if (strEQ(name, "OPT_INDEXES"))
#ifdef OPT_INDEXES
return OPT_INDEXES;
#else
goto not_there;
#endif
if (strEQ(name, "OPT_MULTI"))
#ifdef OPT_MULTI
return OPT_MULTI;
#else
goto not_there;
#endif
if (strEQ(name, "OPT_NONE"))
#ifdef OPT_NONE
return OPT_NONE;
#else
goto not_there;
#endif
if (strEQ(name, "OPT_SYM_LINKS"))
#ifdef OPT_SYM_LINKS
return OPT_SYM_LINKS;
#else
goto not_there;
#endif
if (strEQ(name, "OPT_SYM_OWNER"))
#ifdef OPT_SYM_OWNER
return OPT_SYM_OWNER;
#else
goto not_there;
#endif
if (strEQ(name, "OPT_UNSET"))
#ifdef OPT_UNSET
return OPT_UNSET;
#else
goto not_there;
#endif
if (strEQ(name, "OR_NONE"))
#ifdef OR_NONE
return OR_NONE;
#else
goto not_there;
#endif
if (strEQ(name, "OR_LIMIT"))
#ifdef OR_LIMIT
return OR_LIMIT;
#else
goto not_there;
#endif
if (strEQ(name, "OR_OPTIONS"))
#ifdef OR_OPTIONS
return OR_OPTIONS;
#else
goto not_there;
#endif
if (strEQ(name, "OR_FILEINFO"))
#ifdef OR_FILEINFO
return OR_FILEINFO;
#else
goto not_there;
#endif
if (strEQ(name, "OR_AUTHCFG"))
#ifdef OR_AUTHCFG
return OR_AUTHCFG;
#else
goto not_there;
#endif
if (strEQ(name, "OR_INDEXES"))
#ifdef OR_INDEXES
return OR_INDEXES;
#else
goto not_there;
#endif
if (strEQ(name, "OR_UNSET"))
#ifdef OR_UNSET
return OR_UNSET;
#else
goto not_there;
#endif
if (strEQ(name, "OR_ALL"))
#ifdef OR_ALL
return OR_ALL;
#else
goto not_there;
#endif
break;
case 'P':
break;
case 'Q':
break;
case 'R':
if (strEQ(name, "REDIRECT"))
#ifdef REDIRECT
return REDIRECT;
#else
goto not_there;
#endif
if (strEQ(name, "RSRC_CONF"))
#ifdef RSRC_CONF
return RSRC_CONF;
#else
goto not_there;
#endif
if (strEQ(name, "REMOTE_HOST"))
#ifdef REMOTE_HOST
return REMOTE_HOST;
#else
goto not_there;
#endif
if (strEQ(name, "REMOTE_NAME"))
#ifdef REMOTE_NAME
return REMOTE_NAME;
#else
goto not_there;
#endif
if (strEQ(name, "REMOTE_NOLOOKUP"))
#ifdef REMOTE_NOLOOKUP
return REMOTE_NOLOOKUP;
#else
goto not_there;
#endif
if (strEQ(name, "REMOTE_DOUBLE_REV"))
#ifdef REMOTE_DOUBLE_REV
return REMOTE_DOUBLE_REV;
#else
goto not_there;
#endif
if (strEQ(name, "REQUEST_NO_BODY"))
#ifdef REQUEST_NO_BODY
return REQUEST_NO_BODY;
#else
goto not_there;
#endif
if (strEQ(name, "REQUEST_CHUNKED_ERROR"))
#ifdef REQUEST_CHUNKED_ERROR
return REQUEST_CHUNKED_ERROR;
#else
goto not_there;
#endif
if (strEQ(name, "REQUEST_CHUNKED_DECHUNK"))
#ifdef REQUEST_CHUNKED_DECHUNK
return REQUEST_CHUNKED_DECHUNK;
#else
goto not_there;
#endif
if (strEQ(name, "REQUEST_CHUNKED_PASS"))
#ifdef REQUEST_CHUNKED_PASS
return REQUEST_CHUNKED_PASS;
#else
goto not_there;
#endif
if (strEQ(name, "RESPONSE_CODES"))
#ifdef RESPONSE_CODES
return RESPONSE_CODES;
#else
goto not_there;
#endif
break;
case 'S':
if (strEQ(name, "SATISFY_ALL"))
#ifdef SATISFY_ALL
return SATISFY_ALL;
#else
goto not_there;
#endif
if (strEQ(name, "SATISFY_ANY"))
#ifdef SATISFY_ANY
return SATISFY_ANY;
#else
goto not_there;
#endif
if(strEQ(name, "SATISFY_NOSPEC"))
#ifdef SATISFY_NOSPEC
return SATISFY_NOSPEC;
#else
goto not_there;
#endif
if (strEQ(name, "SERVER_ERROR"))
#ifdef SERVER_ERROR
return SERVER_ERROR;
#else
goto not_there;
#endif
if (strEQ(name, "SERVICE_UNAVAILABLE"))
#ifdef SERVICE_UNAVAILABLE
return SERVICE_UNAVAILABLE;
#else
goto not_there;
#endif
case 'T':
break;
case 'U':
if (strEQ(name, "USE_LOCAL_COPY"))
#ifdef USE_LOCAL_COPY
return USE_LOCAL_COPY;
#else
goto not_there;
#endif
break;
case 'V':
break;
case 'W':
break;
case 'X':
break;
case 'Y':
break;
case 'Z':
break;
default:
errno = EINVAL;
return 0;
}
not_there:
{
enum cmd_how args_how = autoload_args_how(name);
if(((int)args_how) > -1)
return (double)args_how;
}
errno = ENOENT;
return 0;
}
#define __PACKAGE__ "Apache::Constants"
#define __PACKAGE_LEN__ 17
#define __AUTOLOAD__ "Apache::Constants::AUTOLOAD"
/* this is kinda ugly, but wtf */
static void boot_ConstSubs(char *tag)
{
dTHR;
HV *stash = gv_stashpvn(__PACKAGE__, __PACKAGE_LEN__, FALSE);
I32 i;
#ifdef XS_IMPORT
char **export = export_tags(tag);
for (i=0; export[i]; i++) {
#define EXP_NAME export[i]
#else
HV *exp_tags = perl_get_hv("Apache::Constants::EXPORT_TAGS", TRUE);
SV **avrv = hv_fetch(exp_tags, tag, strlen(tag), FALSE);
AV *export;
if(avrv)
export = (AV*)SvRV(*avrv);
else
return;
#define EXP_NAME SvPV(*av_fetch(export, i, 0),na)
for(i=0; i<=AvFILL(export); i++) {
#endif
char *name = EXP_NAME;
double val = constant(name);
my_newCONSTSUB(stash, name, newSViv( (I32) val));
}
}
MODULE = Apache::Constants PACKAGE = Apache::Constants
PROTOTYPES: DISABLE
BOOT:
items = items;
#ifndef XS_IMPORT
perl_require_module("Apache::Constants::Exports", NULL);
#endif
boot_ConstSubs("common");
#ifdef XS_IMPORT
void
import(pclass, ...)
SV *pclass
PREINIT:
I32 i = 0;
SV *caller = perl_eval_pv("scalar caller", TRUE);
CODE:
for(i=1; i<items; i++) {
my_import(pclass, caller, ST(i));
}
#endif
void
__AUTOLOAD()
PREINIT:
HV *stash = gv_stashpvn(__PACKAGE__, __PACKAGE_LEN__, FALSE);
SV *sv = GvSV(gv_fetchpv(__AUTOLOAD__, TRUE, SVt_PV));
char *name = SvPV(sv,na);
int len = __PACKAGE_LEN__+2;
double val;
CODE:
while(len--) ++name;
val = constant(name);
if(errno != 0)
croak("Your vendor has not defined Apache::Constants macro `%s'", name);
else
my_newCONSTSUB(stash, name, newSViv( (I32) val));
const char *
SERVER_VERSION()
CODE:
#if MODULE_MAGIC_NUMBER >= 19980413
RETVAL = ap_get_server_version();
#else
RETVAL = SERVER_VERSION;
#endif
OUTPUT:
RETVAL
char *
SERVER_BUILT()
CODE:
#if MODULE_MAGIC_NUMBER >= 19980413
RETVAL = (char *)ap_get_server_built();
#else
RETVAL = SERVER_BUILT;
#endif
OUTPUT:
RETVAL
char *
DECLINE_CMD()
CODE:
#ifdef DECLINE_CMD
RETVAL = DECLINE_CMD;
#else
RETVAL = "\a\b";
#endif
OUTPUT:
RETVAL
char *
DIR_MAGIC_TYPE()
CODE:
RETVAL = DIR_MAGIC_TYPE;
OUTPUT:
RETVAL