1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-04-30 03:40:34 +02:00

Arrange to convert command-line arguments from the right encoding.

This is a temporary workaround for the 2.0 stable series.  The next
stable series should have an implicit `setlocale (LC_ALL, "")' call,
which will make this unnecessary.

* libguile/feature.c (progargs_fluid): Rename to...
  (scm_program_arguments_fluid): ... this.  Update users.

* libguile/feature.h (scm_program_arguments_fluid): New internal
  declaration.

* libguile/init.c (invoke_main_func): Call
  `scm_i_set_boot_program_arguments' instead of
  `scm_set_program_arguments'.

* libguile/script.c (locale_arguments_to_string_list,
  scm_i_set_boot_program_arguments): New functions.
  (scm_compile_shell_switches): Use `locale_arguments_to_string_list'.

* libguile/script.h (scm_i_set_boot_program_arguments): New internal
  declaration.

* test-suite/standalone/Makefile.am (check_SCRIPTS, TESTS): Add
  `test-command-line-encoding'.
* test-suite/standalone/test-command-line-encoding: New file.
This commit is contained in:
Ludovic Courtès 2011-12-15 01:23:23 +01:00
parent c2c2b5a49b
commit ed4c373966
7 changed files with 81 additions and 11 deletions

View file

@ -22,10 +22,12 @@
# include <config.h>
#endif
#include <localcharset.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <ctype.h>
#include <uniconv.h>
#include "libguile/_scm.h"
#include "libguile/eval.h"
@ -368,6 +370,41 @@ scm_shell_usage (int fatal, char *message)
: SCM_BOOL_F));
}
/* Return a list of strings from ARGV, which contains ARGC strings
assumed to be encoded in the current locale. Use
`environ_locale_charset' instead of relying on
`scm_from_locale_string' because the user hasn't had a change to call
(setlocale LC_ALL "") yet.
XXX: This hack is for 2.0 and will be removed in the next stable
series where the `setlocale' call will be implicit. See
<http://lists.gnu.org/archive/html/guile-devel/2011-11/msg00040.html>
for details. */
static SCM
locale_arguments_to_string_list (int argc, char **const argv)
{
int i;
SCM lst;
const char *encoding;
encoding = environ_locale_charset ();
for (i = argc - 1, lst = SCM_EOL;
i >= 0;
i--)
lst = scm_cons (scm_from_stringn (argv[i], (size_t) -1, encoding,
SCM_FAILED_CONVERSION_ESCAPE_SEQUENCE),
lst);
return lst;
}
/* Set the value returned by `program-arguments', given ARGC and ARGV. */
void
scm_i_set_boot_program_arguments (int argc, char *argv[])
{
scm_fluid_set_x (scm_program_arguments_fluid,
locale_arguments_to_string_list (argc, argv));
}
/* Given an array of command-line switches, return a Scheme expression
to carry out the actions specified by the switches.
@ -378,7 +415,7 @@ scm_compile_shell_switches (int argc, char **argv)
{
return scm_call_2 (scm_c_public_ref ("ice-9 command-line",
"compile-shell-switches"),
scm_makfromstrs (argc, argv),
locale_arguments_to_string_list (argc, argv),
(scm_usage_name
? scm_from_locale_string (scm_usage_name)
: scm_from_latin1_string ("guile")));