Return-Path: Delivered-To: apmail-httpd-apreq-cvs-archive@www.apache.org Received: (qmail 85477 invoked from network); 6 Oct 2005 17:52:18 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 6 Oct 2005 17:52:18 -0000 Received: (qmail 98770 invoked by uid 500); 6 Oct 2005 17:52:18 -0000 Delivered-To: apmail-httpd-apreq-cvs-archive@httpd.apache.org Received: (qmail 98738 invoked by uid 500); 6 Oct 2005 17:52:17 -0000 Mailing-List: contact apreq-cvs-help@httpd.apache.org; run by ezmlm Precedence: bulk Reply-To: apreq-dev@httpd.apache.org List-Post: List-Help: List-Unsubscribe: List-Id: Delivered-To: mailing list apreq-cvs@httpd.apache.org Received: (qmail 98726 invoked by uid 99); 6 Oct 2005 17:52:17 -0000 X-ASF-Spam-Status: No, hits=-9.8 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [209.237.227.194] (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.29) with SMTP; Thu, 06 Oct 2005 10:52:16 -0700 Received: (qmail 85373 invoked by uid 65534); 6 Oct 2005 17:51:56 -0000 Message-ID: <20051006175156.85372.qmail@minotaur.apache.org> Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r306819 - in /httpd/apreq/trunk: ./ glue/perl/xsbuilder/APR/Request/ glue/perl/xsbuilder/APR/Request/Cookie/ glue/perl/xsbuilder/APR/Request/Param/ glue/perl/xsbuilder/maps/ Date: Thu, 06 Oct 2005 17:51:53 -0000 To: apreq-cvs@httpd.apache.org From: joes@apache.org X-Mailer: svnmailer-1.0.5 X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Author: joes Date: Thu Oct 6 10:51:44 2005 New Revision: 306819 URL: http://svn.apache.org/viewcvs?rev=306819&view=rev Log: Move APR::Request::Param::Table and APR::Request::Cookie::Table packages to APR::Request module. Modified: httpd/apreq/trunk/CHANGES httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/APR__Request.h httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Cookie/APR__Request__Cookie.h httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Cookie/Cookie.pm httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Cookie/Cookie.pod httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Cookie/Cookie.xs httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Param/APR__Request__Param.h httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Param/Param.pm httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Param/Param.pod httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Param/Param.xs httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Request.pm httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Request.pod httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Request.xs httpd/apreq/trunk/glue/perl/xsbuilder/maps/apreq_functions.map Modified: httpd/apreq/trunk/CHANGES URL: http://svn.apache.org/viewcvs/httpd/apreq/trunk/CHANGES?rev=306819&r1=306818&r2=306819&view=diff ============================================================================== --- httpd/apreq/trunk/CHANGES (original) +++ httpd/apreq/trunk/CHANGES Thu Oct 6 10:51:44 2005 @@ -4,6 +4,11 @@ @section v2_07 Changes with libapreq2-2.07 + +- Perl API [joes] + Move APR::Request::Param::Table and APR::Request::Cookie::Table + packages to APR::Request module. + - Perl XS [Steve Hay] Fix compile problems on Win32 without PERL_IMPLICIT_SYS related to link being an unresolved symbol. Modified: httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/APR__Request.h URL: http://svn.apache.org/viewcvs/httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/APR__Request.h?rev=306819&r1=306818&r2=306819&view=diff ============================================================================== --- httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/APR__Request.h (original) +++ httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/APR__Request.h Thu Oct 6 10:51:44 2005 @@ -442,3 +442,330 @@ return s; } + + +static int apreq_xs_cookie_table_do_sub(void *data, const char *key, + const char *val) +{ + struct apreq_xs_do_arg *d = data; + apreq_cookie_t *c = apreq_value_to_cookie(val); + dTHXa(d->perl); + dSP; + SV *sv = apreq_xs_cookie2sv(aTHX_ c, d->pkg, d->parent); + int rv; + + ENTER; + SAVETMPS; + + PUSHMARK(SP); + EXTEND(SP,2); + + PUSHs(sv_2mortal(newSVpvn(c->v.name, c->v.nlen))); + PUSHs(sv_2mortal(sv)); + + PUTBACK; + rv = call_sv(d->sub, G_SCALAR); + SPAGAIN; + rv = (1 == rv) ? POPi : 1; + PUTBACK; + FREETMPS; + LEAVE; + + return rv; +} + +MP_STATIC XS(apreq_xs_cookie_table_do) +{ + dXSARGS; + struct apreq_xs_do_arg d = { NULL, NULL, NULL, aTHX }; + const apr_table_t *t; + int i, rv = 1; + SV *sv, *t_obj; + IV iv; + MAGIC *mg; + + if (items < 2 || !SvROK(ST(0)) || !SvROK(ST(1))) + Perl_croak(aTHX_ "Usage: $object->do(\\&callback, @keys)"); + sv = ST(0); + + t_obj = apreq_xs_sv2object(aTHX_ sv, COOKIE_TABLE_CLASS, 't'); + iv = SvIVX(t_obj); + t = INT2PTR(const apr_table_t *, iv); + mg = mg_find(t_obj, PERL_MAGIC_ext); + d.parent = mg->mg_obj; + d.pkg = mg->mg_ptr; + d.sub = ST(1); + + if (items == 2) { + rv = apr_table_do(apreq_xs_cookie_table_do_sub, &d, t, NULL); + XSRETURN_IV(rv); + } + + for (i = 2; i < items; ++i) { + const char *key = SvPV_nolen(ST(i)); + rv = apr_table_do(apreq_xs_cookie_table_do_sub, &d, t, key, NULL); + if (rv == 0) + break; + } + XSRETURN_IV(rv); +} + +MP_STATIC XS(apreq_xs_cookie_table_FETCH) +{ + dXSARGS; + const apr_table_t *t; + const char *cookie_class; + SV *sv, *obj, *parent; + IV iv; + MAGIC *mg; + + if (items != 2 || !SvROK(ST(0)) + || !sv_derived_from(ST(0), COOKIE_TABLE_CLASS)) + Perl_croak(aTHX_ "Usage: " COOKIE_TABLE_CLASS "::FETCH($table, $key)"); + + sv = ST(0); + + obj = apreq_xs_sv2object(aTHX_ sv, COOKIE_TABLE_CLASS, 't'); + iv = SvIVX(obj); + t = INT2PTR(const apr_table_t *, iv); + + mg = mg_find(obj, PERL_MAGIC_ext); + cookie_class = mg->mg_ptr; + parent = mg->mg_obj; + + if (GIMME_V == G_SCALAR) { + IV idx; + const char *key, *val; + const apr_array_header_t *arr; + apr_table_entry_t *te; + key = SvPV_nolen(ST(1)); + + idx = SvCUR(obj); + arr = apr_table_elts(t); + te = (apr_table_entry_t *)arr->elts; + + if (idx > 0 && idx <= arr->nelts + && !strcasecmp(key, te[idx-1].key)) + val = te[idx-1].val; + else + val = apr_table_get(t, key); + + if (val != NULL) { + apreq_cookie_t *c = apreq_value_to_cookie(val); + ST(0) = apreq_xs_cookie2sv(aTHX_ c, cookie_class, parent); + sv_2mortal(ST(0)); + XSRETURN(1); + } + else { + XSRETURN_UNDEF; + } + } + else if (GIMME_V == G_ARRAY) { + struct apreq_xs_do_arg d = {NULL, NULL, NULL, aTHX}; + d.pkg = cookie_class; + d.parent = parent; + XSprePUSH; + PUTBACK; + apr_table_do(apreq_xs_cookie_table_values, &d, t, SvPV_nolen(ST(1)), NULL); + } + else + XSRETURN(0); +} + +MP_STATIC XS(apreq_xs_cookie_table_NEXTKEY) +{ + dXSARGS; + SV *sv, *obj; + IV iv, idx; + const apr_table_t *t; + const apr_array_header_t *arr; + apr_table_entry_t *te; + + if (!SvROK(ST(0))) + Perl_croak(aTHX_ "Usage: $table->NEXTKEY($prev)"); + + sv = ST(0); + obj = apreq_xs_sv2object(aTHX_ sv, COOKIE_TABLE_CLASS, 't'); + + iv = SvIVX(obj); + t = INT2PTR(const apr_table_t *, iv); + arr = apr_table_elts(t); + te = (apr_table_entry_t *)arr->elts; + + if (items == 1) + SvCUR(obj) = 0; + + if (SvCUR(obj) >= arr->nelts) { + SvCUR(obj) = 0; + XSRETURN_UNDEF; + } + idx = SvCUR(obj)++; + sv = newSVpv(te[idx].key, 0); + ST(0) = sv_2mortal(sv); + XSRETURN(1); +} + + +static int apreq_xs_param_table_do_sub(void *data, const char *key, + const char *val) +{ + struct apreq_xs_do_arg *d = data; + apreq_param_t *p = apreq_value_to_param(val); + dTHXa(d->perl); + dSP; + SV *sv = apreq_xs_param2sv(aTHX_ p, d->pkg, d->parent); + int rv; + + ENTER; + SAVETMPS; + + PUSHMARK(SP); + EXTEND(SP,2); + + PUSHs(sv_2mortal(newSVpvn(p->v.name, p->v.nlen))); + PUSHs(sv_2mortal(sv)); + + PUTBACK; + rv = call_sv(d->sub, G_SCALAR); + SPAGAIN; + rv = (1 == rv) ? POPi : 1; + PUTBACK; + FREETMPS; + LEAVE; + + return rv; +} + +MP_STATIC XS(apreq_xs_param_table_do) +{ + dXSARGS; + struct apreq_xs_do_arg d = { NULL, NULL, NULL, aTHX }; + const apr_table_t *t; + int i, rv = 1; + SV *sv, *t_obj; + IV iv; + MAGIC *mg; + + if (items < 2 || !SvROK(ST(0)) || !SvROK(ST(1))) + Perl_croak(aTHX_ "Usage: $object->do(\\&callback, @keys)"); + sv = ST(0); + + t_obj = apreq_xs_sv2object(aTHX_ sv, PARAM_TABLE_CLASS, 't'); + iv = SvIVX(t_obj); + t = INT2PTR(const apr_table_t *, iv); + mg = mg_find(t_obj, PERL_MAGIC_ext); + d.parent = mg->mg_obj; + d.pkg = mg->mg_ptr; + d.sub = ST(1); + + if (items == 2) { + rv = apr_table_do(apreq_xs_param_table_do_sub, &d, t, NULL); + XSRETURN_IV(rv); + } + + for (i = 2; i < items; ++i) { + const char *key = SvPV_nolen(ST(i)); + rv = apr_table_do(apreq_xs_param_table_do_sub, &d, t, key, NULL); + if (rv == 0) + break; + } + XSRETURN_IV(rv); +} + +MP_STATIC XS(apreq_xs_param_table_FETCH) +{ + dXSARGS; + const apr_table_t *t; + const char *param_class; + SV *sv, *t_obj, *parent; + IV iv; + MAGIC *mg; + + if (items != 2 || !SvROK(ST(0)) + || !sv_derived_from(ST(0), PARAM_TABLE_CLASS)) + Perl_croak(aTHX_ "Usage: " PARAM_TABLE_CLASS "::FETCH($table, $key)"); + + sv = ST(0); + + t_obj = apreq_xs_sv2object(aTHX_ sv, PARAM_TABLE_CLASS, 't'); + iv = SvIVX(t_obj); + t = INT2PTR(const apr_table_t *, iv); + + mg = mg_find(t_obj, PERL_MAGIC_ext); + param_class = mg->mg_ptr; + parent = mg->mg_obj; + + + if (GIMME_V == G_SCALAR) { + IV idx; + const char *key, *val; + const apr_array_header_t *arr; + apr_table_entry_t *te; + key = SvPV_nolen(ST(1)); + + idx = SvCUR(t_obj); + arr = apr_table_elts(t); + te = (apr_table_entry_t *)arr->elts; + + if (idx > 0 && idx <= arr->nelts + && !strcasecmp(key, te[idx-1].key)) + val = te[idx-1].val; + else + val = apr_table_get(t, key); + + if (val != NULL) { + apreq_param_t *p = apreq_value_to_param(val); + ST(0) = apreq_xs_param2sv(aTHX_ p, param_class, parent); + sv_2mortal(ST(0)); + XSRETURN(1); + } + else { + XSRETURN_UNDEF; + } + } + else if (GIMME_V == G_ARRAY) { + struct apreq_xs_do_arg d = {NULL, NULL, NULL, aTHX}; + d.pkg = param_class; + d.parent = parent; + XSprePUSH; + PUTBACK; + apr_table_do(apreq_xs_param_table_values, &d, t, SvPV_nolen(ST(1)), NULL); + } + else + XSRETURN(0); +} + +MP_STATIC XS(apreq_xs_param_table_NEXTKEY) +{ + dXSARGS; + SV *sv, *obj; + IV iv, idx; + const apr_table_t *t; + const apr_array_header_t *arr; + apr_table_entry_t *te; + + if (!SvROK(ST(0)) || !sv_derived_from(ST(0), PARAM_TABLE_CLASS)) + Perl_croak(aTHX_ "Usage: " PARAM_TABLE_CLASS "::NEXTKEY($table, $key)"); + + sv = ST(0); + obj = apreq_xs_sv2object(aTHX_ sv, PARAM_TABLE_CLASS,'t'); + + iv = SvIVX(obj); + t = INT2PTR(const apr_table_t *, iv); + arr = apr_table_elts(t); + te = (apr_table_entry_t *)arr->elts; + + if (items == 1) + SvCUR(obj) = 0; + + if (SvCUR(obj) >= arr->nelts) { + SvCUR(obj) = 0; + XSRETURN_UNDEF; + } + idx = SvCUR(obj)++; + sv = newSVpv(te[idx].key, 0); + ST(0) = sv_2mortal(sv); + XSRETURN(1); +} + + Modified: httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Cookie/APR__Request__Cookie.h URL: http://svn.apache.org/viewcvs/httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Cookie/APR__Request__Cookie.h?rev=306819&r1=306818&r2=306819&view=diff ============================================================================== --- httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Cookie/APR__Request__Cookie.h (original) +++ httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Cookie/APR__Request__Cookie.h Thu Oct 6 10:51:44 2005 @@ -1,179 +1,3 @@ -static int apreq_xs_cookie_table_values(void *data, const char *key, - const char *val) -{ - struct apreq_xs_do_arg *d = (struct apreq_xs_do_arg *)data; - dTHXa(d->perl); - dSP; - apreq_cookie_t *c = apreq_value_to_cookie(val); - SV *sv = apreq_xs_cookie2sv(aTHX_ c, d->pkg, d->parent); - - XPUSHs(sv_2mortal(sv)); - PUTBACK; - return 1; -} - -static int apreq_xs_cookie_table_do_sub(void *data, const char *key, - const char *val) -{ - struct apreq_xs_do_arg *d = data; - apreq_cookie_t *c = apreq_value_to_cookie(val); - dTHXa(d->perl); - dSP; - SV *sv = apreq_xs_cookie2sv(aTHX_ c, d->pkg, d->parent); - int rv; - - ENTER; - SAVETMPS; - - PUSHMARK(SP); - EXTEND(SP,2); - - PUSHs(sv_2mortal(newSVpvn(c->v.name, c->v.nlen))); - PUSHs(sv_2mortal(sv)); - - PUTBACK; - rv = call_sv(d->sub, G_SCALAR); - SPAGAIN; - rv = (1 == rv) ? POPi : 1; - PUTBACK; - FREETMPS; - LEAVE; - - return rv; -} - -MP_STATIC XS(apreq_xs_cookie_table_do) -{ - dXSARGS; - struct apreq_xs_do_arg d = { NULL, NULL, NULL, aTHX }; - const apr_table_t *t; - int i, rv = 1; - SV *sv, *t_obj; - IV iv; - MAGIC *mg; - - if (items < 2 || !SvROK(ST(0)) || !SvROK(ST(1))) - Perl_croak(aTHX_ "Usage: $object->do(\\&callback, @keys)"); - sv = ST(0); - - t_obj = apreq_xs_sv2object(aTHX_ sv, COOKIE_TABLE_CLASS, 't'); - iv = SvIVX(t_obj); - t = INT2PTR(const apr_table_t *, iv); - mg = mg_find(t_obj, PERL_MAGIC_ext); - d.parent = mg->mg_obj; - d.pkg = mg->mg_ptr; - d.sub = ST(1); - - if (items == 2) { - rv = apr_table_do(apreq_xs_cookie_table_do_sub, &d, t, NULL); - XSRETURN_IV(rv); - } - - for (i = 2; i < items; ++i) { - const char *key = SvPV_nolen(ST(i)); - rv = apr_table_do(apreq_xs_cookie_table_do_sub, &d, t, key, NULL); - if (rv == 0) - break; - } - XSRETURN_IV(rv); -} - -MP_STATIC XS(apreq_xs_cookie_table_FETCH) -{ - dXSARGS; - const apr_table_t *t; - const char *cookie_class; - SV *sv, *obj, *parent; - IV iv; - MAGIC *mg; - - if (items != 2 || !SvROK(ST(0)) - || !sv_derived_from(ST(0), COOKIE_TABLE_CLASS)) - Perl_croak(aTHX_ "Usage: " COOKIE_TABLE_CLASS "::FETCH($table, $key)"); - - sv = ST(0); - - obj = apreq_xs_sv2object(aTHX_ sv, COOKIE_TABLE_CLASS, 't'); - iv = SvIVX(obj); - t = INT2PTR(const apr_table_t *, iv); - - mg = mg_find(obj, PERL_MAGIC_ext); - cookie_class = mg->mg_ptr; - parent = mg->mg_obj; - - if (GIMME_V == G_SCALAR) { - IV idx; - const char *key, *val; - const apr_array_header_t *arr; - apr_table_entry_t *te; - key = SvPV_nolen(ST(1)); - - idx = SvCUR(obj); - arr = apr_table_elts(t); - te = (apr_table_entry_t *)arr->elts; - - if (idx > 0 && idx <= arr->nelts - && !strcasecmp(key, te[idx-1].key)) - val = te[idx-1].val; - else - val = apr_table_get(t, key); - - if (val != NULL) { - apreq_cookie_t *c = apreq_value_to_cookie(val); - ST(0) = apreq_xs_cookie2sv(aTHX_ c, cookie_class, parent); - sv_2mortal(ST(0)); - XSRETURN(1); - } - else { - XSRETURN_UNDEF; - } - } - else if (GIMME_V == G_ARRAY) { - struct apreq_xs_do_arg d = {NULL, NULL, NULL, aTHX}; - d.pkg = cookie_class; - d.parent = parent; - XSprePUSH; - PUTBACK; - apr_table_do(apreq_xs_cookie_table_values, &d, t, SvPV_nolen(ST(1)), NULL); - } - else - XSRETURN(0); -} - -MP_STATIC XS(apreq_xs_cookie_table_NEXTKEY) -{ - dXSARGS; - SV *sv, *obj; - IV iv, idx; - const apr_table_t *t; - const apr_array_header_t *arr; - apr_table_entry_t *te; - - if (!SvROK(ST(0))) - Perl_croak(aTHX_ "Usage: $table->NEXTKEY($prev)"); - - sv = ST(0); - obj = apreq_xs_sv2object(aTHX_ sv, COOKIE_TABLE_CLASS, 't'); - - iv = SvIVX(obj); - t = INT2PTR(const apr_table_t *, iv); - arr = apr_table_elts(t); - te = (apr_table_entry_t *)arr->elts; - - if (items == 1) - SvCUR(obj) = 0; - - if (SvCUR(obj) >= arr->nelts) { - SvCUR(obj) = 0; - XSRETURN_UNDEF; - } - idx = SvCUR(obj)++; - sv = newSVpv(te[idx].key, 0); - ST(0) = sv_2mortal(sv); - XSRETURN(1); -} - - MP_STATIC XS(XS_APR__Request__Cookie_nil) { dXSARGS; Modified: httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Cookie/Cookie.pm URL: http://svn.apache.org/viewcvs/httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Cookie/Cookie.pm?rev=306819&r1=306818&r2=306819&view=diff ============================================================================== --- httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Cookie/Cookie.pm (original) +++ httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Cookie/Cookie.pm Thu Oct 6 10:51:44 2005 @@ -22,10 +22,3 @@ my $obj = shift; return "$obj"; } - -package APR::Request::Cookie::Table; - -sub EXISTS { - my ($t, $key) = @_; - return defined $t->FETCH($key); -} Modified: httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Cookie/Cookie.pod URL: http://svn.apache.org/viewcvs/httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Cookie/Cookie.pod?rev=306819&r1=306818&r2=306819&view=diff ============================================================================== --- httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Cookie/Cookie.pod (original) +++ httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Cookie/Cookie.pod Thu Oct 6 10:51:44 2005 @@ -64,8 +64,7 @@ a few utility functions and constants. This manpage documents version 2.07 -of the APR::Request::Cookie and -APR::Request::Cookie::Table packages. +of the APR::Request::Cookie package. @@ -298,116 +297,9 @@ -=head1 METHODS - - APR::Request::Cookie::Table - read-only version of APR::Table. - -Tables in this class normally arise from calls to -C<< APR::Request::jar() >>. - - - - -=head2 cookie_class - - $table->cookie_class() - $table->cookie_class($set) - -Get/set the class each table element is blessed into during a -L or L call. If defined, the class must be derived -from APR::Request::Cookie. When called with $set, it returns -the $table. Otherwise it returns the name of the current class, -or undef if no cookie class is defined. - - - -=for example begin - - { - package FOO; - @ISA= 'APR::Request::Cookie'; - } - - $jar->cookie_class("FOO"); - ok $_->isa("FOO") for values %$jar; - -=for example end - -=for example_testing - $jar->do(sub { ok $_[1]->isa("FOO"); }); - - - - -=head2 get - - $table->get($key) - -Same as FETCH. - - - -=head2 FETCH - - $table->FETCH($key) - -In scalar context, this returns the first value matching -$key (note: see NEXTKEY for additional notes). The match -is always case-insensitive. In list context, this returns -all matching values. Note: the type of the return values -depends on the table's current cookie_class. - - - - -=head2 EXISTS - -Synonym for C<< defined >>; these tables are not -allowed to contain undefined values. Since these -are constant tables, they don't autovivify either. - - - - -=head2 FIRSTKEY - - $table->FIRSTKEY() - -Returns the first key in the table. - - - - -=head2 NEXTKEY - - $table->NEXTKEY() - -Returns the next key in the table. For perl 5.8+, -if the key is multivalued, a subsequent FETCH on -this key will return the corresponding value, until -either NEXTKEY or FIRSTKEY is invoked again. For -perl 5.6, FETCH always returns the first value. - - - - -=head2 do - - $table->do($callback, @keys) - -Same as APR::Table::do; iterates over the table -calling $callback->($key, $value) for each matching -@keys. If @keys is empty, this iterates over the -entire table. - -Note: The type of $value inserted into the callback -depends on the table's current cookie_class. - - - =head1 SEE ALSO -L<< Apache2::Cookie >>, L<< APR::Request >>, L<< APR::Table >>. +L<< Apache2::Cookie >>, L<< APR::Request >>. Modified: httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Cookie/Cookie.xs URL: http://svn.apache.org/viewcvs/httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Cookie/Cookie.xs?rev=306819&r1=306818&r2=306819&view=diff ============================================================================== --- httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Cookie/Cookie.xs (original) +++ httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Cookie/Cookie.xs Thu Oct 6 10:51:44 2005 @@ -265,44 +265,3 @@ OUTPUT: RETVAL -MODULE = APR::Request::Cookie PACKAGE = APR::Request::Cookie::Table - -SV * -cookie_class(t, subclass=&PL_sv_undef) - APR::Request::Cookie::Table t - SV *subclass - - PREINIT: - SV *obj = apreq_xs_sv2object(aTHX_ ST(0), COOKIE_TABLE_CLASS, 't'); - MAGIC *mg = mg_find(obj, PERL_MAGIC_ext); - char *curclass = mg->mg_ptr; - - CODE: - - if (items == 2) { - if (!SvOK(subclass)) { - mg->mg_ptr = NULL; - mg->mg_len = 0; - } - else if (!sv_derived_from(subclass, COOKIE_CLASS)) { - Perl_croak(aTHX_ "Usage: " - COOKIE_TABLE_CLASS "::cookie_class($table, $class): " - "class %s is not derived from " COOKIE_CLASS, - SvPV_nolen(subclass)); - } - else { - STRLEN len; - mg->mg_ptr = savepv(SvPV(subclass, len)); - mg->mg_len = len; - } - if (curclass != NULL) - Safefree(curclass); - - XSRETURN(1); - } - - RETVAL = (curclass == NULL) ? &PL_sv_undef : newSVpv(curclass, 0); - - OUTPUT: - RETVAL - Modified: httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Param/APR__Request__Param.h URL: http://svn.apache.org/viewcvs/httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Param/APR__Request__Param.h?rev=306819&r1=306818&r2=306819&view=diff ============================================================================== --- httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Param/APR__Request__Param.h (original) +++ httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Param/APR__Request__Param.h Thu Oct 6 10:51:44 2005 @@ -1,181 +1,3 @@ -static int apreq_xs_param_table_values(void *data, const char *key, - const char *val) -{ - struct apreq_xs_do_arg *d = (struct apreq_xs_do_arg *)data; - dTHXa(d->perl); - dSP; - apreq_param_t *p = apreq_value_to_param(val); - SV *sv = apreq_xs_param2sv(aTHX_ p, d->pkg, d->parent); - - XPUSHs(sv_2mortal(sv)); - PUTBACK; - return 1; -} - - -static int apreq_xs_param_table_do_sub(void *data, const char *key, - const char *val) -{ - struct apreq_xs_do_arg *d = data; - apreq_param_t *p = apreq_value_to_param(val); - dTHXa(d->perl); - dSP; - SV *sv = apreq_xs_param2sv(aTHX_ p, d->pkg, d->parent); - int rv; - - ENTER; - SAVETMPS; - - PUSHMARK(SP); - EXTEND(SP,2); - - PUSHs(sv_2mortal(newSVpvn(p->v.name, p->v.nlen))); - PUSHs(sv_2mortal(sv)); - - PUTBACK; - rv = call_sv(d->sub, G_SCALAR); - SPAGAIN; - rv = (1 == rv) ? POPi : 1; - PUTBACK; - FREETMPS; - LEAVE; - - return rv; -} - -MP_STATIC XS(apreq_xs_param_table_do) -{ - dXSARGS; - struct apreq_xs_do_arg d = { NULL, NULL, NULL, aTHX }; - const apr_table_t *t; - int i, rv = 1; - SV *sv, *t_obj; - IV iv; - MAGIC *mg; - - if (items < 2 || !SvROK(ST(0)) || !SvROK(ST(1))) - Perl_croak(aTHX_ "Usage: $object->do(\\&callback, @keys)"); - sv = ST(0); - - t_obj = apreq_xs_sv2object(aTHX_ sv, PARAM_TABLE_CLASS, 't'); - iv = SvIVX(t_obj); - t = INT2PTR(const apr_table_t *, iv); - mg = mg_find(t_obj, PERL_MAGIC_ext); - d.parent = mg->mg_obj; - d.pkg = mg->mg_ptr; - d.sub = ST(1); - - if (items == 2) { - rv = apr_table_do(apreq_xs_param_table_do_sub, &d, t, NULL); - XSRETURN_IV(rv); - } - - for (i = 2; i < items; ++i) { - const char *key = SvPV_nolen(ST(i)); - rv = apr_table_do(apreq_xs_param_table_do_sub, &d, t, key, NULL); - if (rv == 0) - break; - } - XSRETURN_IV(rv); -} - -MP_STATIC XS(apreq_xs_param_table_FETCH) -{ - dXSARGS; - const apr_table_t *t; - const char *param_class; - SV *sv, *t_obj, *parent; - IV iv; - MAGIC *mg; - - if (items != 2 || !SvROK(ST(0)) - || !sv_derived_from(ST(0), PARAM_TABLE_CLASS)) - Perl_croak(aTHX_ "Usage: " PARAM_TABLE_CLASS "::FETCH($table, $key)"); - - sv = ST(0); - - t_obj = apreq_xs_sv2object(aTHX_ sv, PARAM_TABLE_CLASS, 't'); - iv = SvIVX(t_obj); - t = INT2PTR(const apr_table_t *, iv); - - mg = mg_find(t_obj, PERL_MAGIC_ext); - param_class = mg->mg_ptr; - parent = mg->mg_obj; - - - if (GIMME_V == G_SCALAR) { - IV idx; - const char *key, *val; - const apr_array_header_t *arr; - apr_table_entry_t *te; - key = SvPV_nolen(ST(1)); - - idx = SvCUR(t_obj); - arr = apr_table_elts(t); - te = (apr_table_entry_t *)arr->elts; - - if (idx > 0 && idx <= arr->nelts - && !strcasecmp(key, te[idx-1].key)) - val = te[idx-1].val; - else - val = apr_table_get(t, key); - - if (val != NULL) { - apreq_param_t *p = apreq_value_to_param(val); - ST(0) = apreq_xs_param2sv(aTHX_ p, param_class, parent); - sv_2mortal(ST(0)); - XSRETURN(1); - } - else { - XSRETURN_UNDEF; - } - } - else if (GIMME_V == G_ARRAY) { - struct apreq_xs_do_arg d = {NULL, NULL, NULL, aTHX}; - d.pkg = param_class; - d.parent = parent; - XSprePUSH; - PUTBACK; - apr_table_do(apreq_xs_param_table_values, &d, t, SvPV_nolen(ST(1)), NULL); - } - else - XSRETURN(0); -} - -MP_STATIC XS(apreq_xs_param_table_NEXTKEY) -{ - dXSARGS; - SV *sv, *obj; - IV iv, idx; - const apr_table_t *t; - const apr_array_header_t *arr; - apr_table_entry_t *te; - - if (!SvROK(ST(0)) || !sv_derived_from(ST(0), PARAM_TABLE_CLASS)) - Perl_croak(aTHX_ "Usage: " PARAM_TABLE_CLASS "::NEXTKEY($table, $key)"); - - sv = ST(0); - obj = apreq_xs_sv2object(aTHX_ sv, PARAM_TABLE_CLASS,'t'); - - iv = SvIVX(obj); - t = INT2PTR(const apr_table_t *, iv); - arr = apr_table_elts(t); - te = (apr_table_entry_t *)arr->elts; - - if (items == 1) - SvCUR(obj) = 0; - - if (SvCUR(obj) >= arr->nelts) { - SvCUR(obj) = 0; - XSRETURN_UNDEF; - } - idx = SvCUR(obj)++; - sv = newSVpv(te[idx].key, 0); - ST(0) = sv_2mortal(sv); - XSRETURN(1); -} - - MP_STATIC XS(XS_APR__Request__Param_nil) { dXSARGS; Modified: httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Param/Param.pm URL: http://svn.apache.org/viewcvs/httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Param/Param.pm?rev=306819&r1=306818&r2=306819&view=diff ============================================================================== --- httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Param/Param.pm (original) +++ httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Param/Param.pm Thu Oct 6 10:51:44 2005 @@ -21,10 +21,3 @@ package APR::Request::Brigade::IO; push our(@ISA), (); - -package APR::Request::Param::Table; - -sub EXISTS { - my ($t, $key) = @_; - return defined $t->FETCH($key); -} Modified: httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Param/Param.pod URL: http://svn.apache.org/viewcvs/httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Param/Param.pod?rev=306819&r1=306818&r2=306819&view=diff ============================================================================== --- httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Param/Param.pod (original) +++ httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Param/Param.pod Thu Oct 6 10:51:44 2005 @@ -76,7 +76,7 @@ This manpage documents version 2.07 of the APR::Request::Param, APR::Request::Brigade, -and APR::Request::Param::Table packages. +and APR::Request::Brigade::IO packages. =head1 OVERLOADS @@ -265,95 +265,6 @@ $param->upload_fh Returns a seekable filehandle representing the file-upload content. - - - - -=head1 METHODS - -APR::Request::Param::Table - - - - -=head2 param_class - - $table->param_class() - $table->param_class($set) - - -Get/set the class each table element is blessed into during a -C or C call. If defined, the class must be derived -from APR::Request::Param. When called with $set, it returns -the $table. Otherwise it returns the name of the current class, -or undef if no param class is defined. - - - - -=head2 get - - $table->get($key) - -Same as FETCH. - - - - -=head2 FETCH - - $table->FETCH($key) - -In scalar context, this returns the first value matching -$key (see NEXTKEY for additional notes on this). The match -is always case-insensitive. In list context, this returns -all matching values. Note: the type of the return values -depends on the table's current param_class. - - - -=head2 EXISTS - -Synonym for C<< defined >>; these tables are not -allowed to contain undefined values. Since these -are constant tables, they don't autovivify either. - - - - -=head2 NEXTKEY - - $table->NEXTKEY() - -Returns the next key in the table. For perl 5.8+, -if the key is multivalued, a subsequent FETCH on -this key will return the corresponding value, until -either NEXTKEY or FIRSTKEY is invoked again. For -perl 5.6, FETCH always returns the first value. - - - - -=head2 FIRSTKEY - - $table->FIRSTKEY() - -Returns the first key in the table. - - - - -=head2 do - - $table->do($callback, @keys) - -Same as APR::Table::do; iterates over the table -calling $callback->($key, $value) for each matching -@keys. If @keys is empty, this iterates over the -entire table. - -Note: The type of $value inserted into the callback -depends on the table's current value_class. Modified: httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Param/Param.xs URL: http://svn.apache.org/viewcvs/httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Param/Param.xs?rev=306819&r1=306818&r2=306819&view=diff ============================================================================== --- httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Param/Param.xs (original) +++ httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Param/Param.xs Thu Oct 6 10:51:44 2005 @@ -1,7 +1,8 @@ /* On Win32 without PERL_IMPLICIT_SYS, PerlLIO_link is #defined as * link, which in turn is #defined as win32_link, but mp2's * modperl_perl_unembed.h #undefs link, leaving link as an unresolved - * symbol when linking Param.dll. */ + * symbol when linking Param.dll. + */ #ifdef WIN32 #ifndef PERL_IMPLICIT_SYS #undef PerlLIO_link @@ -133,49 +134,6 @@ RETVAL = apreq_param_make(pool, n, nlen, v, vlen); if (SvTAINTED(name) || SvTAINTED(val)) apreq_param_tainted_on(RETVAL); - - OUTPUT: - RETVAL - - -MODULE = APR::Request::Param PACKAGE = APR::Request::Param::Table - -SV * -param_class(t, subclass=&PL_sv_undef) - APR::Request::Param::Table t - SV *subclass - - PREINIT: - SV *obj = apreq_xs_sv2object(aTHX_ ST(0), PARAM_TABLE_CLASS, 't'); - MAGIC *mg = mg_find(obj, PERL_MAGIC_ext); - char *curclass = mg->mg_ptr; - - CODE: - - if (items == 2) { - if (!SvOK(subclass)) { - mg->mg_ptr = NULL; - mg->mg_len = 0; - } - else if (!sv_derived_from(subclass, PARAM_CLASS)) { - Perl_croak(aTHX_ "Usage: " - PARAM_TABLE_CLASS "::param_class($table, $class): " - "class %s is not derived from " PARAM_CLASS, - SvPV_nolen(subclass)); - } - else { - STRLEN len; - mg->mg_ptr = savepv(SvPV(subclass, len)); - mg->mg_len = len; - - } - if (curclass != NULL) - Safefree(curclass); - - XSRETURN(1); - } - - RETVAL = (curclass == NULL) ? &PL_sv_undef : newSVpv(curclass, 0); OUTPUT: RETVAL Modified: httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Request.pm URL: http://svn.apache.org/viewcvs/httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Request.pm?rev=306819&r1=306818&r2=306819&view=diff ============================================================================== --- httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Request.pm (original) +++ httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Request.pm Thu Oct 6 10:51:44 2005 @@ -34,3 +34,17 @@ package APR::Request::Custom; our @ISA = qw/APR::Request/; + +package APR::Request::Cookie::Table; + +sub EXISTS { + my ($t, $key) = @_; + return defined $t->FETCH($key); +} + +package APR::Request::Param::Table; + +sub EXISTS { + my ($t, $key) = @_; + return defined $t->FETCH($key); +} Modified: httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Request.pod URL: http://svn.apache.org/viewcvs/httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Request.pod?rev=306819&r1=306818&r2=306819&view=diff ============================================================================== --- httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Request.pod (original) +++ httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Request.pod Thu Oct 6 10:51:44 2005 @@ -52,7 +52,9 @@ a few utility functions and constants. This manpage documents version 2.07 -of the APR::Request and APR::Request::Custom packages. +of the APR::Request, APR::Request::Custom, +APR::Request::Cookie::Table, and +APR::Request::Param::Table packages. @@ -321,6 +323,202 @@ } + + + +=head1 METHODS + + APR::Request::Cookie::Table - read-only version of APR::Table. + +Tables in this class normally arise from calls to +C<< APR::Request::jar() >>. + + + + +=head2 cookie_class + + $table->cookie_class() + $table->cookie_class($set) + +Get/set the class each table element is blessed into during a +L or L call. If defined, the class must be derived +from APR::Request::Cookie. When called with $set, it returns +the $table. Otherwise it returns the name of the current class, +or undef if no cookie class is defined. + + + +=for example begin + + { + package FOO; + @ISA= 'APR::Request::Cookie'; + } + + $jar->cookie_class("FOO"); + ok $_->isa("FOO") for values %$jar; + +=for example end + +=for example_testing + $jar->do(sub { ok $_[1]->isa("FOO"); }); + + + + +=head2 get + + $table->get($key) + +Same as FETCH. + + + +=head2 FETCH + + $table->FETCH($key) + +In scalar context, this returns the first value matching +$key (note: see NEXTKEY for additional notes). The match +is always case-insensitive. In list context, this returns +all matching values. Note: the type of the return values +depends on the table's current cookie_class. + + + + +=head2 EXISTS + +Synonym for C<< defined >>; these tables are not +allowed to contain undefined values. Since these +are constant tables, they don't autovivify either. + + + + +=head2 FIRSTKEY + + $table->FIRSTKEY() + +Returns the first key in the table. + + + + +=head2 NEXTKEY + + $table->NEXTKEY() + +Returns the next key in the table. For perl 5.8+, +if the key is multivalued, a subsequent FETCH on +this key will return the corresponding value, until +either NEXTKEY or FIRSTKEY is invoked again. For +perl 5.6, FETCH always returns the first value. + + + + +=head2 do + + $table->do($callback, @keys) + +Same as APR::Table::do; iterates over the table +calling $callback->($key, $value) for each matching +@keys. If @keys is empty, this iterates over the +entire table. + +Note: The type of $value inserted into the callback +depends on the table's current cookie_class. + + + + +=head1 METHODS + +APR::Request::Param::Table + + + + +=head2 param_class + + $table->param_class() + $table->param_class($set) + + +Get/set the class each table element is blessed into during a +C or C call. If defined, the class must be derived +from APR::Request::Param. When called with $set, it returns +the $table. Otherwise it returns the name of the current class, +or undef if no param class is defined. + + + + +=head2 get + + $table->get($key) + +Same as FETCH. + + + + +=head2 FETCH + + $table->FETCH($key) + +In scalar context, this returns the first value matching +$key (see NEXTKEY for additional notes on this). The match +is always case-insensitive. In list context, this returns +all matching values. Note: the type of the return values +depends on the table's current param_class. + + + +=head2 EXISTS + +Synonym for C<< defined >>; these tables are not +allowed to contain undefined values. Since these +are constant tables, they don't autovivify either. + + + + +=head2 NEXTKEY + + $table->NEXTKEY() + +Returns the next key in the table. For perl 5.8+, +if the key is multivalued, a subsequent FETCH on +this key will return the corresponding value, until +either NEXTKEY or FIRSTKEY is invoked again. For +perl 5.6, FETCH always returns the first value. + + + + +=head2 FIRSTKEY + + $table->FIRSTKEY() + +Returns the first key in the table. + + + + +=head2 do + + $table->do($callback, @keys) + +Same as APR::Table::do; iterates over the table +calling $callback->($key, $value) for each matching +@keys. If @keys is empty, this iterates over the +entire table. + +Note: The type of $value inserted into the callback +depends on the table's current value_class. Modified: httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Request.xs URL: http://svn.apache.org/viewcvs/httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Request.xs?rev=306819&r1=306818&r2=306819&view=diff ============================================================================== --- httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Request.xs (original) +++ httpd/apreq/trunk/glue/perl/xsbuilder/APR/Request/Request.xs Thu Oct 6 10:51:44 2005 @@ -270,6 +270,92 @@ OUTPUT: RETVAL + +MODULE = APR::Request::Param PACKAGE = APR::Request::Param::Table + +SV * +param_class(t, subclass=&PL_sv_undef) + APR::Request::Param::Table t + SV *subclass + + PREINIT: + SV *obj = apreq_xs_sv2object(aTHX_ ST(0), PARAM_TABLE_CLASS, 't'); + MAGIC *mg = mg_find(obj, PERL_MAGIC_ext); + char *curclass = mg->mg_ptr; + + CODE: + + if (items == 2) { + if (!SvOK(subclass)) { + mg->mg_ptr = NULL; + mg->mg_len = 0; + } + else if (!sv_derived_from(subclass, PARAM_CLASS)) { + Perl_croak(aTHX_ "Usage: " + PARAM_TABLE_CLASS "::param_class($table, $class): " + "class %s is not derived from " PARAM_CLASS, + SvPV_nolen(subclass)); + } + else { + STRLEN len; + mg->mg_ptr = savepv(SvPV(subclass, len)); + mg->mg_len = len; + + } + if (curclass != NULL) + Safefree(curclass); + + XSRETURN(1); + } + + RETVAL = (curclass == NULL) ? &PL_sv_undef : newSVpv(curclass, 0); + + OUTPUT: + RETVAL + + +MODULE = APR::Request::Cookie PACKAGE = APR::Request::Cookie::Table + +SV * +cookie_class(t, subclass=&PL_sv_undef) + APR::Request::Cookie::Table t + SV *subclass + + PREINIT: + SV *obj = apreq_xs_sv2object(aTHX_ ST(0), COOKIE_TABLE_CLASS, 't'); + MAGIC *mg = mg_find(obj, PERL_MAGIC_ext); + char *curclass = mg->mg_ptr; + + CODE: + + if (items == 2) { + if (!SvOK(subclass)) { + mg->mg_ptr = NULL; + mg->mg_len = 0; + } + else if (!sv_derived_from(subclass, COOKIE_CLASS)) { + Perl_croak(aTHX_ "Usage: " + COOKIE_TABLE_CLASS "::cookie_class($table, $class): " + "class %s is not derived from " COOKIE_CLASS, + SvPV_nolen(subclass)); + } + else { + STRLEN len; + mg->mg_ptr = savepv(SvPV(subclass, len)); + mg->mg_len = len; + } + if (curclass != NULL) + Safefree(curclass); + + XSRETURN(1); + } + + RETVAL = (curclass == NULL) ? &PL_sv_undef : newSVpv(curclass, 0); + + OUTPUT: + RETVAL + + MODULE = APR::Request PACKAGE = APR::Request::Custom APR::Request Modified: httpd/apreq/trunk/glue/perl/xsbuilder/maps/apreq_functions.map URL: http://svn.apache.org/viewcvs/httpd/apreq/trunk/glue/perl/xsbuilder/maps/apreq_functions.map?rev=306819&r1=306818&r2=306819&view=diff ============================================================================== --- httpd/apreq/trunk/glue/perl/xsbuilder/maps/apreq_functions.map (original) +++ httpd/apreq/trunk/glue/perl/xsbuilder/maps/apreq_functions.map Thu Oct 6 10:51:44 2005 @@ -16,7 +16,7 @@ MODULE=APR::Request::Cookie PACKAGE=APR::Request::Cookie PREFIX=apreq_cookie_ apreq_cookie_expires -MODULE=APR::Request::Cookie PACKAGE=APR::Request::Cookie::Table PREFIX=APR__Request__Cookie__Table_ +MODULE=APR::Request PACKAGE=APR::Request::Cookie::Table PREFIX=APR__Request__Cookie__Table_ DEFINE_get | apreq_xs_cookie_table_FETCH | DEFINE_FETCH | apreq_xs_cookie_table_FETCH | DEFINE_NEXTKEY | apreq_xs_cookie_table_NEXTKEY | @@ -33,7 +33,7 @@ DEFINE_body | apreq_xs_body | DEFINE_param | apreq_xs_param | -MODULE=APR::Request::Param PACKAGE=APR::Request::Param::Table PREFIX=APR__Request__Param__Table_ +MODULE=APR::Request PACKAGE=APR::Request::Param::Table PREFIX=APR__Request__Param__Table_ DEFINE_get | apreq_xs_param_table_FETCH | DEFINE_FETCH | apreq_xs_param_table_FETCH | DEFINE_NEXTKEY | apreq_xs_param_table_NEXTKEY |