Annotation of embedaddon/nginx/src/core/ngx_parse.c, revision 1.1.1.1
1.1 misho 1:
2: /*
3: * Copyright (C) Igor Sysoev
4: * Copyright (C) Nginx, Inc.
5: */
6:
7:
8: #include <ngx_config.h>
9: #include <ngx_core.h>
10:
11:
12: ssize_t
13: ngx_parse_size(ngx_str_t *line)
14: {
15: u_char unit;
16: size_t len;
17: ssize_t size;
18: ngx_int_t scale;
19:
20: len = line->len;
21: unit = line->data[len - 1];
22:
23: switch (unit) {
24: case 'K':
25: case 'k':
26: len--;
27: scale = 1024;
28: break;
29:
30: case 'M':
31: case 'm':
32: len--;
33: scale = 1024 * 1024;
34: break;
35:
36: default:
37: scale = 1;
38: }
39:
40: size = ngx_atosz(line->data, len);
41: if (size == NGX_ERROR) {
42: return NGX_ERROR;
43: }
44:
45: size *= scale;
46:
47: return size;
48: }
49:
50:
51: off_t
52: ngx_parse_offset(ngx_str_t *line)
53: {
54: u_char unit;
55: off_t offset;
56: size_t len;
57: ngx_int_t scale;
58:
59: len = line->len;
60: unit = line->data[len - 1];
61:
62: switch (unit) {
63: case 'K':
64: case 'k':
65: len--;
66: scale = 1024;
67: break;
68:
69: case 'M':
70: case 'm':
71: len--;
72: scale = 1024 * 1024;
73: break;
74:
75: case 'G':
76: case 'g':
77: len--;
78: scale = 1024 * 1024 * 1024;
79: break;
80:
81: default:
82: scale = 1;
83: }
84:
85: offset = ngx_atoof(line->data, len);
86: if (offset == NGX_ERROR) {
87: return NGX_ERROR;
88: }
89:
90: offset *= scale;
91:
92: return offset;
93: }
94:
95:
96: ngx_int_t
97: ngx_parse_time(ngx_str_t *line, ngx_uint_t is_sec)
98: {
99: u_char *p, *last;
100: ngx_int_t value, total, scale;
101: ngx_uint_t max, valid;
102: enum {
103: st_start = 0,
104: st_year,
105: st_month,
106: st_week,
107: st_day,
108: st_hour,
109: st_min,
110: st_sec,
111: st_msec,
112: st_last
113: } step;
114:
115: valid = 0;
116: value = 0;
117: total = 0;
118: step = is_sec ? st_start : st_month;
119: scale = is_sec ? 1 : 1000;
120:
121: p = line->data;
122: last = p + line->len;
123:
124: while (p < last) {
125:
126: if (*p >= '0' && *p <= '9') {
127: value = value * 10 + (*p++ - '0');
128: valid = 1;
129: continue;
130: }
131:
132: switch (*p++) {
133:
134: case 'y':
135: if (step > st_start) {
136: return NGX_ERROR;
137: }
138: step = st_year;
139: max = NGX_MAX_INT32_VALUE / (60 * 60 * 24 * 365);
140: scale = 60 * 60 * 24 * 365;
141: break;
142:
143: case 'M':
144: if (step >= st_month) {
145: return NGX_ERROR;
146: }
147: step = st_month;
148: max = NGX_MAX_INT32_VALUE / (60 * 60 * 24 * 30);
149: scale = 60 * 60 * 24 * 30;
150: break;
151:
152: case 'w':
153: if (step >= st_week) {
154: return NGX_ERROR;
155: }
156: step = st_week;
157: max = NGX_MAX_INT32_VALUE / (60 * 60 * 24 * 7);
158: scale = 60 * 60 * 24 * 7;
159: break;
160:
161: case 'd':
162: if (step >= st_day) {
163: return NGX_ERROR;
164: }
165: step = st_day;
166: max = NGX_MAX_INT32_VALUE / (60 * 60 * 24);
167: scale = 60 * 60 * 24;
168: break;
169:
170: case 'h':
171: if (step >= st_hour) {
172: return NGX_ERROR;
173: }
174: step = st_hour;
175: max = NGX_MAX_INT32_VALUE / (60 * 60);
176: scale = 60 * 60;
177: break;
178:
179: case 'm':
180: if (*p == 's') {
181: if (is_sec || step >= st_msec) {
182: return NGX_ERROR;
183: }
184: p++;
185: step = st_msec;
186: max = NGX_MAX_INT32_VALUE;
187: scale = 1;
188: break;
189: }
190:
191: if (step >= st_min) {
192: return NGX_ERROR;
193: }
194: step = st_min;
195: max = NGX_MAX_INT32_VALUE / 60;
196: scale = 60;
197: break;
198:
199: case 's':
200: if (step >= st_sec) {
201: return NGX_ERROR;
202: }
203: step = st_sec;
204: max = NGX_MAX_INT32_VALUE;
205: scale = 1;
206: break;
207:
208: case ' ':
209: if (step >= st_sec) {
210: return NGX_ERROR;
211: }
212: step = st_last;
213: max = NGX_MAX_INT32_VALUE;
214: scale = 1;
215: break;
216:
217: default:
218: return NGX_ERROR;
219: }
220:
221: if (step != st_msec && !is_sec) {
222: scale *= 1000;
223: max /= 1000;
224: }
225:
226: if ((ngx_uint_t) value > max) {
227: return NGX_ERROR;
228: }
229:
230: total += value * scale;
231:
232: if ((ngx_uint_t) total > NGX_MAX_INT32_VALUE) {
233: return NGX_ERROR;
234: }
235:
236: value = 0;
237: scale = is_sec ? 1 : 1000;
238:
239: while (p < last && *p == ' ') {
240: p++;
241: }
242: }
243:
244: if (valid) {
245: return total + value * scale;
246: }
247:
248: return NGX_ERROR;
249: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>