~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Linux Cross Reference
Nginx/core/ngx_parse.c

Version: ~ [ nginx-0.6.26 ] ~ [ nginx-0.5.35 ] ~ [ nginx-0.5.20 ] ~ [ nginx-0.5.19 ] ~

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

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.