changeset 2452:95f078e7d743

allow insertion range if its start or end is the same as existent one
author Igor Sysoev <igor@sysoev.ru>
date Fri, 16 Jan 2009 16:29:23 +0000
parents b70e7f34d92b
children 1e53534e6800
files src/http/modules/ngx_http_geo_module.c
diffstat 1 files changed, 48 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/http/modules/ngx_http_geo_module.c
+++ b/src/http/modules/ngx_http_geo_module.c
@@ -615,12 +615,60 @@ ngx_http_geo_add_range(ngx_conf_t *cf, n
                 range[i + 2].end = range[i].end;
                 range[i + 2].value = range[i].value;
 
+                range[i + 1].start = (u_short) s;
+                range[i + 1].end = (u_short) e;
+                range[i + 1].value = ctx->value;
+
                 range[i].end = (u_short) (s - 1);
 
+                goto next;
+            }
+
+            if (s == (ngx_uint_t) range[i].start
+                && e < (ngx_uint_t) range[i].end)
+            {
+                /* shift the range start and insert the new range */
+
+                range = ngx_array_push(a);
+                if (range == NULL) {
+                    return NGX_CONF_ERROR;
+                }
+
+                range = a->elts;
+
+                ngx_memcpy(&range[i + 2], &range[i + 1],
+                           (a->nelts - 2 - i) * sizeof(ngx_http_geo_range_t));
+
+                range[i + 1].start = (u_short) (e + 1);
+
+                range[i].start = (u_short) s;
+                range[i].end = (u_short) e;
+                range[i].value = ctx->value;
+
+                goto next;
+            }
+
+            if (s > (ngx_uint_t) range[i].start
+                && e == (ngx_uint_t) range[i].end)
+            {
+                /* shift the range end and insert the new range */
+
+                range = ngx_array_push(a);
+                if (range == NULL) {
+                    return NGX_CONF_ERROR;
+                }
+
+                range = a->elts;
+
+                ngx_memcpy(&range[i + 2], &range[i + 1],
+                           (a->nelts - 2 - i) * sizeof(ngx_http_geo_range_t));
+
                 range[i + 1].start = (u_short) s;
                 range[i + 1].end = (u_short) e;
                 range[i + 1].value = ctx->value;
 
+                range[i].end = (u_short) (s - 1);
+
                 goto next;
             }