summaryrefslogtreecommitdiff
path: root/src/buffer.h
diff options
context:
space:
mode:
authorKen Raeburn <raeburn@raeburn.org>2015-11-01 01:42:21 -0400
committerKen Raeburn <raeburn@raeburn.org>2015-11-01 01:42:21 -0400
commit39372e1a1032521be74575bb06f95a3898fbae30 (patch)
tree754bd242a23d2358ea116126fcb0a629947bd9ec /src/buffer.h
parent6a3121904d76e3b2f63007341d48c5c1af55de80 (diff)
parente11aaee266da52937a3a031cb108fe13f68958c3 (diff)
downloademacs-39372e1a1032521be74575bb06f95a3898fbae30.tar.gz
merge from trunk
Diffstat (limited to 'src/buffer.h')
-rw-r--r--src/buffer.h353
1 files changed, 187 insertions, 166 deletions
diff --git a/src/buffer.h b/src/buffer.h
index a2645981e01..b36f9c8f895 100644
--- a/src/buffer.h
+++ b/src/buffer.h
@@ -1,6 +1,6 @@
/* Header file for the buffer manipulation primitives.
-Copyright (C) 1985-1986, 1993-1995, 1997-2013 Free Software Foundation,
+Copyright (C) 1985-1986, 1993-1995, 1997-2015 Free Software Foundation,
Inc.
This file is part of GNU Emacs.
@@ -18,13 +18,16 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
-#include <sys/types.h> /* for off_t, time_t */
-#include "systime.h" /* for EMACS_TIME */
+#ifndef EMACS_BUFFER_H
+#define EMACS_BUFFER_H
+
+#include <sys/types.h>
+#include <time.h>
+
+#include "character.h"
+#include "lisp.h"
INLINE_HEADER_BEGIN
-#ifndef BUFFER_INLINE
-# define BUFFER_INLINE INLINE
-#endif
/* Accessing the parameters of the current buffer. */
@@ -229,7 +232,7 @@ INLINE_HEADER_BEGIN
BUF_BEG_UNCHANGED (buf) = (start) - BUF_BEG (buf); \
} \
} \
- while (0)
+ while (false)
/* Macros to set PT in the current buffer, or another buffer. */
@@ -249,6 +252,7 @@ extern void temp_set_point (struct buffer *, ptrdiff_t);
extern void set_point_both (ptrdiff_t, ptrdiff_t);
extern void temp_set_point_both (struct buffer *,
ptrdiff_t, ptrdiff_t);
+extern void set_point_from_marker (Lisp_Object);
extern void enlarge_buffer_text (struct buffer *, ptrdiff_t);
@@ -304,7 +308,7 @@ extern void enlarge_buffer_text (struct buffer *, ptrdiff_t);
else \
wrong_type_argument (Qinteger_or_marker_p, __pos); \
} \
- while (0)
+ while (false)
/* Maximum number of bytes in a buffer.
A buffer cannot contain more bytes than a 1-origin fixnum can represent,
@@ -474,15 +478,18 @@ struct buffer_text
to move a marker within a buffer. */
struct Lisp_Marker *markers;
- /* Usually 0. Temporarily set to 1 in decode_coding_gap to
+ /* Usually false. Temporarily true in decode_coding_gap to
prevent Fgarbage_collect from shrinking the gap and losing
not-yet-decoded bytes. */
- bool inhibit_shrinking;
+ bool_bf inhibit_shrinking : 1;
+
+ /* True if it needs to be redisplayed. */
+ bool_bf redisplay : 1;
};
/* Most code should use this macro to access Lisp fields in struct buffer. */
-#define BVAR(buf, field) ((buf)->INTERNAL_FIELD (field))
+#define BVAR(buf, field) ((buf)->field ## _)
/* This is the structure that the buffer Lisp object points to. */
@@ -491,17 +498,17 @@ struct buffer
struct vectorlike_header header;
/* The name of this buffer. */
- Lisp_Object INTERNAL_FIELD (name);
+ Lisp_Object name_;
/* The name of the file visited in this buffer, or nil. */
- Lisp_Object INTERNAL_FIELD (filename);
+ Lisp_Object filename_;
/* Directory for expanding relative file names. */
- Lisp_Object INTERNAL_FIELD (directory);
+ Lisp_Object directory_;
/* True if this buffer has been backed up (if you write to the visited
file and it hasn't been backed up, then a backup will be made). */
- Lisp_Object INTERNAL_FIELD (backed_up);
+ Lisp_Object backed_up_;
/* Length of file when last read or saved.
-1 means auto saving turned off because buffer shrank a lot.
@@ -509,132 +516,132 @@ struct buffer
(That value is used with buffer-swap-text.)
This is not in the struct buffer_text
because it's not used in indirect buffers at all. */
- Lisp_Object INTERNAL_FIELD (save_length);
+ Lisp_Object save_length_;
/* File name used for auto-saving this buffer.
This is not in the struct buffer_text
because it's not used in indirect buffers at all. */
- Lisp_Object INTERNAL_FIELD (auto_save_file_name);
+ Lisp_Object auto_save_file_name_;
/* Non-nil if buffer read-only. */
- Lisp_Object INTERNAL_FIELD (read_only);
+ Lisp_Object read_only_;
/* "The mark". This is a marker which may
point into this buffer or may point nowhere. */
- Lisp_Object INTERNAL_FIELD (mark);
+ Lisp_Object mark_;
/* Alist of elements (SYMBOL . VALUE-IN-THIS-BUFFER) for all
per-buffer variables of this buffer. For locally unbound
symbols, just the symbol appears as the element. */
- Lisp_Object INTERNAL_FIELD (local_var_alist);
+ Lisp_Object local_var_alist_;
/* Symbol naming major mode (e.g., lisp-mode). */
- Lisp_Object INTERNAL_FIELD (major_mode);
+ Lisp_Object major_mode_;
/* Pretty name of major mode (e.g., "Lisp"). */
- Lisp_Object INTERNAL_FIELD (mode_name);
+ Lisp_Object mode_name_;
/* Mode line element that controls format of mode line. */
- Lisp_Object INTERNAL_FIELD (mode_line_format);
+ Lisp_Object mode_line_format_;
/* Analogous to mode_line_format for the line displayed at the top
of windows. Nil means don't display that line. */
- Lisp_Object INTERNAL_FIELD (header_line_format);
+ Lisp_Object header_line_format_;
/* Keys that are bound local to this buffer. */
- Lisp_Object INTERNAL_FIELD (keymap);
+ Lisp_Object keymap_;
/* This buffer's local abbrev table. */
- Lisp_Object INTERNAL_FIELD (abbrev_table);
+ Lisp_Object abbrev_table_;
/* This buffer's syntax table. */
- Lisp_Object INTERNAL_FIELD (syntax_table);
+ Lisp_Object syntax_table_;
/* This buffer's category table. */
- Lisp_Object INTERNAL_FIELD (category_table);
+ Lisp_Object category_table_;
/* Values of several buffer-local variables. */
/* tab-width is buffer-local so that redisplay can find it
in buffers that are not current. */
- Lisp_Object INTERNAL_FIELD (case_fold_search);
- Lisp_Object INTERNAL_FIELD (tab_width);
- Lisp_Object INTERNAL_FIELD (fill_column);
- Lisp_Object INTERNAL_FIELD (left_margin);
+ Lisp_Object case_fold_search_;
+ Lisp_Object tab_width_;
+ Lisp_Object fill_column_;
+ Lisp_Object left_margin_;
/* Function to call when insert space past fill column. */
- Lisp_Object INTERNAL_FIELD (auto_fill_function);
+ Lisp_Object auto_fill_function_;
/* Case table for case-conversion in this buffer.
This char-table maps each char into its lower-case version. */
- Lisp_Object INTERNAL_FIELD (downcase_table);
+ Lisp_Object downcase_table_;
/* Char-table mapping each char to its upper-case version. */
- Lisp_Object INTERNAL_FIELD (upcase_table);
+ Lisp_Object upcase_table_;
/* Char-table for conversion for case-folding search. */
- Lisp_Object INTERNAL_FIELD (case_canon_table);
+ Lisp_Object case_canon_table_;
/* Char-table of equivalences for case-folding search. */
- Lisp_Object INTERNAL_FIELD (case_eqv_table);
+ Lisp_Object case_eqv_table_;
/* Non-nil means do not display continuation lines. */
- Lisp_Object INTERNAL_FIELD (truncate_lines);
+ Lisp_Object truncate_lines_;
/* Non-nil means to use word wrapping when displaying continuation lines. */
- Lisp_Object INTERNAL_FIELD (word_wrap);
+ Lisp_Object word_wrap_;
/* Non-nil means display ctl chars with uparrow. */
- Lisp_Object INTERNAL_FIELD (ctl_arrow);
+ Lisp_Object ctl_arrow_;
/* Non-nil means reorder bidirectional text for display in the
visual order. */
- Lisp_Object INTERNAL_FIELD (bidi_display_reordering);
+ Lisp_Object bidi_display_reordering_;
/* If non-nil, specifies which direction of text to force in all the
paragraphs of the buffer. Nil means determine paragraph
direction dynamically for each paragraph. */
- Lisp_Object INTERNAL_FIELD (bidi_paragraph_direction);
+ Lisp_Object bidi_paragraph_direction_;
/* Non-nil means do selective display;
see doc string in syms_of_buffer (buffer.c) for details. */
- Lisp_Object INTERNAL_FIELD (selective_display);
+ Lisp_Object selective_display_;
/* Non-nil means show ... at end of line followed by invisible lines. */
- Lisp_Object INTERNAL_FIELD (selective_display_ellipses);
+ Lisp_Object selective_display_ellipses_;
/* Alist of (FUNCTION . STRING) for each minor mode enabled in buffer. */
- Lisp_Object INTERNAL_FIELD (minor_modes);
+ Lisp_Object minor_modes_;
/* t if "self-insertion" should overwrite; `binary' if it should also
overwrite newlines and tabs - for editing executables and the like. */
- Lisp_Object INTERNAL_FIELD (overwrite_mode);
+ Lisp_Object overwrite_mode_;
/* Non-nil means abbrev mode is on. Expand abbrevs automatically. */
- Lisp_Object INTERNAL_FIELD (abbrev_mode);
+ Lisp_Object abbrev_mode_;
/* Display table to use for text in this buffer. */
- Lisp_Object INTERNAL_FIELD (display_table);
+ Lisp_Object display_table_;
/* t means the mark and region are currently active. */
- Lisp_Object INTERNAL_FIELD (mark_active);
+ Lisp_Object mark_active_;
/* Non-nil means the buffer contents are regarded as multi-byte
form of characters, not a binary code. */
- Lisp_Object INTERNAL_FIELD (enable_multibyte_characters);
+ Lisp_Object enable_multibyte_characters_;
/* Coding system to be used for encoding the buffer contents on
saving. */
- Lisp_Object INTERNAL_FIELD (buffer_file_coding_system);
+ Lisp_Object buffer_file_coding_system_;
/* List of symbols naming the file format used for visited file. */
- Lisp_Object INTERNAL_FIELD (file_format);
+ Lisp_Object file_format_;
/* List of symbols naming the file format used for auto-save file. */
- Lisp_Object INTERNAL_FIELD (auto_save_file_format);
+ Lisp_Object auto_save_file_format_;
/* True if the newline position cache, width run cache and BIDI paragraph
cache are enabled. See search.c, indent.c and bidi.c for details. */
- Lisp_Object INTERNAL_FIELD (cache_long_scans);
+ Lisp_Object cache_long_scans_;
/* If the width run cache is enabled, this table contains the
character widths width_run_cache (see above) assumes. When we
@@ -642,105 +649,107 @@ struct buffer
current display table to see whether the display table has
affected the widths of any characters. If it has, we
invalidate the width run cache, and re-initialize width_table. */
- Lisp_Object INTERNAL_FIELD (width_table);
+ Lisp_Object width_table_;
/* In an indirect buffer, or a buffer that is the base of an
indirect buffer, this holds a marker that records
PT for this buffer when the buffer is not current. */
- Lisp_Object INTERNAL_FIELD (pt_marker);
+ Lisp_Object pt_marker_;
/* In an indirect buffer, or a buffer that is the base of an
indirect buffer, this holds a marker that records
BEGV for this buffer when the buffer is not current. */
- Lisp_Object INTERNAL_FIELD (begv_marker);
+ Lisp_Object begv_marker_;
/* In an indirect buffer, or a buffer that is the base of an
indirect buffer, this holds a marker that records
ZV for this buffer when the buffer is not current. */
- Lisp_Object INTERNAL_FIELD (zv_marker);
+ Lisp_Object zv_marker_;
/* This holds the point value before the last scroll operation.
Explicitly setting point sets this to nil. */
- Lisp_Object INTERNAL_FIELD (point_before_scroll);
+ Lisp_Object point_before_scroll_;
/* Truename of the visited file, or nil. */
- Lisp_Object INTERNAL_FIELD (file_truename);
+ Lisp_Object file_truename_;
/* Invisibility spec of this buffer.
t => any non-nil `invisible' property means invisible.
A list => `invisible' property means invisible
if it is memq in that list. */
- Lisp_Object INTERNAL_FIELD (invisibility_spec);
+ Lisp_Object invisibility_spec_;
/* This is the last window that was selected with this buffer in it,
or nil if that window no longer displays this buffer. */
- Lisp_Object INTERNAL_FIELD (last_selected_window);
+ Lisp_Object last_selected_window_;
/* Incremented each time the buffer is displayed in a window. */
- Lisp_Object INTERNAL_FIELD (display_count);
+ Lisp_Object display_count_;
/* Widths of left and right marginal areas for windows displaying
this buffer. */
- Lisp_Object INTERNAL_FIELD (left_margin_cols);
- Lisp_Object INTERNAL_FIELD (right_margin_cols);
+ Lisp_Object left_margin_cols_;
+ Lisp_Object right_margin_cols_;
/* Widths of left and right fringe areas for windows displaying
this buffer. */
- Lisp_Object INTERNAL_FIELD (left_fringe_width);
- Lisp_Object INTERNAL_FIELD (right_fringe_width);
+ Lisp_Object left_fringe_width_;
+ Lisp_Object right_fringe_width_;
/* Non-nil means fringes are drawn outside display margins;
othersize draw them between margin areas and text. */
- Lisp_Object INTERNAL_FIELD (fringes_outside_margins);
+ Lisp_Object fringes_outside_margins_;
- /* Width and type of scroll bar areas for windows displaying
+ /* Width, height and types of scroll bar areas for windows displaying
this buffer. */
- Lisp_Object INTERNAL_FIELD (scroll_bar_width);
- Lisp_Object INTERNAL_FIELD (vertical_scroll_bar_type);
+ Lisp_Object scroll_bar_width_;
+ Lisp_Object scroll_bar_height_;
+ Lisp_Object vertical_scroll_bar_type_;
+ Lisp_Object horizontal_scroll_bar_type_;
/* Non-nil means indicate lines not displaying text (in a style
like vi). */
- Lisp_Object INTERNAL_FIELD (indicate_empty_lines);
+ Lisp_Object indicate_empty_lines_;
/* Non-nil means indicate buffer boundaries and scrolling. */
- Lisp_Object INTERNAL_FIELD (indicate_buffer_boundaries);
+ Lisp_Object indicate_buffer_boundaries_;
/* Logical to physical fringe bitmap mappings. */
- Lisp_Object INTERNAL_FIELD (fringe_indicator_alist);
+ Lisp_Object fringe_indicator_alist_;
/* Logical to physical cursor bitmap mappings. */
- Lisp_Object INTERNAL_FIELD (fringe_cursor_alist);
+ Lisp_Object fringe_cursor_alist_;
/* Time stamp updated each time this buffer is displayed in a window. */
- Lisp_Object INTERNAL_FIELD (display_time);
+ Lisp_Object display_time_;
/* If scrolling the display because point is below the bottom of a
window showing this buffer, try to choose a window start so
that point ends up this number of lines from the top of the
window. Nil means that scrolling method isn't used. */
- Lisp_Object INTERNAL_FIELD (scroll_up_aggressively);
+ Lisp_Object scroll_up_aggressively_;
/* If scrolling the display because point is above the top of a
window showing this buffer, try to choose a window start so
that point ends up this number of lines from the bottom of the
window. Nil means that scrolling method isn't used. */
- Lisp_Object INTERNAL_FIELD (scroll_down_aggressively);
+ Lisp_Object scroll_down_aggressively_;
/* Desired cursor type in this buffer. See the doc string of
per-buffer variable `cursor-type'. */
- Lisp_Object INTERNAL_FIELD (cursor_type);
+ Lisp_Object cursor_type_;
/* An integer > 0 means put that number of pixels below text lines
in the display of this buffer. */
- Lisp_Object INTERNAL_FIELD (extra_line_spacing);
+ Lisp_Object extra_line_spacing_;
/* Cursor type to display in non-selected windows.
t means to use hollow box cursor.
See `cursor-type' for other values. */
- Lisp_Object INTERNAL_FIELD (cursor_in_non_selected_windows);
+ Lisp_Object cursor_in_non_selected_windows_;
/* No more Lisp_Object beyond this point. Except undo_list,
- which is handled specially in Fgarbage_collect . */
+ which is handled specially in Fgarbage_collect. */
/* This structure holds the coordinates of the buffer contents
in ordinary buffers. In indirect buffers, this is not used. */
@@ -794,13 +803,13 @@ struct buffer
char local_flags[MAX_PER_BUFFER_VARS];
/* Set to the modtime of the visited file when read or written.
- EMACS_NSECS (modtime) == NONEXISTENT_MODTIME_NSECS means
- visited file was nonexistent. EMACS_NSECS (modtime) ==
+ modtime.tv_nsec == NONEXISTENT_MODTIME_NSECS means
+ visited file was nonexistent. modtime.tv_nsec ==
UNKNOWN_MODTIME_NSECS means visited file modtime unknown;
in no case complain about any mismatch on next save attempt. */
#define NONEXISTENT_MODTIME_NSECS (-1)
#define UNKNOWN_MODTIME_NSECS (-2)
- EMACS_TIME modtime;
+ struct timespec modtime;
/* Size of the file when modtime was set. This is used to detect the
case where the file grew while we were reading it, so the modtime
@@ -846,12 +855,12 @@ struct buffer
struct region_cache *width_run_cache;
struct region_cache *bidi_paragraph_cache;
- /* Non-zero means don't use redisplay optimizations for
- displaying this buffer. */
- unsigned prevent_redisplay_optimizations_p : 1;
+ /* Non-zero means disable redisplay optimizations when rebuilding the glyph
+ matrices (but not when redrawing). */
+ bool_bf prevent_redisplay_optimizations_p : 1;
/* Non-zero whenever the narrowing is changed in this buffer. */
- unsigned clip_changed : 1;
+ bool_bf clip_changed : 1;
/* List of overlays that end at or before the current center,
in order of end-position. */
@@ -869,105 +878,111 @@ struct buffer
buffer of an indirect buffer. But we can't store it in the
struct buffer_text because local variables have to be right in
the struct buffer. So we copy it around in set_buffer_internal. */
- Lisp_Object INTERNAL_FIELD (undo_list);
+ Lisp_Object undo_list_;
};
/* Most code should use these functions to set Lisp fields in struct
- buffer. */
-BUFFER_INLINE void
+ buffer. (Some setters that are private to a single .c file are
+ defined as static in those files.) */
+INLINE void
bset_bidi_paragraph_direction (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (bidi_paragraph_direction) = val;
+ b->bidi_paragraph_direction_ = val;
+}
+INLINE void
+bset_cache_long_scans (struct buffer *b, Lisp_Object val)
+{
+ b->cache_long_scans_ = val;
}
-BUFFER_INLINE void
+INLINE void
bset_case_canon_table (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (case_canon_table) = val;
+ b->case_canon_table_ = val;
}
-BUFFER_INLINE void
+INLINE void
bset_case_eqv_table (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (case_eqv_table) = val;
+ b->case_eqv_table_ = val;
}
-BUFFER_INLINE void
+INLINE void
bset_directory (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (directory) = val;
+ b->directory_ = val;
}
-BUFFER_INLINE void
+INLINE void
bset_display_count (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (display_count) = val;
+ b->display_count_ = val;
}
-BUFFER_INLINE void
+INLINE void
bset_display_time (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (display_time) = val;
+ b->display_time_ = val;
}
-BUFFER_INLINE void
+INLINE void
bset_downcase_table (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (downcase_table) = val;
+ b->downcase_table_ = val;
}
-BUFFER_INLINE void
+INLINE void
bset_enable_multibyte_characters (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (enable_multibyte_characters) = val;
+ b->enable_multibyte_characters_ = val;
}
-BUFFER_INLINE void
+INLINE void
bset_filename (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (filename) = val;
+ b->filename_ = val;
}
-BUFFER_INLINE void
+INLINE void
bset_keymap (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (keymap) = val;
+ b->keymap_ = val;
}
-BUFFER_INLINE void
+INLINE void
bset_last_selected_window (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (last_selected_window) = val;
+ b->last_selected_window_ = val;
}
-BUFFER_INLINE void
+INLINE void
bset_local_var_alist (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (local_var_alist) = val;
+ b->local_var_alist_ = val;
}
-BUFFER_INLINE void
+INLINE void
bset_mark_active (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (mark_active) = val;
+ b->mark_active_ = val;
}
-BUFFER_INLINE void
+INLINE void
bset_point_before_scroll (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (point_before_scroll) = val;
+ b->point_before_scroll_ = val;
}
-BUFFER_INLINE void
+INLINE void
bset_read_only (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (read_only) = val;
+ b->read_only_ = val;
}
-BUFFER_INLINE void
+INLINE void
bset_truncate_lines (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (truncate_lines) = val;
+ b->truncate_lines_ = val;
}
-BUFFER_INLINE void
+INLINE void
bset_undo_list (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (undo_list) = val;
+ b->undo_list_ = val;
}
-BUFFER_INLINE void
+INLINE void
bset_upcase_table (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (upcase_table) = val;
+ b->upcase_table_ = val;
}
-BUFFER_INLINE void
+INLINE void
bset_width_table (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (width_table) = val;
+ b->width_table_ = val;
}
/* Number of Lisp_Objects at the beginning of struct buffer.
@@ -1014,7 +1029,7 @@ bset_width_table (struct buffer *b, Lisp_Object val)
else \
eassert (b->indirections >= 0); \
} \
- } while (0)
+ } while (false)
/* Chain of all buffers, including killed ones. */
@@ -1068,13 +1083,21 @@ extern ptrdiff_t overlay_strings (ptrdiff_t, struct window *, unsigned char **);
extern void validate_region (Lisp_Object *, Lisp_Object *);
extern void set_buffer_internal_1 (struct buffer *);
extern void set_buffer_temp (struct buffer *);
-extern Lisp_Object buffer_local_value_1 (Lisp_Object, Lisp_Object);
+extern Lisp_Object buffer_local_value (Lisp_Object, Lisp_Object);
extern void record_buffer (Lisp_Object);
extern void fix_overlays_before (struct buffer *, ptrdiff_t, ptrdiff_t);
extern void mmap_set_vars (bool);
extern void restore_buffer (Lisp_Object);
extern void set_buffer_if_live (Lisp_Object);
+/* Return B as a struct buffer pointer, defaulting to the current buffer. */
+
+INLINE struct buffer *
+decode_buffer (Lisp_Object b)
+{
+ return NILP (b) ? current_buffer : (CHECK_BUFFER (b), XBUFFER (b));
+}
+
/* Set the current buffer to B.
We previously set windows_or_buffers_changed here to invalidate
@@ -1084,7 +1107,7 @@ extern void set_buffer_if_live (Lisp_Object);
windows than the selected one requires a select_window at some
time, and that increments windows_or_buffers_changed. */
-BUFFER_INLINE void
+INLINE void
set_buffer_internal (struct buffer *b)
{
if (current_buffer != b)
@@ -1094,7 +1117,7 @@ set_buffer_internal (struct buffer *b)
/* Arrange to go back to the original buffer after the next
call to unbind_to if the original buffer is still alive. */
-BUFFER_INLINE void
+INLINE void
record_unwind_current_buffer (void)
{
record_unwind_protect (set_buffer_if_live, Fcurrent_buffer ());
@@ -1107,23 +1130,19 @@ record_unwind_current_buffer (void)
#define GET_OVERLAYS_AT(posn, overlays, noverlays, nextp, chrq) \
do { \
ptrdiff_t maxlen = 40; \
- overlays = alloca (maxlen * sizeof *overlays); \
- noverlays = overlays_at (posn, 0, &overlays, &maxlen, \
- nextp, NULL, chrq); \
- if (noverlays > maxlen) \
+ SAFE_NALLOCA (overlays, 1, maxlen); \
+ (noverlays) = overlays_at (posn, false, &(overlays), &maxlen, \
+ nextp, NULL, chrq); \
+ if ((noverlays) > maxlen) \
{ \
maxlen = noverlays; \
- overlays = alloca (maxlen * sizeof *overlays); \
- noverlays = overlays_at (posn, 0, &overlays, &maxlen, \
- nextp, NULL, chrq); \
+ SAFE_NALLOCA (overlays, 1, maxlen); \
+ (noverlays) = overlays_at (posn, false, &(overlays), &maxlen, \
+ nextp, NULL, chrq); \
} \
- } while (0)
+ } while (false)
extern Lisp_Object Vbuffer_alist;
-extern Lisp_Object Qbefore_change_functions;
-extern Lisp_Object Qafter_change_functions;
-extern Lisp_Object Qfirst_change_hook;
-extern Lisp_Object Qpriority, Qbefore_string, Qafter_string;
/* FOR_EACH_LIVE_BUFFER (LIST_VAR, BUF_VAR) followed by a statement is
a `for' loop which iterates over the buffers from Vbuffer_alist. */
@@ -1133,7 +1152,7 @@ extern Lisp_Object Qpriority, Qbefore_string, Qafter_string;
/* Get text properties of B. */
-BUFFER_INLINE INTERVAL
+INLINE INTERVAL
buffer_intervals (struct buffer *b)
{
eassert (b->text != NULL);
@@ -1142,7 +1161,7 @@ buffer_intervals (struct buffer *b)
/* Set text properties of B to I. */
-BUFFER_INLINE void
+INLINE void
set_buffer_intervals (struct buffer *b, INTERVAL i)
{
eassert (b->text != NULL);
@@ -1151,7 +1170,7 @@ set_buffer_intervals (struct buffer *b, INTERVAL i)
/* Non-zero if current buffer has overlays. */
-BUFFER_INLINE bool
+INLINE bool
buffer_has_overlays (void)
{
return current_buffer->overlays_before || current_buffer->overlays_after;
@@ -1171,7 +1190,7 @@ buffer_has_overlays (void)
the buffer to the next character after fetching this one. Instead,
use either FETCH_CHAR_ADVANCE or STRING_CHAR_AND_LENGTH. */
-BUFFER_INLINE int
+INLINE int
FETCH_MULTIBYTE_CHAR (ptrdiff_t pos)
{
unsigned char *p = ((pos >= GPT_BYTE ? GAP_SIZE : 0)
@@ -1183,7 +1202,7 @@ FETCH_MULTIBYTE_CHAR (ptrdiff_t pos)
If POS doesn't point the head of valid multi-byte form, only the byte at
POS is returned. No range checking. */
-BUFFER_INLINE int
+INLINE int
BUF_FETCH_MULTIBYTE_CHAR (struct buffer *buf, ptrdiff_t pos)
{
unsigned char *p
@@ -1194,7 +1213,7 @@ BUF_FETCH_MULTIBYTE_CHAR (struct buffer *buf, ptrdiff_t pos)
/* Return number of windows showing B. */
-BUFFER_INLINE int
+INLINE int
buffer_window_count (struct buffer *b)
{
if (b->base_buffer)
@@ -1236,7 +1255,7 @@ extern int last_per_buffer_idx;
from the start of a buffer structure. */
#define PER_BUFFER_VAR_OFFSET(VAR) \
- offsetof (struct buffer, INTERNAL_FIELD (VAR))
+ offsetof (struct buffer, VAR ## _)
/* Used to iterate over normal Lisp_Object fields of struct buffer (all
Lisp_Objects except undo_list). If you add, remove, or reorder
@@ -1256,12 +1275,12 @@ extern int last_per_buffer_idx;
#define PER_BUFFER_VAR_IDX(VAR) \
PER_BUFFER_IDX (PER_BUFFER_VAR_OFFSET (VAR))
-/* Value is non-zero if the variable with index IDX has a local value
+/* Value is true if the variable with index IDX has a local value
in buffer B. */
#define PER_BUFFER_VALUE_P(B, IDX) \
(((IDX) < 0 || IDX >= last_per_buffer_idx) \
- ? (emacs_abort (), 0) \
+ ? (emacs_abort (), false) \
: ((B)->local_flags[IDX] != 0))
/* Set whether per-buffer variable with index IDX has a buffer-local
@@ -1272,7 +1291,7 @@ extern int last_per_buffer_idx;
if ((IDX) < 0 || (IDX) >= last_per_buffer_idx) \
emacs_abort (); \
(B)->local_flags[IDX] = (VAL); \
- } while (0)
+ } while (false)
/* Return the index value of the per-buffer variable at offset OFFSET
in the buffer structure.
@@ -1301,13 +1320,13 @@ extern int last_per_buffer_idx;
/* Functions to get and set default value of the per-buffer
variable at offset OFFSET in the buffer structure. */
-BUFFER_INLINE Lisp_Object
+INLINE Lisp_Object
per_buffer_default (int offset)
{
return *(Lisp_Object *)(offset + (char *) &buffer_defaults);
}
-BUFFER_INLINE void
+INLINE void
set_per_buffer_default (int offset, Lisp_Object value)
{
*(Lisp_Object *)(offset + (char *) &buffer_defaults) = value;
@@ -1316,20 +1335,20 @@ set_per_buffer_default (int offset, Lisp_Object value)
/* Functions to get and set buffer-local value of the per-buffer
variable at offset OFFSET in the buffer structure. */
-BUFFER_INLINE Lisp_Object
+INLINE Lisp_Object
per_buffer_value (struct buffer *b, int offset)
{
return *(Lisp_Object *)(offset + (char *) b);
}
-BUFFER_INLINE void
+INLINE void
set_per_buffer_value (struct buffer *b, int offset, Lisp_Object value)
{
*(Lisp_Object *)(offset + (char *) b) = value;
}
/* Downcase a character C, or make no change if that cannot be done. */
-BUFFER_INLINE int
+INLINE int
downcase (int c)
{
Lisp_Object downcase_table = BVAR (current_buffer, downcase_table);
@@ -1337,11 +1356,11 @@ downcase (int c)
return NATNUMP (down) ? XFASTINT (down) : c;
}
-/* 1 if C is upper case. */
-BUFFER_INLINE bool uppercasep (int c) { return downcase (c) != c; }
+/* True if C is upper case. */
+INLINE bool uppercasep (int c) { return downcase (c) != c; }
/* Upcase a character C known to be not upper case. */
-BUFFER_INLINE int
+INLINE int
upcase1 (int c)
{
Lisp_Object upcase_table = BVAR (current_buffer, upcase_table);
@@ -1349,14 +1368,16 @@ upcase1 (int c)
return NATNUMP (up) ? XFASTINT (up) : c;
}
-/* 1 if C is lower case. */
-BUFFER_INLINE bool
+/* True if C is lower case. */
+INLINE bool
lowercasep (int c)
{
return !uppercasep (c) && upcase1 (c) != c;
}
/* Upcase a character C, or make no change if that cannot be done. */
-BUFFER_INLINE int upcase (int c) { return uppercasep (c) ? c : upcase1 (c); }
+INLINE int upcase (int c) { return uppercasep (c) ? c : upcase1 (c); }
INLINE_HEADER_END
+
+#endif /* EMACS_BUFFER_H */