Mercurial > hg > nginx
diff src/core/ngx_parse.c @ 157:70b36c805682
nginx-0.0.1-2003-10-23-19:54:19 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 23 Oct 2003 15:54:19 +0000 |
parents | |
children | 2357fa41738a |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/core/ngx_parse.c Thu Oct 23 15:54:19 2003 +0000 @@ -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; +}