diff options
author | Igor Sysoev <igor@sysoev.ru> | 2003-10-23 19:54:19 +0400 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2003-10-23 19:54:19 +0400 |
commit | 8556e6da41e80772cb9710e4309d9ad44a7b360e (patch) | |
tree | 8bb0a9f5b03e8c8fc6a2df3c1b51335dcdeae5ac /src/core/ngx_parse.c | |
parent | f107910a9ef3b7de8752fc4e9e34cb69c1924a09 (diff) |
nginx-0.0.1-2003-10-23-19:54:19 import
Diffstat (limited to 'src/core/ngx_parse.c')
-rw-r--r-- | src/core/ngx_parse.c | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/src/core/ngx_parse.c b/src/core/ngx_parse.c new file mode 100644 index 000000000..213b2f6ec --- /dev/null +++ b/src/core/ngx_parse.c @@ -0,0 +1,205 @@ + +#include <ngx_config.h> +#include <ngx_core.h> + + +int ngx_parse_size(ngx_str_t *line) +{ + int len, scale, size; + char last; + + len = line->len; + last = line->data[len - 1]; + + switch (last) { + case 'K': + case 'k': + len--; + scale = 1024; + break; + + case 'M': + case 'm': + len--; + scale = 1024 * 1024; + break; + + default: + scale = 1; + } + + size = ngx_atoi(line->data, len); + if (size == NGX_ERROR) { + return NGX_ERROR; + } + + size *= scale; + + return size; +} + + +int ngx_parse_time(ngx_str_t *line, int sec) +{ + int value, total, len, scale; + u_int max, i; + char *start, last; + enum { + st_start = 0, + st_year, + st_month, + st_week, + st_day, + st_hour, + st_min, + st_sec, + st_msec, + st_last + } step; + + + start = line->data; + len = 0; + total = 0; + step = sec ? st_start : st_month; + + for (i = 0; /* void */ ; i++) { + + if (i < line->len) { + if (line->data[i] != ' ') { + len++; + continue; + } + + if (line->data[i] == ' ' && len == 0) { + start = &line->data[i + 1]; + continue; + } + } + + if (len == 0) { + break; + } + + last = line->data[i - 1]; + + switch (last) { + case 'y': + if (step > st_start) { + return NGX_ERROR; + } + step = st_year; + len--; + max = 68; + scale = 60 * 60 * 24 * 365; + break; + + case 'M': + if (step > st_year) { + return NGX_ERROR; + } + step = st_month; + len--; + max = 828; + scale = 60 * 60 * 24 * 30; + break; + + case 'w': + if (step > st_month) { + return NGX_ERROR; + } + step = st_week; + len--; + max = 3550; + scale = 60 * 60 * 24 * 7; + break; + + case 'd': + if (step > st_week) { + return NGX_ERROR; + } + step = st_day; + len--; + max = 24855; + scale = 60 * 60 * 24; + break; + + case 'h': + if (step > st_day) { + return NGX_ERROR; + } + step = st_hour; + len--; + max = 596523; + scale = 60 * 60; + break; + + case 'm': + if (step > st_hour) { + return NGX_ERROR; + } + step = st_min; + len--; + max = 35791394; + scale = 60; + break; + + case 's': + len--; + + if (line->data[i - 2] == 'm') { + if (sec || step > st_sec) { + return NGX_ERROR; + } + step = st_msec; + len--; + max = 2147483647; + scale = 1; + break; + } + + if (step > st_min) { + return NGX_ERROR; + } + + step = st_sec; + max = 2147483647; + scale = 1; + break; + + default: + step = st_last; + max = 2147483647; + scale = 1; + } + + value = ngx_atoi(start, len); + if (value == NGX_ERROR) { + return NGX_ERROR; + } + + if (step != st_msec && !sec) { + scale *= 1000; + max /= 1000; + } + + if ((u_int) value > max) { + return NGX_PARSE_LARGE_TIME; + } + + total += value * scale; + + if ((u_int) total > 2147483647) { + return NGX_PARSE_LARGE_TIME; + } + + if (i >= line->len) { + break; + } + + len = 0; + start = &line->data[i + 1]; + } + + return total; +} |