diff options
author | Ken Raeburn <raeburn@raeburn.org> | 2015-11-01 01:42:21 -0400 |
---|---|---|
committer | Ken Raeburn <raeburn@raeburn.org> | 2015-11-01 01:42:21 -0400 |
commit | 39372e1a1032521be74575bb06f95a3898fbae30 (patch) | |
tree | 754bd242a23d2358ea116126fcb0a629947bd9ec /src/buffer.h | |
parent | 6a3121904d76e3b2f63007341d48c5c1af55de80 (diff) | |
parent | e11aaee266da52937a3a031cb108fe13f68958c3 (diff) | |
download | emacs-39372e1a1032521be74575bb06f95a3898fbae30.tar.gz |
merge from trunk
Diffstat (limited to 'src/buffer.h')
-rw-r--r-- | src/buffer.h | 353 |
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 */ |