Skip to content

Commit b782bba

Browse files
pcloudsgitster
authored andcommitted
utf8.c: add reencode_string_len() that can handle NULs in string
Signed-off-by: Nguyễn Thái Ngọc Duy <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 2bc1e7e commit b782bba

File tree

3 files changed

+24
-7
lines changed

3 files changed

+24
-7
lines changed

compat/precompose_utf8.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ void precompose_argv(int argc, const char **argv)
7878
size_t namelen;
7979
oldarg = argv[i];
8080
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);
8282
if (newarg)
8383
argv[i] = newarg;
8484
}

utf8.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -468,7 +468,7 @@ int utf8_fprintf(FILE *stream, const char *format, ...)
468468
#else
469469
typedef char * iconv_ibp;
470470
#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)
472472
{
473473
size_t outsz, outalloc;
474474
char *out, *outpos;
@@ -502,13 +502,17 @@ char *reencode_string_iconv(const char *in, size_t insz, iconv_t conv)
502502
}
503503
else {
504504
*outpos = '\0';
505+
if (outsz_p)
506+
*outsz_p = outpos - out;
505507
break;
506508
}
507509
}
508510
return out;
509511
}
510512

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)
512516
{
513517
iconv_t conv;
514518
char *out;
@@ -534,7 +538,7 @@ char *reencode_string(const char *in, const char *out_encoding, const char *in_e
534538
return NULL;
535539
}
536540

537-
out = reencode_string_iconv(in, strlen(in), conv);
541+
out = reencode_string_iconv(in, insz, conv, outsz);
538542
iconv_close(conv);
539543
return out;
540544
}

utf8.h

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,25 @@ void strbuf_add_wrapped_bytes(struct strbuf *buf, const char *data, int len,
1717
int indent, int indent2, int width);
1818

1919
#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);
2226
#else
23-
#define reencode_string(a,b,c) NULL
27+
#define reencode_string_len(a,b,c,d,e) NULL
2428
#endif
2529

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+
2639
int mbs_chrlen(const char **text, size_t *remainder_p, const char *encoding);
2740

2841
#endif

0 commit comments

Comments
 (0)