u_char c, *p, *src, *dst, *saved, **table;
uint32_t n;
ngx_buf_t *b;
- ngx_uint_t i;
ngx_chain_t *out, *cl, **ll;
src = buf->pos;
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pool->log, 0,
"http charset utf saved: %z", ctx->saved_len);
- p = src;
-
- for (i = ctx->saved_len; i < NGX_UTF_LEN; i++) {
- ctx->saved[i] = *p++;
-
- if (p == buf->last) {
- break;
- }
- }
+ len = ngx_min(NGX_UTF_LEN - ctx->saved_len, (size_t) (buf->last - src));
+ ngx_memcpy(&ctx->saved[ctx->saved_len], src, len);
+ len += ctx->saved_len;
saved = ctx->saved;
- n = ngx_utf8_decode(&saved, i);
+ n = ngx_utf8_decode(&saved, len);
c = '\0';
/* incomplete UTF-8 symbol */
- if (i < NGX_UTF_LEN) {
+ if (len < NGX_UTF_LEN) {
out = ngx_http_charset_get_buf(pool, ctx);
if (out == NULL) {
return NULL;
b->sync = 1;
b->shadow = buf;
- ngx_memcpy(&ctx->saved[ctx->saved_len], src, i);
- ctx->saved_len += i;
+ ctx->saved_len = len;
return out;
}