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>