aboutsummaryrefslogtreecommitdiffstats
path: root/src/callproc.c
diff options
context:
space:
mode:
authorRichard M. Stallman1998-01-05 17:39:32 +0000
committerRichard M. Stallman1998-01-05 17:39:32 +0000
commit30d57b8e6e138b354768ea8b218412e55e027bbc (patch)
tree0dbf93de3a2ec87731e973fafb9af2cd625eec95 /src/callproc.c
parent1d2fc6120d6a7f3f435506cdb69c76afe2b8a463 (diff)
downloademacs-30d57b8e6e138b354768ea8b218412e55e027bbc.tar.gz
emacs-30d57b8e6e138b354768ea8b218412e55e027bbc.zip
(Fcall_process): When deciding whether to encode args,
check them for multibyteness, don't check enable-multibyte-characters. (Fcall_process): Use size_byte for the args. (Fcall_process_region): Likewise for temp file. (child_setup, getenv_internal, Fgetenv): Likewise.
Diffstat (limited to 'src/callproc.c')
-rw-r--r--src/callproc.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/src/callproc.c b/src/callproc.c
index 697a3befb1d..e1eff4f549d 100644
--- a/src/callproc.c
+++ b/src/callproc.c
@@ -248,9 +248,15 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.")
248 /* If arguments are supplied, we may have to encode them. */ 248 /* If arguments are supplied, we may have to encode them. */
249 if (nargs >= 5) 249 if (nargs >= 5)
250 { 250 {
251 int must_encode = 0;
252
253 for (i = 0; i < nargs; i++)
254 if (STRING_MULTIBYTE (args[i]))
255 must_encode = 1;
256
251 if (!NILP (Vcoding_system_for_write)) 257 if (!NILP (Vcoding_system_for_write))
252 val = Vcoding_system_for_write; 258 val = Vcoding_system_for_write;
253 else if (NILP (current_buffer->enable_multibyte_characters)) 259 else if (! must_encode)
254 val = Qnil; 260 val = Qnil;
255 else 261 else
256 { 262 {
@@ -439,7 +445,7 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.")
439 for (i = 4; i < nargs; i++) 445 for (i = 4; i < nargs; i++)
440 { 446 {
441 int size = encoding_buffer_size (&argument_coding, 447 int size = encoding_buffer_size (&argument_coding,
442 XSTRING (args[i])->size); 448 XSTRING (args[i])->size_byte);
443 unsigned char *dummy1 = (unsigned char *) alloca (size); 449 unsigned char *dummy1 = (unsigned char *) alloca (size);
444 int produced, dummy; 450 int produced, dummy;
445 451
@@ -448,7 +454,8 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.")
448 produced = encode_coding (&argument_coding, 454 produced = encode_coding (&argument_coding,
449 XSTRING (args[i])->data, 455 XSTRING (args[i])->data,
450 new_argv[i - 3], 456 new_argv[i - 3],
451 XSTRING (args[i])->size, size, &dummy); 457 XSTRING (args[i])->size_byte,
458 size, &dummy);
452 new_argv[i - 3][produced] = 0; 459 new_argv[i - 3][produced] = 0;
453 } 460 }
454 UNGCPRO; 461 UNGCPRO;
@@ -824,9 +831,9 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.")
824 strcat (tempfile, "detmp.XXX"); 831 strcat (tempfile, "detmp.XXX");
825#endif 832#endif
826#else /* not DOS_NT */ 833#else /* not DOS_NT */
827 char *tempfile = (char *) alloca (XSTRING (Vtemp_file_name_pattern)->size + 1); 834 char *tempfile = (char *) alloca (XSTRING (Vtemp_file_name_pattern)->size_byte + 1);
828 bcopy (XSTRING (Vtemp_file_name_pattern)->data, tempfile, 835 bcopy (XSTRING (Vtemp_file_name_pattern)->data, tempfile,
829 XSTRING (Vtemp_file_name_pattern)->size + 1); 836 XSTRING (Vtemp_file_name_pattern)->size_byte + 1);
830#endif /* not DOS_NT */ 837#endif /* not DOS_NT */
831 838
832 mktemp (tempfile); 839 mktemp (tempfile);
@@ -964,7 +971,7 @@ child_setup (in, out, err, new_argv, set_pgrp, current_dir)
964 register char *temp; 971 register char *temp;
965 register int i; 972 register int i;
966 973
967 i = XSTRING (current_dir)->size; 974 i = XSTRING (current_dir)->size_byte;
968 pwd_var = (char *) alloca (i + 6); 975 pwd_var = (char *) alloca (i + 6);
969 temp = pwd_var + 4; 976 temp = pwd_var + 4;
970 bcopy ("PWD=", pwd_var, 4); 977 bcopy ("PWD=", pwd_var, 4);
@@ -1159,7 +1166,7 @@ getenv_internal (var, varlen, value, valuelen)
1159 1166
1160 entry = XCONS (scan)->car; 1167 entry = XCONS (scan)->car;
1161 if (STRINGP (entry) 1168 if (STRINGP (entry)
1162 && XSTRING (entry)->size > varlen 1169 && XSTRING (entry)->size_byte > varlen
1163 && XSTRING (entry)->data[varlen] == '=' 1170 && XSTRING (entry)->data[varlen] == '='
1164#ifdef WINDOWSNT 1171#ifdef WINDOWSNT
1165 /* NT environment variables are case insensitive. */ 1172 /* NT environment variables are case insensitive. */
@@ -1170,7 +1177,7 @@ getenv_internal (var, varlen, value, valuelen)
1170 ) 1177 )
1171 { 1178 {
1172 *value = (char *) XSTRING (entry)->data + (varlen + 1); 1179 *value = (char *) XSTRING (entry)->data + (varlen + 1);
1173 *valuelen = XSTRING (entry)->size - (varlen + 1); 1180 *valuelen = XSTRING (entry)->size_byte - (varlen + 1);
1174 return 1; 1181 return 1;
1175 } 1182 }
1176 } 1183 }
@@ -1189,7 +1196,7 @@ This function consults the variable ``process-environment'' for its value.")
1189 int valuelen; 1196 int valuelen;
1190 1197
1191 CHECK_STRING (var, 0); 1198 CHECK_STRING (var, 0);
1192 if (getenv_internal (XSTRING (var)->data, XSTRING (var)->size, 1199 if (getenv_internal (XSTRING (var)->data, XSTRING (var)->size_byte,
1193 &value, &valuelen)) 1200 &value, &valuelen))
1194 return make_string (value, valuelen); 1201 return make_string (value, valuelen);
1195 else 1202 else