merge trunk

This commit is contained in:
Kenichi Handa 2012-10-13 22:11:40 +09:00
commit 2e58893d16
17 changed files with 164 additions and 170 deletions

View file

@ -1,3 +1,7 @@
2012-10-13 Chong Yidong <cyd@gnu.org>
* files.texi (File Conveniences): ImageMagick enabled by default.
2012-10-10 Dani Moncayo <dmoncayo@gmail.com> 2012-10-10 Dani Moncayo <dmoncayo@gmail.com>
* basic.texi (Arguments): Fix typos. * basic.texi (Arguments): Fix typos.

View file

@ -1931,15 +1931,22 @@ non-@code{nil}. Currently, Emacs only supports animation in GIF
files. files.
@cindex ImageMagick support @cindex ImageMagick support
If your Emacs was compiled with ImageMagick support, it is possible @vindex imagemagick-enabled-types
to view a much wider variety of image types in Image mode, by @vindex imagemagick-types-inhibit
rendering the images via ImageMagick. However, this feature is If Emacs was compiled with support for the ImageMagick library, it
currently disabled by default. To enable it, add the following line can use ImageMagick to render a wide variety of images. The variable
to your init file: @code{imagemagick-enabled-types} lists the image types that Emacs may
render using ImageMagick; each element in the list should be an
@example internal ImageMagick name for an image type, as a symbol or an
(imagemagick-register-types) equivalent string (e.g.@: @code{BMP} for @file{.bmp} images). To
@end example enable ImageMagick for all possible image types, change
@code{imagemagick-enabled-types} to @code{t}. The variable
@code{imagemagick-types-inhibit} lists the image types which should
never be rendered using ImageMagick, regardless of the value of
@code{imagemagick-enabled-types} (the default list includes types like
@code{C} and @code{HTML}, which ImageMagick can render as an ``image''
but Emacs should not). To disable ImageMagick entirely, change
@code{imagemagick-types-inhibit} to @code{t}.
@findex thumbs-mode @findex thumbs-mode
@findex mode, thumbs @findex mode, thumbs

View file

@ -1,3 +1,7 @@
2012-10-13 Chong Yidong <cyd@gnu.org>
* display.texi (ImageMagick Images): ImageMagick enabled by default.
2012-10-05 Chong Yidong <cyd@gnu.org> 2012-10-05 Chong Yidong <cyd@gnu.org>
* minibuf.texi (Basic Completion): Clarify list form of completion * minibuf.texi (Basic Completion): Clarify list form of completion

View file

