diff --git a/rust_src/remacs-sys/lib.rs b/rust_src/remacs-sys/lib.rs index d6975c85220..89c414b5a5d 100644 --- a/rust_src/remacs-sys/lib.rs +++ b/rust_src/remacs-sys/lib.rs @@ -1296,6 +1296,7 @@ extern "C" { pub static Qsequencep: Lisp_Object; pub static Qcharacterp: Lisp_Object; pub static Qchar_table_p: Lisp_Object; + pub static Qbufferp: Lisp_Object; pub static Qminus: Lisp_Object; pub static Qinteger: Lisp_Object; @@ -1347,7 +1348,6 @@ extern "C" { pub fn Fcurrent_buffer() -> Lisp_Object; pub fn Fsignal(error_symbol: Lisp_Object, data: Lisp_Object) -> !; pub fn Fcopy_sequence(seq: Lisp_Object) -> Lisp_Object; - pub fn Fbuffer_file_name(buffer: Lisp_Object) -> Lisp_Object; pub fn Ffind_operation_coding_system(nargs: ptrdiff_t, args: *mut Lisp_Object) -> Lisp_Object; pub fn Flocal_variable_p(variable: Lisp_Object, buffer: Lisp_Object) -> Lisp_Object; pub fn Ffuncall(nargs: ptrdiff_t, args: *mut Lisp_Object) -> Lisp_Object; diff --git a/rust_src/src/buffers.rs b/rust_src/src/buffers.rs index 85a9da8a47f..eeacc8be413 100644 --- a/rust_src/src/buffers.rs +++ b/rust_src/src/buffers.rs @@ -116,3 +116,16 @@ pub fn current_buffer() -> LispObject { )) } } + +/// Return name of file BUFFER is visiting, or nil if none. +/// No argument or nil as argument means use the current buffer. +#[lisp_fn(min = "0")] +pub fn buffer_file_name(buffer: LispObject) -> LispObject { + let buf = if buffer.is_nil() { + ThreadState::current_buffer() + } else { + buffer.as_buffer_or_error() + }; + + LispObject::from_raw(buf.filename) +} diff --git a/rust_src/src/crypto/mod.rs b/rust_src/src/crypto/mod.rs index dfbc7767bbf..ee6d040a24b 100644 --- a/rust_src/src/crypto/mod.rs +++ b/rust_src/src/crypto/mod.rs @@ -5,7 +5,7 @@ use std; use std::slice; use libc::ptrdiff_t; -use buffers::{LispBufferRef, get_buffer}; +use buffers::{LispBufferRef, get_buffer, buffer_file_name}; use libc; use lisp::{LispObject, LispNumber}; use multibyte::LispStringRef; @@ -14,7 +14,7 @@ use remacs_sys::{preferred_coding_system, Fcoding_system_p, code_convert_string, validate_subarray, string_char_to_byte}; use remacs_sys::{current_thread, record_unwind_current_buffer, set_buffer_internal, make_buffer_string}; -use remacs_sys::{globals, Fbuffer_file_name, Ffind_operation_coding_system, Flocal_variable_p}; +use remacs_sys::{globals, Ffind_operation_coding_system, Flocal_variable_p}; use remacs_sys::{Qmd5, Qsha1, Qsha224, Qsha256, Qsha384, Qsha512, Qstringp, Qraw_text, Qcoding_system_error, Qwrite_region, Qbuffer_file_coding_system}; use remacs_macros::lisp_fn; @@ -112,13 +112,13 @@ fn get_coding_system_for_buffer( return LispObject::from_raw(unsafe { Qraw_text }); } } - if LispObject::from_raw(unsafe { Fbuffer_file_name(object.to_raw()) }).is_not_nil() { + if buffer_file_name(object).is_not_nil() { /* Check file-coding-system-alist. */ let mut args = [ unsafe { Qwrite_region }, start.to_raw(), end.to_raw(), - unsafe { Fbuffer_file_name(object.to_raw()) }, + buffer_file_name(object).to_raw(), ]; let val = LispObject::from_raw(unsafe { Ffind_operation_coding_system(4, args.as_mut_ptr()) diff --git a/rust_src/src/lib.rs b/rust_src/src/lib.rs index bed43b4488b..207f869e5d9 100755 --- a/rust_src/src/lib.rs +++ b/rust_src/src/lib.rs @@ -64,6 +64,9 @@ pub use base64::base64_decode_1; // Used in buffer.c pub use buffers::Fbuffer_live_p; +// Used in nsfns.m +pub use buffers::Fbuffer_file_name; + // These need to be exported as bytecode.c depends upon them. pub use math::Fplus; pub use math::Fminus; @@ -153,6 +156,7 @@ pub extern "C" fn rust_init_syms() { defsubr(&*buffers::Sbuffer_live_p); defsubr(&*buffers::Sget_buffer); defsubr(&*buffers::Scurrent_buffer); + defsubr(&*buffers::Sbuffer_file_name); defsubr(&*windows::Swindowp); defsubr(&*windows::Swindow_live_p); defsubr(&*process::Sget_process); diff --git a/rust_src/src/lisp.rs b/rust_src/src/lisp.rs index 7088abc83a1..cff68fc444d 100644 --- a/rust_src/src/lisp.rs +++ b/rust_src/src/lisp.rs @@ -26,7 +26,7 @@ use remacs_sys::{EmacsInt, EmacsUint, EmacsDouble, VALMASK, VALBITS, INTTYPEBITS Lisp_Misc_Any, Lisp_Misc_Type, Lisp_Float, Lisp_Cons, Lisp_Object, lispsym, make_float, circular_list, internal_equal, Fcons, CHECK_IMPURE, Qnil, Qt, Qnumberp, Qfloatp, Qstringp, Qsymbolp, Qnumber_or_marker_p, Qwholenump, Qvectorp, - Qcharacterp, Qlistp, Qintegerp, Qhash_table_p, Qchar_table_p, Qconsp, + Qcharacterp, Qlistp, Qintegerp, Qhash_table_p, Qchar_table_p, Qconsp, Qbufferp, SYMBOL_NAME, PseudovecType, EqualKind}; // TODO: tweak Makefile to rebuild C files if this changes. @@ -435,6 +435,12 @@ impl LispObject { self.as_vectorlike().map_or(None, |v| v.as_buffer()) } + pub fn as_buffer_or_error(self) -> LispBufferRef { + self.as_buffer().unwrap_or_else( + || wrong_type!(Qbufferp, self), + ) + } + pub fn is_char_table(self) -> bool { self.as_vectorlike().map_or(false, |v| { v.is_pseudovector(PseudovecType::PVEC_CHAR_TABLE) diff --git a/src/buffer.c b/src/buffer.c index e781d386b02..7424544f226 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -1066,14 +1066,6 @@ Return nil if BUFFER has been killed. */) return BVAR (decode_buffer (buffer), name); } -DEFUN ("buffer-file-name", Fbuffer_file_name, Sbuffer_file_name, 0, 1, 0, - doc: /* Return name of file BUFFER is visiting, or nil if none. -No argument or nil as argument means use the current buffer. */) - (register Lisp_Object buffer) -{ - return BVAR (decode_buffer (buffer), filename); -} - DEFUN ("buffer-base-buffer", Fbuffer_base_buffer, Sbuffer_base_buffer, 0, 1, 0, doc: /* Return the base buffer of indirect buffer BUFFER. @@ -6138,7 +6130,6 @@ Functions running this hook are, `get-buffer-create', defsubr (&Smake_indirect_buffer); defsubr (&Sgenerate_new_buffer_name); defsubr (&Sbuffer_name); - defsubr (&Sbuffer_file_name); defsubr (&Sbuffer_base_buffer); defsubr (&Sbuffer_local_value); defsubr (&Sbuffer_local_variables);