You are viewing a plain text version of this content. The canonical link for it is here.
Posted to apreq-cvs@httpd.apache.org by jo...@apache.org on 2003/04/21 06:29:47 UTC
cvs commit: httpd-apreq-2/t env.c tables.c
joes 2003/04/20 21:29:47
Modified: . README
src apreq.c apreq.h apreq_parsers.c apreq_tables.c
apreq_tables.h
t env.c tables.c
Log:
replace table_iter API with simpler table_elts
Revision Changes Path
1.2 +2 -1 httpd-apreq-2/README
Index: README
===================================================================
RCS file: /home/cvs/httpd-apreq-2/README,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- README 17 Apr 2003 23:18:10 -0000 1.1
+++ README 21 Apr 2003 04:29:46 -0000 1.2
@@ -3,7 +3,7 @@
What is it?
-----------
- httpd-apreq (aka `apreq') is subproject of the Apache Server Project
+ httpd-apreq (aka `apreq') is subproject of the Apache HTTP Server Project
whose membership (aka apreq's `committers') develops and maintains the
libapreq software library.
@@ -62,6 +62,7 @@
Perl API - modperl@perl.apache.org
Tcl API - XXX
Java API - XXX
+ Python API - XXX
developer list (bugs, patches, etc.):
apreq-dev@cvs.apache.org
1.13 +1 -1 httpd-apreq-2/src/apreq.c
Index: apreq.c
===================================================================
RCS file: /home/cvs/httpd-apreq-2/src/apreq.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- apreq.c 19 Apr 2003 09:42:08 -0000 1.12
+++ apreq.c 21 Apr 2003 04:29:46 -0000 1.13
@@ -170,7 +170,7 @@
char *p;
if (s == NULL)
return 0;
- n = apr_strtoi64(s, &p, 0); /* XXX: what about overflow? */
+ n = (long)apr_strtoi64(s, &p, 0); /* XXX: what about overflow? */
if (p == NULL)
return n;
1.13 +3 -0 httpd-apreq-2/src/apreq.h
Index: apreq.h
===================================================================
RCS file: /home/cvs/httpd-apreq-2/src/apreq.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- apreq.h 18 Apr 2003 20:15:50 -0000 1.12
+++ apreq.h 21 Apr 2003 04:29:46 -0000 1.13
@@ -77,6 +77,9 @@
APREQ_DECLARE(apr_ssize_t) apreq_unescape(char *str);
#define apreq_unescape(str) apreq_decode(str,str,strlen(str))
+#define APREQ_ARRAY_VALUE(a,i) (*(apreq_value_t **)( (a)->elts + \
+ ((a)->elt_size * (i)) ))
+
/**
* Returns an RFC-822 formatted time string. Similar to ap_gm_timestr_822.
*
1.17 +3 -4 httpd-apreq-2/src/apreq_parsers.c
Index: apreq_parsers.c
===================================================================
RCS file: /home/cvs/httpd-apreq-2/src/apreq_parsers.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- apreq_parsers.c 20 Apr 2003 03:16:27 -0000 1.16
+++ apreq_parsers.c 21 Apr 2003 04:29:46 -0000 1.17
@@ -917,11 +917,10 @@
apr_bucket *eos;
apr_status_t s = split_on_bdry(pool, ctx->bb, bb, ctx->bdry);
apreq_param_t *param;
- apreq_table_iter_t ti;
+ const apr_array_header_t *arr;
- ti.t = req->body;
- apreq_table_last(&ti);
- param = apreq_value_to_param(ti.v);
+ arr = apreq_table_elts(req->body);
+ param = apreq_value_to_param(APREQ_ARRAY_VALUE(arr,arr->nelts-1));
switch (s) {
1.16 +30 -106 httpd-apreq-2/src/apreq_tables.c
Index: apreq_tables.c
===================================================================
RCS file: /home/cvs/httpd-apreq-2/src/apreq_tables.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- apreq_tables.c 20 Apr 2003 18:49:13 -0000 1.15
+++ apreq_tables.c 21 Apr 2003 04:29:46 -0000 1.16
@@ -73,8 +73,8 @@
/* private struct */
typedef struct apreq_table_entry_t {
- const char *key; /* = val->name : saves a ptr deref */
const apreq_value_t *val;
+ const char *key; /* = val->name : saves a ptr deref */
enum { RED, BLACK } color;
int tree[4]; /* LEFT RIGHT PARENT NEXT */
@@ -140,8 +140,8 @@
#define DEAD(idx) ( (idx)[o].key == NULL )
#define KILL(t,idx) do { (idx)[o].key = NULL; \
- if (idx ==(t)->a.nelts-1) (t)->a.nelts--; \
- else (t)->ghosts++; } while (0)
+ if ((idx)==(t)->a.nelts-1) (t)->a.nelts--; \
+ else (t)->ghosts++; } while (0)
#define RESURRECT(t,idx) do { (idx)[o].key = (idx)[o].val->name; \
(t)->ghosts--; } while (0)
@@ -699,8 +699,7 @@
for (idx = 0; idx < t->a.nelts; ++idx) {
int j = idx[o].tree[NEXT];
-/* printf("GOT HERE(%d:%d:%d): %s\n", j, idx, arr.nelts, idx[o].key);
- */
+
if ( j >= 0 && IN_FOREST(t,idx) ) {
apreq_value_t *v;
@@ -712,6 +711,7 @@
for ( ; j >= 0; j = j[o].tree[NEXT]) {
*(const apreq_value_t **)apr_array_push(&arr) = j[o].val;
KILL(t,j);
+ printf("GOT HERE(%d:%d): %s\n", t->ghosts, arr.nelts, idx[o].key);
}
v = t->merge(t->a.pool, &arr);
@@ -742,8 +742,8 @@
/* EXPENSIVE: ~O(4 * t->a.nelts * q->nelts) */
apreq_table_entry_t *o = (apreq_table_entry_t *)t->a.elts;
- int j, n, m, *p = (int *)q->elts;
- int reindex = 0;
+ int j, m, rv=0, *p = (int *)q->elts;
+ register int n;
/* add sentinel */
*(int *)apr_array_push(q) = t->a.nelts;
@@ -751,17 +751,18 @@
LOCK_TABLE(t);
- /* remove entries O(t->nelts) */
+ /* remove entries O(t->nelts)! */
for ( j=1, n=0; n < q->nelts; ++j, ++n )
- for (m = p[n]+1; m < p[n+1]; ++m) {
+ for (m = p[n]+1; m < p[n+1]; ++m)
m[o-j] = m[o];
- }
t->a.nelts -= q->nelts;
+ printf("GOT HERE(%d:%d:%d)\n", p[0], p[1], p[2]);
+
/* reindex trees */
-#define REINDEX(P) for (n=0; P > p[n]; ++n) P--; reindex += n
+#define REINDEX(P) for (n=0; P > p[n]; ++n) ; P -= n; rv += n
for (j=0; j < TABLE_HASH_SIZE; ++j) {
REINDEX( t->root[j] );
@@ -777,7 +778,7 @@
#undef REINDEX
UNLOCK_TABLE(t);
- return reindex;
+ return rv;
}
APREQ_DECLARE(int) apreq_table_ghosts(apreq_table_t *t)
@@ -787,36 +788,23 @@
APREQ_DECLARE(int) apreq_table_exorcise(apreq_table_t *t)
{
- int rv = 0;
+ apreq_table_entry_t *o = (apreq_table_entry_t *)t->a.elts;
+ int idx;
+ int a[APREQ_NELTS];
+ apr_array_header_t arr = { t->a.pool, sizeof(int), 0,
+ APREQ_NELTS, (char *)a };
+
if (t->ghosts == 0)
return 0;
- if (t->ghosts < t->a.nelts) {
- apreq_table_entry_t *o = (apreq_table_entry_t *)t->a.elts;
-
- /* trailing ghosts cannot occur; IOW t->a.nelts-1 is
- always alive */
-
- /* bury any remaining ghosts */
- if (t->ghosts) {
- int idx;
- apr_array_header_t *a = apr_array_make(t->a.pool,
- t->ghosts + 1,
- sizeof(int));
- for (idx = 0; idx < t->a.nelts; ++idx)
- if (DEAD(idx))
- *(int *)apr_array_push(a) = idx;
-
- rv = bury_table_entries(t,a);
+ for (idx = 0; idx < t->a.nelts; ++idx)
+ if (DEAD(idx)) {
+ *(int *)apr_array_push(&arr) = idx;
}
- }
- else { /* nothing but ghosts */
- t->a.nelts = 0;
- }
t->ghosts = 0;
- return rv;
+ return bury_table_entries(t,&arr);
}
@@ -1052,10 +1040,9 @@
for (idx = n; idx < t->a.nelts; ++idx) {
const unsigned char hash = TABLE_HASH(idx[o].key);
- if (idx[o].tree[PARENT] == idx - n) { /* ghost from s */
- KILL(t,idx);
+ if (DEAD(idx))
continue;
- }
+
if (idx[o].tree[NEXT] >= 0)
idx[o].tree[NEXT] += n;
@@ -1172,75 +1159,12 @@
/********************* iterators ********************/
-APREQ_DECLARE(apr_status_t) APR_INLINE apreq_table_fetch(
- apreq_table_iter_t *ti, int idx)
+APR_INLINE
+APREQ_DECLARE(const apr_array_header_t *)apreq_table_elts(apreq_table_t *t)
{
- const apreq_table_t *t = ti->t;
- apreq_table_entry_t *o = (apreq_table_entry_t *)t->a.elts;
-
- if (idx < 0 || idx >= t->a.nelts - t->ghosts) {
- ti->v = NULL;
- ti->i = -1;
- return APR_EGENERAL;
- }
-
- if (t->ghosts) {
- if (idx == t->a.nelts - t->ghosts - 1)
- ti->i = t->a.nelts - 1;
- else
- for (ti->i = 0; ti->i <= idx; ti->i++)
- if ( DEAD(ti->i) )
- ++idx;
- }
- else
- ti->i = idx;
-
- ti->v = idx[o].val;
- return APR_SUCCESS;
-}
-
-
-APREQ_DECLARE(apr_status_t) APR_INLINE apreq_table_next(apreq_table_iter_t *ti)
-{
- const apreq_table_t *t = ti->t;
- apreq_table_entry_t *o = (apreq_table_entry_t *)t->a.elts;
-
- if (ti->i < 0 || ti->i >= t->a.nelts) {
- ti->v = NULL;
- ti->i = -1;
- return APR_EGENERAL;
- }
-
- if (ti->i == t->a.nelts - 1) {
- ti->v = NULL;
- ti->i = -1;
- return APR_SUCCESS;
- }
-
- while (DEAD(++ti->i))
- ; /* skip dead elements */
-
- ti->v = ti->i[o].val;
- return APR_SUCCESS;
-}
-
-
-APREQ_DECLARE(apr_status_t) APR_INLINE apreq_table_prev(apreq_table_iter_t *ti)
-{
- const apreq_table_t *t = ti->t;
- apreq_table_entry_t *o = (apreq_table_entry_t *)t->a.elts;
-
- if (ti->i < 0 || ti->i >= t->a.nelts) {
- ti->v = NULL;
- ti->i = -1;
- return APR_EGENERAL;
- }
-
- while (--ti->i >= 0 && DEAD(ti->i))
- ; /* skip dead elements */
-
- ti->v = (ti->i == -1) ? NULL : ti->i[o].val;
- return APR_SUCCESS;
+ if (t->ghosts)
+ apreq_table_exorcise(t);
+ return (const apr_array_header_t *)t;
}
1.11 +2 -13 httpd-apreq-2/src/apreq_tables.h
Index: apreq_tables.h
===================================================================
RCS file: /home/cvs/httpd-apreq-2/src/apreq_tables.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- apreq_tables.h 19 Apr 2003 09:42:08 -0000 1.10
+++ apreq_tables.h 21 Apr 2003 04:29:46 -0000 1.11
@@ -352,20 +352,9 @@
const unsigned flags);
/** Iterator API */
+APR_INLINE
+APREQ_DECLARE(const apr_array_header_t *)apreq_table_elts(apreq_table_t *t);
-typedef struct apreq_table_iter_t {
- const apreq_value_t *v;
- const apreq_table_t *t;
- int i;
-} apreq_table_iter_t;
-
-APREQ_DECLARE(apr_status_t) APR_INLINE apreq_table_fetch(apreq_table_iter_t *ti,
- int idx);
-#define apreq_table_first(ti) apreq_table_fetch(ti,0)
-#define apreq_table_last(ti) apreq_table_fetch(ti,apreq_table_nelts((ti)->t)-1)
-
-APREQ_DECLARE(apr_status_t) APR_INLINE apreq_table_next(apreq_table_iter_t *ti);
-APREQ_DECLARE(apr_status_t) APR_INLINE apreq_table_prev(apreq_table_iter_t *ti);
/**
* Declaration prototype for the iterator callback function of apr_table_do()
1.3 +2 -1 httpd-apreq-2/t/env.c
Index: env.c
===================================================================
RCS file: /home/cvs/httpd-apreq-2/t/env.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- env.c 19 Apr 2003 09:42:08 -0000 1.2
+++ env.c 21 Apr 2003 04:29:47 -0000 1.3
@@ -65,7 +65,8 @@
#include <stdio.h>
#define dENV struct env_ctx *env = (struct env_ctx *)ctx
-/* the "warehouse" */
+
+/* rigged environent for unit tests */
struct env_ctx {
apr_pool_t *pool;
1.4 +36 -25 httpd-apreq-2/t/tables.c
Index: tables.c
===================================================================
RCS file: /home/cvs/httpd-apreq-2/t/tables.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- tables.c 19 Apr 2003 16:06:03 -0000 1.3
+++ tables.c 21 Apr 2003 04:29:47 -0000 1.4
@@ -161,10 +161,11 @@
static void table_overlap(CuTest *tc)
{
const char *val;
- apreq_table_t *t1 = apreq_table_make(p, 1);
apreq_table_t *t2 = apreq_table_make(p, 1);
apr_status_t s;
+ t1 = apreq_table_make(p, 1);
+
apreq_table_add(t1, V("a", "0"));
apreq_table_add(t1, V("g", "7"));
@@ -182,6 +183,7 @@
CuAssertIntEquals(tc, APR_SUCCESS, s);
CuAssertIntEquals(tc, 7, apreq_table_nelts(t1));
CuAssertIntEquals(tc, 3, apreq_table_ghosts(t1));
+ CuAssertIntEquals(tc, 9, apreq_table_exorcise(t1));
val = apreq_table_get(t1, "a");
CuAssertStrEquals(tc, "0, 1",val);
@@ -199,12 +201,43 @@
CuAssertStrEquals(tc, "7",val);
}
+static void table_elts(CuTest *tc)
+{
+ const char *val;
+ const apreq_value_t *v;
+ const apr_array_header_t *a;
+
+ a = apreq_table_elts(t1);
+
+ CuAssertIntEquals(tc, 7, apreq_table_nelts(t1));
+ CuAssertIntEquals(tc, 0, apreq_table_ghosts(t1));
+
+ v = APREQ_ARRAY_VALUE(a,0);
+ CuAssertStrEquals(tc,"0, 1", v->data);
+ v = APREQ_ARRAY_VALUE(a,1);
+ CuAssertStrEquals(tc,"7", v->data);
+ v = APREQ_ARRAY_VALUE(a,2);
+ CuAssertStrEquals(tc,"2, 2.0, 2.", v->data);
+ v = APREQ_ARRAY_VALUE(a,3);
+ CuAssertStrEquals(tc,"3", v->data);
+
+ v = APREQ_ARRAY_VALUE(a,a->nelts-1);
+ CuAssertStrEquals(tc,"6", v->data);
+ v = APREQ_ARRAY_VALUE(a,a->nelts-2);
+ CuAssertStrEquals(tc,"5", v->data);
+ v = APREQ_ARRAY_VALUE(a,a->nelts-3);
+ CuAssertStrEquals(tc,"4", v->data);
+}
+
+
static void table_overlay(CuTest *tc)
{
const char *val;
- t1 = apreq_table_make(p, 1);
apreq_table_t *t2 = apreq_table_make(p, 1);
apr_status_t s;
+
+ t1 = apreq_table_make(p, 1);
+
apreq_table_add(t1, V("a", "0"));
apreq_table_add(t1, V("g", "7"));
@@ -236,28 +269,6 @@
CuAssertStrEquals(tc, "7",val);
}
-static void table_iterators(CuTest *tc)
-{
- const char *val;
- apreq_table_iter_t ti;
- ti.t = t1;
- apreq_table_first(&ti);
- CuAssertStrEquals(tc,"0", ti.v->data);
- apreq_table_next(&ti);
- CuAssertStrEquals(tc,"7", ti.v->data);
- apreq_table_next(&ti);
- CuAssertStrEquals(tc,"1", ti.v->data);
- apreq_table_next(&ti);
- CuAssertStrEquals(tc,"2", ti.v->data);
- apreq_table_last(&ti);
- CuAssertStrEquals(tc,"6", ti.v->data);
- apreq_table_prev(&ti);
- CuAssertStrEquals(tc,"2.", ti.v->data);
- apreq_table_prev(&ti);
- CuAssertStrEquals(tc,"5", ti.v->data);
-
-}
-
CuSuite *testtable(void)
{
CuSuite *suite = CuSuiteNew("Table");
@@ -271,8 +282,8 @@
SUITE_ADD_TEST(suite, table_clear);
SUITE_ADD_TEST(suite, table_unset);
SUITE_ADD_TEST(suite, table_overlap);
+ SUITE_ADD_TEST(suite, table_elts);
SUITE_ADD_TEST(suite, table_overlay);
- SUITE_ADD_TEST(suite, table_iterators);
return suite;
}