emacs_close (fd);
}
+void
+close_file_ptr_unwind (void *fdp)
+{
+ int fd = *((int *) fdp);
+ if (fd >= 0)
+ emacs_close (fd);
+}
+
void
fclose_unwind (void *arg)
{
fclose (stream);
}
+void
+fclose_ptr_unwind (void *arg)
+{
+ FILE *stream = *((void **) arg);
+ if (stream)
+ fclose (stream);
+}
+
/* Restore point, having saved it as a marker. */
void
{
unsigned char *p = SDATA (name);
- while (*p && ASCII_BYTE_P (*p))
+ while (*p && ASCII_CHAR_P (*p))
p++;
if (*p == '\0')
{
{
Lisp_Object handler;
struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
- ptrdiff_t count = SPECPDL_INDEX ();
+ dynwind_begin ();
Lisp_Object encoded_file, encoded_newname;
#if HAVE_LIBSELINUX
security_context_t con;
/* Likewise for output file name. */
if (NILP (handler))
handler = Ffind_file_name_handler (newname, Qcopy_file);
- if (!NILP (handler))
- RETURN_UNGCPRO (call7 (handler, Qcopy_file, file, newname,
- ok_if_already_exists, keep_time, preserve_uid_gid,
- preserve_permissions));
+ if (!NILP (handler)) {
+ dynwind_end ();
+ return call7 (handler, Qcopy_file, file, newname, ok_if_already_exists, keep_time, preserve_uid_gid, preserve_permissions);
+ }
encoded_file = ENCODE_FILE (file);
encoded_newname = ENCODE_FILE (newname);
if (ifd < 0)
report_file_error ("Opening input file", file);
- record_unwind_protect_int (close_file_unwind, ifd);
+ record_unwind_protect_int_1 (close_file_unwind, ifd, false);
if (fstat (ifd, &st) != 0)
report_file_error ("Input file status", file);
if (ofd < 0)
report_file_error ("Opening output file", newname);
- record_unwind_protect_int (close_file_unwind, ofd);
+ record_unwind_protect_int_1 (close_file_unwind, ofd, false);
if (already_exists)
{
#endif /* MSDOS */
#endif /* not WINDOWSNT */
- /* Discard the unwind protects. */
- specpdl_ptr = specpdl + count;
+ dynwind_end ();
UNGCPRO;
return Qnil;
if (NILP (handler))
handler = Ffind_file_name_handler (newname, Qrename_file);
if (!NILP (handler))
- RETURN_UNGCPRO (call4 (handler, Qrename_file,
- file, newname, ok_if_already_exists));
+ return call4 (handler, Qrename_file, file, newname, ok_if_already_exists);
encoded_file = ENCODE_FILE (file);
encoded_newname = ENCODE_FILE (newname);
NILP (ok_if_already_exists) ? Qnil : Qt,
Qt, Qt, Qt);
- count = SPECPDL_INDEX ();
+ dynwind_begin ();
specbind (Qdelete_by_moving_to_trash, Qnil);
if (!NILP (Ffile_directory_p (file)) && NILP (symlink_target))
call2 (Qdelete_directory, file, Qt);
else
Fdelete_file (file, Qnil);
- unbind_to (count, Qnil);
+ dynwind_end ();
}
else
report_file_errno ("Renaming", list2 (file, newname), rename_errno);
call the corresponding file handler. */
handler = Ffind_file_name_handler (file, Qadd_name_to_file);
if (!NILP (handler))
- RETURN_UNGCPRO (call4 (handler, Qadd_name_to_file, file,
- newname, ok_if_already_exists));
+ return call4 (handler, Qadd_name_to_file, file, newname, ok_if_already_exists);
/* If the new name has special constructs in it,
call the corresponding file handler. */
handler = Ffind_file_name_handler (newname, Qadd_name_to_file);
if (!NILP (handler))
- RETURN_UNGCPRO (call4 (handler, Qadd_name_to_file, file,
- newname, ok_if_already_exists));
+ return call4 (handler, Qadd_name_to_file, file, newname, ok_if_already_exists);
encoded_file = ENCODE_FILE (file);
encoded_newname = ENCODE_FILE (newname);
call the corresponding file handler. */
handler = Ffind_file_name_handler (filename, Qmake_symbolic_link);
if (!NILP (handler))
- RETURN_UNGCPRO (call4 (handler, Qmake_symbolic_link, filename,
- linkname, ok_if_already_exists));
+ return call4 (handler, Qmake_symbolic_link, filename, linkname, ok_if_already_exists);
/* If the new link name has special constructs in it,
call the corresponding file handler. */
handler = Ffind_file_name_handler (linkname, Qmake_symbolic_link);
if (!NILP (handler))
- RETURN_UNGCPRO (call4 (handler, Qmake_symbolic_link, filename,
- linkname, ok_if_already_exists));
+ return call4 (handler, Qmake_symbolic_link, filename, linkname, ok_if_already_exists);
encoded_filename = ENCODE_FILE (filename);
encoded_linkname = ENCODE_FILE (linkname);
acl_t acl;
Lisp_Object acl_string;
char *str;
+# ifndef HAVE_ACL_TYPE_EXTENDED
+ acl_type_t ACL_TYPE_EXTENDED = ACL_TYPE_ACCESS;
+# endif
#endif
absname = expand_and_dir_to_file (filename,
#ifdef HAVE_ACL_SET_FILE
absname = ENCODE_FILE (absname);
- acl = acl_get_file (SSDATA (absname), ACL_TYPE_ACCESS);
+ acl = acl_get_file (SSDATA (absname), ACL_TYPE_EXTENDED);
if (acl == NULL)
return Qnil;
ptrdiff_t how_much;
off_t beg_offset, end_offset;
int unprocessed;
- ptrdiff_t count = SPECPDL_INDEX ();
struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
Lisp_Object handler, val, insval, orig_filename, old_undo;
Lisp_Object p;
&& BEG == Z);
Lisp_Object old_Vdeactivate_mark = Vdeactivate_mark;
bool we_locked_file = 0;
- ptrdiff_t fd_index;
+
+ dynwind_begin ();
if (current_buffer->base_buffer && ! NILP (visit))
error ("Cannot do file visiting in an indirect buffer");
goto notfound;
}
- fd_index = SPECPDL_INDEX ();
- record_unwind_protect_int (close_file_unwind, fd);
+ record_unwind_protect_ptr (close_file_ptr_unwind, &fd);
/* Replacement should preserve point as it preserves markers. */
if (!NILP (replace))
report_file_error ("Read error", orig_filename);
else if (nread > 0)
{
- struct buffer *prev = current_buffer;
Lisp_Object workbuf;
struct buffer *buf;
+ dynwind_begin ();
record_unwind_current_buffer ();
workbuf = Fget_buffer_create (build_string (" *code-converting-work*"));
TEMP_SET_PT_BOTH (BEG, BEG_BYTE);
coding_system = call2 (Vset_auto_coding_function,
filename, make_number (nread));
- set_buffer_internal (prev);
- /* Discard the unwind protect for recovering the
- current buffer. */
- specpdl_ptr--;
+ dynwind_end ();
/* Rewind the file for the actual read done later. */
if (lseek (fd, 0, SEEK_SET) < 0)
if (same_at_start - BEGV_BYTE == end_offset - beg_offset)
{
emacs_close (fd);
- clear_unwind_protect (fd_index);
+ fd = -1;
/* Truncate the buffer to the size of the file. */
del_range_1 (same_at_start, same_at_end, 0, 0);
unsigned char *decoded;
ptrdiff_t temp;
ptrdiff_t this = 0;
- ptrdiff_t this_count = SPECPDL_INDEX ();
bool multibyte
= ! NILP (BVAR (current_buffer, enable_multibyte_characters));
Lisp_Object conversion_buffer;
struct gcpro gcpro1;
+ dynwind_begin ();
conversion_buffer = code_conversion_save (1, multibyte);
/* First read the whole file, performing code conversion into
if (this < 0)
report_file_error ("Read error", orig_filename);
emacs_close (fd);
- clear_unwind_protect (fd_index);
+ fd = -1;
if (unprocessed > 0)
{
}
inserted = 0;
- unbind_to (this_count, Qnil);
+ dynwind_end ();
goto handled;
}
/* Set point before the inserted characters. */
SET_PT_BOTH (temp, same_at_start);
- unbind_to (this_count, Qnil);
+ dynwind_end ();
goto handled;
}
Vdeactivate_mark = Qt;
emacs_close (fd);
- clear_unwind_protect (fd_index);
+ fd = -1;
if (how_much < 0)
report_file_error ("Read error", orig_filename);
care of marker adjustment. By this way, we can run Lisp
program safely before decoding the inserted text. */
Lisp_Object unwind_data;
- ptrdiff_t count1 = SPECPDL_INDEX ();
+ dynwind_begin ();
unwind_data = Fcons (BVAR (current_buffer, enable_multibyte_characters),
Fcons (BVAR (current_buffer, undo_list),
if (CONSP (coding_system))
coding_system = XCAR (coding_system);
}
- unbind_to (count1, Qnil);
+ dynwind_end ();
inserted = Z_BYTE - BEG_BYTE;
}
if (inserted > 0)
{
/* Don't run point motion or modification hooks when decoding. */
- ptrdiff_t count1 = SPECPDL_INDEX ();
ptrdiff_t old_inserted = inserted;
+ dynwind_begin ();
specbind (Qinhibit_point_motion_hooks, Qt);
specbind (Qinhibit_modification_hooks, Qt);
Otherwise start with an empty undo_list. */
bset_undo_list (current_buffer, EQ (old_undo, Qt) ? Qt : Qnil);
- unbind_to (count1, Qnil);
+ dynwind_end ();
}
if (!NILP (visit)
if (NILP (val))
val = list2 (orig_filename, make_number (inserted));
- RETURN_UNGCPRO (unbind_to (count, val));
+ dynwind_end ();
+ return val;
}
\f
static Lisp_Object build_annotations (Lisp_Object, Lisp_Object);
const char *fn;
struct stat st;
struct timespec modtime;
- ptrdiff_t count = SPECPDL_INDEX ();
- ptrdiff_t count1 IF_LINT (= 0);
Lisp_Object handler;
Lisp_Object visit_file;
Lisp_Object annotations;
return val;
}
+ dynwind_begin ();
record_unwind_protect (save_restriction_restore, save_restriction_save ());
/* Special kludge to simplify auto-saving. */
report_file_errno ("Opening output file", filename, open_errno);
}
- count1 = SPECPDL_INDEX ();
- record_unwind_protect_int (close_file_unwind, desc);
+ dynwind_begin ();
+ record_unwind_protect_int_1 (close_file_unwind, desc, false);
}
if (NUMBERP (append))
if (emacs_close (desc) < 0)
ok = 0, save_errno = errno;
- /* Discard the unwind protect for close_file_unwind. */
- specpdl_ptr = specpdl + count1;
+ dynwind_end ();
}
/* Some file systems have a bug where st_mtime is not updated
= XCDR (Vwrite_region_annotation_buffers);
}
- unbind_to (count, Qnil);
+ dynwind_end ();
if (file_locked)
unlock_file (lockname);
int do_handled_files;
Lisp_Object oquit;
FILE *stream = NULL;
- ptrdiff_t count = SPECPDL_INDEX ();
+ dynwind_begin ();
bool orig_minibuffer_auto_raise = minibuffer_auto_raise;
bool old_message_p = 0;
struct auto_save_unwind auto_save_unwind;
Vquit_flag = oquit;
/* This restores the message-stack status. */
- unbind_to (count, Qnil);
+ dynwind_end ();
return Qnil;
}
return Qnil;
}
-Lisp_Object
-Fread_file_name (Lisp_Object prompt, Lisp_Object dir, Lisp_Object default_filename, Lisp_Object mustmatch, Lisp_Object initial, Lisp_Object predicate)
-{
- struct gcpro gcpro1;
- Lisp_Object args[7];
-
- GCPRO1 (default_filename);
- args[0] = intern ("read-file-name");
- args[1] = prompt;
- args[2] = dir;
- args[3] = default_filename;
- args[4] = mustmatch;
- args[5] = initial;
- args[6] = predicate;
- RETURN_UNGCPRO (Ffuncall (7, args));
-}
-
-\f
void
init_fileio (void)
{
void
syms_of_fileio (void)
{
+#include "fileio.x"
+
DEFSYM (Qoperations, "operations");
DEFSYM (Qexpand_file_name, "expand-file-name");
DEFSYM (Qsubstitute_in_file_name, "substitute-in-file-name");
DEFSYM (Qcopy_directory, "copy-directory");
DEFSYM (Qdelete_directory, "delete-directory");
DEFSYM (Qsubstitute_env_in_file_name, "substitute-env-in-file-name");
-
- defsubr (&Sfind_file_name_handler);
- defsubr (&Sfile_name_directory);
- defsubr (&Sfile_name_nondirectory);
- defsubr (&Sunhandled_file_name_directory);
- defsubr (&Sfile_name_as_directory);
- defsubr (&Sdirectory_file_name);
- defsubr (&Smake_temp_name);
- defsubr (&Sexpand_file_name);
- defsubr (&Ssubstitute_in_file_name);
- defsubr (&Scopy_file);
- defsubr (&Smake_directory_internal);
- defsubr (&Sdelete_directory_internal);
- defsubr (&Sdelete_file);
- defsubr (&Srename_file);
- defsubr (&Sadd_name_to_file);
- defsubr (&Smake_symbolic_link);
- defsubr (&Sfile_name_absolute_p);
- defsubr (&Sfile_exists_p);
- defsubr (&Sfile_executable_p);
- defsubr (&Sfile_readable_p);
- defsubr (&Sfile_writable_p);
- defsubr (&Saccess_file);
- defsubr (&Sfile_symlink_p);
- defsubr (&Sfile_directory_p);
- defsubr (&Sfile_accessible_directory_p);
- defsubr (&Sfile_regular_p);
- defsubr (&Sfile_modes);
- defsubr (&Sset_file_modes);
- defsubr (&Sset_file_times);
- defsubr (&Sfile_selinux_context);
- defsubr (&Sfile_acl);
- defsubr (&Sset_file_acl);
- defsubr (&Sset_file_selinux_context);
- defsubr (&Sset_default_file_modes);
- defsubr (&Sdefault_file_modes);
- defsubr (&Sfile_newer_than_file_p);
- defsubr (&Sinsert_file_contents);
- defsubr (&Schoose_write_coding_system);
- defsubr (&Swrite_region);
- defsubr (&Scar_less_than_car);
- defsubr (&Sverify_visited_file_modtime);
- defsubr (&Svisited_file_modtime);
- defsubr (&Sset_visited_file_modtime);
- defsubr (&Sdo_auto_save);
- defsubr (&Sset_buffer_auto_saved);
- defsubr (&Sclear_buffer_auto_save_failure);
- defsubr (&Srecent_auto_save_p);
-
- defsubr (&Snext_read_file_uses_dialog_p);
-
-#ifdef HAVE_SYNC
- defsubr (&Sunix_sync);
-#endif
}