Annotation of embedaddon/nginx/src/core/ngx_parse.c, revision 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>