From 60d67b83f26f9fd6d852bada09ecd77301cedff4 Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" Date: Fri, 9 Jan 1998 23:12:05 +0000 Subject: [PATCH] (Fdo_auto_save): Save and restore multibyteness of minibuffer. (Fwrite_region): Use message_with_string. (auto_save_error, Fdo_auto_save): Likewise. (Ffile_name_directory): Maybe use make_unibyte_string. (Ffile_name_nondirectory): Likewise. (Fsubstitute_in_file_name): Convert substituted envvars to multibyte if necessary. Otherwise use make_unibyte_string. (Finsert_file_contents): Use make_unibyte_string. (double_dollars): Use make_uninit_multibyte_string. --- src/fileio.c | 82 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 61 insertions(+), 21 deletions(-) diff --git a/src/fileio.c b/src/fileio.c index 50c9662eea3..97691a41d3e 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -409,11 +409,14 @@ on VMS, perhaps instead a string ending in `:', `]' or `>'.") } CORRECT_DIR_SEPS (beg); #endif /* DOS_NT */ - return make_string (beg, p - beg); + + if (STRING_MULTIBYTE (filename)) + return make_string (beg, p - beg); + return make_unibyte_string (beg, p - beg); } -DEFUN ("file-name-nondirectory", Ffile_name_nondirectory, Sfile_name_nondirectory, - 1, 1, 0, +DEFUN ("file-name-nondirectory", Ffile_name_nondirectory, + Sfile_name_nondirectory, 1, 1, 0, "Return file name FILENAME sans its directory.\n\ For example, in a Unix-syntax file name,\n\ this is everything after the last slash,\n\ @@ -443,12 +446,16 @@ or the entire name if it contains no slash.") /* only recognise drive specifier at beginning */ && !(p[-1] == ':' && p == beg + 2) #endif - ) p--; + ) + p--; - return make_string (p, end - p); + if (STRING_MULTIBYTE (filename)) + return make_string (p, end - p); + return make_unibyte_string (p, end - p); } -DEFUN ("unhandled-file-name-directory", Funhandled_file_name_directory, Sunhandled_file_name_directory, 1, 1, 0, +DEFUN ("unhandled-file-name-directory", Funhandled_file_name_directory, + Sunhandled_file_name_directory, 1, 1, 0, "Return a directly usable directory name somehow associated with FILENAME.\n\ A `directly usable' directory name is one that may be used without the\n\ intervention of any file handler.\n\ @@ -1932,8 +1939,33 @@ duplicates what `expand-file-name' does.") if (!o) goto badvar; - strcpy (x, o); - x += strlen (o); + if (STRING_MULTIBYTE (filename)) + { + /* If the original string is multibyte, + convert what we substitute into multibyte. */ + unsigned char workbuf[4], *str; + int len; + extern int nonascii_insert_offset; + + while (*o) + { + int c = *o++; + if (c >= 0200) + { + c += nonascii_insert_offset; + len = CHAR_STRING (c, workbuf, str); + bcopy (str, x, len); + x += len; + } + else + *x++ = c; + } + } + else + { + strcpy (x, o); + x += strlen (o); + } } *x = 0; @@ -1956,7 +1988,9 @@ duplicates what `expand-file-name' does.") xnm = p; #endif - return make_string (xnm, x - xnm); + if (STRING_MULTIBYTE (filename)) + return make_string (xnm, x - xnm); + return make_unibyte_string (xnm, x - xnm); badsubst: error ("Bad format environment-variable substitution"); @@ -3260,8 +3294,11 @@ This does code conversion according to the value of\n\ XSTRING (orig_filename)->data, strerror (errno)); else if (nread > 0) { - val = call1 (Vset_auto_coding_function, - make_string (read_buf, nread)); + Lisp_Object tem; + /* Always make this a unibyte string + because we have not yet decoded it. */ + tem = make_unibyte_string (read_buf, nread); + val = call1 (Vset_auto_coding_function, tem); /* Rewind the file for the actual read done later. */ if (lseek (fd, 0, 0) < 0) report_file_error ("Setting file position", @@ -4331,7 +4368,7 @@ to the file, instead of any buffer contents, and END is ignored.") return Qnil; if (!auto_saving) - message ("Wrote %s", XSTRING (visit_file)->data); + message_with_string ("Wrote %s", visit_file, 1); return Qnil; } @@ -4624,11 +4661,11 @@ Lisp_Object auto_save_error () { ring_bell (); - message ("Autosaving...error for %s", XSTRING (current_buffer->name)->data); + message_with_string ("Autosaving...error for %s", current_buffer->name, 1); Fsleep_for (make_number (1), Qnil); - message ("Autosaving...error!for %s", XSTRING (current_buffer->name)->data); + message_with_string ("Autosaving...error for %s", current_buffer->name, 0); Fsleep_for (make_number (1), Qnil); - message ("Autosaving...error for %s", XSTRING (current_buffer->name)->data); + message_with_string ("Autosaving...error for %s", current_buffer->name, 0); Fsleep_for (make_number (1), Qnil); return Qnil; } @@ -4689,6 +4726,7 @@ A non-nil CURRENT-ONLY argument means save only current buffer.") int auto_saved = 0; char *omessage = echo_area_glyphs; int omessage_length = echo_area_glyphs_length; + int oldmultibyte = message_enable_multibyte; int do_handled_files; Lisp_Object oquit; FILE *stream; @@ -4808,8 +4846,8 @@ A non-nil CURRENT-ONLY argument means save only current buffer.") { /* It has shrunk too much; turn off auto-saving here. */ minibuffer_auto_raise = orig_minibuffer_auto_raise; - message ("Buffer %s has shrunk a lot; auto save turned off there", - XSTRING (b->name)->data); + message_with_string ("Buffer %s has shrunk a lot; auto save turned off there", + b->name, 1); minibuffer_auto_raise = 0; /* Turn off auto-saving until there's a real save, and prevent any more warnings. */ @@ -4843,7 +4881,7 @@ A non-nil CURRENT-ONLY argument means save only current buffer.") if (omessage) { sit_for (1, 0, 0, 0, 0); - message2 (omessage, omessage_length); + message2 (omessage, omessage_length, oldmultibyte); } else message1 ("Auto-saving...done"); @@ -4897,14 +4935,16 @@ double_dollars (val) register int n; int osize, count; - osize = XSTRING (val)->size; - /* Quote "$" as "$$" to get it past substitute-in-file-name */ + osize = XSTRING (val)->size_byte; + + /* Count the number of $ characters. */ for (n = osize, count = 0, old = XSTRING (val)->data; n > 0; n--) if (*old++ == '$') count++; if (count > 0) { old = XSTRING (val)->data; - val = Fmake_string (make_number (osize + count), make_number (0)); + val = make_uninit_multibyte_string (XSTRING (val)->size + count, + osize + count); new = XSTRING (val)->data; for (n = osize; n > 0; n--) if (*old != '$') -- 2.39.2