Mercurial > hg > nginx-vendor-current
comparison src/core/ngx_parse.c @ 0:f0b350454894 NGINX_0_1_0
nginx 0.1.0
*) The first public version.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Mon, 04 Oct 2004 00:00:00 +0400 |
parents | |
children | 408f195b3482 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:f0b350454894 |
---|---|
1 | |
2 /* | |
3 * Copyright (C) Igor Sysoev | |
4 */ | |
5 | |
6 | |
7 #include <ngx_config.h> | |
8 #include <ngx_core.h> | |
9 | |
10 | |
11 ngx_int_t ngx_parse_size(ngx_str_t *line) | |
12 { | |
13 u_char last; | |
14 size_t len; | |
15 ngx_int_t scale, size; | |
16 | |
17 len = line->len; | |
18 last = line->data[len - 1]; | |
19 | |
20 switch (last) { | |
21 case 'K': | |
22 case 'k': | |
23 len--; | |
24 scale = 1024; | |
25 break; | |
26 | |
27 case 'M': | |
28 case 'm': | |
29 len--; | |
30 scale = 1024 * 1024; | |
31 break; | |
32 | |
33 default: | |
34 scale = 1; | |
35 } | |
36 | |
37 size = ngx_atoi(line->data, len); | |
38 if (size == NGX_ERROR) { | |
39 return NGX_ERROR; | |
40 } | |
41 | |
42 size *= scale; | |
43 | |
44 return size; | |
45 } | |
46 | |
47 | |
48 ngx_int_t ngx_parse_time(ngx_str_t *line, ngx_int_t sec) | |
49 { | |
50 size_t len; | |
51 u_char *start, last; | |
52 ngx_int_t value, total, scale; | |
53 ngx_uint_t max, i; | |
54 enum { | |
55 st_start = 0, | |
56 st_year, | |
57 st_month, | |
58 st_week, | |
59 st_day, | |
60 st_hour, | |
61 st_min, | |
62 st_sec, | |
63 st_msec, | |
64 st_last | |
65 } step; | |
66 | |
67 | |
68 start = line->data; | |
69 len = 0; | |
70 total = 0; | |
71 step = sec ? st_start : st_month; | |
72 | |
73 for (i = 0; /* void */ ; i++) { | |
74 | |
75 if (i < line->len) { | |
76 if (line->data[i] != ' ') { | |
77 len++; | |
78 continue; | |
79 } | |
80 | |
81 if (line->data[i] == ' ' && len == 0) { | |
82 start = &line->data[i + 1]; | |
83 continue; | |
84 } | |
85 } | |
86 | |
87 if (len == 0) { | |
88 break; | |
89 } | |
90 | |
91 last = line->data[i - 1]; | |
92 | |
93 switch (last) { | |
94 case 'y': | |
95 if (step > st_start) { | |
96 return NGX_ERROR; | |
97 } | |
98 step = st_year; | |
99 len--; | |
100 max = 68; | |
101 scale = 60 * 60 * 24 * 365; | |
102 break; | |
103 | |
104 case 'M': | |
105 if (step > st_year) { | |
106 return NGX_ERROR; | |
107 } | |
108 step = st_month; | |
109 len--; | |
110 max = 828; | |
111 scale = 60 * 60 * 24 * 30; | |
112 break; | |
113 | |
114 case 'w': | |
115 if (step > st_month) { | |
116 return NGX_ERROR; | |
117 } | |
118 step = st_week; | |
119 len--; | |
120 max = 3550; | |
121 scale = 60 * 60 * 24 * 7; | |
122 break; | |
123 | |
124 case 'd': | |
125 if (step > st_week) { | |
126 return NGX_ERROR; | |
127 } | |
128 step = st_day; | |
129 len--; | |
130 max = 24855; | |
131 scale = 60 * 60 * 24; | |
132 break; | |
133 | |
134 case 'h': | |
135 if (step > st_day) { | |
136 return NGX_ERROR; | |
137 } | |
138 step = st_hour; | |
139 len--; | |
140 max = 596523; | |
141 scale = 60 * 60; | |
142 break; | |
143 | |
144 case 'm': | |
145 if (step > st_hour) { | |
146 return NGX_ERROR; | |
147 } | |
148 step = st_min; | |
149 len--; | |
150 max = 35791394; | |
151 scale = 60; | |
152 break; | |
153 | |
154 case 's': | |
155 len--; | |
156 | |
157 if (line->data[i - 2] == 'm') { | |
158 if (sec || step > st_sec) { | |
159 return NGX_ERROR; | |
160 } | |
161 step = st_msec; | |
162 len--; | |
163 max = 2147483647; | |
164 scale = 1; | |
165 break; | |
166 } | |
167 | |
168 if (step > st_min) { | |
169 return NGX_ERROR; | |
170 } | |
171 | |
172 step = st_sec; | |
173 max = 2147483647; | |
174 scale = 1; | |
175 break; | |
176 | |
177 default: | |
178 step = st_last; | |
179 max = 2147483647; | |
180 scale = 1; | |
181 } | |
182 | |
183 value = ngx_atoi(start, len); | |
184 if (value == NGX_ERROR) { | |
185 return NGX_ERROR; | |
186 } | |
187 | |
188 if (step != st_msec && !sec) { | |
189 scale *= 1000; | |
190 max /= 1000; | |
191 } | |
192 | |
193 if ((u_int) value > max) { | |
194 return NGX_PARSE_LARGE_TIME; | |
195 } | |
196 | |
197 total += value * scale; | |
198 | |
199 if ((u_int) total > 2147483647) { | |
200 return NGX_PARSE_LARGE_TIME; | |
201 } | |
202 | |
203 if (i >= line->len) { | |
204 break; | |
205 } | |
206 | |
207 len = 0; | |
208 start = &line->data[i + 1]; | |
209 } | |
210 | |
211 return total; | |
212 } |