12 static u_char *ngx_sprintf_num(u_char *buf, u_char *last, uint64_t ui64,
154 ngx_uint_t width, sign, hex, max_width, frac_width, scale, n;
158 while (*fmt && buf < last) {
170 zero = (u_char) ((*++fmt ==
'0') ?
'0' :
' ');
178 while (*fmt >=
'0' && *fmt <=
'9') {
179 width = width * 10 + *fmt++ -
'0';
211 while (*fmt >=
'0' && *fmt <=
'9') {
212 frac_width = frac_width * 10 + *fmt++ -
'0';
218 slen = va_arg(args,
size_t);
235 len =
ngx_min(((
size_t) (last - buf)), v->
len);
244 len =
ngx_min(((
size_t) (last - buf)), vv->
len);
251 p = va_arg(args, u_char *);
253 if (slen == (
size_t) -1) {
254 while (*p && buf < last) {
259 len =
ngx_min(((
size_t) (last - buf)), slen);
268 i64 = (int64_t) va_arg(args, off_t);
278 i64 = (int64_t) va_arg(args, time_t);
289 ui64 = (uint64_t) ms;
295 i64 = (int64_t) va_arg(args, ssize_t);
297 ui64 = (uint64_t) va_arg(args,
size_t);
316 i64 = (int64_t) va_arg(args,
int);
318 ui64 = (uint64_t) va_arg(args, u_int);
324 i64 = (int64_t) va_arg(args,
long);
326 ui64 = (uint64_t) va_arg(args, u_long);
332 i64 = (int64_t) va_arg(args, int32_t);
334 ui64 = (uint64_t) va_arg(args, uint32_t);
340 i64 = va_arg(args, int64_t);
342 ui64 = va_arg(args, uint64_t);
360 f = va_arg(args,
double);
373 for (n = frac_width; n; n--) {
377 frac = (uint64_t) ((f - (
double) ui64) * scale + 0.5);
385 buf = ngx_sprintf_num(buf, last, ui64, zero, 0, width);
392 buf = ngx_sprintf_num(buf, last, frac,
'0', 0, frac_width);
401 i64 = (int64_t) va_arg(args, rlim_t);
407 ui64 = (uintptr_t) va_arg(args,
void *);
415 d = va_arg(args,
int);
416 *buf++ = (u_char) (d & 0xff);
451 ui64 = (uint64_t) -i64;
454 ui64 = (uint64_t) i64;
458 buf = ngx_sprintf_num(buf, last, ui64, zero, hex, width);
472 ngx_sprintf_num(u_char *buf, u_char *last, uint64_t ui64, u_char zero,
482 static u_char hex[] =
"0123456789abcdef";
483 static u_char HEX[] =
"0123456789ABCDEF";
487 if (hexadecimal == 0) {
506 ui32 = (uint32_t) ui64;
509 *--p = (u_char) (ui32 % 10 +
'0');
510 }
while (ui32 /= 10);
514 *--p = (u_char) (ui64 % 10 +
'0');
515 }
while (ui64 /= 10);
518 }
else if (hexadecimal == 1) {
523 *--p = hex[(uint32_t) (ui64 & 0xf)];
525 }
while (ui64 >>= 4);
532 *--p = HEX[(uint32_t) (ui64 & 0xf)];
534 }
while (ui64 >>= 4);
541 while (len++ < width && buf < last) {
549 if (buf + len > last) {
573 c1 = (c1 >=
'A' && c1 <=
'Z') ? (c1 | 0x20) : c1;
574 c2 = (c2 >=
'A' && c2 <=
'Z') ? (c2 | 0x20) : c2;
599 c1 = (c1 >=
'A' && c1 <=
'Z') ? (c1 | 0x20) : c1;
600 c2 = (c2 >=
'A' && c2 <=
'Z') ? (c2 | 0x20) : c2;
625 c2 = *(u_char *) s2++;
664 c2 = *(u_char *) s2++;
688 c2 = (c2 >=
'A' && c2 <=
'Z') ? (c2 | 0x20) : c2;
698 c1 = (c1 >=
'A' && c1 <=
'Z') ? (c1 | 0x20) : c1;
720 c2 = (c2 >=
'A' && c2 <=
'Z') ? (c2 | 0x20) : c2;
731 c1 = (c1 >=
'A' && c1 <=
'Z') ? (c1 | 0x20) : c1;
751 if (s1[n] != s2[n]) {
752 return s1[n] - s2[n];
777 if (c1 >=
'a' && c1 <=
'z') {
782 if (c2 >=
'a' && c2 <=
'z') {
833 c1 = (c1 >=
'A' && c1 <=
'Z') ? (c1 | 0x20) : c1;
834 c2 = (c2 >=
'A' && c2 <=
'Z') ? (c2 | 0x20) : c2;
847 c1 = (c1 ==
'.') ?
' ' : c1;
848 c2 = (c2 ==
'.') ?
' ' : c2;
864 for (value = 0; n--; line++) {
865 if (*line < '0' || *line >
'9') {
869 value = value * 10 + (*line -
'0');
895 for (value = 0; n--; line++) {
910 if (*line < '0' || *line >
'9') {
914 value = value * 10 + (*line -
'0');
940 for (value = 0; n--; line++) {
941 if (*line < '0' || *line >
'9') {
945 value = value * 10 + (*line -
'0');
966 for (value = 0; n--; line++) {
967 if (*line < '0' || *line >
'9') {
971 value = value * 10 + (*line -
'0');
992 for (value = 0; n--; line++) {
993 if (*line < '0' || *line >
'9') {
997 value = value * 10 + (*line -
'0');
1019 for (value = 0; n--; line++) {
1022 if (ch >=
'0' && ch <=
'9') {
1023 value = value * 16 + (ch -
'0');
1027 c = (u_char) (ch | 0x20);
1029 if (c >=
'a' && c <=
'f') {
1030 value = value * 16 + (c -
'a' + 10);
1049 static u_char hex[] =
"0123456789abcdef";
1052 *dst++ = hex[*src >> 4];
1053 *dst++ = hex[*src++ & 0xf];
1065 static u_char basis64[] =
1066 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
1073 *d++ = basis64[(s[0] >> 2) & 0x3f];
1074 *d++ = basis64[((s[0] & 3) << 4) | (s[1] >> 4)];
1075 *d++ = basis64[((s[1] & 0x0f) << 2) | (s[2] >> 6)];
1076 *d++ = basis64[s[2] & 0x3f];
1083 *d++ = basis64[(s[0] >> 2) & 0x3f];
1086 *d++ = basis64[(s[0] & 3) << 4];
1090 *d++ = basis64[((s[0] & 3) << 4) | (s[1] >> 4)];
1091 *d++ = basis64[(s[1] & 0x0f) << 2];
1104 static u_char basis64[] = {
1105 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
1106 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
1107 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 62, 77, 77, 77, 63,
1108 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 77, 77, 77, 77, 77, 77,
1109 77, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
1110 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 77, 77, 77, 77, 77,
1111 77, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
1112 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 77, 77, 77, 77, 77,
1114 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
1115 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
1116 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
1117 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
1118 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
1119 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
1120 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
1121 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77
1124 return ngx_decode_base64_internal(dst, src, basis64);
1131 static u_char basis64[] = {
1132 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
1133 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
1134 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 62, 77, 77,
1135 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 77, 77, 77, 77, 77, 77,
1136 77, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
1137 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 77, 77, 77, 77, 63,
1138 77, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
1139 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 77, 77, 77, 77, 77,
1141 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
1142 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
1143 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
1144 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
1145 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
1146 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
1147 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
1148 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77
1151 return ngx_decode_base64_internal(dst, src, basis64);
1161 for (len = 0; len < src->
len; len++) {
1162 if (src->
data[len] ==
'=') {
1166 if (basis[src->
data[len]] == 77) {
1179 *d++ = (u_char) (basis[s[0]] << 2 | basis[s[1]] >> 4);
1180 *d++ = (u_char) (basis[s[1]] << 4 | basis[s[2]] >> 2);
1181 *d++ = (u_char) (basis[s[2]] << 6 | basis[s[3]]);
1188 *d++ = (u_char) (basis[s[0]] << 2 | basis[s[1]] >> 4);
1192 *d++ = (u_char) (basis[s[1]] << 4 | basis[s[2]] >> 2);
1214 uint32_t u,
i, valid;
1224 }
else if (u >= 0xe0) {
1230 }
else if (u >= 0xc2) {
1254 u = (u << 6) | (i & 0x3f);
1275 for (len = 0; p < last; len++) {
1328 while (src < next) {
1345 static u_char hex[] =
"0123456789abcdef";
1349 static uint32_t uri[] = {
1369 static uint32_t args[] = {
1389 static uint32_t uri_component[] = {
1409 static uint32_t html[] = {
1429 static uint32_t refresh[] = {
1449 static uint32_t memcached[] = {
1469 static uint32_t *map[] =
1470 { uri, args, uri_component, html, refresh, memcached, memcached };
1482 if (escape[*src >> 5] & (1 << (*src & 0x1f))) {
1489 return (uintptr_t) n;
1493 if (escape[*src >> 5] & (1 << (*src & 0x1f))) {
1495 *dst++ = hex[*src >> 4];
1496 *dst++ = hex[*src & 0xf];
1505 return (uintptr_t) dst;
1512 u_char *d, *s, ch, c, decoded;
1548 if (ch >=
'0' && ch <=
'9') {
1549 decoded = (u_char) (ch -
'0');
1550 state = sw_quoted_second;
1554 c = (u_char) (ch | 0x20);
1555 if (c >=
'a' && c <=
'f') {
1556 decoded = (u_char) (c -
'a' + 10);
1557 state = sw_quoted_second;
1569 case sw_quoted_second:
1573 if (ch >=
'0' && ch <=
'9') {
1574 ch = (u_char) ((decoded << 4) + ch -
'0');
1577 if (ch >
'%' && ch < 0x7f) {
1582 *d++ =
'%'; *d++ = *(s - 2); *d++ = *(s - 1);
1592 c = (u_char) (ch | 0x20);
1593 if (c >=
'a' && c <=
'f') {
1594 ch = (u_char) ((decoded << 4) + c -
'a' + 10);
1612 if (ch >
'%' && ch < 0x7f) {
1617 *d++ =
'%'; *d++ = *(s - 2); *d++ = *(s - 1);
1653 len +=
sizeof(
"<") - 2;
1657 len +=
sizeof(
">") - 2;
1661 len +=
sizeof(
"&") - 2;
1665 len +=
sizeof(
""") - 2;
1674 return (uintptr_t) len;
1683 *dst++ =
'&'; *dst++ =
'l'; *dst++ =
't'; *dst++ =
';';
1687 *dst++ =
'&'; *dst++ =
'g'; *dst++ =
't'; *dst++ =
';';
1691 *dst++ =
'&'; *dst++ =
'a'; *dst++ =
'm'; *dst++ =
'p';
1696 *dst++ =
'&'; *dst++ =
'q'; *dst++ =
'u'; *dst++ =
'o';
1697 *dst++ =
't'; *dst++ =
';';
1707 return (uintptr_t) dst;
1723 if (node->
key != temp->
key) {
1736 if (*p == sentinel) {
1745 node->
left = sentinel;
1746 node->
right = sentinel;
1758 node = rbtree->
root;
1761 while (node != sentinel) {
1765 if (hash != node->
key) {
1798 ngx_int_t (*cmp)(
const void *,
const void *))
1800 u_char *p1, *p2, *p;
1807 for (p1 = (u_char *) base + size;
1808 p1 < (u_char *) base + n * size;
1814 p2 > (u_char *) base && cmp(p2 - size, p) > 0;
1827 #if (NGX_MEMCPY_LIMIT)
1830 ngx_memcpy(
void *dst,
const void *src,
size_t n)
1832 if (n > NGX_MEMCPY_LIMIT) {
1837 return memcpy(dst, src, n);