[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

[PATCH] extract NLS initialization code form svn_cmdline_init

From: Kouhei Sutou <kou_at_cozmixng.org>
Date: 2005-07-09 18:20:51 CEST

Hi,

I want to initialize only NLS in Ruby bindings. The bindings
doesn't need to initialize others (apr_pool, ...).
svn_cmdline_init() initializes NLS but this initializes
apr_pool too.

This patch extract NLS initialization code from
svn_cmdline_init() for reusing the code by bindings.

In Ruby bindings, I don't want to call textdomain(). So I
divided the code into svn_nls_environment_init() and
svn_nls_init(). I'll use only svn_nls_environment_init() in
Ruby bindings.

{{{
Extract NLS initialization code from svn_cmdline_init.

* subversion/libsvn_subr/nls.c
  (svn_nls_environment_init): Initialize NLS environment.
  (svn_nls_init): Initialize NLS environment and set up
  text domain.

* subversion/include/svn_nls.h: Add.

* subversion/libsvn_subr/cmdline.c
  (svn_cmdline_init): Extract NLS initialization code.
}}}

Thanks,

--
kou

Index: subversion/include/svn_nls.h
===================================================================
--- subversion/include/svn_nls.h (revision 0)
+++ subversion/include/svn_nls.h (revision 0)
@@ -0,0 +1,53 @@
+/**
+ * @copyright
+ * ====================================================================
+ * Copyright (c) 2000-2005 CollabNet. All rights reserved.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at http://subversion.tigris.org/license-1.html.
+ * If newer versions of this license are posted there, you may use a
+ * newer version instead, at your option.
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals. For exact contribution history, see the revision
+ * history and logs, available at http://subversion.tigris.org/.
+ * ====================================================================
+ * @endcopyright
+ *
+ * @file svn_nls.h
+ * @brief Support functions for NLS programs
+ */
+
+
+
+#ifndef SVN_NLS_H
+#define SVN_NLS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/** Set up the NLS environment.
+ * If @a error_stream is non-null, print error messages to the stream.
+ * Return @c EXIT_SUCCESS if successful, otherwise @c EXIT_FAILURE.
+ *
+ * @note This function is for bindings. usually use svn_cmdline_init().
+ * This function should be called after initializing APR.
+ */
+int svn_nls_environment_init (FILE *error_stream);
+
+/** Set up the NLS which includes NLS environment set up.
+ * If @a error_stream is non-null, print error messages to the stream.
+ * Return @c EXIT_SUCCESS if successful, otherwise @c EXIT_FAILURE.
+ *
+ * @note This function is for bindings. usually use svn_cmdline_init().
+ * This function should be called after initializing APR.
+ */
+int svn_nls_init (FILE *error_stream);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* SVN_NLS_H */
Index: subversion/libsvn_subr/cmdline.c
===================================================================
--- subversion/libsvn_subr/cmdline.c (revision 15306)
+++ subversion/libsvn_subr/cmdline.c (working copy)
@@ -35,6 +35,7 @@
 #include "svn_path.h"
 #include "svn_pools.h"
 #include "svn_error.h"
+#include "svn_nls.h"
 #include "utf_impl.h"
 
 #include "svn_private_config.h"
@@ -162,72 +163,9 @@
   pool = svn_pool_create (NULL);
   svn_utf_initialize (pool);
 
-#ifdef ENABLE_NLS
-#ifdef WIN32
- {
- WCHAR ucs2_path[MAX_PATH];
- char* utf8_path;
- const char* internal_path;
- apr_pool_t* pool;
- apr_status_t apr_err;
- apr_size_t inwords, outbytes, outlength;
-
- apr_pool_create (&pool, 0);
- /* get exe name - our locale info will be in '../share/locale' */
- inwords = GetModuleFileNameW (0, ucs2_path,
- sizeof (ucs2_path) / sizeof(ucs2_path[0]));
- if (! inwords)
- {
- /* We must be on a Win9x machine, so attempt to get an ANSI path,
- and convert it to Unicode. */
- CHAR ansi_path[MAX_PATH];
-
- if (! GetModuleFileNameA (0, ansi_path, sizeof (ansi_path)))
- goto utf8_error;
-
- inwords =
- MultiByteToWideChar (CP_ACP, 0, ansi_path, -1, ucs2_path,
- sizeof (ucs2_path) / sizeof (ucs2_path[0]));
- if (! inwords)
- goto utf8_error;
- }
-
- outbytes = outlength = 3 * (inwords + 1);
- utf8_path = apr_palloc (pool, outlength);
- apr_err = apr_conv_ucs2_to_utf8 (ucs2_path, &inwords,
- utf8_path, &outbytes);
- if (!apr_err && (inwords > 0 || outbytes == 0))
- apr_err = APR_INCOMPLETE;
- if (apr_err)
- {
- utf8_error:
- if (error_stream)
- fprintf (error_stream, "Can't convert module path to UTF-8");
- return EXIT_FAILURE;
- }
-
- utf8_path[outlength - outbytes] = '\0';
- internal_path = svn_path_internal_style (utf8_path, pool);
- /* get base path name */
- internal_path = svn_path_dirname (internal_path, pool);
- internal_path = svn_path_join (internal_path, SVN_LOCALE_RELATIVE_PATH,
- pool);
- bindtextdomain (PACKAGE_NAME, internal_path);
- apr_pool_destroy (pool);
- }
-#else
- bindtextdomain(PACKAGE_NAME, SVN_LOCALE_DIR);
-#ifdef HAVE_BIND_TEXTDOMAIN_CODESET
- bind_textdomain_codeset(PACKAGE_NAME, "UTF-8");
-#endif
-#endif
- textdomain(PACKAGE_NAME);
-#endif
-
- return EXIT_SUCCESS;
+ return svn_nls_init(error_stream);
 }
 
