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:
parent
c2c2b5a49b
commit
ed4c373966
7 changed files with 81 additions and 11 deletions
|
@ -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")));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue