utf8.c: add reencode_string_len() that can handle NULs in string
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Nguyễn Thái Ngọc Duy committed
Apr 19, 2013 at 09:08 UTC
b782bbab94e3618aea352907caa77321b487b918
3 files changed
+24
-7
compat/precompose_utf8.c
+1
-1
@@ -78,7 +78,7 @@ void precompose_argv(int argc, const char **argv)
78
size_t namelen;
79
oldarg = argv[i];
80
if (has_non_ascii(oldarg, (size_t)-1, &namelen)) {
81
- newarg = reencode_string_iconv(oldarg, namelen, ic_precompose);
81
+ newarg = reencode_string_iconv(oldarg, namelen, ic_precompose, NULL);
82
if (newarg)
83
argv[i] = newarg;
84
}
utf8.c
+7
-3
@@ -468,7 +468,7 @@ int utf8_fprintf(FILE *stream, const char *format, ...)
468
#else
469
typedef char * iconv_ibp;
470
#endif
471
-char *reencode_string_iconv(const char *in, size_t insz, iconv_t conv)
471
+char *reencode_string_iconv(const char *in, size_t insz, iconv_t conv, int *outsz_p)
472
{
473
size_t outsz, outalloc;
474
char *out, *outpos;
@@ -502,13 +502,17 @@ char *reencode_string_iconv(const char *in, size_t insz, iconv_t conv)
502
}
503
else {
504
*outpos = '\0';
505
+ if (outsz_p)
506
+ *outsz_p = outpos - out;
507
break;
508
}
509
}
510
return out;
511
}
512
511
-char *reencode_string(const char *in, const char *out_encoding, const char *in_encoding)
513
+char *reencode_string_len(const char *in, int insz,
514
+ const char *out_encoding, const char *in_encoding,
515
+ int *outsz)
516
{
517
iconv_t conv;
518
char *out;
@@ -534,7 +538,7 @@ char *reencode_string(const char *in, const char *out_encoding, const char *in_e
538
return NULL;
539
}
540
537
- out = reencode_string_iconv(in, strlen(in), conv);
541
+ out = reencode_string_iconv(in, insz, conv, outsz);
542
iconv_close(conv);
543
return out;
544
}
utf8.h
+16
-3
@@ -17,12 +17,25 @@ void strbuf_add_wrapped_bytes(struct strbuf *buf, const char *data, int len,
17
int indent, int indent2, int width);
18
19
#ifndef NO_ICONV
20
-char *reencode_string_iconv(const char *in, size_t insz, iconv_t conv);
21
-char *reencode_string(const char *in, const char *out_encoding, const char *in_encoding);
20
+char *reencode_string_iconv(const char *in, size_t insz,
21
+ iconv_t conv, int *outsz);
22
+char *reencode_string_len(const char *in, int insz,
23
+ const char *out_encoding,
24
+ const char *in_encoding,
25
+ int *outsz);
26
#else
23
-#define reencode_string(a,b,c) NULL
27
+#define reencode_string_len(a,b,c,d,e) NULL
28
#endif
29
30
+static inline char *reencode_string(const char *in,
31
+ const char *out_encoding,
32
+ const char *in_encoding)
33
+{
34
+ return reencode_string_len(in, strlen(in),
35
+ out_encoding, in_encoding,
36
+ NULL);
37
+}
38
+
39
int mbs_chrlen(const char **text, size_t *remainder_p, const char *encoding);
40
41
#endif