annotate src/core/ngx_string.c @ 7736:a46fcf101cfc

Core: added format specifiers to output binary data as hex. Now "s", "V", and "v" format specifiers may be prefixed with "x" (lowercase) or "X" (uppercase) to output corresponding data in hexadecimal format. In collaboration with Maxim Dounin.
author Vladimir Homutov <vl@nginx.com>
date Wed, 28 Oct 2020 10:56:11 +0300
parents a42a6dfeb01a
children 5772da03faf8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 409
diff changeset
1
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 409
diff changeset
2 /*
444
42d11f017717 nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents: 441
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 4312
diff changeset
4 * Copyright (C) Nginx, Inc.
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 409
diff changeset
5 */
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 409
diff changeset
6
0
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 0
diff changeset
9 #include <ngx_core.h>
0
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
2293
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
12 static u_char *ngx_sprintf_num(u_char *buf, u_char *last, uint64_t ui64,
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
13 u_char zero, ngx_uint_t hexadecimal, ngx_uint_t width);
7736
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
14 static u_char *ngx_sprintf_str(u_char *buf, u_char *last, u_char *src,
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
15 size_t len, ngx_uint_t hexadecimal);
5551
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
16 static void ngx_encode_base64_internal(ngx_str_t *dst, ngx_str_t *src,
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
17 const u_char *basis, ngx_uint_t padding);
3756
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
18 static ngx_int_t ngx_decode_base64_internal(ngx_str_t *dst, ngx_str_t *src,
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
19 const u_char *basis);
2293
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
20
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
21
2135
8c6521eedf84 ngx_strlow()
Igor Sysoev <igor@sysoev.ru>
parents: 2125
diff changeset
22 void
8c6521eedf84 ngx_strlow()
Igor Sysoev <igor@sysoev.ru>
parents: 2125
diff changeset
23 ngx_strlow(u_char *dst, u_char *src, size_t n)
8c6521eedf84 ngx_strlow()
Igor Sysoev <igor@sysoev.ru>
parents: 2125
diff changeset
24 {
3275
b344b68da8c5 optimize some cycles:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
25 while (n) {
2135
8c6521eedf84 ngx_strlow()
Igor Sysoev <igor@sysoev.ru>
parents: 2125
diff changeset
26 *dst = ngx_tolower(*src);
8c6521eedf84 ngx_strlow()
Igor Sysoev <igor@sysoev.ru>
parents: 2125
diff changeset
27 dst++;
8c6521eedf84 ngx_strlow()
Igor Sysoev <igor@sysoev.ru>
parents: 2125
diff changeset
28 src++;
3275
b344b68da8c5 optimize some cycles:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
29 n--;
2135
8c6521eedf84 ngx_strlow()
Igor Sysoev <igor@sysoev.ru>
parents: 2125
diff changeset
30 }
8c6521eedf84 ngx_strlow()
Igor Sysoev <igor@sysoev.ru>
parents: 2125
diff changeset
31 }
8c6521eedf84 ngx_strlow()
Igor Sysoev <igor@sysoev.ru>
parents: 2125
diff changeset
32
8c6521eedf84 ngx_strlow()
Igor Sysoev <igor@sysoev.ru>
parents: 2125
diff changeset
33
7120
874171c3c71a Fixed handling of non-null-terminated unix sockets.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7067
diff changeset
34 size_t
874171c3c71a Fixed handling of non-null-terminated unix sockets.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7067
diff changeset
35 ngx_strnlen(u_char *p, size_t n)
874171c3c71a Fixed handling of non-null-terminated unix sockets.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7067
diff changeset
36 {
874171c3c71a Fixed handling of non-null-terminated unix sockets.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7067
diff changeset
37 size_t i;
874171c3c71a Fixed handling of non-null-terminated unix sockets.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7067
diff changeset
38
874171c3c71a Fixed handling of non-null-terminated unix sockets.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7067
diff changeset
39 for (i = 0; i < n; i++) {
874171c3c71a Fixed handling of non-null-terminated unix sockets.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7067
diff changeset
40
874171c3c71a Fixed handling of non-null-terminated unix sockets.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7067
diff changeset
41 if (p[i] == '\0') {
874171c3c71a Fixed handling of non-null-terminated unix sockets.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7067
diff changeset
42 return i;
874171c3c71a Fixed handling of non-null-terminated unix sockets.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7067
diff changeset
43 }
874171c3c71a Fixed handling of non-null-terminated unix sockets.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7067
diff changeset
44 }
874171c3c71a Fixed handling of non-null-terminated unix sockets.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7067
diff changeset
45
874171c3c71a Fixed handling of non-null-terminated unix sockets.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7067
diff changeset
46 return n;
874171c3c71a Fixed handling of non-null-terminated unix sockets.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7067
diff changeset
47 }
874171c3c71a Fixed handling of non-null-terminated unix sockets.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7067
diff changeset
48
874171c3c71a Fixed handling of non-null-terminated unix sockets.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7067
diff changeset
49
493
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
50 u_char *
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
51 ngx_cpystrn(u_char *dst, u_char *src, size_t n)
0
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
52 {
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
53 if (n == 0) {
0
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
54 return dst;
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
55 }
0
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56
2919
41e7d9153967 change surplus for() to while()
Igor Sysoev <igor@sysoev.ru>
parents: 2763
diff changeset
57 while (--n) {
0
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58 *dst = *src;
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
60 if (*dst == '\0') {
0
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61 return dst;
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
62 }
2919
41e7d9153967 change surplus for() to while()
Igor Sysoev <igor@sysoev.ru>
parents: 2763
diff changeset
63
41e7d9153967 change surplus for() to while()
Igor Sysoev <igor@sysoev.ru>
parents: 2763
diff changeset
64 dst++;
41e7d9153967 change surplus for() to while()
Igor Sysoev <igor@sysoev.ru>
parents: 2763
diff changeset
65 src++;
0
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
66 }
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68 *dst = '\0';
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
69
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
70 return dst;
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
71 }
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 0
diff changeset
72
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 0
diff changeset
73
493
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
74 u_char *
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
75 ngx_pstrdup(ngx_pool_t *pool, ngx_str_t *src)
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
76 {
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
77 u_char *dst;
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
78
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1956
diff changeset
79 dst = ngx_pnalloc(pool, src->len);
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
80 if (dst == NULL) {
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
81 return NULL;
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
82 }
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
83
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
84 ngx_memcpy(dst, src->data, src->len);
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
85
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
86 return dst;
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
87 }
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
88
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
89
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
90 /*
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
91 * supported formats:
473
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
92 * %[0][width][x][X]O off_t
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
93 * %[0][width]T time_t
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
94 * %[0][width][u][x|X]z ssize_t/size_t
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
95 * %[0][width][u][x|X]d int/u_int
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
96 * %[0][width][u][x|X]l long
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
97 * %[0][width|m][u][x|X]i ngx_int_t/ngx_uint_t
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
98 * %[0][width][u][x|X]D int32_t/uint32_t
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
99 * %[0][width][u][x|X]L int64_t/uint64_t
495
fc9909c369b2 nginx-0.1.22-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 493
diff changeset
100 * %[0][width|m][u][x|X]A ngx_atomic_int_t/ngx_atomic_uint_t
3506
c3fa65192119 use double in %f format to allow %.15f precision
Igor Sysoev <igor@sysoev.ru>
parents: 3486
diff changeset
101 * %[0][width][.width]f double, max valid number fits to %18.15f
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
102 * %P ngx_pid_t
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
103 * %M ngx_msec_t
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
104 * %r rlim_t
1406
03341711f9a2 use %v for ngx_variable_value_t in ngx_sprintf(),
Igor Sysoev <igor@sysoev.ru>
parents: 1405
diff changeset
105 * %p void *
7736
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
106 * %[x|X]V ngx_str_t *
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
107 * %[x|X]v ngx_variable_value_t *
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
108 * %[x|X]s null-terminated string
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
109 * %*[x|X]s length and string
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
110 * %Z '\0'
525
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
111 * %N '\n'
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
112 * %c char
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
113 * %% %
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
114 *
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
115 * reserved:
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
116 * %t ptrdiff_t
3046
52e984126b2c fix typo
Igor Sysoev <igor@sysoev.ru>
parents: 2919
diff changeset
117 * %S null-terminated wchar string
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
118 * %C wchar
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
119 */
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
120
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
121
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
122 u_char * ngx_cdecl
493
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
123 ngx_sprintf(u_char *buf, const char *fmt, ...)
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
124 {
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
125 u_char *p;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
126 va_list args;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
127
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
128 va_start(args, fmt);
2763
819bea4e964e ngx_vslprintf(), ngx_slprintf()
Igor Sysoev <igor@sysoev.ru>
parents: 2680
diff changeset
129 p = ngx_vslprintf(buf, (void *) -1, fmt, args);
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
130 va_end(args);
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
131
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
132 return p;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
133 }
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
134
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
135
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
136 u_char * ngx_cdecl
493
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
137 ngx_snprintf(u_char *buf, size_t max, const char *fmt, ...)
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
138 {
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
139 u_char *p;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
140 va_list args;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
141
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
142 va_start(args, fmt);
2763
819bea4e964e ngx_vslprintf(), ngx_slprintf()
Igor Sysoev <igor@sysoev.ru>
parents: 2680
diff changeset
143 p = ngx_vslprintf(buf, buf + max, fmt, args);
819bea4e964e ngx_vslprintf(), ngx_slprintf()
Igor Sysoev <igor@sysoev.ru>
parents: 2680
diff changeset
144 va_end(args);
819bea4e964e ngx_vslprintf(), ngx_slprintf()
Igor Sysoev <igor@sysoev.ru>
parents: 2680
diff changeset
145
819bea4e964e ngx_vslprintf(), ngx_slprintf()
Igor Sysoev <igor@sysoev.ru>
parents: 2680
diff changeset
146 return p;
819bea4e964e ngx_vslprintf(), ngx_slprintf()
Igor Sysoev <igor@sysoev.ru>
parents: 2680
diff changeset
147 }
819bea4e964e ngx_vslprintf(), ngx_slprintf()
Igor Sysoev <igor@sysoev.ru>
parents: 2680
diff changeset
148
819bea4e964e ngx_vslprintf(), ngx_slprintf()
Igor Sysoev <igor@sysoev.ru>
parents: 2680
diff changeset
149
819bea4e964e ngx_vslprintf(), ngx_slprintf()
Igor Sysoev <igor@sysoev.ru>
parents: 2680
diff changeset
150 u_char * ngx_cdecl
819bea4e964e ngx_vslprintf(), ngx_slprintf()
Igor Sysoev <igor@sysoev.ru>
parents: 2680
diff changeset
151 ngx_slprintf(u_char *buf, u_char *last, const char *fmt, ...)
819bea4e964e ngx_vslprintf(), ngx_slprintf()
Igor Sysoev <igor@sysoev.ru>
parents: 2680
diff changeset
152 {
819bea4e964e ngx_vslprintf(), ngx_slprintf()
Igor Sysoev <igor@sysoev.ru>
parents: 2680
diff changeset
153 u_char *p;
819bea4e964e ngx_vslprintf(), ngx_slprintf()
Igor Sysoev <igor@sysoev.ru>
parents: 2680
diff changeset
154 va_list args;
819bea4e964e ngx_vslprintf(), ngx_slprintf()
Igor Sysoev <igor@sysoev.ru>
parents: 2680
diff changeset
155
819bea4e964e ngx_vslprintf(), ngx_slprintf()
Igor Sysoev <igor@sysoev.ru>
parents: 2680
diff changeset
156 va_start(args, fmt);
819bea4e964e ngx_vslprintf(), ngx_slprintf()
Igor Sysoev <igor@sysoev.ru>
parents: 2680
diff changeset
157 p = ngx_vslprintf(buf, last, fmt, args);
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
158 va_end(args);
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
159
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
160 return p;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
161 }
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
162
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
163
493
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
164 u_char *
2763
819bea4e964e ngx_vslprintf(), ngx_slprintf()
Igor Sysoev <igor@sysoev.ru>
parents: 2680
diff changeset
165 ngx_vslprintf(u_char *buf, u_char *last, const char *fmt, va_list args)
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
166 {
2763
819bea4e964e ngx_vslprintf(), ngx_slprintf()
Igor Sysoev <igor@sysoev.ru>
parents: 2680
diff changeset
167 u_char *p, zero;
1310
33d6c994a0b2 Sun Studio on sparc uses different bit order
Igor Sysoev <igor@sysoev.ru>
parents: 1298
diff changeset
168 int d;
4604
d3fc672fd6cc Fix of "%f" format handling.
Igor Sysoev <igor@sysoev.ru>
parents: 4412
diff changeset
169 double f;
7736
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
170 size_t slen;
1310
33d6c994a0b2 Sun Studio on sparc uses different bit order
Igor Sysoev <igor@sysoev.ru>
parents: 1298
diff changeset
171 int64_t i64;
4604
d3fc672fd6cc Fix of "%f" format handling.
Igor Sysoev <igor@sysoev.ru>
parents: 4412
diff changeset
172 uint64_t ui64, frac;
1310
33d6c994a0b2 Sun Studio on sparc uses different bit order
Igor Sysoev <igor@sysoev.ru>
parents: 1298
diff changeset
173 ngx_msec_t ms;
4604
d3fc672fd6cc Fix of "%f" format handling.
Igor Sysoev <igor@sysoev.ru>
parents: 4412
diff changeset
174 ngx_uint_t width, sign, hex, max_width, frac_width, scale, n;
1406
03341711f9a2 use %v for ngx_variable_value_t in ngx_sprintf(),
Igor Sysoev <igor@sysoev.ru>
parents: 1405
diff changeset
175 ngx_str_t *v;
03341711f9a2 use %v for ngx_variable_value_t in ngx_sprintf(),
Igor Sysoev <igor@sysoev.ru>
parents: 1405
diff changeset
176 ngx_variable_value_t *vv;
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
177
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
178 while (*fmt && buf < last) {
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
179
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
180 /*
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
181 * "buf < last" means that we could copy at least one character:
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
182 * the plain character, "%%", "%c", and minus without the checking
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
183 */
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
184
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
185 if (*fmt == '%') {
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
186
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
187 i64 = 0;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
188 ui64 = 0;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
189
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
190 zero = (u_char) ((*++fmt == '0') ? '0' : ' ');
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
191 width = 0;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
192 sign = 1;
2293
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
193 hex = 0;
493
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
194 max_width = 0;
2293
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
195 frac_width = 0;
1863
8382d94ba6ae allow zero length in %*s
Igor Sysoev <igor@sysoev.ru>
parents: 1773
diff changeset
196 slen = (size_t) -1;
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
197
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
198 while (*fmt >= '0' && *fmt <= '9') {
7067
e3723f2a11b7 Parenthesized ASCII-related calculations.
Valentin Bartenev <vbart@nginx.com>
parents: 6974
diff changeset
199 width = width * 10 + (*fmt++ - '0');
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
200 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
201
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
202
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
203 for ( ;; ) {
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
204 switch (*fmt) {
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
205
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
206 case 'u':
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
207 sign = 0;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
208 fmt++;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
209 continue;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
210
467
bbd6b0b4a2b1 nginx-0.1.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
211 case 'm':
493
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
212 max_width = 1;
467
bbd6b0b4a2b1 nginx-0.1.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
213 fmt++;
bbd6b0b4a2b1 nginx-0.1.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
214 continue;
bbd6b0b4a2b1 nginx-0.1.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
215
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
216 case 'X':
2293
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
217 hex = 2;
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
218 sign = 0;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
219 fmt++;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
220 continue;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
221
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
222 case 'x':
2293
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
223 hex = 1;
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
224 sign = 0;
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
225 fmt++;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
226 continue;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
227
2293
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
228 case '.':
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
229 fmt++;
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
230
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
231 while (*fmt >= '0' && *fmt <= '9') {
7067
e3723f2a11b7 Parenthesized ASCII-related calculations.
Valentin Bartenev <vbart@nginx.com>
parents: 6974
diff changeset
232 frac_width = frac_width * 10 + (*fmt++ - '0');
2293
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
233 }
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
234
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
235 break;
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
236
1773
d85879105d35 %*s format
Igor Sysoev <igor@sysoev.ru>
parents: 1745
diff changeset
237 case '*':
1866
d5557e6a4224 use correct type cast
Igor Sysoev <igor@sysoev.ru>
parents: 1863
diff changeset
238 slen = va_arg(args, size_t);
1773
d85879105d35 %*s format
Igor Sysoev <igor@sysoev.ru>
parents: 1745
diff changeset
239 fmt++;
d85879105d35 %*s format
Igor Sysoev <igor@sysoev.ru>
parents: 1745
diff changeset
240 continue;
d85879105d35 %*s format
Igor Sysoev <igor@sysoev.ru>
parents: 1745
diff changeset
241
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
242 default:
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
243 break;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
244 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
245
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
246 break;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
247 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
248
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
249
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
250 switch (*fmt) {
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
251
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
252 case 'V':
1406
03341711f9a2 use %v for ngx_variable_value_t in ngx_sprintf(),
Igor Sysoev <igor@sysoev.ru>
parents: 1405
diff changeset
253 v = va_arg(args, ngx_str_t *);
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
254
7736
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
255 buf = ngx_sprintf_str(buf, last, v->data, v->len, hex);
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
256 fmt++;
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
257
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
258 continue;
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
259
1406
03341711f9a2 use %v for ngx_variable_value_t in ngx_sprintf(),
Igor Sysoev <igor@sysoev.ru>
parents: 1405
diff changeset
260 case 'v':
03341711f9a2 use %v for ngx_variable_value_t in ngx_sprintf(),
Igor Sysoev <igor@sysoev.ru>
parents: 1405
diff changeset
261 vv = va_arg(args, ngx_variable_value_t *);
03341711f9a2 use %v for ngx_variable_value_t in ngx_sprintf(),
Igor Sysoev <igor@sysoev.ru>
parents: 1405
diff changeset
262
7736
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
263 buf = ngx_sprintf_str(buf, last, vv->data, vv->len, hex);
1406
03341711f9a2 use %v for ngx_variable_value_t in ngx_sprintf(),
Igor Sysoev <igor@sysoev.ru>
parents: 1405
diff changeset
264 fmt++;
03341711f9a2 use %v for ngx_variable_value_t in ngx_sprintf(),
Igor Sysoev <igor@sysoev.ru>
parents: 1405
diff changeset
265
03341711f9a2 use %v for ngx_variable_value_t in ngx_sprintf(),
Igor Sysoev <igor@sysoev.ru>
parents: 1405
diff changeset
266 continue;
03341711f9a2 use %v for ngx_variable_value_t in ngx_sprintf(),
Igor Sysoev <igor@sysoev.ru>
parents: 1405
diff changeset
267
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
268 case 's':
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
269 p = va_arg(args, u_char *);
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
270
7736
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
271 buf = ngx_sprintf_str(buf, last, p, slen, hex);
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
272 fmt++;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
273
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
274 continue;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
275
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
276 case 'O':
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
277 i64 = (int64_t) va_arg(args, off_t);
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
278 sign = 1;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
279 break;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
280
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
281 case 'P':
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
282 i64 = (int64_t) va_arg(args, ngx_pid_t);
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
283 sign = 1;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
284 break;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
285
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
286 case 'T':
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
287 i64 = (int64_t) va_arg(args, time_t);
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
288 sign = 1;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
289 break;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
290
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
291 case 'M':
561
e48ebafc6939 nginx-0.3.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 557
diff changeset
292 ms = (ngx_msec_t) va_arg(args, ngx_msec_t);
e48ebafc6939 nginx-0.3.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 557
diff changeset
293 if ((ngx_msec_int_t) ms == -1) {
e48ebafc6939 nginx-0.3.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 557
diff changeset
294 sign = 1;
e48ebafc6939 nginx-0.3.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 557
diff changeset
295 i64 = -1;
e48ebafc6939 nginx-0.3.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 557
diff changeset
296 } else {
e48ebafc6939 nginx-0.3.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 557
diff changeset
297 sign = 0;
e48ebafc6939 nginx-0.3.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 557
diff changeset
298 ui64 = (uint64_t) ms;
e48ebafc6939 nginx-0.3.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 557
diff changeset
299 }
557
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
300 break;
ecd9c160f25b nginx-0.3.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
301
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
302 case 'z':
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
303 if (sign) {
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
304 i64 = (int64_t) va_arg(args, ssize_t);
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
305 } else {
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
306 ui64 = (uint64_t) va_arg(args, size_t);
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
307 }
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
308 break;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
309
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
310 case 'i':
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
311 if (sign) {
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
312 i64 = (int64_t) va_arg(args, ngx_int_t);
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
313 } else {
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
314 ui64 = (uint64_t) va_arg(args, ngx_uint_t);
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
315 }
493
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
316
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
317 if (max_width) {
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
318 width = NGX_INT_T_LEN;
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
319 }
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
320
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
321 break;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
322
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
323 case 'd':
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
324 if (sign) {
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
325 i64 = (int64_t) va_arg(args, int);
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
326 } else {
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
327 ui64 = (uint64_t) va_arg(args, u_int);
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
328 }
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
329 break;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
330
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
331 case 'l':
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
332 if (sign) {
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
333 i64 = (int64_t) va_arg(args, long);
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
334 } else {
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
335 ui64 = (uint64_t) va_arg(args, u_long);
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
336 }
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
337 break;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
338
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
339 case 'D':
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
340 if (sign) {
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
341 i64 = (int64_t) va_arg(args, int32_t);
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
342 } else {
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
343 ui64 = (uint64_t) va_arg(args, uint32_t);
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
344 }
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
345 break;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
346
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
347 case 'L':
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
348 if (sign) {
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
349 i64 = va_arg(args, int64_t);
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
350 } else {
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
351 ui64 = va_arg(args, uint64_t);
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
352 }
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
353 break;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
354
493
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
355 case 'A':
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
356 if (sign) {
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
357 i64 = (int64_t) va_arg(args, ngx_atomic_int_t);
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
358 } else {
495
fc9909c369b2 nginx-0.1.22-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 493
diff changeset
359 ui64 = (uint64_t) va_arg(args, ngx_atomic_uint_t);
493
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
360 }
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
361
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
362 if (max_width) {
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
363 width = NGX_ATOMIC_T_LEN;
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
364 }
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
365
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
366 break;
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
367
2293
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
368 case 'f':
3506
c3fa65192119 use double in %f format to allow %.15f precision
Igor Sysoev <igor@sysoev.ru>
parents: 3486
diff changeset
369 f = va_arg(args, double);
2293
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
370
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
371 if (f < 0) {
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
372 *buf++ = '-';
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
373 f = -f;
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
374 }
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
375
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
376 ui64 = (int64_t) f;
4604
d3fc672fd6cc Fix of "%f" format handling.
Igor Sysoev <igor@sysoev.ru>
parents: 4412
diff changeset
377 frac = 0;
d3fc672fd6cc Fix of "%f" format handling.
Igor Sysoev <igor@sysoev.ru>
parents: 4412
diff changeset
378
d3fc672fd6cc Fix of "%f" format handling.
Igor Sysoev <igor@sysoev.ru>
parents: 4412
diff changeset
379 if (frac_width) {
d3fc672fd6cc Fix of "%f" format handling.
Igor Sysoev <igor@sysoev.ru>
parents: 4412
diff changeset
380
d3fc672fd6cc Fix of "%f" format handling.
Igor Sysoev <igor@sysoev.ru>
parents: 4412
diff changeset
381 scale = 1;
d3fc672fd6cc Fix of "%f" format handling.
Igor Sysoev <igor@sysoev.ru>
parents: 4412
diff changeset
382 for (n = frac_width; n; n--) {
d3fc672fd6cc Fix of "%f" format handling.
Igor Sysoev <igor@sysoev.ru>
parents: 4412
diff changeset
383 scale *= 10;
d3fc672fd6cc Fix of "%f" format handling.
Igor Sysoev <igor@sysoev.ru>
parents: 4412
diff changeset
384 }
d3fc672fd6cc Fix of "%f" format handling.
Igor Sysoev <igor@sysoev.ru>
parents: 4412
diff changeset
385
d3fc672fd6cc Fix of "%f" format handling.
Igor Sysoev <igor@sysoev.ru>
parents: 4412
diff changeset
386 frac = (uint64_t) ((f - (double) ui64) * scale + 0.5);
d3fc672fd6cc Fix of "%f" format handling.
Igor Sysoev <igor@sysoev.ru>
parents: 4412
diff changeset
387
d3fc672fd6cc Fix of "%f" format handling.
Igor Sysoev <igor@sysoev.ru>
parents: 4412
diff changeset
388 if (frac == scale) {
d3fc672fd6cc Fix of "%f" format handling.
Igor Sysoev <igor@sysoev.ru>
parents: 4412
diff changeset
389 ui64++;
d3fc672fd6cc Fix of "%f" format handling.
Igor Sysoev <igor@sysoev.ru>
parents: 4412
diff changeset
390 frac = 0;
d3fc672fd6cc Fix of "%f" format handling.
Igor Sysoev <igor@sysoev.ru>
parents: 4412
diff changeset
391 }
d3fc672fd6cc Fix of "%f" format handling.
Igor Sysoev <igor@sysoev.ru>
parents: 4412
diff changeset
392 }
2293
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
393
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
394 buf = ngx_sprintf_num(buf, last, ui64, zero, 0, width);
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
395
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
396 if (frac_width) {
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
397 if (buf < last) {
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
398 *buf++ = '.';
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
399 }
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
400
4604
d3fc672fd6cc Fix of "%f" format handling.
Igor Sysoev <igor@sysoev.ru>
parents: 4412
diff changeset
401 buf = ngx_sprintf_num(buf, last, frac, '0', 0, frac_width);
2293
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
402 }
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
403
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
404 fmt++;
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
405
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
406 continue;
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
407
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
408 #if !(NGX_WIN32)
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
409 case 'r':
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
410 i64 = (int64_t) va_arg(args, rlim_t);
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
411 sign = 1;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
412 break;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
413 #endif
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
414
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
415 case 'p':
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
416 ui64 = (uintptr_t) va_arg(args, void *);
2293
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
417 hex = 2;
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
418 sign = 0;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
419 zero = '0';
6314
fcbac620ae83 Style: NGX_PTR_SIZE replaced with sizeof(void *).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6009
diff changeset
420 width = 2 * sizeof(void *);
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
421 break;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
422
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
423 case 'c':
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
424 d = va_arg(args, int);
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
425 *buf++ = (u_char) (d & 0xff);
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
426 fmt++;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
427
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
428 continue;
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
429
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
430 case 'Z':
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
431 *buf++ = '\0';
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
432 fmt++;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
433
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
434 continue;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
435
525
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
436 case 'N':
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
437 #if (NGX_WIN32)
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
438 *buf++ = CR;
5965
78271500b8de A bounds check of %N format on Windows.
Igor Sysoev <igor@sysoev.ru>
parents: 5944
diff changeset
439 if (buf < last) {
78271500b8de A bounds check of %N format on Windows.
Igor Sysoev <igor@sysoev.ru>
parents: 5944
diff changeset
440 *buf++ = LF;
78271500b8de A bounds check of %N format on Windows.
Igor Sysoev <igor@sysoev.ru>
parents: 5944
diff changeset
441 }
78271500b8de A bounds check of %N format on Windows.
Igor Sysoev <igor@sysoev.ru>
parents: 5944
diff changeset
442 #else
78271500b8de A bounds check of %N format on Windows.
Igor Sysoev <igor@sysoev.ru>
parents: 5944
diff changeset
443 *buf++ = LF;
525
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
444 #endif
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
445 fmt++;
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
446
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
447 continue;
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
448
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
449 case '%':
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
450 *buf++ = '%';
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
451 fmt++;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
452
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
453 continue;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
454
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
455 default:
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
456 *buf++ = *fmt++;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
457
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
458 continue;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
459 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
460
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
461 if (sign) {
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
462 if (i64 < 0) {
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
463 *buf++ = '-';
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
464 ui64 = (uint64_t) -i64;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
465
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
466 } else {
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
467 ui64 = (uint64_t) i64;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
468 }
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
469 }
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
470
2293
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
471 buf = ngx_sprintf_num(buf, last, ui64, zero, hex, width);
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
472
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
473 fmt++;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
474
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
475 } else {
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
476 *buf++ = *fmt++;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
477 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
478 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
479
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
480 return buf;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
481 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
482
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
483
2293
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
484 static u_char *
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
485 ngx_sprintf_num(u_char *buf, u_char *last, uint64_t ui64, u_char zero,
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
486 ngx_uint_t hexadecimal, ngx_uint_t width)
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
487 {
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
488 u_char *p, temp[NGX_INT64_LEN + 1];
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
489 /*
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
490 * we need temp[NGX_INT64_LEN] only,
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
491 * but icc issues the warning
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
492 */
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
493 size_t len;
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
494 uint32_t ui32;
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
495 static u_char hex[] = "0123456789abcdef";
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
496 static u_char HEX[] = "0123456789ABCDEF";
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
497
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
498 p = temp + NGX_INT64_LEN;
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
499
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
500 if (hexadecimal == 0) {
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
501
5358
670ceaba03d8 Win32: Open Watcom C compatibility fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4781
diff changeset
502 if (ui64 <= (uint64_t) NGX_MAX_UINT32_VALUE) {
2293
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
503
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
504 /*
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
505 * To divide 64-bit numbers and to find remainders
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
506 * on the x86 platform gcc and icc call the libc functions
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
507 * [u]divdi3() and [u]moddi3(), they call another function
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
508 * in its turn. On FreeBSD it is the qdivrem() function,
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
509 * its source code is about 170 lines of the code.
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
510 * The glibc counterpart is about 150 lines of the code.
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
511 *
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
512 * For 32-bit numbers and some divisors gcc and icc use
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
513 * a inlined multiplication and shifts. For example,
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
514 * unsigned "i32 / 10" is compiled to
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
515 *
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
516 * (i32 * 0xCCCCCCCD) >> 35
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
517 */
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
518
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
519 ui32 = (uint32_t) ui64;
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
520
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
521 do {
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
522 *--p = (u_char) (ui32 % 10 + '0');
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
523 } while (ui32 /= 10);
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
524
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
525 } else {
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
526 do {
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
527 *--p = (u_char) (ui64 % 10 + '0');
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
528 } while (ui64 /= 10);
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
529 }
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
530
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
531 } else if (hexadecimal == 1) {
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
532
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
533 do {
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
534
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
535 /* the "(uint32_t)" cast disables the BCC's warning */
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
536 *--p = hex[(uint32_t) (ui64 & 0xf)];
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
537
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
538 } while (ui64 >>= 4);
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
539
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
540 } else { /* hexadecimal == 2 */
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
541
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
542 do {
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
543
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
544 /* the "(uint32_t)" cast disables the BCC's warning */
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
545 *--p = HEX[(uint32_t) (ui64 & 0xf)];
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
546
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
547 } while (ui64 >>= 4);
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
548 }
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
549
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
550 /* zero or space padding */
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
551
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
552 len = (temp + NGX_INT64_LEN) - p;
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
553
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
554 while (len++ < width && buf < last) {
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
555 *buf++ = zero;
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
556 }
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
557
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
558 /* number safe copy */
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
559
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
560 len = (temp + NGX_INT64_LEN) - p;
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
561
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
562 if (buf + len > last) {
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
563 len = last - buf;
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
564 }
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
565
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
566 return ngx_cpymem(buf, p, len);
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
567 }
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
568
0433bc27e468 %f format
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
569
7736
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
570 static u_char *
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
571 ngx_sprintf_str(u_char *buf, u_char *last, u_char *src, size_t len,
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
572 ngx_uint_t hexadecimal)
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
573 {
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
574 static u_char hex[] = "0123456789abcdef";
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
575 static u_char HEX[] = "0123456789ABCDEF";
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
576
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
577 if (hexadecimal == 0) {
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
578
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
579 if (len == (size_t) -1) {
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
580 while (*src && buf < last) {
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
581 *buf++ = *src++;
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
582 }
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
583
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
584 } else {
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
585 len = ngx_min((size_t) (last - buf), len);
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
586 buf = ngx_cpymem(buf, src, len);
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
587 }
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
588
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
589 } else if (hexadecimal == 1) {
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
590
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
591 if (len == (size_t) -1) {
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
592
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
593 while (*src && buf < last - 1) {
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
594 *buf++ = hex[*src >> 4];
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
595 *buf++ = hex[*src++ & 0xf];
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
596 }
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
597
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
598 } else {
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
599
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
600 while (len-- && buf < last - 1) {
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
601 *buf++ = hex[*src >> 4];
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
602 *buf++ = hex[*src++ & 0xf];
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
603 }
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
604 }
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
605
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
606 } else { /* hexadecimal == 2 */
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
607
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
608 if (len == (size_t) -1) {
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
609
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
610 while (*src && buf < last - 1) {
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
611 *buf++ = HEX[*src >> 4];
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
612 *buf++ = HEX[*src++ & 0xf];
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
613 }
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
614
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
615 } else {
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
616
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
617 while (len-- && buf < last - 1) {
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
618 *buf++ = HEX[*src >> 4];
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
619 *buf++ = HEX[*src++ & 0xf];
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
620 }
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
621 }
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
622 }
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
623
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
624 return buf;
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
625 }
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
626
a46fcf101cfc Core: added format specifiers to output binary data as hex.
Vladimir Homutov <vl@nginx.com>
parents: 7494
diff changeset
627
1107
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
628 /*
1541
22629796df09 fix comment
Igor Sysoev <igor@sysoev.ru>
parents: 1406
diff changeset
629 * We use ngx_strcasecmp()/ngx_strncasecmp() for 7-bit ASCII strings only,
1107
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
630 * and implement our own ngx_strcasecmp()/ngx_strncasecmp()
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
631 * to avoid libc locale overhead. Besides, we use the ngx_uint_t's
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
632 * instead of the u_char's, because they are slightly faster.
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
633 */
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
634
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
635 ngx_int_t
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
636 ngx_strcasecmp(u_char *s1, u_char *s2)
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
637 {
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
638 ngx_uint_t c1, c2;
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
639
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
640 for ( ;; ) {
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
641 c1 = (ngx_uint_t) *s1++;
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
642 c2 = (ngx_uint_t) *s2++;
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
643
3115
204ea173234f style fix
Igor Sysoev <igor@sysoev.ru>
parents: 3046
diff changeset
644 c1 = (c1 >= 'A' && c1 <= 'Z') ? (c1 | 0x20) : c1;
204ea173234f style fix
Igor Sysoev <igor@sysoev.ru>
parents: 3046
diff changeset
645 c2 = (c2 >= 'A' && c2 <= 'Z') ? (c2 | 0x20) : c2;
1107
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
646
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
647 if (c1 == c2) {
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
648
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
649 if (c1) {
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
650 continue;
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
651 }
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
652
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
653 return 0;
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
654 }
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
655
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
656 return c1 - c2;
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
657 }
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
658 }
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
659
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
660
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
661 ngx_int_t
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
662 ngx_strncasecmp(u_char *s1, u_char *s2, size_t n)
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
663 {
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
664 ngx_uint_t c1, c2;
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
665
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
666 while (n) {
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
667 c1 = (ngx_uint_t) *s1++;
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
668 c2 = (ngx_uint_t) *s2++;
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
669
3115
204ea173234f style fix
Igor Sysoev <igor@sysoev.ru>
parents: 3046
diff changeset
670 c1 = (c1 >= 'A' && c1 <= 'Z') ? (c1 | 0x20) : c1;
204ea173234f style fix
Igor Sysoev <igor@sysoev.ru>
parents: 3046
diff changeset
671 c2 = (c2 >= 'A' && c2 <= 'Z') ? (c2 | 0x20) : c2;
1107
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
672
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
673 if (c1 == c2) {
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
674
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
675 if (c1) {
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
676 n--;
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
677 continue;
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
678 }
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
679
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
680 return 0;
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
681 }
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
682
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
683 return c1 - c2;
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
684 }
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
685
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
686 return 0;
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
687 }
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
688
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1029
diff changeset
689
1552
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
690 u_char *
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
691 ngx_strnstr(u_char *s1, char *s2, size_t len)
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
692 {
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
693 u_char c1, c2;
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
694 size_t n;
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
695
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
696 c2 = *(u_char *) s2++;
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
697
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
698 n = ngx_strlen(s2);
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
699
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
700 do {
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
701 do {
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
702 if (len-- == 0) {
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
703 return NULL;
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
704 }
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
705
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
706 c1 = *s1++;
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
707
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
708 if (c1 == 0) {
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
709 return NULL;
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
710 }
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
711
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
712 } while (c1 != c2);
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
713
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
714 if (n > len) {
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
715 return NULL;
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
716 }
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
717
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
718 } while (ngx_strncmp(s1, (u_char *) s2, n) != 0);
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
719
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
720 return --s1;
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
721 }
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
722
f045c67ab622 ngx_strnstr()
Igor Sysoev <igor@sysoev.ru>
parents: 1550
diff changeset
723
1550
d0bdd5f2276e add comment
Igor Sysoev <igor@sysoev.ru>
parents: 1544
diff changeset
724 /*
d0bdd5f2276e add comment
Igor Sysoev <igor@sysoev.ru>
parents: 1544
diff changeset
725 * ngx_strstrn() and ngx_strcasestrn() are intended to search for static
d0bdd5f2276e add comment
Igor Sysoev <igor@sysoev.ru>
parents: 1544
diff changeset
726 * substring with known length in null-terminated string. The argument n
d0bdd5f2276e add comment
Igor Sysoev <igor@sysoev.ru>
parents: 1544
diff changeset
727 * must be length of the second substring - 1.
d0bdd5f2276e add comment
Igor Sysoev <igor@sysoev.ru>
parents: 1544
diff changeset
728 */
d0bdd5f2276e add comment
Igor Sysoev <igor@sysoev.ru>
parents: 1544
diff changeset
729
1542
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
730 u_char *
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
731 ngx_strstrn(u_char *s1, char *s2, size_t n)
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
732 {
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
733 u_char c1, c2;
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
734
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
735 c2 = *(u_char *) s2++;
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
736
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
737 do {
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
738 do {
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
739 c1 = *s1++;
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
740
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
741 if (c1 == 0) {
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
742 return NULL;
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
743 }
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
744
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
745 } while (c1 != c2);
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
746
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
747 } while (ngx_strncmp(s1, (u_char *) s2, n) != 0);
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
748
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
749 return --s1;
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
750 }
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
751
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
752
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
753 u_char *
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
754 ngx_strcasestrn(u_char *s1, char *s2, size_t n)
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
755 {
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
756 ngx_uint_t c1, c2;
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
757
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
758 c2 = (ngx_uint_t) *s2++;
3115
204ea173234f style fix
Igor Sysoev <igor@sysoev.ru>
parents: 3046
diff changeset
759 c2 = (c2 >= 'A' && c2 <= 'Z') ? (c2 | 0x20) : c2;
1542
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
760
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
761 do {
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
762 do {
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
763 c1 = (ngx_uint_t) *s1++;
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
764
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
765 if (c1 == 0) {
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
766 return NULL;
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
767 }
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
768
3115
204ea173234f style fix
Igor Sysoev <igor@sysoev.ru>
parents: 3046
diff changeset
769 c1 = (c1 >= 'A' && c1 <= 'Z') ? (c1 | 0x20) : c1;
1542
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
770
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
771 } while (c1 != c2);
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
772
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
773 } while (ngx_strncasecmp(s1, (u_char *) s2, n) != 0);
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
774
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
775 return --s1;
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
776 }
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
777
f5bd1a7ed2cd ngx_strstrn() and ngx_strcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 1541
diff changeset
778
2668
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
779 /*
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
780 * ngx_strlcasestrn() is intended to search for static substring
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
781 * with known length in string until the argument last. The argument n
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
782 * must be length of the second substring - 1.
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
783 */
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
784
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
785 u_char *
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
786 ngx_strlcasestrn(u_char *s1, u_char *last, u_char *s2, size_t n)
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
787 {
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
788 ngx_uint_t c1, c2;
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
789
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
790 c2 = (ngx_uint_t) *s2++;
3115
204ea173234f style fix
Igor Sysoev <igor@sysoev.ru>
parents: 3046
diff changeset
791 c2 = (c2 >= 'A' && c2 <= 'Z') ? (c2 | 0x20) : c2;
2668
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
792 last -= n;
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
793
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
794 do {
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
795 do {
2680
82e3946062be backout r2677 and fix ngx_strlcasestrn() again
Igor Sysoev <igor@sysoev.ru>
parents: 2676
diff changeset
796 if (s1 >= last) {
2668
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
797 return NULL;
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
798 }
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
799
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
800 c1 = (ngx_uint_t) *s1++;
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
801
3115
204ea173234f style fix
Igor Sysoev <igor@sysoev.ru>
parents: 3046
diff changeset
802 c1 = (c1 >= 'A' && c1 <= 'Z') ? (c1 | 0x20) : c1;
2668
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
803
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
804 } while (c1 != c2);
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
805
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
806 } while (ngx_strncasecmp(s1, s2, n) != 0);
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
807
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
808 return --s1;
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
809 }
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
810
2f9c37445ffb ngx_strlcasestrn()
Igor Sysoev <igor@sysoev.ru>
parents: 2293
diff changeset
811
493
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
812 ngx_int_t
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
813 ngx_rstrncmp(u_char *s1, u_char *s2, size_t n)
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
814 {
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
815 if (n == 0) {
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
816 return 0;
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
817 }
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
818
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
819 n--;
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
820
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
821 for ( ;; ) {
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
822 if (s1[n] != s2[n]) {
290
87e73f067470 nginx-0.0.2-2004-03-16-10:10:12 import
Igor Sysoev <igor@sysoev.ru>
parents: 176
diff changeset
823 return s1[n] - s2[n];
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
824 }
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
825
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
826 if (n == 0) {
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
827 return 0;
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
828 }
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
829
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
830 n--;
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
831 }
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
832 }
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
833
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
834
493
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
835 ngx_int_t
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
836 ngx_rstrncasecmp(u_char *s1, u_char *s2, size_t n)
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
837 {
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
838 u_char c1, c2;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
839
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
840 if (n == 0) {
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
841 return 0;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
842 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
843
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
844 n--;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
845
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
846 for ( ;; ) {
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
847 c1 = s1[n];
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
848 if (c1 >= 'a' && c1 <= 'z') {
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
849 c1 -= 'a' - 'A';
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
850 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
851
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
852 c2 = s2[n];
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
853 if (c2 >= 'a' && c2 <= 'z') {
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
854 c2 -= 'a' - 'A';
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
855 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
856
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
857 if (c1 != c2) {
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
858 return c1 - c2;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
859 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
860
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
861 if (n == 0) {
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
862 return 0;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
863 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
864
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
865 n--;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
866 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
867 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
868
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
869
493
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
870 ngx_int_t
1029
ce08bc4cb97b ngx_strn2cmp() > ngx_memn2cmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1024
diff changeset
871 ngx_memn2cmp(u_char *s1, u_char *s2, size_t n1, size_t n2)
1024
eeadc558e86d ngx_strn2cmp()
Igor Sysoev <igor@sysoev.ru>
parents: 827
diff changeset
872 {
eeadc558e86d ngx_strn2cmp()
Igor Sysoev <igor@sysoev.ru>
parents: 827
diff changeset
873 size_t n;
eeadc558e86d ngx_strn2cmp()
Igor Sysoev <igor@sysoev.ru>
parents: 827
diff changeset
874 ngx_int_t m, z;
eeadc558e86d ngx_strn2cmp()
Igor Sysoev <igor@sysoev.ru>
parents: 827
diff changeset
875
eeadc558e86d ngx_strn2cmp()
Igor Sysoev <igor@sysoev.ru>
parents: 827
diff changeset
876 if (n1 <= n2) {
eeadc558e86d ngx_strn2cmp()
Igor Sysoev <igor@sysoev.ru>
parents: 827
diff changeset
877 n = n1;
eeadc558e86d ngx_strn2cmp()
Igor Sysoev <igor@sysoev.ru>
parents: 827
diff changeset
878 z = -1;
eeadc558e86d ngx_strn2cmp()
Igor Sysoev <igor@sysoev.ru>
parents: 827
diff changeset
879
eeadc558e86d ngx_strn2cmp()
Igor Sysoev <igor@sysoev.ru>
parents: 827
diff changeset
880 } else {
eeadc558e86d ngx_strn2cmp()
Igor Sysoev <igor@sysoev.ru>
parents: 827
diff changeset
881 n = n2;
eeadc558e86d ngx_strn2cmp()
Igor Sysoev <igor@sysoev.ru>
parents: 827
diff changeset
882 z = 1;
eeadc558e86d ngx_strn2cmp()
Igor Sysoev <igor@sysoev.ru>
parents: 827
diff changeset
883 }
eeadc558e86d ngx_strn2cmp()
Igor Sysoev <igor@sysoev.ru>
parents: 827
diff changeset
884
1029
ce08bc4cb97b ngx_strn2cmp() > ngx_memn2cmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1024
diff changeset
885 m = ngx_memcmp(s1, s2, n);
1024
eeadc558e86d ngx_strn2cmp()
Igor Sysoev <igor@sysoev.ru>
parents: 827
diff changeset
886
eeadc558e86d ngx_strn2cmp()
Igor Sysoev <igor@sysoev.ru>
parents: 827
diff changeset
887 if (m || n1 == n2) {
eeadc558e86d ngx_strn2cmp()
Igor Sysoev <igor@sysoev.ru>
parents: 827
diff changeset
888 return m;
eeadc558e86d ngx_strn2cmp()
Igor Sysoev <igor@sysoev.ru>
parents: 827
diff changeset
889 }
eeadc558e86d ngx_strn2cmp()
Igor Sysoev <igor@sysoev.ru>
parents: 827
diff changeset
890
eeadc558e86d ngx_strn2cmp()
Igor Sysoev <igor@sysoev.ru>
parents: 827
diff changeset
891 return z;
eeadc558e86d ngx_strn2cmp()
Igor Sysoev <igor@sysoev.ru>
parents: 827
diff changeset
892 }
eeadc558e86d ngx_strn2cmp()
Igor Sysoev <igor@sysoev.ru>
parents: 827
diff changeset
893
eeadc558e86d ngx_strn2cmp()
Igor Sysoev <igor@sysoev.ru>
parents: 827
diff changeset
894
eeadc558e86d ngx_strn2cmp()
Igor Sysoev <igor@sysoev.ru>
parents: 827
diff changeset
895 ngx_int_t
3116
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
896 ngx_dns_strcmp(u_char *s1, u_char *s2)
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
897 {
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
898 ngx_uint_t c1, c2;
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
899
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
900 for ( ;; ) {
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
901 c1 = (ngx_uint_t) *s1++;
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
902 c2 = (ngx_uint_t) *s2++;
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
903
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
904 c1 = (c1 >= 'A' && c1 <= 'Z') ? (c1 | 0x20) : c1;
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
905 c2 = (c2 >= 'A' && c2 <= 'Z') ? (c2 | 0x20) : c2;
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
906
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
907 if (c1 == c2) {
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
908
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
909 if (c1) {
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
910 continue;
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
911 }
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
912
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
913 return 0;
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
914 }
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
915
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
916 /* in ASCII '.' > '-', but we need '.' to be the lowest character */
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
917
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
918 c1 = (c1 == '.') ? ' ' : c1;
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
919 c2 = (c2 == '.') ? ' ' : c2;
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
920
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
921 return c1 - c2;
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
922 }
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
923 }
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
924
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
925
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
926 ngx_int_t
5389
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
927 ngx_filename_cmp(u_char *s1, u_char *s2, size_t n)
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
928 {
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
929 ngx_uint_t c1, c2;
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
930
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
931 while (n) {
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
932 c1 = (ngx_uint_t) *s1++;
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
933 c2 = (ngx_uint_t) *s2++;
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
934
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
935 #if (NGX_HAVE_CASELESS_FILESYSTEM)
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
936 c1 = tolower(c1);
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
937 c2 = tolower(c2);
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
938 #endif
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
939
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
940 if (c1 == c2) {
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
941
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
942 if (c1) {
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
943 n--;
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
944 continue;
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
945 }
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
946
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
947 return 0;
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
948 }
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
949
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
950 /* we need '/' to be the lowest character */
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
951
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
952 if (c1 == 0 || c2 == 0) {
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
953 return c1 - c2;
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
954 }
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
955
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
956 c1 = (c1 == '/') ? 0 : c1;
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
957 c2 = (c2 == '/') ? 0 : c2;
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
958
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
959 return c1 - c2;
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
960 }
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
961
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
962 return 0;
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
963 }
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
964
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
965
72e31d88defa Added ngx_filename_cmp() with "/" sorted to the left.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
966 ngx_int_t
493
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
967 ngx_atoi(u_char *line, size_t n)
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 0
diff changeset
968 {
6009
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
969 ngx_int_t value, cutoff, cutlim;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 0
diff changeset
970
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
971 if (n == 0) {
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
972 return NGX_ERROR;
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
973 }
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
974
6009
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
975 cutoff = NGX_MAX_INT_T_VALUE / 10;
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
976 cutlim = NGX_MAX_INT_T_VALUE % 10;
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
977
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 0
diff changeset
978 for (value = 0; n--; line++) {
83
a7e45c45a95c nginx-0.0.1-2003-04-28-19:06:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
979 if (*line < '0' || *line > '9') {
a7e45c45a95c nginx-0.0.1-2003-04-28-19:06:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
980 return NGX_ERROR;
a7e45c45a95c nginx-0.0.1-2003-04-28-19:06:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
981 }
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 0
diff changeset
982
6009
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
983 if (value >= cutoff && (value > cutoff || *line - '0' > cutlim)) {
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
984 return NGX_ERROR;
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
985 }
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
986
83
a7e45c45a95c nginx-0.0.1-2003-04-28-19:06:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
987 value = value * 10 + (*line - '0');
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 0
diff changeset
988 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 0
diff changeset
989
6009
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
990 return value;
338
0376cffa29e6 nginx-0.0.3-2004-05-20-21:33:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
991 }
0376cffa29e6 nginx-0.0.3-2004-05-20-21:33:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
992
0376cffa29e6 nginx-0.0.3-2004-05-20-21:33:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
993
3512
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
994 /* parse a fixed point number, e.g., ngx_atofp("10.5", 4, 2) returns 1050 */
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
995
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
996 ngx_int_t
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
997 ngx_atofp(u_char *line, size_t n, size_t point)
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
998 {
6009
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
999 ngx_int_t value, cutoff, cutlim;
3512
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1000 ngx_uint_t dot;
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1001
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1002 if (n == 0) {
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1003 return NGX_ERROR;
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1004 }
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1005
6009
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1006 cutoff = NGX_MAX_INT_T_VALUE / 10;
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1007 cutlim = NGX_MAX_INT_T_VALUE % 10;
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1008
3512
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1009 dot = 0;
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1010
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1011 for (value = 0; n--; line++) {
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1012
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1013 if (point == 0) {
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1014 return NGX_ERROR;
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1015 }
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1016
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1017 if (*line == '.') {
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1018 if (dot) {
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1019 return NGX_ERROR;
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1020 }
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1021
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1022 dot = 1;
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1023 continue;
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1024 }
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1025
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1026 if (*line < '0' || *line > '9') {
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1027 return NGX_ERROR;
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1028 }
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1029
6009
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1030 if (value >= cutoff && (value > cutoff || *line - '0' > cutlim)) {
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1031 return NGX_ERROR;
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1032 }
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1033
3512
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1034 value = value * 10 + (*line - '0');
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1035 point -= dot;
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1036 }
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1037
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1038 while (point--) {
6009
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1039 if (value > cutoff) {
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1040 return NGX_ERROR;
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1041 }
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1042
3512
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1043 value = value * 10;
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1044 }
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1045
6009
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1046 return value;
3512
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1047 }
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1048
098100f5f54b ngx_atofp()
Igor Sysoev <igor@sysoev.ru>
parents: 3507
diff changeset
1049
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1050 ssize_t
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1051 ngx_atosz(u_char *line, size_t n)
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1052 {
6009
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1053 ssize_t value, cutoff, cutlim;
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1054
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1055 if (n == 0) {
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1056 return NGX_ERROR;
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1057 }
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1058
6009
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1059 cutoff = NGX_MAX_SIZE_T_VALUE / 10;
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1060 cutlim = NGX_MAX_SIZE_T_VALUE % 10;
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1061
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1062 for (value = 0; n--; line++) {
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1063 if (*line < '0' || *line > '9') {
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1064 return NGX_ERROR;
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1065 }
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1066
6009
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1067 if (value >= cutoff && (value > cutoff || *line - '0' > cutlim)) {
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1068 return NGX_ERROR;
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1069 }
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1070
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1071 value = value * 10 + (*line - '0');
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1072 }
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1073
6009
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1074 return value;
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1075 }
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1076
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1077
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1078 off_t
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1079 ngx_atoof(u_char *line, size_t n)
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1080 {
6009
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1081 off_t value, cutoff, cutlim;
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1082
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1083 if (n == 0) {
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1084 return NGX_ERROR;
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1085 }
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1086
6009
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1087 cutoff = NGX_MAX_OFF_T_VALUE / 10;
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1088 cutlim = NGX_MAX_OFF_T_VALUE % 10;
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1089
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1090 for (value = 0; n--; line++) {
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1091 if (*line < '0' || *line > '9') {
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1092 return NGX_ERROR;
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1093 }
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1094
6009
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1095 if (value >= cutoff && (value > cutoff || *line - '0' > cutlim)) {
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1096 return NGX_ERROR;
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1097 }
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1098
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1099 value = value * 10 + (*line - '0');
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1100 }
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1101
6009
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1102 return value;
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1103 }
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1104
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1105
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1106 time_t
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1107 ngx_atotm(u_char *line, size_t n)
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1108 {
6009
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1109 time_t value, cutoff, cutlim;
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1110
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1111 if (n == 0) {
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1112 return NGX_ERROR;
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1113 }
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1114
6009
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1115 cutoff = NGX_MAX_TIME_T_VALUE / 10;
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1116 cutlim = NGX_MAX_TIME_T_VALUE % 10;
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1117
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1118 for (value = 0; n--; line++) {
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1119 if (*line < '0' || *line > '9') {
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1120 return NGX_ERROR;
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1121 }
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1122
6009
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1123 if (value >= cutoff && (value > cutoff || *line - '0' > cutlim)) {
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1124 return NGX_ERROR;
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1125 }
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1126
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1127 value = value * 10 + (*line - '0');
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1128 }
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1129
6009
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1130 return value;
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1131 }
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1132
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 495
diff changeset
1133
493
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1134 ngx_int_t
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1135 ngx_hextoi(u_char *line, size_t n)
338
0376cffa29e6 nginx-0.0.3-2004-05-20-21:33:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
1136 {
783
47e2296f9897 decrease number of branches
Igor Sysoev <igor@sysoev.ru>
parents: 657
diff changeset
1137 u_char c, ch;
6009
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1138 ngx_int_t value, cutoff;
338
0376cffa29e6 nginx-0.0.3-2004-05-20-21:33:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
1139
0376cffa29e6 nginx-0.0.3-2004-05-20-21:33:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
1140 if (n == 0) {
0376cffa29e6 nginx-0.0.3-2004-05-20-21:33:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
1141 return NGX_ERROR;
0376cffa29e6 nginx-0.0.3-2004-05-20-21:33:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
1142 }
0376cffa29e6 nginx-0.0.3-2004-05-20-21:33:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
1143
6009
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1144 cutoff = NGX_MAX_INT_T_VALUE / 16;
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1145
338
0376cffa29e6 nginx-0.0.3-2004-05-20-21:33:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
1146 for (value = 0; n--; line++) {
6009
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1147 if (value > cutoff) {
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1148 return NGX_ERROR;
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1149 }
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1150
338
0376cffa29e6 nginx-0.0.3-2004-05-20-21:33:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
1151 ch = *line;
0376cffa29e6 nginx-0.0.3-2004-05-20-21:33:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
1152
0376cffa29e6 nginx-0.0.3-2004-05-20-21:33:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
1153 if (ch >= '0' && ch <= '9') {
0376cffa29e6 nginx-0.0.3-2004-05-20-21:33:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
1154 value = value * 16 + (ch - '0');
0376cffa29e6 nginx-0.0.3-2004-05-20-21:33:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
1155 continue;
0376cffa29e6 nginx-0.0.3-2004-05-20-21:33:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
1156 }
0376cffa29e6 nginx-0.0.3-2004-05-20-21:33:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
1157
783
47e2296f9897 decrease number of branches
Igor Sysoev <igor@sysoev.ru>
parents: 657
diff changeset
1158 c = (u_char) (ch | 0x20);
338
0376cffa29e6 nginx-0.0.3-2004-05-20-21:33:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
1159
783
47e2296f9897 decrease number of branches
Igor Sysoev <igor@sysoev.ru>
parents: 657
diff changeset
1160 if (c >= 'a' && c <= 'f') {
47e2296f9897 decrease number of branches
Igor Sysoev <igor@sysoev.ru>
parents: 657
diff changeset
1161 value = value * 16 + (c - 'a' + 10);
338
0376cffa29e6 nginx-0.0.3-2004-05-20-21:33:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
1162 continue;
0376cffa29e6 nginx-0.0.3-2004-05-20-21:33:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
1163 }
0376cffa29e6 nginx-0.0.3-2004-05-20-21:33:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
1164
0376cffa29e6 nginx-0.0.3-2004-05-20-21:33:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
1165 return NGX_ERROR;
0376cffa29e6 nginx-0.0.3-2004-05-20-21:33:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
1166 }
0376cffa29e6 nginx-0.0.3-2004-05-20-21:33:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
1167
6009
15a15f6ae3a2 Core: overflow detection in number parsing functions.
Ruslan Ermilov <ru@nginx.com>
parents: 5965
diff changeset
1168 return value;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 0
diff changeset
1169 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 0
diff changeset
1170
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 0
diff changeset
1171
1745
ec63069aeb78 replace ngx_md5_text() with ngx_hex_dump()
Igor Sysoev <igor@sysoev.ru>
parents: 1629
diff changeset
1172 u_char *
ec63069aeb78 replace ngx_md5_text() with ngx_hex_dump()
Igor Sysoev <igor@sysoev.ru>
parents: 1629
diff changeset
1173 ngx_hex_dump(u_char *dst, u_char *src, size_t len)
174
ea464a6c0581 nginx-0.0.1-2003-11-05-01:12:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 100
diff changeset
1174 {
290
87e73f067470 nginx-0.0.2-2004-03-16-10:10:12 import
Igor Sysoev <igor@sysoev.ru>
parents: 176
diff changeset
1175 static u_char hex[] = "0123456789abcdef";
175
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
1176
1745
ec63069aeb78 replace ngx_md5_text() with ngx_hex_dump()
Igor Sysoev <igor@sysoev.ru>
parents: 1629
diff changeset
1177 while (len--) {
ec63069aeb78 replace ngx_md5_text() with ngx_hex_dump()
Igor Sysoev <igor@sysoev.ru>
parents: 1629
diff changeset
1178 *dst++ = hex[*src >> 4];
ec63069aeb78 replace ngx_md5_text() with ngx_hex_dump()
Igor Sysoev <igor@sysoev.ru>
parents: 1629
diff changeset
1179 *dst++ = hex[*src++ & 0xf];
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
1180 }
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
1181
1745
ec63069aeb78 replace ngx_md5_text() with ngx_hex_dump()
Igor Sysoev <igor@sysoev.ru>
parents: 1629
diff changeset
1182 return dst;
174
ea464a6c0581 nginx-0.0.1-2003-11-05-01:12:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 100
diff changeset
1183 }
ea464a6c0581 nginx-0.0.1-2003-11-05-01:12:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 100
diff changeset
1184
ea464a6c0581 nginx-0.0.1-2003-11-05-01:12:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 100
diff changeset
1185
493
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1186 void
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1187 ngx_encode_base64(ngx_str_t *dst, ngx_str_t *src)
404
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1188 {
5551
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1189 static u_char basis64[] =
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1190 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1191
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1192 ngx_encode_base64_internal(dst, src, basis64, 1);
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1193 }
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1194
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1195
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1196 void
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1197 ngx_encode_base64url(ngx_str_t *dst, ngx_str_t *src)
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1198 {
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1199 static u_char basis64[] =
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1200 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1201
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1202 ngx_encode_base64_internal(dst, src, basis64, 0);
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1203 }
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1204
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1205
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1206 static void
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1207 ngx_encode_base64_internal(ngx_str_t *dst, ngx_str_t *src, const u_char *basis,
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1208 ngx_uint_t padding)
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1209 {
404
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1210 u_char *d, *s;
408
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1211 size_t len;
404
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1212
409
8ac40cae79f0 nginx-0.0.10-2004-08-29-07:55:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 408
diff changeset
1213 len = src->len;
404
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1214 s = src->data;
409
8ac40cae79f0 nginx-0.0.10-2004-08-29-07:55:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 408
diff changeset
1215 d = dst->data;
404
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1216
408
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1217 while (len > 2) {
5551
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1218 *d++ = basis[(s[0] >> 2) & 0x3f];
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1219 *d++ = basis[((s[0] & 3) << 4) | (s[1] >> 4)];
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1220 *d++ = basis[((s[1] & 0x0f) << 2) | (s[2] >> 6)];
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1221 *d++ = basis[s[2] & 0x3f];
408
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1222
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1223 s += 3;
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1224 len -= 3;
404
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1225 }
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1226
408
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1227 if (len) {
5551
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1228 *d++ = basis[(s[0] >> 2) & 0x3f];
404
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1229
408
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1230 if (len == 1) {
5551
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1231 *d++ = basis[(s[0] & 3) << 4];
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1232 if (padding) {
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1233 *d++ = '=';
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1234 }
404
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1235
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1236 } else {
5551
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1237 *d++ = basis[((s[0] & 3) << 4) | (s[1] >> 4)];
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1238 *d++ = basis[(s[1] & 0x0f) << 2];
404
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1239 }
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1240
5551
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1241 if (padding) {
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1242 *d++ = '=';
a602e1006579 Core: added ngx_encode_base64url().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5389
diff changeset
1243 }
404
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1244 }
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1245
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1246 dst->len = d - dst->data;
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1247 }
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1248
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1249
493
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1250 ngx_int_t
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1251 ngx_decode_base64(ngx_str_t *dst, ngx_str_t *src)
404
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1252 {
827
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1253 static u_char basis64[] = {
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1254 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1255 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1256 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 62, 77, 77, 77, 63,
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1257 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 77, 77, 77, 77, 77, 77,
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1258 77, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1259 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 77, 77, 77, 77, 77,
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1260 77, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1261 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 77, 77, 77, 77, 77,
404
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1262
827
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1263 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1264 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1265 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1266 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1267 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1268 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1269 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1270 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1271 };
408
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1272
3756
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1273 return ngx_decode_base64_internal(dst, src, basis64);
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1274 }
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1275
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1276
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1277 ngx_int_t
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1278 ngx_decode_base64url(ngx_str_t *dst, ngx_str_t *src)
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1279 {
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1280 static u_char basis64[] = {
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1281 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1282 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1283 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 62, 77, 77,
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1284 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 77, 77, 77, 77, 77, 77,
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1285 77, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1286 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 77, 77, 77, 77, 63,
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1287 77, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1288 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 77, 77, 77, 77, 77,
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1289
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1290 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1291 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1292 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1293 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1294 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1295 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1296 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1297 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1298 };
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1299
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1300 return ngx_decode_base64_internal(dst, src, basis64);
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1301 }
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1302
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1303
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1304 static ngx_int_t
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1305 ngx_decode_base64_internal(ngx_str_t *dst, ngx_str_t *src, const u_char *basis)
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1306 {
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1307 size_t len;
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1308 u_char *d, *s;
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1309
408
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1310 for (len = 0; len < src->len; len++) {
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1311 if (src->data[len] == '=') {
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1312 break;
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1313 }
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1314
3756
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1315 if (basis[src->data[len]] == 77) {
408
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1316 return NGX_ERROR;
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1317 }
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1318 }
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1319
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1320 if (len % 4 == 1) {
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1321 return NGX_ERROR;
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1322 }
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1323
404
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1324 s = src->data;
409
8ac40cae79f0 nginx-0.0.10-2004-08-29-07:55:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 408
diff changeset
1325 d = dst->data;
404
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1326
408
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1327 while (len > 3) {
3756
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1328 *d++ = (u_char) (basis[s[0]] << 2 | basis[s[1]] >> 4);
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1329 *d++ = (u_char) (basis[s[1]] << 4 | basis[s[2]] >> 2);
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1330 *d++ = (u_char) (basis[s[2]] << 6 | basis[s[3]]);
404
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1331
408
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1332 s += 4;
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1333 len -= 4;
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1334 }
404
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1335
408
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1336 if (len > 1) {
3756
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1337 *d++ = (u_char) (basis[s[0]] << 2 | basis[s[1]] >> 4);
408
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1338 }
404
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1339
408
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1340 if (len > 2) {
3756
7224d008faaf new ngx_http_secure_link_module with secure_link, secure_link_md5, and
Igor Sysoev <igor@sysoev.ru>
parents: 3725
diff changeset
1341 *d++ = (u_char) (basis[s[1]] << 4 | basis[s[2]] >> 2);
408
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1342 }
404
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1343
408
d6e2b445c1b8 nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
1344 dst->len = d - dst->data;
404
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1345
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1346 return NGX_OK;
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1347 }
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1348
37b5381fb6d8 nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 339
diff changeset
1349
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1350 /*
2125
8e4b9d2acde8 rename ngx_utf_...() to ngx_utf8_...()
Igor Sysoev <igor@sysoev.ru>
parents: 2120
diff changeset
1351 * ngx_utf8_decode() decodes two and more bytes UTF sequences only
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1352 * the return values:
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1353 * 0x80 - 0x10ffff valid character
2120
2f2052fdd882 fix utf-8 names in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
1354 * 0x110000 - 0xfffffffd invalid sequence
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1355 * 0xfffffffe incomplete sequence
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1356 * 0xffffffff error
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1357 */
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1358
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1359 uint32_t
2125
8e4b9d2acde8 rename ngx_utf_...() to ngx_utf8_...()
Igor Sysoev <igor@sysoev.ru>
parents: 2120
diff changeset
1360 ngx_utf8_decode(u_char **p, size_t n)
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1361 {
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1362 size_t len;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1363 uint32_t u, i, valid;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1364
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1365 u = **p;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1366
4209
9679fc14c063 Fixed utf8 decode (ticket #25).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
1367 if (u >= 0xf0) {
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1368
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1369 u &= 0x07;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1370 valid = 0xffff;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1371 len = 3;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1372
4209
9679fc14c063 Fixed utf8 decode (ticket #25).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
1373 } else if (u >= 0xe0) {
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1374
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1375 u &= 0x0f;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1376 valid = 0x7ff;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1377 len = 2;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1378
4209
9679fc14c063 Fixed utf8 decode (ticket #25).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4192
diff changeset
1379 } else if (u >= 0xc2) {
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1380
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1381 u &= 0x1f;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1382 valid = 0x7f;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1383 len = 1;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1384
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1385 } else {
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1386 (*p)++;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1387 return 0xffffffff;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1388 }
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1389
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1390 if (n - 1 < len) {
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1391 return 0xfffffffe;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1392 }
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1393
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1394 (*p)++;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1395
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1396 while (len) {
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1397 i = *(*p)++;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1398
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1399 if (i < 0x80) {
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1400 return 0xffffffff;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1401 }
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1402
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1403 u = (u << 6) | (i & 0x3f);
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1404
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1405 len--;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1406 }
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1407
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1408 if (u > valid) {
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1409 return u;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1410 }
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1411
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1412 return 0xffffffff;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1413 }
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1414
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 613
diff changeset
1415
523
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1416 size_t
2125
8e4b9d2acde8 rename ngx_utf_...() to ngx_utf8_...()
Igor Sysoev <igor@sysoev.ru>
parents: 2120
diff changeset
1417 ngx_utf8_length(u_char *p, size_t n)
523
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1418 {
2120
2f2052fdd882 fix utf-8 names in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
1419 u_char c, *last;
2f2052fdd882 fix utf-8 names in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
1420 size_t len;
523
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1421
2120
2f2052fdd882 fix utf-8 names in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
1422 last = p + n;
523
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1423
2120
2f2052fdd882 fix utf-8 names in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
1424 for (len = 0; p < last; len++) {
2f2052fdd882 fix utf-8 names in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
1425
2f2052fdd882 fix utf-8 names in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
1426 c = *p;
523
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1427
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1428 if (c < 0x80) {
2120
2f2052fdd882 fix utf-8 names in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
1429 p++;
523
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1430 continue;
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1431 }
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1432
7494
a42a6dfeb01a Fixed incorrect length handling in ngx_utf8_length().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7395
diff changeset
1433 if (ngx_utf8_decode(&p, last - p) > 0x10ffff) {
2125
8e4b9d2acde8 rename ngx_utf_...() to ngx_utf8_...()
Igor Sysoev <igor@sysoev.ru>
parents: 2120
diff changeset
1434 /* invalid UTF-8 */
2120
2f2052fdd882 fix utf-8 names in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
1435 return n;
523
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1436 }
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1437 }
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1438
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1439 return len;
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1440 }
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1441
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1442
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1443 u_char *
2125
8e4b9d2acde8 rename ngx_utf_...() to ngx_utf8_...()
Igor Sysoev <igor@sysoev.ru>
parents: 2120
diff changeset
1444 ngx_utf8_cpystrn(u_char *dst, u_char *src, size_t n, size_t len)
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1445 {
2120
2f2052fdd882 fix utf-8 names in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
1446 u_char c, *next;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1447
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1448 if (n == 0) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1449 return dst;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1450 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1451
2120
2f2052fdd882 fix utf-8 names in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
1452 while (--n) {
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1453
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1454 c = *src;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1455 *dst = c;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1456
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1457 if (c < 0x80) {
2120
2f2052fdd882 fix utf-8 names in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
1458
2f2052fdd882 fix utf-8 names in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
1459 if (c != '\0') {
2f2052fdd882 fix utf-8 names in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
1460 dst++;
2f2052fdd882 fix utf-8 names in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
1461 src++;
2f2052fdd882 fix utf-8 names in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
1462 len--;
2f2052fdd882 fix utf-8 names in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
1463
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1464 continue;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1465 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1466
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1467 return dst;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1468 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1469
2120
2f2052fdd882 fix utf-8 names in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
1470 next = src;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1471
2125
8e4b9d2acde8 rename ngx_utf_...() to ngx_utf8_...()
Igor Sysoev <igor@sysoev.ru>
parents: 2120
diff changeset
1472 if (ngx_utf8_decode(&next, len) > 0x10ffff) {
8e4b9d2acde8 rename ngx_utf_...() to ngx_utf8_...()
Igor Sysoev <igor@sysoev.ru>
parents: 2120
diff changeset
1473 /* invalid UTF-8 */
2120
2f2052fdd882 fix utf-8 names in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
1474 break;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1475 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1476
2120
2f2052fdd882 fix utf-8 names in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
1477 while (src < next) {
3410
bfcc9be4f1c9 fix ngx_utf8_cpystrn(): it did not fully copy utf-8 string
Igor Sysoev <igor@sysoev.ru>
parents: 3275
diff changeset
1478 *dst++ = *src++;
2120
2f2052fdd882 fix utf-8 names in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
1479 len--;
2f2052fdd882 fix utf-8 names in autoindex
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
1480 }
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1481 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1482
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1483 *dst = '\0';
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1484
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1485 return dst;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1486 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1487
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1488
493
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1489 uintptr_t
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1490 ngx_escape_uri(u_char *dst, u_char *src, size_t size, ngx_uint_t type)
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 0
diff changeset
1491 {
3275
b344b68da8c5 optimize some cycles:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1492 ngx_uint_t n;
827
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1493 uint32_t *escape;
5772
d421be0d842a Core: use uppercase hexadecimal digits for percent-encoding.
Piotr Sikora <piotr@cloudflare.com>
parents: 5551
diff changeset
1494 static u_char hex[] = "0123456789ABCDEF";
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
1495
827
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1496 /* " ", "#", "%", "?", %00-%1F, %7F-%FF */
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
1497
827
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1498 static uint32_t uri[] = {
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1499 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 0
diff changeset
1500
827
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1501 /* ?>=< ;:98 7654 3210 /.-, +*)( '&%$ #"! */
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1502 0x80000029, /* 1000 0000 0000 0000 0000 0000 0010 1001 */
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1503
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1504 /* _^]\ [ZYX WVUT SRQP ONML KJIH GFED CBA@ */
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1505 0x00000000, /* 0000 0000 0000 0000 0000 0000 0000 0000 */
452
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1506
827
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1507 /* ~}| {zyx wvut srqp onml kjih gfed cba` */
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1508 0x80000000, /* 1000 0000 0000 0000 0000 0000 0000 0000 */
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 0
diff changeset
1509
827
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1510 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1511 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1512 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1513 0xffffffff /* 1111 1111 1111 1111 1111 1111 1111 1111 */
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1514 };
452
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1515
3486
5d28d30ba1b1 escape ampersand in argument while rewrite
Igor Sysoev <igor@sysoev.ru>
parents: 3410
diff changeset
1516 /* " ", "#", "%", "&", "+", "?", %00-%1F, %7F-%FF */
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
1517
827
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1518 static uint32_t args[] = {
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1519 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1520
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1521 /* ?>=< ;:98 7654 3210 /.-, +*)( '&%$ #"! */
3725
4954530db2af escape ";" in arguments
Igor Sysoev <igor@sysoev.ru>
parents: 3641
diff changeset
1522 0x88000869, /* 1000 1000 0000 0000 0000 1000 0110 1001 */
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
1523
827
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1524 /* _^]\ [ZYX WVUT SRQP ONML KJIH GFED CBA@ */
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1525 0x00000000, /* 0000 0000 0000 0000 0000 0000 0000 0000 */
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
1526
827
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1527 /* ~}| {zyx wvut srqp onml kjih gfed cba` */
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1528 0x80000000, /* 1000 0000 0000 0000 0000 0000 0000 0000 */
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
1529
827
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1530 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1531 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1532 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1533 0xffffffff /* 1111 1111 1111 1111 1111 1111 1111 1111 */
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1534 };
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
1535
4192
61e4af19df9f Autoindex: escape '?' in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4133
diff changeset
1536 /* not ALPHA, DIGIT, "-", ".", "_", "~" */
61e4af19df9f Autoindex: escape '?' in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4133
diff changeset
1537
61e4af19df9f Autoindex: escape '?' in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4133
diff changeset
1538 static uint32_t uri_component[] = {
61e4af19df9f Autoindex: escape '?' in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4133
diff changeset
1539 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
61e4af19df9f Autoindex: escape '?' in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4133
diff changeset
1540
61e4af19df9f Autoindex: escape '?' in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4133
diff changeset
1541 /* ?>=< ;:98 7654 3210 /.-, +*)( '&%$ #"! */
61e4af19df9f Autoindex: escape '?' in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4133
diff changeset
1542 0xfc009fff, /* 1111 1100 0000 0000 1001 1111 1111 1111 */
61e4af19df9f Autoindex: escape '?' in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4133
diff changeset
1543
61e4af19df9f Autoindex: escape '?' in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4133
diff changeset
1544 /* _^]\ [ZYX WVUT SRQP ONML KJIH GFED CBA@ */
61e4af19df9f Autoindex: escape '?' in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4133
diff changeset
1545 0x78000001, /* 0111 1000 0000 0000 0000 0000 0000 0001 */
61e4af19df9f Autoindex: escape '?' in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4133
diff changeset
1546
61e4af19df9f Autoindex: escape '?' in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4133
diff changeset
1547 /* ~}| {zyx wvut srqp onml kjih gfed cba` */
61e4af19df9f Autoindex: escape '?' in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4133
diff changeset
1548 0xb8000001, /* 1011 1000 0000 0000 0000 0000 0000 0001 */
61e4af19df9f Autoindex: escape '?' in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4133
diff changeset
1549
61e4af19df9f Autoindex: escape '?' in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4133
diff changeset
1550 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
61e4af19df9f Autoindex: escape '?' in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4133
diff changeset
1551 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
61e4af19df9f Autoindex: escape '?' in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4133
diff changeset
1552 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
61e4af19df9f Autoindex: escape '?' in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4133
diff changeset
1553 0xffffffff /* 1111 1111 1111 1111 1111 1111 1111 1111 */
61e4af19df9f Autoindex: escape '?' in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4133
diff changeset
1554 };
61e4af19df9f Autoindex: escape '?' in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4133
diff changeset
1555
1405
fdd064faf26a escape " ", "%", and %00-%1F in login and password
Igor Sysoev <igor@sysoev.ru>
parents: 1333
diff changeset
1556 /* " ", "#", """, "%", "'", %00-%1F, %7F-%FF */
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
1557
827
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1558 static uint32_t html[] = {
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1559 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
1560
827
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1561 /* ?>=< ;:98 7654 3210 /.-, +*)( '&%$ #"! */
1297
4ec0bc95172b "?" should not be escaped
Igor Sysoev <igor@sysoev.ru>
parents: 1208
diff changeset
1562 0x000000ad, /* 0000 0000 0000 0000 0000 0000 1010 1101 */
827
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1563
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1564 /* _^]\ [ZYX WVUT SRQP ONML KJIH GFED CBA@ */
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1565 0x00000000, /* 0000 0000 0000 0000 0000 0000 0000 0000 */
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
1566
827
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1567 /* ~}| {zyx wvut srqp onml kjih gfed cba` */
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1568 0x80000000, /* 1000 0000 0000 0000 0000 0000 0000 0000 */
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
1569
827
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1570 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1571 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1572 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1573 0xffffffff /* 1111 1111 1111 1111 1111 1111 1111 1111 */
0444286b860a style fix
Igor Sysoev <igor@sysoev.ru>
parents: 826
diff changeset
1574 };
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
1575
1405
fdd064faf26a escape " ", "%", and %00-%1F in login and password
Igor Sysoev <igor@sysoev.ru>
parents: 1333
diff changeset
1576 /* " ", """, "%", "'", %00-%1F, %7F-%FF */
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
1577
1298
458e041fc902 msie_refresh should escape at least '"' to prevent XSS
Igor Sysoev <igor@sysoev.ru>
parents: 1297
diff changeset
1578 static uint32_t refresh[] = {
458e041fc902 msie_refresh should escape at least '"' to prevent XSS
Igor Sysoev <igor@sysoev.ru>
parents: 1297
diff changeset
1579 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
458e041fc902 msie_refresh should escape at least '"' to prevent XSS
Igor Sysoev <igor@sysoev.ru>
parents: 1297
diff changeset
1580
458e041fc902 msie_refresh should escape at least '"' to prevent XSS
Igor Sysoev <igor@sysoev.ru>
parents: 1297
diff changeset
1581 /* ?>=< ;:98 7654 3210 /.-, +*)( '&%$ #"! */
1629
12a656452ad1 do not encode already encoded characters in msie_refresh
Igor Sysoev <igor@sysoev.ru>
parents: 1593
diff changeset
1582 0x00000085, /* 0000 0000 0000 0000 0000 0000 1000 0101 */
1298
458e041fc902 msie_refresh should escape at least '"' to prevent XSS
Igor Sysoev <igor@sysoev.ru>
parents: 1297
diff changeset
1583
458e041fc902 msie_refresh should escape at least '"' to prevent XSS
Igor Sysoev <igor@sysoev.ru>
parents: 1297
diff changeset
1584 /* _^]\ [ZYX WVUT SRQP ONML KJIH GFED CBA@ */
458e041fc902 msie_refresh should escape at least '"' to prevent XSS
Igor Sysoev <igor@sysoev.ru>
parents: 1297
diff changeset
1585 0x00000000, /* 0000 0000 0000 0000 0000 0000 0000 0000 */
458e041fc902 msie_refresh should escape at least '"' to prevent XSS
Igor Sysoev <igor@sysoev.ru>
parents: 1297
diff changeset
1586
458e041fc902 msie_refresh should escape at least '"' to prevent XSS
Igor Sysoev <igor@sysoev.ru>
parents: 1297
diff changeset
1587 /* ~}| {zyx wvut srqp onml kjih gfed cba` */
458e041fc902 msie_refresh should escape at least '"' to prevent XSS
Igor Sysoev <igor@sysoev.ru>
parents: 1297
diff changeset
1588 0x80000000, /* 1000 0000 0000 0000 0000 0000 0000 0000 */
458e041fc902 msie_refresh should escape at least '"' to prevent XSS
Igor Sysoev <igor@sysoev.ru>
parents: 1297
diff changeset
1589
458e041fc902 msie_refresh should escape at least '"' to prevent XSS
Igor Sysoev <igor@sysoev.ru>
parents: 1297
diff changeset
1590 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
458e041fc902 msie_refresh should escape at least '"' to prevent XSS
Igor Sysoev <igor@sysoev.ru>
parents: 1297
diff changeset
1591 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
458e041fc902 msie_refresh should escape at least '"' to prevent XSS
Igor Sysoev <igor@sysoev.ru>
parents: 1297
diff changeset
1592 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
458e041fc902 msie_refresh should escape at least '"' to prevent XSS
Igor Sysoev <igor@sysoev.ru>
parents: 1297
diff changeset
1593 0xffffffff /* 1111 1111 1111 1111 1111 1111 1111 1111 */
458e041fc902 msie_refresh should escape at least '"' to prevent XSS
Igor Sysoev <igor@sysoev.ru>
parents: 1297
diff changeset
1594 };
458e041fc902 msie_refresh should escape at least '"' to prevent XSS
Igor Sysoev <igor@sysoev.ru>
parents: 1297
diff changeset
1595
1405
fdd064faf26a escape " ", "%", and %00-%1F in login and password
Igor Sysoev <igor@sysoev.ru>
parents: 1333
diff changeset
1596 /* " ", "%", %00-%1F */
1333
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1310
diff changeset
1597
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1310
diff changeset
1598 static uint32_t memcached[] = {
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1310
diff changeset
1599 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1310
diff changeset
1600
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1310
diff changeset
1601 /* ?>=< ;:98 7654 3210 /.-, +*)( '&%$ #"! */
1405
fdd064faf26a escape " ", "%", and %00-%1F in login and password
Igor Sysoev <igor@sysoev.ru>
parents: 1333
diff changeset
1602 0x00000021, /* 0000 0000 0000 0000 0000 0000 0010 0001 */
1333
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1310
diff changeset
1603
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1310
diff changeset
1604 /* _^]\ [ZYX WVUT SRQP ONML KJIH GFED CBA@ */
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1310
diff changeset
1605 0x00000000, /* 0000 0000 0000 0000 0000 0000 0000 0000 */
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1310
diff changeset
1606
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1310
diff changeset
1607 /* ~}| {zyx wvut srqp onml kjih gfed cba` */
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1310
diff changeset
1608 0x00000000, /* 0000 0000 0000 0000 0000 0000 0000 0000 */
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1310
diff changeset
1609
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1310
diff changeset
1610 0x00000000, /* 0000 0000 0000 0000 0000 0000 0000 0000 */
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1310
diff changeset
1611 0x00000000, /* 0000 0000 0000 0000 0000 0000 0000 0000 */
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1310
diff changeset
1612 0x00000000, /* 0000 0000 0000 0000 0000 0000 0000 0000 */
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1310
diff changeset
1613 0x00000000, /* 0000 0000 0000 0000 0000 0000 0000 0000 */
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1310
diff changeset
1614 };
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1310
diff changeset
1615
1405
fdd064faf26a escape " ", "%", and %00-%1F in login and password
Igor Sysoev <igor@sysoev.ru>
parents: 1333
diff changeset
1616 /* mail_auth is the same as memcached */
fdd064faf26a escape " ", "%", and %00-%1F in login and password
Igor Sysoev <igor@sysoev.ru>
parents: 1333
diff changeset
1617
fdd064faf26a escape " ", "%", and %00-%1F in login and password
Igor Sysoev <igor@sysoev.ru>
parents: 1333
diff changeset
1618 static uint32_t *map[] =
4192
61e4af19df9f Autoindex: escape '?' in file names.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4133
diff changeset
1619 { uri, args, uri_component, html, refresh, memcached, memcached };
1298
458e041fc902 msie_refresh should escape at least '"' to prevent XSS
Igor Sysoev <igor@sysoev.ru>
parents: 1297
diff changeset
1620
458e041fc902 msie_refresh should escape at least '"' to prevent XSS
Igor Sysoev <igor@sysoev.ru>
parents: 1297
diff changeset
1621
458e041fc902 msie_refresh should escape at least '"' to prevent XSS
Igor Sysoev <igor@sysoev.ru>
parents: 1297
diff changeset
1622 escape = map[type];
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
1623
452
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1624 if (dst == NULL) {
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1625
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1626 /* find the number of the characters to be escaped */
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 0
diff changeset
1627
3115
204ea173234f style fix
Igor Sysoev <igor@sysoev.ru>
parents: 3046
diff changeset
1628 n = 0;
452
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1629
3275
b344b68da8c5 optimize some cycles:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1630 while (size) {
6626
b3682580c1bd Avoid left-shifting integers into the sign bit, which is undefined.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6314
diff changeset
1631 if (escape[*src >> 5] & (1U << (*src & 0x1f))) {
452
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1632 n++;
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1633 }
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1634 src++;
3275
b344b68da8c5 optimize some cycles:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1635 size--;
452
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1636 }
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1637
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
1638 return (uintptr_t) n;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 0
diff changeset
1639 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 0
diff changeset
1640
3275
b344b68da8c5 optimize some cycles:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1641 while (size) {
6626
b3682580c1bd Avoid left-shifting integers into the sign bit, which is undefined.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6314
diff changeset
1642 if (escape[*src >> 5] & (1U << (*src & 0x1f))) {
452
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1643 *dst++ = '%';
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1644 *dst++ = hex[*src >> 4];
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1645 *dst++ = hex[*src & 0xf];
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1646 src++;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 0
diff changeset
1647
452
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1648 } else {
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1649 *dst++ = *src++;
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1650 }
3275
b344b68da8c5 optimize some cycles:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1651 size--;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 0
diff changeset
1652 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 0
diff changeset
1653
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
1654 return (uintptr_t) dst;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 0
diff changeset
1655 }
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1656
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1657
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1658 void
601
77f77f53214a nginx-0.3.22-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1659 ngx_unescape_uri(u_char **dst, u_char **src, size_t size, ngx_uint_t type)
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1660 {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1661 u_char *d, *s, ch, c, decoded;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1662 enum {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1663 sw_usual = 0,
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1664 sw_quoted,
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1665 sw_quoted_second
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1666 } state;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1667
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1668 d = *dst;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1669 s = *src;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1670
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1671 state = 0;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1672 decoded = 0;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1673
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1674 while (size--) {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1675
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1676 ch = *s++;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1677
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1678 switch (state) {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1679 case sw_usual:
1593
bef67c6abbe7 unescape SSI include
Igor Sysoev <igor@sysoev.ru>
parents: 1560
diff changeset
1680 if (ch == '?'
bef67c6abbe7 unescape SSI include
Igor Sysoev <igor@sysoev.ru>
parents: 1560
diff changeset
1681 && (type & (NGX_UNESCAPE_URI|NGX_UNESCAPE_REDIRECT)))
bef67c6abbe7 unescape SSI include
Igor Sysoev <igor@sysoev.ru>
parents: 1560
diff changeset
1682 {
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1683 *d++ = ch;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1684 goto done;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1685 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1686
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1687 if (ch == '%') {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1688 state = sw_quoted;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1689 break;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1690 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1691
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1692 *d++ = ch;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1693 break;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1694
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1695 case sw_quoted:
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1696
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1697 if (ch >= '0' && ch <= '9') {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1698 decoded = (u_char) (ch - '0');
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1699 state = sw_quoted_second;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1700 break;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1701 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1702
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1703 c = (u_char) (ch | 0x20);
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1704 if (c >= 'a' && c <= 'f') {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1705 decoded = (u_char) (c - 'a' + 10);
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1706 state = sw_quoted_second;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1707 break;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1708 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1709
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1710 /* the invalid quoted character */
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1711
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1712 state = sw_usual;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1713
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1714 *d++ = ch;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1715
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1716 break;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1717
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1718 case sw_quoted_second:
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1719
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1720 state = sw_usual;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1721
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1722 if (ch >= '0' && ch <= '9') {
7067
e3723f2a11b7 Parenthesized ASCII-related calculations.
Valentin Bartenev <vbart@nginx.com>
parents: 6974
diff changeset
1723 ch = (u_char) ((decoded << 4) + (ch - '0'));
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1724
1593
bef67c6abbe7 unescape SSI include
Igor Sysoev <igor@sysoev.ru>
parents: 1560
diff changeset
1725 if (type & NGX_UNESCAPE_REDIRECT) {
601
77f77f53214a nginx-0.3.22-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1726 if (ch > '%' && ch < 0x7f) {
77f77f53214a nginx-0.3.22-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1727 *d++ = ch;
77f77f53214a nginx-0.3.22-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1728 break;
77f77f53214a nginx-0.3.22-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1729 }
77f77f53214a nginx-0.3.22-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1730
77f77f53214a nginx-0.3.22-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1731 *d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1);
77f77f53214a nginx-0.3.22-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1732
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1733 break;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1734 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1735
601
77f77f53214a nginx-0.3.22-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1736 *d++ = ch;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1737
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1738 break;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1739 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1740
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1741 c = (u_char) (ch | 0x20);
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1742 if (c >= 'a' && c <= 'f') {
7067
e3723f2a11b7 Parenthesized ASCII-related calculations.
Valentin Bartenev <vbart@nginx.com>
parents: 6974
diff changeset
1743 ch = (u_char) ((decoded << 4) + (c - 'a') + 10);
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1744
1593
bef67c6abbe7 unescape SSI include
Igor Sysoev <igor@sysoev.ru>
parents: 1560
diff changeset
1745 if (type & NGX_UNESCAPE_URI) {
bef67c6abbe7 unescape SSI include
Igor Sysoev <igor@sysoev.ru>
parents: 1560
diff changeset
1746 if (ch == '?') {
bef67c6abbe7 unescape SSI include
Igor Sysoev <igor@sysoev.ru>
parents: 1560
diff changeset
1747 *d++ = ch;
bef67c6abbe7 unescape SSI include
Igor Sysoev <igor@sysoev.ru>
parents: 1560
diff changeset
1748 goto done;
bef67c6abbe7 unescape SSI include
Igor Sysoev <igor@sysoev.ru>
parents: 1560
diff changeset
1749 }
bef67c6abbe7 unescape SSI include
Igor Sysoev <igor@sysoev.ru>
parents: 1560
diff changeset
1750
bef67c6abbe7 unescape SSI include
Igor Sysoev <igor@sysoev.ru>
parents: 1560
diff changeset
1751 *d++ = ch;
bef67c6abbe7 unescape SSI include
Igor Sysoev <igor@sysoev.ru>
parents: 1560
diff changeset
1752 break;
bef67c6abbe7 unescape SSI include
Igor Sysoev <igor@sysoev.ru>
parents: 1560
diff changeset
1753 }
bef67c6abbe7 unescape SSI include
Igor Sysoev <igor@sysoev.ru>
parents: 1560
diff changeset
1754
bef67c6abbe7 unescape SSI include
Igor Sysoev <igor@sysoev.ru>
parents: 1560
diff changeset
1755 if (type & NGX_UNESCAPE_REDIRECT) {
601
77f77f53214a nginx-0.3.22-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1756 if (ch == '?') {
77f77f53214a nginx-0.3.22-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1757 *d++ = ch;
77f77f53214a nginx-0.3.22-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1758 goto done;
77f77f53214a nginx-0.3.22-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1759 }
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1760
601
77f77f53214a nginx-0.3.22-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1761 if (ch > '%' && ch < 0x7f) {
77f77f53214a nginx-0.3.22-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1762 *d++ = ch;
77f77f53214a nginx-0.3.22-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1763 break;
77f77f53214a nginx-0.3.22-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1764 }
77f77f53214a nginx-0.3.22-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1765
77f77f53214a nginx-0.3.22-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1766 *d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1);
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1767 break;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1768 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1769
601
77f77f53214a nginx-0.3.22-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1770 *d++ = ch;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1771
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1772 break;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1773 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1774
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1775 /* the invalid quoted character */
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1776
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1777 break;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1778 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1779 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1780
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1781 done:
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1782
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1783 *dst = d;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1784 *src = s;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1785 }
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1786
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1787
1544
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1788 uintptr_t
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1789 ngx_escape_html(u_char *dst, u_char *src, size_t size)
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1790 {
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1791 u_char ch;
3275
b344b68da8c5 optimize some cycles:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1792 ngx_uint_t len;
1544
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1793
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1794 if (dst == NULL) {
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1795
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1796 len = 0;
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1797
3275
b344b68da8c5 optimize some cycles:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1798 while (size) {
1544
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1799 switch (*src++) {
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1800
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1801 case '<':
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1802 len += sizeof("&lt;") - 2;
1560
25ee6eee7573 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1552
diff changeset
1803 break;
1544
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1804
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1805 case '>':
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1806 len += sizeof("&gt;") - 2;
1560
25ee6eee7573 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1552
diff changeset
1807 break;
1544
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1808
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1809 case '&':
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1810 len += sizeof("&amp;") - 2;
1560
25ee6eee7573 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1552
diff changeset
1811 break;
1544
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1812
4312
0a8e51a16484 Added escaping of double quotes in ngx_escape_html().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4209
diff changeset
1813 case '"':
0a8e51a16484 Added escaping of double quotes in ngx_escape_html().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4209
diff changeset
1814 len += sizeof("&quot;") - 2;
0a8e51a16484 Added escaping of double quotes in ngx_escape_html().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4209
diff changeset
1815 break;
0a8e51a16484 Added escaping of double quotes in ngx_escape_html().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4209
diff changeset
1816
1544
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1817 default:
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1818 break;
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1819 }
3275
b344b68da8c5 optimize some cycles:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1820 size--;
1544
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1821 }
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1822
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1823 return (uintptr_t) len;
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1824 }
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1825
3275
b344b68da8c5 optimize some cycles:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1826 while (size) {
1544
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1827 ch = *src++;
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1828
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1829 switch (ch) {
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1830
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1831 case '<':
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1832 *dst++ = '&'; *dst++ = 'l'; *dst++ = 't'; *dst++ = ';';
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1833 break;
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1834
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1835 case '>':
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1836 *dst++ = '&'; *dst++ = 'g'; *dst++ = 't'; *dst++ = ';';
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1837 break;
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1838
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1839 case '&':
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1840 *dst++ = '&'; *dst++ = 'a'; *dst++ = 'm'; *dst++ = 'p';
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1841 *dst++ = ';';
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1842 break;
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1843
4312
0a8e51a16484 Added escaping of double quotes in ngx_escape_html().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4209
diff changeset
1844 case '"':
0a8e51a16484 Added escaping of double quotes in ngx_escape_html().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4209
diff changeset
1845 *dst++ = '&'; *dst++ = 'q'; *dst++ = 'u'; *dst++ = 'o';
0a8e51a16484 Added escaping of double quotes in ngx_escape_html().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4209
diff changeset
1846 *dst++ = 't'; *dst++ = ';';
0a8e51a16484 Added escaping of double quotes in ngx_escape_html().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4209
diff changeset
1847 break;
0a8e51a16484 Added escaping of double quotes in ngx_escape_html().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4209
diff changeset
1848
1544
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1849 default:
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1850 *dst++ = ch;
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1851 break;
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1852 }
3275
b344b68da8c5 optimize some cycles:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1853 size--;
1544
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1854 }
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1855
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1856 return (uintptr_t) dst;
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1857 }
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1858
998c44b19e30 ngx_escape_html()
Igor Sysoev <igor@sysoev.ru>
parents: 1542
diff changeset
1859
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1860 uintptr_t
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1861 ngx_escape_json(u_char *dst, u_char *src, size_t size)
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1862 {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1863 u_char ch;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1864 ngx_uint_t len;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1865
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1866 if (dst == NULL) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1867 len = 0;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1868
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1869 while (size) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1870 ch = *src++;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1871
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1872 if (ch == '\\' || ch == '"') {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1873 len++;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1874
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1875 } else if (ch <= 0x1f) {
6974
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1876
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1877 switch (ch) {
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1878 case '\n':
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1879 case '\r':
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1880 case '\t':
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1881 case '\b':
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1882 case '\f':
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1883 len++;
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1884 break;
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1885
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1886 default:
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1887 len += sizeof("\\u001F") - 2;
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1888 }
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1889 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1890
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1891 size--;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1892 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1893
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1894 return (uintptr_t) len;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1895 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1896
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1897 while (size) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1898 ch = *src++;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1899
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1900 if (ch > 0x1f) {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1901
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1902 if (ch == '\\' || ch == '"') {
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1903 *dst++ = '\\';
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1904 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1905
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1906 *dst++ = ch;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1907
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1908 } else {
6974
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1909 *dst++ = '\\';
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1910
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1911 switch (ch) {
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1912 case '\n':
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1913 *dst++ = 'n';
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1914 break;
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1915
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1916 case '\r':
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1917 *dst++ = 'r';
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1918 break;
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1919
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1920 case '\t':
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1921 *dst++ = 't';
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1922 break;
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1923
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1924 case '\b':
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1925 *dst++ = 'b';
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1926 break;
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1927
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1928 case '\f':
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1929 *dst++ = 'f';
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1930 break;
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1931
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1932 default:
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1933 *dst++ = 'u'; *dst++ = '0'; *dst++ = '0';
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1934 *dst++ = '0' + (ch >> 4);
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1935
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1936 ch &= 0xf;
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1937
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1938 *dst++ = (ch < 10) ? ('0' + ch) : ('A' + ch - 10);
289403abc84e Core: improved JSON escaping.
Valentin Bartenev <vbart@nginx.com>
parents: 6626
diff changeset
1939 }
5944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1940 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1941
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1942 size--;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1943 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1944
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1945 return (uintptr_t) dst;
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1946 }
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1947
33c08d7e2915 Autoindex: implemented JSON output format.
Valentin Bartenev <vbart@nginx.com>
parents: 5772
diff changeset
1948
3641
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1949 void
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1950 ngx_str_rbtree_insert_value(ngx_rbtree_node_t *temp,
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1951 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1952 {
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1953 ngx_str_node_t *n, *t;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1954 ngx_rbtree_node_t **p;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1955
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1956 for ( ;; ) {
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1957
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1958 n = (ngx_str_node_t *) node;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1959 t = (ngx_str_node_t *) temp;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1960
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1961 if (node->key != temp->key) {
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1962
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1963 p = (node->key < temp->key) ? &temp->left : &temp->right;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1964
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1965 } else if (n->str.len != t->str.len) {
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1966
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1967 p = (n->str.len < t->str.len) ? &temp->left : &temp->right;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1968
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1969 } else {
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1970 p = (ngx_memcmp(n->str.data, t->str.data, n->str.len) < 0)
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1971 ? &temp->left : &temp->right;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1972 }
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1973
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1974 if (*p == sentinel) {
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1975 break;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1976 }
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1977
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1978 temp = *p;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1979 }
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1980
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1981 *p = node;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1982 node->parent = temp;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1983 node->left = sentinel;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1984 node->right = sentinel;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1985 ngx_rbt_red(node);
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1986 }
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1987
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1988
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1989 ngx_str_node_t *
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1990 ngx_str_rbtree_lookup(ngx_rbtree_t *rbtree, ngx_str_t *val, uint32_t hash)
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1991 {
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1992 ngx_int_t rc;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1993 ngx_str_node_t *n;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1994 ngx_rbtree_node_t *node, *sentinel;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1995
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1996 node = rbtree->root;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1997 sentinel = rbtree->sentinel;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1998
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1999 while (node != sentinel) {
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2000
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2001 n = (ngx_str_node_t *) node;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2002
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2003 if (hash != node->key) {
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2004 node = (hash < node->key) ? node->left : node->right;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2005 continue;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2006 }
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2007
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2008 if (val->len != n->str.len) {
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2009 node = (val->len < n->str.len) ? node->left : node->right;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2010 continue;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2011 }
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2012
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2013 rc = ngx_memcmp(val->data, n->str.data, val->len);
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2014
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2015 if (rc < 0) {
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2016 node = node->left;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2017 continue;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2018 }
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2019
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2020 if (rc > 0) {
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2021 node = node->right;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2022 continue;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2023 }
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2024
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2025 return n;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2026 }
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2027
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2028 return NULL;
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2029 }
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2030
6802ba529ec4 change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
2031
1208
5eae5751507f ngx_sort
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
2032 /* ngx_sort() is implemented as insertion sort because we need stable sort */
5eae5751507f ngx_sort
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
2033
5eae5751507f ngx_sort
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
2034 void
5eae5751507f ngx_sort
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
2035 ngx_sort(void *base, size_t n, size_t size,
1956
cb8c0c8e0c27 use ngx_int_t in ngx_sort() callback
Igor Sysoev <igor@sysoev.ru>
parents: 1955
diff changeset
2036 ngx_int_t (*cmp)(const void *, const void *))
1208
5eae5751507f ngx_sort
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
2037 {
1955
466fdc84c82d use dynamically allocated buffer in ngx_sort()
Igor Sysoev <igor@sysoev.ru>
parents: 1867
diff changeset
2038 u_char *p1, *p2, *p;
466fdc84c82d use dynamically allocated buffer in ngx_sort()
Igor Sysoev <igor@sysoev.ru>
parents: 1867
diff changeset
2039
466fdc84c82d use dynamically allocated buffer in ngx_sort()
Igor Sysoev <igor@sysoev.ru>
parents: 1867
diff changeset
2040 p = ngx_alloc(size, ngx_cycle->log);
466fdc84c82d use dynamically allocated buffer in ngx_sort()
Igor Sysoev <igor@sysoev.ru>
parents: 1867
diff changeset
2041 if (p == NULL) {
466fdc84c82d use dynamically allocated buffer in ngx_sort()
Igor Sysoev <igor@sysoev.ru>
parents: 1867
diff changeset
2042 return;
466fdc84c82d use dynamically allocated buffer in ngx_sort()
Igor Sysoev <igor@sysoev.ru>
parents: 1867
diff changeset
2043 }
1208
5eae5751507f ngx_sort
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
2044
5eae5751507f ngx_sort
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
2045 for (p1 = (u_char *) base + size;
5eae5751507f ngx_sort
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
2046 p1 < (u_char *) base + n * size;
5eae5751507f ngx_sort
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
2047 p1 += size)
5eae5751507f ngx_sort
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
2048 {
1955
466fdc84c82d use dynamically allocated buffer in ngx_sort()
Igor Sysoev <igor@sysoev.ru>
parents: 1867
diff changeset
2049 ngx_memcpy(p, p1, size);
1208
5eae5751507f ngx_sort
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
2050
5eae5751507f ngx_sort
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
2051 for (p2 = p1;
1955
466fdc84c82d use dynamically allocated buffer in ngx_sort()
Igor Sysoev <igor@sysoev.ru>
parents: 1867
diff changeset
2052 p2 > (u_char *) base && cmp(p2 - size, p) > 0;
1208
5eae5751507f ngx_sort
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
2053 p2 -= size)
5eae5751507f ngx_sort
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
2054 {
5eae5751507f ngx_sort
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
2055 ngx_memcpy(p2, p2 - size, size);
5eae5751507f ngx_sort
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
2056 }
5eae5751507f ngx_sort
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
2057
1955
466fdc84c82d use dynamically allocated buffer in ngx_sort()
Igor Sysoev <igor@sysoev.ru>
parents: 1867
diff changeset
2058 ngx_memcpy(p2, p, size);
1208
5eae5751507f ngx_sort
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
2059 }
1955
466fdc84c82d use dynamically allocated buffer in ngx_sort()
Igor Sysoev <igor@sysoev.ru>
parents: 1867
diff changeset
2060
466fdc84c82d use dynamically allocated buffer in ngx_sort()
Igor Sysoev <igor@sysoev.ru>
parents: 1867
diff changeset
2061 ngx_free(p);
1208
5eae5751507f ngx_sort
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
2062 }
5eae5751507f ngx_sort
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
2063
5eae5751507f ngx_sort
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
2064
7395
9ca82f273967 Core: ngx_explicit_memzero().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7120
diff changeset
2065 void
9ca82f273967 Core: ngx_explicit_memzero().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7120
diff changeset
2066 ngx_explicit_memzero(void *buf, size_t n)
9ca82f273967 Core: ngx_explicit_memzero().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7120
diff changeset
2067 {
9ca82f273967 Core: ngx_explicit_memzero().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7120
diff changeset
2068 ngx_memzero(buf, n);
9ca82f273967 Core: ngx_explicit_memzero().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7120
diff changeset
2069 ngx_memory_barrier();
9ca82f273967 Core: ngx_explicit_memzero().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7120
diff changeset
2070 }
9ca82f273967 Core: ngx_explicit_memzero().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7120
diff changeset
2071
9ca82f273967 Core: ngx_explicit_memzero().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7120
diff changeset
2072
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2073 #if (NGX_MEMCPY_LIMIT)
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2074
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2075 void *
4781
814541b2ec23 Added "const" to ngx_memcpy() with NGX_MEMCPY_LIMIT defined.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4604
diff changeset
2076 ngx_memcpy(void *dst, const void *src, size_t n)
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2077 {
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2078 if (n > NGX_MEMCPY_LIMIT) {
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2079 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, "memcpy %uz bytes", n);
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2080 ngx_debug_point();
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2081 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2082
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2083 return memcpy(dst, src, n);
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2084 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2085
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2086 #endif