comparison src/core/ngx_string.c @ 0:f0b350454894 NGINX_0_1_0

nginx 0.1.0 *) The first public version.
author Igor Sysoev <http://sysoev.ru>
date Mon, 04 Oct 2004 00:00:00 +0400
parents
children cc9f381affaa
comparison
equal deleted inserted replaced
-1:000000000000 0:f0b350454894
1
2 /*
3 * Copyright (C) Igor Sysoev
4 */
5
6
7 #include <ngx_config.h>
8 #include <ngx_core.h>
9
10
11 u_char *ngx_cpystrn(u_char *dst, u_char *src, size_t n)
12 {
13 if (n == 0) {
14 return dst;
15 }
16
17 for (/* void */; --n; dst++, src++) {
18 *dst = *src;
19
20 if (*dst == '\0') {
21 return dst;
22 }
23 }
24
25 *dst = '\0';
26
27 return dst;
28 }
29
30
31 ngx_int_t ngx_rstrncmp(u_char *s1, u_char *s2, size_t n)
32 {
33 if (n == 0) {
34 return 0;
35 }
36
37 n--;
38
39 for ( ;; ) {
40 if (s1[n] != s2[n]) {
41 return s1[n] - s2[n];
42 }
43
44 if (n == 0) {
45 return 0;
46 }
47
48 n--;
49 }
50 }
51
52
53 ngx_int_t ngx_atoi(u_char *line, size_t n)
54 {
55 ngx_int_t value;
56
57 if (n == 0) {
58 return NGX_ERROR;
59 }
60
61 for (value = 0; n--; line++) {
62 if (*line < '0' || *line > '9') {
63 return NGX_ERROR;
64 }
65
66 value = value * 10 + (*line - '0');
67 }
68
69 if (value < 0) {
70 return NGX_ERROR;
71
72 } else {
73 return value;
74 }
75 }
76
77
78 ngx_int_t ngx_hextoi(u_char *line, size_t n)
79 {
80 u_char ch;
81 ngx_int_t value;
82
83 if (n == 0) {
84 return NGX_ERROR;
85 }
86
87 for (value = 0; n--; line++) {
88 ch = *line;
89
90 if (ch >= '0' && ch <= '9') {
91 value = value * 16 + (ch - '0');
92 continue;
93 }
94
95 if (ch >= 'A' && ch <= 'F') {
96 value = value * 16 + (ch - 'A' + 10);
97 continue;
98 }
99
100 if (ch >= 'a' && ch <= 'f') {
101 value = value * 16 + (ch - 'a' + 10);
102 continue;
103 }
104
105 return NGX_ERROR;
106 }
107
108 if (value < 0) {
109 return NGX_ERROR;
110
111 } else {
112 return value;
113 }
114 }
115
116
117 void ngx_md5_text(u_char *text, u_char *md5)
118 {
119 int i;
120 static u_char hex[] = "0123456789abcdef";
121
122 for (i = 0; i < 16; i++) {
123 *text++ = hex[md5[i] >> 4];
124 *text++ = hex[md5[i] & 0xf];
125 }
126
127 *text = '\0';
128 }
129
130
131 void ngx_encode_base64(ngx_str_t *src, ngx_str_t *dst)
132 {
133 u_char *d, *s;
134 size_t len;
135 static u_char basis64[] =
136 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
137
138 len = src->len;
139 s = src->data;
140 d = dst->data;
141
142 while (len > 2) {
143 *d++ = basis64[(s[0] >> 2) & 0x3f];
144 *d++ = basis64[((s[0] & 3) << 4) | (s[1] >> 4)];
145 *d++ = basis64[((s[1] & 0x0f) << 2) | (s[2] >> 6)];
146 *d++ = basis64[s[2] & 0x3f];
147
148 s += 3;
149 len -= 3;
150 }
151
152 if (len) {
153 *d++ = basis64[(s[0] >> 2) & 0x3f];
154
155 if (len == 1) {
156 *d++ = basis64[(s[0] & 3) << 4];
157 *d++ = '=';
158
159 } else {
160 *d++ = basis64[((s[0] & 3) << 4) | (s[1] >> 4)];
161 *d++ = basis64[(s[1] & 0x0f) << 2];
162 }
163
164 *d++ = '=';
165 }
166
167 dst->len = d - dst->data;
168 }
169
170
171 ngx_int_t ngx_decode_base64(ngx_str_t *src, ngx_str_t *dst)
172 {
173 size_t len;
174 u_char *d, *s;
175 static u_char basis64[] =
176 { 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
177 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
178 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 62, 77, 77, 77, 63,
179 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 77, 77, 77, 77, 77, 77,
180 77, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
181 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 77, 77, 77, 77, 77,
182 77, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
183 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 77, 77, 77, 77, 77,
184
185 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
186 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
187 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
188 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
189 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
190 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
191 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
192 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77 };
193
194 for (len = 0; len < src->len; len++) {
195 if (src->data[len] == '=') {
196 break;
197 }
198
199 if (basis64[src->data[len]] == 77) {
200 return NGX_ERROR;
201 }
202 }
203
204 if (len % 4 == 1) {
205 return NGX_ERROR;
206 }
207
208 s = src->data;
209 d = dst->data;
210
211 while (len > 3) {
212 *d++ = (u_char) (basis64[s[0]] << 2 | basis64[s[1]] >> 4);
213 *d++ = (u_char) (basis64[s[1]] << 4 | basis64[s[2]] >> 2);
214 *d++ = (u_char) (basis64[s[2]] << 6 | basis64[s[3]]);
215
216 s += 4;
217 len -= 4;
218 }
219
220 if (len > 1) {
221 *d++ = (u_char) (basis64[s[0]] << 2 | basis64[s[1]] >> 4);
222 }
223
224 if (len > 2) {
225 *d++ = (u_char) (basis64[s[1]] << 4 | basis64[s[2]] >> 2);
226 }
227
228 dst->len = d - dst->data;
229
230 return NGX_OK;
231 }
232
233
234 #if 0
235 char *ngx_psprintf(ngx_pool_t *p, const char *fmt, ...)
236 {
237 va_list args;
238
239 va_start(args, fmt);
240
241 while (*fmt) {
242 switch(*fmt++) {
243 case '%':
244 switch(*fmt++) {
245 case 's':
246 s = va_arg(args, char *);
247 n += ngx_strlen(s);
248 break;
249
250 default:
251 n++;
252 }
253 default:
254 n++;
255 }
256 }
257
258 str = ngx_palloc(p, n);
259
260 va_start(args, fmt);
261
262 for (i = 0; i < n; i++) {
263 switch(*fmt++) {
264 case '%':
265 switch(*fmt++) {
266 case 's':
267 s = va_arg(args, char *);
268 while (str[i++] = s);
269 break;
270
271 default:
272 n++;
273 }
274 default:
275 str[i] = *fmt;
276 }
277 }
278
279 len += ngx_vsnprintf(errstr + len, sizeof(errstr) - len - 1, fmt, args);
280
281 va_end(args);
282
283 }
284 #endif