Author: rinrab Date: Sat Jun 7 17:41:22 2025 New Revision: 1926218 URL: http://svn.apache.org/viewvc?rev=1926218&view=rev Log: In the trunk: Add svn_cmdline__get_utf8_argv() function and platform-specific implementations.
(merged from utf8-cmdline-prototype@r1925816) * subversion/include/private/svn_cmdline_private.h (svn_cmdline__win32_get_utf8_argv, svn_cmdline__default_get_utf8_argv): Define functions. (svn_cmdline__get_utf8_argv): Add non-platform-dependent wrapper. * subversion/libsvn_subr/cmdline.c (svn_cmdline__win32_get_utf8_argv, svn_cmdline__default_get_utf8_argv): Implement functions. No real usages yet. Modified: subversion/trunk/ (props changed) subversion/trunk/subversion/include/private/svn_cmdline_private.h subversion/trunk/subversion/libsvn_subr/cmdline.c Propchange: subversion/trunk/ ------------------------------------------------------------------------------ Merged /subversion/branches/utf8-cmdline-prototype:r1925816 Modified: subversion/trunk/subversion/include/private/svn_cmdline_private.h URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/private/svn_cmdline_private.h?rev=1926218&r1=1926217&r2=1926218&view=diff ============================================================================== --- subversion/trunk/subversion/include/private/svn_cmdline_private.h (original) +++ subversion/trunk/subversion/include/private/svn_cmdline_private.h Sat Jun 7 17:41:22 2025 @@ -289,6 +289,12 @@ svn_cmdline__win32_get_cstring_argv(cons int argc, const wchar_t *argv[], apr_pool_t *result_pool); + +svn_error_t * +svn_cmdline__win32_get_utf8_argv(const char **utf8_argv_p[], + int argc, + const wchar_t *argv[], + apr_pool_t *result_pool); #endif /* Default platform-agnostic handler that normalizes command line arguments @@ -299,14 +305,22 @@ svn_cmdline__default_get_cstring_argv(co const char *argv[], apr_pool_t *result_pool); +svn_error_t * +svn_cmdline__default_get_utf8_argv(const char **utf8_argv_p[], + int argc, + const char *argv[], + apr_pool_t *result_pool); + #if defined(WIN32) && defined(_MSC_VER) typedef wchar_t svn_cmdline__argv_char_t; #define SVN_CMDLINE__MAIN wmain #define svn_cmdline__get_cstring_argv svn_cmdline__win32_get_cstring_argv +#define svn_cmdline__get_utf8_argv svn_cmdline__win32_get_utf8_argv #else typedef char svn_cmdline__argv_char_t; #define SVN_CMDLINE__MAIN main #define svn_cmdline__get_cstring_argv svn_cmdline__default_get_cstring_argv +#define svn_cmdline__get_utf8_argv svn_cmdline__default_get_utf8_argv #endif #ifdef __cplusplus Modified: subversion/trunk/subversion/libsvn_subr/cmdline.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/cmdline.c?rev=1926218&r1=1926217&r2=1926218&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_subr/cmdline.c (original) +++ subversion/trunk/subversion/libsvn_subr/cmdline.c Sat Jun 7 17:41:22 2025 @@ -1,3 +1,4 @@ +#include "svn_cmdline_private.h" /* * cmdline.c : Helpers for command-line programs. * @@ -1429,10 +1430,32 @@ svn_cmdline__win32_get_cstring_argv(cons APR_ARRAY_PUSH(cstring_argv, const char *) = cstring_arg; } +} + +svn_error_t * +svn_cmdline__win32_get_utf8_argv(const char **utf8_argv_p[], + int argc, + const wchar_t *argv[], + apr_pool_t *result_pool) +{ + apr_array_header_t *utf8_argv; + int i; + + utf8_argv = apr_array_make(result_pool, argc + 1, sizeof(const char *)); + + for (i = 0; i < argc; i++) + { + const wchar_t *arg = argv[i]; + char *utf8_arg; - APR_ARRAY_PUSH(cstring_argv, const char *) = NULL; + SVN_ERR(svn_utf__win32_utf16_to_utf8(&utf8_arg, arg, NULL, result_pool)); - *cstring_argv_p = (const char **)cstring_argv->elts; + APR_ARRAY_PUSH(utf8_argv, const char *) = utf8_arg; + } + + APR_ARRAY_PUSH(utf8_argv, const char *) = NULL; + + *utf8_argv_p = (const char **)utf8_argv->elts; return SVN_NO_ERROR; } @@ -1447,3 +1470,30 @@ svn_cmdline__default_get_cstring_argv(co *cstring_argv_p = argv; return SVN_NO_ERROR; } + +svn_error_t * +svn_cmdline__default_get_utf8_argv(const char **utf8_argv_p[], + int argc, + const char *argv[], + apr_pool_t *result_pool) +{ + apr_array_header_t *utf8_argv; + int i; + + utf8_argv = apr_array_make(result_pool, argc + 1, sizeof(const char *)); + + for (i = 0; i < argc; i++) + { + const char *arg = argv[i]; + char *utf8_arg; + + SVN_ERR(svn_utf_cstring_to_utf8(&utf8_arg, arg, result_pool)); + + APR_ARRAY_PUSH(utf8_argv, const char *) = utf8_arg; + } + + APR_ARRAY_PUSH(utf8_argv, const char *) = NULL; + + *utf8_argv_p = (const char **)utf8_argv->elts; + return SVN_NO_ERROR; +}