-
 svn_error_t *
 svn_cmdline_cstring_from_utf8 (const char **dest,
                                const char *src,
Index: subversion/libsvn_subr/nls.c
===================================================================
--- subversion/libsvn_subr/nls.c (revision 0)
+++ subversion/libsvn_subr/nls.c (revision 0)
@@ -0,0 +1,114 @@
+/*
+ * nls.c : Helpers for NLS programs.
+ *
+ * ====================================================================
+ * Copyright (c) 2000-2005 CollabNet. All rights reserved.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at http://subversion.tigris.org/license-1.html.
+ * If newer versions of this license are posted there, you may use a
+ * newer version instead, at your option.
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals. For exact contribution history, see the revision
+ * history and logs, available at http://subversion.tigris.org/.
+ * ====================================================================
+ */
+
+#include <stdlib.h>
+
+#ifndef WIN32
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#endif
+
+#include <apr_errno.h>
+
+#include "svn_error.h"
+#include "svn_pools.h"
+
+#include "svn_private_config.h"
+
+
+int
+svn_nls_environment_init (FILE *error_stream)
+{
+#ifdef ENABLE_NLS
+#ifdef WIN32
+ {
+ WCHAR ucs2_path[MAX_PATH];
+ char* utf8_path;
+ const char* internal_path;
+ apr_pool_t* pool;
+ apr_status_t apr_err;
+ apr_size_t inwords, outbytes, outlength;
+
+ apr_pool_create (&pool, 0);
+ /* get exe name - our locale info will be in '../share/locale' */
+ inwords = GetModuleFileNameW (0, ucs2_path,
+ sizeof (ucs2_path) / sizeof(ucs2_path[0]));
+ if (! inwords)
+ {
+ /* We must be on a Win9x machine, so attempt to get an ANSI path,
+ and convert it to Unicode. */
+ CHAR ansi_path[MAX_PATH];
+
+ if (! GetModuleFileNameA (0, ansi_path, sizeof (ansi_path)))
+ goto utf8_error;
+
+ inwords =
+ MultiByteToWideChar (CP_ACP, 0, ansi_path, -1, ucs2_path,
+ sizeof (ucs2_path) / sizeof (ucs2_path[0]));
+ if (! inwords)
+ goto utf8_error;
+ }
+
+ outbytes = outlength = 3 * (inwords + 1);
+ utf8_path = apr_palloc (pool, outlength);
+ apr_err = apr_conv_ucs2_to_utf8 (ucs2_path, &inwords,
+ utf8_path, &outbytes);
+ if (!apr_err && (inwords > 0 || outbytes == 0))
+ apr_err = APR_INCOMPLETE;
+ if (apr_err)
+ {
+ utf8_error:
+ if (error_stream)
+ fprintf (error_stream, "Can't convert module path to UTF-8");
+ return EXIT_FAILURE;
+ }
+
+ utf8_path[outlength - outbytes] = '\0';
+ internal_path = svn_path_internal_style (utf8_path, pool);
+ /* get base path name */
+ internal_path = svn_path_dirname (internal_path, pool);
+ internal_path = svn_path_join (internal_path, SVN_LOCALE_RELATIVE_PATH,
+ pool);
+ bindtextdomain (PACKAGE_NAME, internal_path);
+ apr_pool_destroy (pool);
+ }
+#else
+ bindtextdomain(PACKAGE_NAME, SVN_LOCALE_DIR);
+#ifdef HAVE_BIND_TEXTDOMAIN_CODESET
+ bind_textdomain_codeset(PACKAGE_NAME, "UTF-8");
+#endif
+#endif
+#endif
+
+ return EXIT_SUCCESS;
+}
+
+int
+svn_nls_init (FILE *error_stream)
+{
+#ifdef ENABLE_NLS
+ if (svn_nls_environment_init(error_stream) != EXIT_SUCCESS) {
+ return EXIT_FAILURE;
+ }
+ textdomain(PACKAGE_NAME);
+#endif
+
+ return EXIT_SUCCESS;
+}

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Sat Jul 9 18:24:21 2005

This is an archived mail posted to the Subversion Dev mailing list.