@ -4579,56 +4579,34 @@ specifying the bounding box of the PostScript image, analogous to the
@cindex images, support for more formats @cindex images, support for more formats
If you build Emacs with ImageMagick support, you can use the If you build Emacs with ImageMagick support, you can use the
ImageMagick library to load many image formats. The image type symbol ImageMagick library to load many image formats (@pxref{File
Conveniences,,, emacs, The GNU Emacs Manual}). The image type symbol
for images loaded via ImageMagick is @code{imagemagick}, regardless of for images loaded via ImageMagick is @code{imagemagick}, regardless of
the actual underlying image format. the actual underlying image format.
@defun imagemagick-types @defun imagemagick-types
This function returns a list of image file extensions supported by the This function returns a list of image file extensions supported by the
current ImageMagick installation. current ImageMagick installation. Each list element is a symbol
representing an internal ImageMagick name for an image type, such as
@code{BMP} for @file{.bmp} images.
@end defun @end defun
By default, Emacs does not use ImageMagick to display images in @defopt imagemagick-enabled-types
Image mode, e.g.@: when visiting such files with @kbd{C-x C-f}. This The value of this variable is a list of ImageMagick image types which
feature is enabled by calling @code{imagemagick-register-types}. Emacs may attempt to render using ImageMagick. Each list element
should be one of the symbols in the list returned by
@defun imagemagick-register-types @code{imagemagick-types}, or an equivalent string. Alternatively, a
This function enables using Image mode to visit image files supported value of @code{t} enables ImageMagick for all possible image types.
by ImageMagick. @xref{File Conveniences,,, emacs, The GNU Emacs Regardless of the value of this variable,
Manual}. It also causes @code{create-image} and other helper @code{imagemagick-types-inhibit} (see below) takes precedence.
functions to associate such file names with the @code{imagemagick}
image type (@pxref{Defining Images}).
All image file extensions supported by ImageMagick are registered,
except those specified in @code{imagemagick-types-inhibit}. If Emacs
was not compiled with ImageMagick support, this function does nothing.
@end defun
@defopt imagemagick-types-inhibit
This variable specifies a list of image types that should @emph{not}
be registered by @code{imagemagick-register-types}. Each entry in
this list should be one of the symbols returned by
@code{imagemagick-types}. The default value lists several file types
that are considered ``images'' by ImageMagick, but which should not be
considered as images by Emacs, including C files and HTML files.
@end defopt @end defopt
@ignore @defopt imagemagick-types-inhibit
@c I don't know what this means. I suspect it means eg loading jpg The value of this variable lists the ImageMagick image types which
@c images via libjpeg or ImageMagick. But it doesn't work. should never be rendered using ImageMagick, regardless of the value of
@c If you don't have libjpeg support compiled in, you cannot @code{imagemagick-enabled-types}. A value of @code{t} disables
@c view jpeg images, even if you have imagemagick support: ImageMagick entirely.
@c http://debbugs.gnu.org/9045 @end defopt
@c And if you have both compiled in, then you always get
@c the libjpeg version:
@c http://debbugs.gnu.org/10746
There may be overlap between image loaders in your Emacs installation,
and you may prefer to use a different one for a given image type
(which loader will be used in practice depends on the priority of the
loaders).
For example, if you never want to use the ImageMagick loader to view
JPEG files, add @code{JPG} to this list.
@end ignore
Images loaded with ImageMagick support the following additional Images loaded with ImageMagick support the following additional
image descriptor properties: image descriptor properties:

View file

@ -137,16 +137,16 @@ It is no longer necessary to call `imagemagick-register-types'
explicitly to install ImageMagick image types; that function is called explicitly to install ImageMagick image types; that function is called
automatically at startup, or when customizing a relevant imagemagick- automatically at startup, or when customizing a relevant imagemagick-
option. option.
+++
*** Setting `imagemagick-types-inhibit' to t now disables the use of *** Setting `imagemagick-types-inhibit' to t now disables the use of
ImageMagick to view images. You must call imagemagick-register-types ImageMagick to view images. You must call imagemagick-register-types
afterwards if you do not use customize to change this. afterwards if you do not use customize to change this.
+++
*** The new variable `imagemagick-enabled-types' also affects which *** The new variable `imagemagick-enabled-types' also affects which
ImageMagick types are treated as images. The function ImageMagick types are treated as images. The function
`imagemagick-filter-types' returns the list of types that will be `imagemagick-filter-types' returns the list of types that will be
treated as images. treated as images.
---
*** Images displayed via ImageMagick now support transparency and the *** Images displayed via ImageMagick now support transparency and the
:background image spec property. :background image spec property.

View file

