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;
   }