This patch changes the apr_table_elts macro so that it provides access to the internals of an apr_table_t via a const pointer instead of the current non-const pointer.
My main motivation for this is to make it possible to speed up the table internals in the future (e.g., by adding an index for fast lookups) without breaking backward compatibility.
In addition, allowing non-const access to the array is dangerous even with the current code base. For example, an application can break assumptions in the table code by setting keys in the array to null.
All the current uses of apr_table_elts in Apache 2.0 are for const iterators, so the only change required to the httpd code is the replacement of "apr_array_header_t*" declarations with "const apr_array_header_t*" (the patch includes the diffs for all the affected files).
--Brian
Index: modules/filters/mod_include.c =================================================================== RCS file: /home/cvspublic/httpd-2.0/modules/filters/mod_include.c,v retrieving revision 1.150 diff -u -r1.150 mod_include.c --- modules/filters/mod_include.c 2001/09/19 06:25:07 1.150 +++ modules/filters/mod_include.c 2001/11/10 23:49:39 @@ -2601,8 +2601,8 @@ if (ctx->flags & FLAG_PRINTING) { ap_ssi_get_tag_and_value(ctx, &tag, &tag_val, 1); if ((tag == NULL) && (tag_val == NULL)) { - apr_array_header_t *arr = apr_table_elts(r->subprocess_env); - apr_table_entry_t *elts = (apr_table_entry_t *)arr->elts; + const apr_array_header_t *arr = apr_table_elts(r->subprocess_env); + const apr_table_entry_t *elts = (const apr_table_entry_t *)arr->elts; int i; const char *key_text, *val_text; apr_size_t k_len, v_len, t_wrt; Index: modules/generators/mod_cgi.c =================================================================== RCS file: /home/cvspublic/httpd-2.0/modules/generators/mod_cgi.c,v retrieving revision 1.106 diff -u -r1.106 mod_cgi.c --- modules/generators/mod_cgi.c 2001/09/18 03:33:30 1.106 +++ modules/generators/mod_cgi.c 2001/11/10 23:49:39 @@ -257,8 +257,8 @@ char *dbuf, const char *sbuf, apr_file_t *script_in, apr_file_t *script_err) { - apr_array_header_t *hdrs_arr = apr_table_elts(r->headers_in); - apr_table_entry_t *hdrs = (apr_table_entry_t *) hdrs_arr->elts; + const apr_array_header_t *hdrs_arr = apr_table_elts(r->headers_in); + const apr_table_entry_t *hdrs = (const apr_table_entry_t *) hdrs_arr->elts; char argsbuffer[HUGE_STRING_LEN]; apr_file_t *f = NULL; int i; Index: modules/http/http_request.c =================================================================== RCS file: /home/cvspublic/httpd-2.0/modules/http/http_request.c,v retrieving revision 1.117 diff -u -r1.117 http_request.c --- modules/http/http_request.c 2001/10/30 19:21:41 1.117 +++ modules/http/http_request.c 2001/11/10 23:49:40 @@ -310,8 +310,8 @@ static apr_table_t *rename_original_env(apr_pool_t *p, apr_table_t *t) { - apr_array_header_t *env_arr = apr_table_elts(t); - apr_table_entry_t *elts = (apr_table_entry_t *) env_arr->elts; + const apr_array_header_t *env_arr = apr_table_elts(t); + const apr_table_entry_t *elts = (const apr_table_entry_t *) env_arr->elts; apr_table_t *new = apr_table_make(p, env_arr->nalloc); int i; Index: modules/mappers/mod_rewrite.c =================================================================== RCS file: /home/cvspublic/httpd-2.0/modules/mappers/mod_rewrite.c,v retrieving revision 1.85 diff -u -r1.85 mod_rewrite.c --- modules/mappers/mod_rewrite.c 2001/10/21 17:56:36 1.85 +++ modules/mappers/mod_rewrite.c 2001/11/10 23:49:42 @@ -3627,12 +3627,12 @@ static char *lookup_header(request_rec *r, const char *name) { - apr_array_header_t *hdrs_arr; - apr_table_entry_t *hdrs; + const apr_array_header_t *hdrs_arr; + const apr_table_entry_t *hdrs; int i; hdrs_arr = apr_table_elts(r->headers_in); - hdrs = (apr_table_entry_t *)hdrs_arr->elts; + hdrs = (const apr_table_entry_t *)hdrs_arr->elts; for (i = 0; i < hdrs_arr->nelts; ++i) { if (hdrs[i].key == NULL) { continue; Index: modules/metadata/mod_env.c =================================================================== RCS file: /home/cvspublic/httpd-2.0/modules/metadata/mod_env.c,v retrieving revision 1.25 diff -u -r1.25 mod_env.c --- modules/metadata/mod_env.c 2001/10/21 01:17:11 1.25 +++ modules/metadata/mod_env.c 2001/11/10 23:49:43 @@ -92,8 +92,8 @@ env_dir_config_rec *add = addv; env_dir_config_rec *res = apr_palloc(p, sizeof(*res)); - apr_table_entry_t *elts; - apr_array_header_t *arr; + const apr_table_entry_t *elts; + const apr_array_header_t *arr; int i; Index: modules/metadata/mod_setenvif.c =================================================================== RCS file: /home/cvspublic/httpd-2.0/modules/metadata/mod_setenvif.c,v retrieving revision 1.30 diff -u -r1.30 mod_setenvif.c --- modules/metadata/mod_setenvif.c 2001/06/12 17:06:01 1.30 +++ modules/metadata/mod_setenvif.c 2001/11/10 23:49:43 @@ -406,7 +406,7 @@ { sei_cfg_rec *sconf; sei_entry *entries; - apr_table_entry_t *elts; + const apr_table_entry_t *elts; const char *val; int i, j; char *last_name; @@ -459,8 +459,8 @@ * the headers_in until we find a match or run out of * headers. */ - apr_array_header_t *arr = apr_table_elts(r->headers_in); - elts = (apr_table_entry_t *) arr->elts; + const apr_array_header_t *arr = apr_table_elts(r->headers_in); + elts = (const apr_table_entry_t *) arr->elts; val = NULL; for (j = 0; j < arr->nelts; ++j) { if (!ap_regexec(b->pnamereg, elts[j].key, 0, NULL, 0)) { @@ -489,8 +489,8 @@ } if (!ap_regexec(b->preg, val, 0, NULL, 0)) { - apr_array_header_t *arr = apr_table_elts(b->features); - elts = (apr_table_entry_t *) arr->elts; + const apr_array_header_t *arr = apr_table_elts(b->features); + elts = (const apr_table_entry_t *) arr->elts; for (j = 0; j < arr->nelts; ++j) { if (!strcmp(elts[j].val, "!")) { Index: server/util_script.c =================================================================== RCS file: /home/cvspublic/httpd-2.0/server/util_script.c,v retrieving revision 1.65 diff -u -r1.65 util_script.c --- server/util_script.c 2001/11/10 18:38:02 1.65 +++ server/util_script.c 2001/11/10 23:49:44 @@ -122,8 +122,8 @@ AP_DECLARE(char **) ap_create_environment(apr_pool_t *p, apr_table_t *t) { - apr_array_header_t *env_arr = apr_table_elts(t); - apr_table_entry_t *elts = (apr_table_entry_t *) env_arr->elts; + const apr_array_header_t *env_arr = apr_table_elts(t); + const apr_table_entry_t *elts = (const apr_table_entry_t *) env_arr->elts; char **env = (char **) apr_palloc(p, (env_arr->nelts + 2) * sizeof(char *)); int i, j; char *tz; @@ -169,8 +169,8 @@ char *env_temp; #endif const char *host; - apr_array_header_t *hdrs_arr = apr_table_elts(r->headers_in); - apr_table_entry_t *hdrs = (apr_table_entry_t *) hdrs_arr->elts; + const apr_array_header_t *hdrs_arr = apr_table_elts(r->headers_in); + const apr_table_entry_t *hdrs = (const apr_table_entry_t *) hdrs_arr->elts; int i; apr_port_t rport; apr_sockaddr_t *remotesa; Index: srclib/apr/include/apr_tables.h =================================================================== RCS file: /home/cvspublic/apr/include/apr_tables.h,v retrieving revision 1.23 diff -u -r1.23 apr_tables.h --- srclib/apr/include/apr_tables.h 2001/08/24 17:55:45 1.23 +++ srclib/apr/include/apr_tables.h 2001/11/10 23:49:44 @@ -137,7 +137,7 @@ * @param t The table * @return An array containing the contents of the table */ -#define apr_table_elts(t) ((apr_array_header_t *)(t)) +#define apr_table_elts(t) ((const apr_array_header_t *)(t)) /** * Determine if the table is empty