@ -1,3 +1,13 @@
2012-10-13 Chong Yidong <cyd@gnu.org>
* textmodes/ispell.el (ispell-pdict-save): If flyspell-mode is
enabled, re-enable it (Bug#11963).
2012-10-13 Martin Rudalics <rudalics@gmx.at>
* emacs-lisp/debug.el (debug): When debugger-will-be-back is
non-nil, restore window configuration (Bug#12623).
2012-10-12 Stefan Monnier <monnier@iro.umontreal.ca> 2012-10-12 Stefan Monnier <monnier@iro.umontreal.ca>
* help-fns.el (describe-variable, describe-function-1): * help-fns.el (describe-variable, describe-function-1):

View file

@ -213,7 +213,8 @@ first will be printed into the backtrace buffer."
(or enable-recursive-minibuffers (> (minibuffer-depth) 0))) (or enable-recursive-minibuffers (> (minibuffer-depth) 0)))
(standard-input t) (standard-output t) (standard-input t) (standard-output t)
inhibit-redisplay inhibit-redisplay
(cursor-in-echo-area nil)) (cursor-in-echo-area nil)
(window-configuration (current-window-configuration)))
(unwind-protect (unwind-protect
(save-excursion (save-excursion
(when (eq (car debugger-args) 'debug) (when (eq (car debugger-args) 'debug)
@ -266,16 +267,19 @@ first will be printed into the backtrace buffer."
;; Make sure we unbind buffer-read-only in the right buffer. ;; Make sure we unbind buffer-read-only in the right buffer.
(save-excursion (save-excursion
(recursive-edit)))) (recursive-edit))))
(when (and (not debugger-will-be-back) (if debugger-will-be-back
(window-live-p debugger-window) ;; Restore previous window configuration (Bug#12623).
(eq (window-buffer debugger-window) debugger-buffer)) (set-window-configuration window-configuration)
;; Record height of debugger window. (when (and (window-live-p debugger-window)
(setq debugger-previous-window-height (eq (window-buffer debugger-window) debugger-buffer))
(window-total-size debugger-window)) (progn
;; Unshow debugger-buffer. ;; Record height of debugger window.
(quit-restore-window debugger-window debugger-bury-or-kill) (setq debugger-previous-window-height
;; Restore current buffer (Bug#12502). (window-total-size debugger-window))
(set-buffer debugger-old-buffer)) ;; Unshow debugger-buffer.
(quit-restore-window debugger-window debugger-bury-or-kill)
;; Restore current buffer (Bug#12502).
(set-buffer debugger-old-buffer))))
;; Restore previous state of debugger-buffer in case we were ;; Restore previous state of debugger-buffer in case we were
;; in a recursive invocation of the debugger, otherwise just ;; in a recursive invocation of the debugger, otherwise just
;; erase the buffer and put it into fundamental mode. ;; erase the buffer and put it into fundamental mode.

View file

@ -1893,11 +1893,14 @@ If so, ask if it needs to be saved."
(interactive (list ispell-silently-savep t)) (interactive (list ispell-silently-savep t))
(if (and ispell-pdict-modified-p (listp ispell-pdict-modified-p)) (if (and ispell-pdict-modified-p (listp ispell-pdict-modified-p))
(setq ispell-pdict-modified-p (car ispell-pdict-modified-p))) (setq ispell-pdict-modified-p (car ispell-pdict-modified-p)))
(if (or ispell-pdict-modified-p force-save) (when (and (or ispell-pdict-modified-p force-save)
(if (or no-query (y-or-n-p "Personal dictionary modified. Save? ")) (or no-query
(progn (y-or-n-p "Personal dictionary modified. Save? ")))
(ispell-send-string "#\n") ; save dictionary (ispell-send-string "#\n") ; save dictionary
(message "Personal dictionary saved.")))) (message "Personal dictionary saved.")
(when flyspell-mode
(flyspell-mode 0)
(flyspell-mode 1)))
;; unassert variable, even if not saved to avoid questioning. ;; unassert variable, even if not saved to avoid questioning.
(setq ispell-pdict-modified-p nil)) (setq ispell-pdict-modified-p nil))

View file

@ -1,3 +1,14 @@
2012-10-13 Liam Stitt <stittl@cuug.ab.ca> (tiny change)
* url-vars.el (url-uncompressor-alist):
* url-file.el (url-file-find-possibly-compressed-file, url-file):
Recognize .xz compression (Bug#11839).
2012-10-13 Chong Yidong <cyd@gnu.org>
* url-http.el (url-http):
* url.el (url-retrieve-internal): Doc fix (Bug#6407).
2012-10-08 Glenn Morris <rgm@gnu.org> 2012-10-08 Glenn Morris <rgm@gnu.org>
* url-methods.el (url-scheme-get-property): url-https.el was * url-methods.el (url-scheme-get-property): url-https.el was

View file

@ -40,7 +40,7 @@ can do automatic decompression for them, and won't find 'foo' if
'foo.gz' exists, even though the FTP server would happily serve it up 'foo.gz' exists, even though the FTP server would happily serve it up
to them." to them."
(let ((scratch nil) (let ((scratch nil)
(compressed-extensions '("" ".gz" ".z" ".Z" ".bz2")) (compressed-extensions '("" ".gz" ".z" ".Z" ".bz2" ".xz"))
(found nil)) (found nil))
(while (and compressed-extensions (not found)) (while (and compressed-extensions (not found))
(if (file-exists-p (setq scratch (concat fname (pop compressed-extensions)))) (if (file-exists-p (setq scratch (concat fname (pop compressed-extensions))))
@ -177,6 +177,7 @@ to them."
(".uue" "x-uuencoded") (".uue" "x-uuencoded")
(".hqx" "x-hqx") (".hqx" "x-hqx")
(".bz2" "x-bzip2") (".bz2" "x-bzip2")
(".xz" "x-xz")
(_ nil))) (_ nil)))
(if (file-directory-p filename) (if (file-directory-p filename)

View file

@ -1150,8 +1150,12 @@ the end of the document."
(defun url-http (url callback cbargs &optional retry-buffer) (defun url-http (url callback cbargs &optional retry-buffer)
"Retrieve URL via HTTP asynchronously. "Retrieve URL via HTTP asynchronously.
URL must be a parsed URL. See `url-generic-parse-url' for details. URL must be a parsed URL. See `url-generic-parse-url' for details.
When retrieval is completed, the function CALLBACK is executed with
CBARGS as the arguments. When retrieval is completed, execute the function CALLBACK, using
the arguments listed in CBARGS. The first element in CBARGS
should be a plist describing what has happened so far during the
request, as described in the docstring of `url-retrieve' (if in
doubt, specify nil).
Optional arg RETRY-BUFFER, if non-nil, specifies the buffer of a Optional arg RETRY-BUFFER, if non-nil, specifies the buffer of a
previous `url-http' call, which is being re-attempted." previous `url-http' call, which is being re-attempted."

View file

@ -152,7 +152,8 @@ variable."
(".uue" . "x-uuencoded") (".uue" . "x-uuencoded")
(".hqx" . "x-hqx") (".hqx" . "x-hqx")
(".Z" . "x-compress") (".Z" . "x-compress")
(".bz2" . "x-bzip2")) (".bz2" . "x-bzip2")
(".xz" . "x-xz"))
"An alist of file extensions and appropriate content-transfer-encodings." "An alist of file extensions and appropriate content-transfer-encodings."
:type '(repeat (cons :format "%v" :type '(repeat (cons :format "%v"
(string :tag "Extension") (string :tag "Extension")

View file

@ -131,9 +131,9 @@ characters are percent-encoded; see `url-encode-url'.
CALLBACK is called when the object has been completely retrieved, with CALLBACK is called when the object has been completely retrieved, with
the current buffer containing the object, and any MIME headers associated the current buffer containing the object, and any MIME headers associated
with it. It is called as (apply CALLBACK STATUS CBARGS). with it. It is called as (apply CALLBACK STATUS CBARGS).
STATUS is a list with an even number of elements representing STATUS is a plist representing what happened during the request,
what happened during the request, with most recent events first, with most recent events first, or an empty list if no events have
or an empty list if no events have occurred. Each pair is one of: occurred. Each pair is one of:
\(:redirect REDIRECTED-TO) - the request was redirected to this URL \(:redirect REDIRECTED-TO) - the request was redirected to this URL
\(:error (ERROR-SYMBOL . DATA)) - an error occurred. The error can be \(:error (ERROR-SYMBOL . DATA)) - an error occurred. The error can be
@ -169,8 +169,10 @@ URL-encoded before it's used."
(defun url-retrieve-internal (url callback cbargs &optional silent (defun url-retrieve-internal (url callback cbargs &optional silent
inhibit-cookies) inhibit-cookies)
"Internal function; external interface is `url-retrieve'. "Internal function; external interface is `url-retrieve'.
CBARGS is what the callback will actually receive - the first item is CBARGS is the list of arguments that the callback function will
the list of events, as described in the docstring of `url-retrieve'. receive; its first element should be a plist specifying what has
happened so far during the request, as described in the docstring
of `url-retrieve' (if in doubt, specify nil).
If SILENT, don't message progress reports and the like. If SILENT, don't message progress reports and the like.
If INHIBIT-COOKIES, cookies will neither be stored nor sent to If INHIBIT-COOKIES, cookies will neither be stored nor sent to

View file

@ -3,6 +3,23 @@
* coding.c (detect_coding): Set coding->id before calling * coding.c (detect_coding): Set coding->id before calling
this->detector. this->detector.
2012-10-13 Andreas Schwab <schwab@linux-m68k.org>
* fileio.c: Formatting fixes.
2012-10-13 Paul Eggert <eggert@cs.ucla.edu>
Fix some stat-related races.
* fileio.c (Fwrite_region): Avoid race condition if a file is
removed or renamed by some other process immediately after Emacs
writes it but before Emacs stats it. Do not assume that stat (or
fstat) succeeds.
* image.c (slurp_file): Resolve the file name with fopen + fstat
rather than stat + fopen.
(pbm_read_file) [0]: Remove unused code with stat race.
* process.c (allocate_pty) [HAVE_PTYS && !PTY_ITERATION && !PTY_OPEN]:
Remove ineffective code with stat race.
2012-10-12 Stefan Monnier <monnier@iro.umontreal.ca> 2012-10-12 Stefan Monnier <monnier@iro.umontreal.ca>
* doc.c (get_doc_string): Don't signal an error if the file is missing. * doc.c (get_doc_string): Don't signal an error if the file is missing.

View file

@ -1370,8 +1370,7 @@ See also the function `substitute-in-file-name'.")
p = nm; p = nm;
while (*p) while (*p)
{ {
if (p[0] == '/' && p[1] == '/' if (p[0] == '/' && p[1] == '/')
)
nm = p + 1; nm = p + 1;
if (p[0] == '/' && p[1] == '~') if (p[0] == '/' && p[1] == '~')
nm = p + 1, lose = 1; nm = p + 1, lose = 1;
@ -1510,17 +1509,16 @@ search_embedded_absfilename (char *nm, char *endp)
for (p = nm + 1; p < endp; p++) for (p = nm + 1; p < endp; p++)
{ {
if ((0 if (IS_DIRECTORY_SEP (p[-1])
|| IS_DIRECTORY_SEP (p[-1]))
&& file_name_absolute_p (p) && file_name_absolute_p (p)
#if defined (WINDOWSNT) || defined (CYGWIN) #if defined (WINDOWSNT) || defined (CYGWIN)
/* // at start of file name is meaningful in Apollo, /* // at start of file name is meaningful in Apollo,
WindowsNT and Cygwin systems. */ WindowsNT and Cygwin systems. */
&& !(IS_DIRECTORY_SEP (p[0]) && p - 1 == nm) && !(IS_DIRECTORY_SEP (p[0]) && p - 1 == nm)
#endif /* not (WINDOWSNT || CYGWIN) */ #endif /* not (WINDOWSNT || CYGWIN) */
) )
{ {
for (s = p; *s && (!IS_DIRECTORY_SEP (*s)); s++); for (s = p; *s && !IS_DIRECTORY_SEP (*s); s++);
if (p[0] == '~' && s > p + 1) /* We've got "/~something/". */ if (p[0] == '~' && s > p + 1) /* We've got "/~something/". */
{ {
char *o = alloca (s - p + 1); char *o = alloca (s - p + 1);
@ -1735,7 +1733,7 @@ those `/' is discarded. */)
*x = 0; *x = 0;
/* If /~ or // appears, discard everything through first slash. */ /* If /~ or // appears, discard everything through first slash. */
while ((p = search_embedded_absfilename (xnm, x))) while ((p = search_embedded_absfilename (xnm, x)) != NULL)
/* This time we do not start over because we've already expanded envvars /* This time we do not start over because we've already expanded envvars
and replaced $$ with $. Maybe we should start over as well, but we'd and replaced $$ with $. Maybe we should start over as well, but we'd
need to quote some $ to $$ first. */ need to quote some $ to $$ first. */
@ -2169,7 +2167,7 @@ With a prefix argument, TRASH is nil. */)
encoded_file = ENCODE_FILE (filename); encoded_file = ENCODE_FILE (filename);
if (0 > unlink (SSDATA (encoded_file))) if (unlink (SSDATA (encoded_file)) < 0)
report_file_error ("Removing old name", list1 (filename)); report_file_error ("Removing old name", list1 (filename));
return Qnil; return Qnil;
} }
@ -2218,8 +2216,8 @@ This is what happens in interactive use with M-x. */)
#endif #endif
) )
{ {
Lisp_Object fname = NILP (Ffile_directory_p (file)) Lisp_Object fname = (NILP (Ffile_directory_p (file))
? file : Fdirectory_file_name (file); ? file : Fdirectory_file_name (file));
newname = Fexpand_file_name (Ffile_name_nondirectory (fname), newname); newname = Fexpand_file_name (Ffile_name_nondirectory (fname), newname);
} }
else else
@ -2247,7 +2245,7 @@ This is what happens in interactive use with M-x. */)
|| INTEGERP (ok_if_already_exists)) || INTEGERP (ok_if_already_exists))
barf_or_query_if_file_exists (newname, "rename to it", barf_or_query_if_file_exists (newname, "rename to it",
INTEGERP (ok_if_already_exists), 0, 0); INTEGERP (ok_if_already_exists), 0, 0);
if (0 > rename (SSDATA (encoded_file), SSDATA (encoded_newname))) if (rename (SSDATA (encoded_file), SSDATA (encoded_newname)) < 0)
{ {
if (errno == EXDEV) if (errno == EXDEV)
{ {
@ -2328,7 +2326,7 @@ This is what happens in interactive use with M-x. */)
INTEGERP (ok_if_already_exists), 0, 0); INTEGERP (ok_if_already_exists), 0, 0);
unlink (SSDATA (newname)); unlink (SSDATA (newname));
if (0 > link (SSDATA (encoded_file), SSDATA (encoded_newname))) if (link (SSDATA (encoded_file), SSDATA (encoded_newname)) < 0)
report_file_error ("Adding new name", list2 (file, newname)); report_file_error ("Adding new name", list2 (file, newname));
UNGCPRO; UNGCPRO;
@ -2385,15 +2383,14 @@ This happens for interactive use with M-x. */)
|| INTEGERP (ok_if_already_exists)) || INTEGERP (ok_if_already_exists))
barf_or_query_if_file_exists (linkname, "make it a link", barf_or_query_if_file_exists (linkname, "make it a link",
INTEGERP (ok_if_already_exists), 0, 0); INTEGERP (ok_if_already_exists), 0, 0);
if (0 > symlink (SSDATA (encoded_filename), if (symlink (SSDATA (encoded_filename), SSDATA (encoded_linkname)) < 0)
SSDATA (encoded_linkname)))
{ {
/* If we didn't complain already, silently delete existing file. */ /* If we didn't complain already, silently delete existing file. */
if (errno == EEXIST) if (errno == EEXIST)
{ {
unlink (SSDATA (encoded_linkname)); unlink (SSDATA (encoded_linkname));
if (0 <= symlink (SSDATA (encoded_filename), if (symlink (SSDATA (encoded_filename), SSDATA (encoded_linkname))
SSDATA (encoded_linkname))) >= 0)
{ {
UNGCPRO; UNGCPRO;
return Qnil; return Qnil;
@ -3203,7 +3200,7 @@ emacs_lseek (int fd, EMACS_INT offset, int whence)
{ {
/* Use "&" rather than "&&" to suppress a bogus GCC warning; see /* Use "&" rather than "&&" to suppress a bogus GCC warning; see
<http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43772>. */ <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43772>. */
if (! ((TYPE_MINIMUM (off_t) <= offset) & (offset <= TYPE_MAXIMUM (off_t)))) if (! ((offset >= TYPE_MINIMUM (off_t)) & (offset <= TYPE_MAXIMUM (off_t))))
{ {
errno = EINVAL; errno = EINVAL;
return -1; return -1;
@ -3376,7 +3373,7 @@ variable `last-coding-system-used' to the coding system actually used. */)
if (!NILP (beg)) if (!NILP (beg))
{ {
if (! (RANGED_INTEGERP (0, beg, TYPE_MAXIMUM (off_t)))) if (! RANGED_INTEGERP (0, beg, TYPE_MAXIMUM (off_t)))
wrong_type_argument (intern ("file-offset"), beg); wrong_type_argument (intern ("file-offset"), beg);
beg_offset = XFASTINT (beg); beg_offset = XFASTINT (beg);
} }
@ -3385,7 +3382,7 @@ variable `last-coding-system-used' to the coding system actually used. */)
if (!NILP (end)) if (!NILP (end))
{ {
if (! (RANGED_INTEGERP (0, end, TYPE_MAXIMUM (off_t)))) if (! RANGED_INTEGERP (0, end, TYPE_MAXIMUM (off_t)))
wrong_type_argument (intern ("file-offset"), end); wrong_type_argument (intern ("file-offset"), end);
end_offset = XFASTINT (end); end_offset = XFASTINT (end);
} }
@ -3421,8 +3418,8 @@ variable `last-coding-system-used' to the coding system actually used. */)
if (beg_offset < likely_end) if (beg_offset < likely_end)
{ {
ptrdiff_t buf_bytes = ptrdiff_t buf_bytes
Z_BYTE - (!NILP (replace) ? ZV_BYTE - BEGV_BYTE : 0); = Z_BYTE - (!NILP (replace) ? ZV_BYTE - BEGV_BYTE : 0);
ptrdiff_t buf_growth_max = BUF_BYTES_MAX - buf_bytes; ptrdiff_t buf_growth_max = BUF_BYTES_MAX - buf_bytes;
off_t likely_growth = likely_end - beg_offset; off_t likely_growth = likely_end - beg_offset;
if (buf_growth_max < likely_growth) if (buf_growth_max < likely_growth)
@ -4545,6 +4542,7 @@ This calls `write-region-annotate-functions' at the start, and
int save_errno = 0; int save_errno = 0;
const char *fn; const char *fn;
struct stat st; struct stat st;
EMACS_TIME modtime;
ptrdiff_t count = SPECPDL_INDEX (); ptrdiff_t count = SPECPDL_INDEX ();
int count1; int count1;
Lisp_Object handler; Lisp_Object handler;
@ -4757,12 +4755,19 @@ This calls `write-region-annotate-functions' at the start, and
} }
#endif #endif
modtime = invalid_emacs_time ();
if (visiting)
{
if (fstat (desc, &st) == 0)
modtime = get_stat_mtime (&st);
else
ok = 0, save_errno = errno;
}
/* NFS can report a write failure now. */ /* NFS can report a write failure now. */
if (emacs_close (desc) < 0) if (emacs_close (desc) < 0)
ok = 0, save_errno = errno; ok = 0, save_errno = errno;
stat (fn, &st);
/* Discard the unwind protect for close_file_unwind. */ /* Discard the unwind protect for close_file_unwind. */
specpdl_ptr = specpdl + count1; specpdl_ptr = specpdl + count1;
@ -4790,9 +4795,9 @@ This calls `write-region-annotate-functions' at the start, and
/* Do this before reporting IO error /* Do this before reporting IO error
to avoid a "file has changed on disk" warning on to avoid a "file has changed on disk" warning on
next attempt to save. */ next attempt to save. */
if (visiting) if (EMACS_TIME_VALID_P (modtime))
{ {
current_buffer->modtime = get_stat_mtime (&st); current_buffer->modtime = modtime;
current_buffer->modtime_size = st.st_size; current_buffer->modtime_size = st.st_size;
} }
@ -5042,12 +5047,12 @@ e_write (int desc, Lisp_Object string, ptrdiff_t start, ptrdiff_t end,
if (coding->produced > 0) if (coding->produced > 0)
{ {
coding->produced -= coding->produced
emacs_write (desc, -= emacs_write (desc,
STRINGP (coding->dst_object) STRINGP (coding->dst_object)
? SSDATA (coding->dst_object) ? SSDATA (coding->dst_object)
: (char *) BYTE_POS_ADDR (coding->dst_pos_byte), : (char *) BYTE_POS_ADDR (coding->dst_pos_byte),
coding->produced); coding->produced);
if (coding->produced) if (coding->produced)
return 0; return 0;
@ -5226,8 +5231,8 @@ auto_save_1 (void)
if (stat (SSDATA (BVAR (current_buffer, filename)), &st) >= 0) if (stat (SSDATA (BVAR (current_buffer, filename)), &st) >= 0)
/* But make sure we can overwrite it later! */ /* But make sure we can overwrite it later! */
auto_save_mode_bits = (st.st_mode | 0600) & 0777; auto_save_mode_bits = (st.st_mode | 0600) & 0777;
else if ((modes = Ffile_modes (BVAR (current_buffer, filename)), else if (modes = Ffile_modes (BVAR (current_buffer, filename)),
INTEGERP (modes))) INTEGERP (modes))
/* Remote files don't cooperate with stat. */ /* Remote files don't cooperate with stat. */
auto_save_mode_bits = (XINT (modes) | 0600) & 0777; auto_save_mode_bits = (XINT (modes) | 0600) & 0777;
} }

View file

@ -2140,12 +2140,11 @@ x_find_image_file (Lisp_Object file)
static unsigned char * static unsigned char *
slurp_file (char *file, ptrdiff_t *size) slurp_file (char *file, ptrdiff_t *size)
{ {
FILE *fp = NULL; FILE *fp = fopen (file, "rb");
unsigned char *buf = NULL; unsigned char *buf = NULL;
struct stat st; struct stat st;
if (stat (file, &st) == 0 if (fp && fstat (fileno (fp), &st) == 0
&& (fp = fopen (file, "rb")) != NULL
&& 0 <= st.st_size && st.st_size <= min (PTRDIFF_MAX, SIZE_MAX) && 0 <= st.st_size && st.st_size <= min (PTRDIFF_MAX, SIZE_MAX)
&& (buf = xmalloc (st.st_size), && (buf = xmalloc (st.st_size),
fread (buf, 1, st.st_size, fp) == st.st_size)) fread (buf, 1, st.st_size, fp) == st.st_size))
@ -5004,45 +5003,6 @@ pbm_scan_number (unsigned char **s, unsigned char *end)
} }
#ifdef HAVE_NTGUI
#if 0 /* Unused. ++kfs */
/* Read FILE into memory. Value is a pointer to a buffer allocated
with xmalloc holding FILE's contents. Value is null if an error
occurred. *SIZE is set to the size of the file. */
static char *
pbm_read_file (Lisp_Object file, int *size)
{
FILE *fp = NULL;
char *buf = NULL;
struct stat st;
if (stat (SDATA (file), &st) == 0
&& (fp = fopen (SDATA (file), "rb")) != NULL
&& 0 <= st.st_size && st.st_size <= min (PTRDIFF_MAX, SIZE_MAX)
&& (buf = xmalloc (st.st_size),
fread (buf, 1, st.st_size, fp) == st.st_size))
{
*size = st.st_size;
fclose (fp);
}
else
{
if (fp)
fclose (fp);
if (buf)
{
xfree (buf);
buf = NULL;
}
}
return buf;
}
#endif
#endif /* HAVE_NTGUI */
/* Load PBM image IMG for use on frame F. */ /* Load PBM image IMG for use on frame F. */
static bool static bool

View file

@ -646,23 +646,6 @@ allocate_pty (void)
PTY_OPEN; PTY_OPEN;
#else /* no PTY_OPEN */ #else /* no PTY_OPEN */
{ {
{ /* Some systems name their pseudoterminals so that there are gaps in
the usual sequence - for example, on HP9000/S700 systems, there
are no pseudoterminals with names ending in 'f'. So we wait for
three failures in a row before deciding that we've reached the
end of the ptys. */
int failed_count = 0;
struct stat stb;
if (stat (pty_name, &stb) < 0)
{
failed_count++;
if (failed_count >= 3)
return -1;
}
else
failed_count = 0;
}
# ifdef O_NONBLOCK # ifdef O_NONBLOCK
fd = emacs_open (pty_name, O_RDWR | O_NONBLOCK, 0); fd = emacs_open (pty_name, O_RDWR | O_NONBLOCK, 0);
# else # else