# HG changeset patch # User Richard M. Stallman # Date 789038374 0 # Node ID b0f6fc3f80b12d7816d31ad53b141b6149295246 # Parent fe2243b3186b755d2bcf3a1d3aa9bc6c0c56a26e (struct buffer): Fields markers and intervals moved out. (struct buffer_text): Fields markers and intervals moved here. (BUF_MARKERS, BUF_INTERVALS): New macros. (struct buffer): Make buffer_file_type field unconditional. (struct buffer): New field pt_marker. save_modiff field deleted. (struct buffer_text): save_modiff field moved here. (SAVE_MODIFF, BUF_SAVE_MODIFF): New macros. Use them instead of direct access to save_modiff field. (struct buffer): New fields begv_marker, zv_marker. (struct buffer): Make text field be a pointer. The struct buffer_text field renamed to own_text. Add fields indirect_to_buffer and size. Move pt, begv and zv fields here. (struct buffer_text): Moved from here. (BEGV, PT, ZV, BEGV_ADDR, PT_ADDR, ZV_ADDR): Corresponding changes. (BUF_BEGV, BUF_PT, BUF_ZV): Corresponding changes. (SET_BUF_ZV, SET_BUF_PT, point): diff -r fe2243b3186b -r b0f6fc3f80b1 src/buffer.h --- a/src/buffer.h Mon Jan 02 09:18:07 1995 +0000 +++ b/src/buffer.h Mon Jan 02 09:19:34 1995 +0000 @@ -27,58 +27,61 @@ #else /* don't support text properties */ -#define SET_PT(position) (current_buffer->text.pt = (position)) -#define TEMP_SET_PT(position) (current_buffer->text.pt = (position)) +#define SET_PT(position) (current_buffer->pt = (position)) +#define TEMP_SET_PT(position) (current_buffer->pt = (position)) -#define BUF_SET_PT(buffer, position) (buffer->text.pt = (position)) -#define BUF_TEMP_SET_PT(buffer, position) (buffer->text.pt = (position)) +#define BUF_SET_PT(buffer, position) (buffer->pt = (position)) +#define BUF_TEMP_SET_PT(buffer, position) (buffer->pt = (position)) #endif /* don't support text properties */ /* Character position of beginning of buffer. */ #define BEG (1) /* Character position of beginning of accessible range of buffer. */ -#define BEGV (current_buffer->text.begv) +#define BEGV (current_buffer->begv) /* Character position of point in buffer. The "+ 0" makes this not an l-value, so you can't assign to it. Use SET_PT instead. */ -#define PT (current_buffer->text.pt + 0) +#define PT (current_buffer->pt + 0) /* Character position of gap in buffer. */ -#define GPT (current_buffer->text.gpt) +#define GPT (current_buffer->text->gpt) /* Character position of end of accessible range of buffer. */ -#define ZV (current_buffer->text.zv) +#define ZV (current_buffer->zv) /* Character position of end of buffer. */ -#define Z (current_buffer->text.z) +#define Z (current_buffer->text->z) /* Is the current buffer narrowed? */ #define NARROWED ((BEGV != BEG) || (ZV != Z)) /* Modification count. */ -#define MODIFF (current_buffer->text.modiff) +#define MODIFF (current_buffer->text->modiff) + +/* Modification count as of last visit or save. */ +#define SAVE_MODIFF (current_buffer->text->save_modiff) /* Address of beginning of buffer. */ -#define BEG_ADDR (current_buffer->text.beg) +#define BEG_ADDR (current_buffer->text->beg) /* Address of beginning of accessible range of buffer. */ -#define BEGV_ADDR (&FETCH_CHAR (current_buffer->text.begv)) +#define BEGV_ADDR (&FETCH_CHAR (current_buffer->begv)) /* Address of point in buffer. */ -#define PT_ADDR (&FETCH_CHAR (current_buffer->text.pt)) +#define PT_ADDR (&FETCH_CHAR (current_buffer->pt)) /* Address of beginning of gap in buffer. */ -#define GPT_ADDR (current_buffer->text.beg + current_buffer->text.gpt - 1) +#define GPT_ADDR (current_buffer->text->beg + current_buffer->text->gpt - 1) /* Address of end of gap in buffer. */ -#define GAP_END_ADDR (current_buffer->text.beg + current_buffer->text.gpt + current_buffer->text.gap_size - 1) +#define GAP_END_ADDR (current_buffer->text->beg + current_buffer->text->gpt + current_buffer->text->gap_size - 1) /* Address of end of accessible range of buffer. */ -#define ZV_ADDR (&FETCH_CHAR (current_buffer->text.zv)) +#define ZV_ADDR (&FETCH_CHAR (current_buffer->zv)) /* Size of gap. */ -#define GAP_SIZE (current_buffer->text.gap_size) +#define GAP_SIZE (current_buffer->text->gap_size) /* Now similar macros for a specified buffer. Note that many of these evaluate the buffer argument more than once. */ @@ -87,70 +90,87 @@ #define BUF_BEG(buf) (1) /* Character position of beginning of accessible range of buffer. */ -#define BUF_BEGV(buf) ((buf)->text.begv) +#define BUF_BEGV(buf) ((buf)->begv) /* Character position of point in buffer. */ -#define BUF_PT(buf) ((buf)->text.pt) +#define BUF_PT(buf) ((buf)->pt) /* Character position of gap in buffer. */ -#define BUF_GPT(buf) ((buf)->text.gpt) +#define BUF_GPT(buf) ((buf)->text->gpt) /* Character position of end of accessible range of buffer. */ -#define BUF_ZV(buf) ((buf)->text.zv) +#define BUF_ZV(buf) ((buf)->zv) /* Character position of end of buffer. */ -#define BUF_Z(buf) ((buf)->text.z) +#define BUF_Z(buf) ((buf)->text->z) /* Is this buffer narrowed? */ -#define BUF_NARROWED(buf) ((BUF_BEGV(buf) != BUF_BEG(buf)) \ - || (BUF_ZV(buf) != BUF_Z(buf))) +#define BUF_NARROWED(buf) ((BUF_BEGV (buf) != BUF_BEG (buf)) \ + || (BUF_ZV (buf) != BUF_Z (buf))) /* Modification count. */ -#define BUF_MODIFF(buf) ((buf)->text.modiff) +#define BUF_MODIFF(buf) ((buf)->text->modiff) + +/* Modification count as of last visit or save. */ +#define BUF_SAVE_MODIFF(buf) ((buf)->text->save_modiff) + +/* Interval tree of buffer. */ +#define BUF_INTERVALS(buf) ((buf)->text->intervals) + +/* Marker chain of buffer. */ +#define BUF_MARKERS(buf) ((buf)->text->markers) /* Address of beginning of buffer. */ -#define BUF_BEG_ADDR(buf) ((buf)->text.beg) +#define BUF_BEG_ADDR(buf) ((buf)->text->beg) /* Macro for setting the value of BUF_ZV (BUF) to VALUE, by varying the end of the accessible region. */ -#define SET_BUF_ZV(buf, value) ((buf)->text.zv = (value)) -#define SET_BUF_PT(buf, value) ((buf)->text.pt = (value)) +#define SET_BUF_ZV(buf, value) ((buf)->zv = (value)) +#define SET_BUF_PT(buf, value) ((buf)->pt = (value)) /* Size of gap. */ -#define BUF_GAP_SIZE(buf) ((buf)->text.gap_size) +#define BUF_GAP_SIZE(buf) ((buf)->text->gap_size) /* Return the address of character at position POS in buffer BUF. Note that both arguments can be computed more than once. */ #define BUF_CHAR_ADDRESS(buf, pos) \ -((buf)->text.beg + (pos) - 1 \ - + ((pos) >= (buf)->text.gpt ? (buf)->text.gap_size : 0)) +((buf)->text->beg + (pos) - 1 \ + + ((pos) >= (buf)->text->gpt ? (buf)->text->gap_size : 0)) /* Convert the address of a char in the buffer into a character position. */ #define PTR_CHAR_POS(ptr) \ -((ptr) - (current_buffer)->text.beg \ - - (ptr - (current_buffer)->text.beg < (unsigned) GPT ? 0 : GAP_SIZE) \ +((ptr) - (current_buffer)->text->beg \ + - (ptr - (current_buffer)->text->beg < (unsigned) GPT ? 0 : GAP_SIZE) \ + 1) /* Convert the address of a char in the buffer into a character position. */ #define BUF_PTR_CHAR_POS(buf, ptr) \ -((ptr) - (buf)->text.beg \ - - (ptr - (buf)->text.beg < (unsigned) BUF_GPT ((buf)) \ +((ptr) - (buf)->text->beg \ + - (ptr - (buf)->text->beg < (unsigned) BUF_GPT ((buf)) \ ? 0 : BUF_GAP_SIZE ((buf))) \ + 1) struct buffer_text { - unsigned char *beg; /* Actual address of buffer contents. */ - int begv; /* Index of beginning of accessible range. */ - int pt; /* Position of point in buffer. */ - int gpt; /* Index of gap in buffer. */ - int zv; /* Index of end of accessible range. */ - int z; /* Index of end of buffer. */ - int gap_size; /* Size of buffer's gap */ + unsigned char *beg; /* Actual address of buffer contents. */ + int gpt; /* Index of gap in buffer. */ + int z; /* Index of end of buffer. */ + int gap_size; /* Size of buffer's gap. */ int modiff; /* This counts buffer-modification events for this buffer. It is incremented for each such event, and never otherwise changed. */ + int save_modiff; /* Previous value of modiff, as of last + time buffer visited or saved a file. */ + + /* Properties of this buffer's text -- conditionally compiled. */ + DECLARE_INTERVALS + + /* The markers that refer to this buffer. + This is actually a single marker --- + successive elements in its marker `chain' + are the other markers referring to this buffer. */ + Lisp_Object markers; }; struct buffer @@ -158,48 +178,54 @@ /* Everything before the `name' slot must be of a non-Lisp_Object type, and every slot after `name' must be a Lisp_Object. - Check out mark_buffer (alloc.c) to see why. - */ + Check out mark_buffer (alloc.c) to see why. */ - /* This structure holds the coordinates of the buffer contents. */ - struct buffer_text text; + EMACS_INT size; + /* Next buffer, in chain of all buffers including killed buffers. This chain is used only for garbage collection, in order to - collect killed buffers properly. */ + collect killed buffers properly. + Note that vectors and most pseudovectors are all on one chain, + but buffers are on a separate chain of their own. */ struct buffer *next; + + /* This structure holds the coordinates of the buffer contents + in ordinary buffers. In indirect buffers, this is not used. */ + struct buffer_text own_text; + + /* This points to the `struct buffer_text' that used for this buffer. + In an ordinary buffer, this is the own_text field above. + In an indirect buffer, this is the own_text field of another buffer. */ + struct buffer_text *text; + + /* Position of point in buffer. */ + int pt; + /* Index of beginning of accessible range. */ + int begv; + /* Index of end of accessible range. */ + int zv; + + /* In an indirect buffer, this points to the base buffer. + In an ordinary buffer, it is 0. */ + struct buffer *base_buffer; + /* Flags saying which DEFVAR_PER_BUFFER variables are local to this buffer. */ int local_var_flags; - /* Value of text.modiff as of when visited file was read or written. */ - int save_modified; /* Set to the modtime of the visited file when read or written. -1 means visited file was nonexistent. 0 means visited file modtime unknown; in no case complain about any mismatch on next save attempt. */ int modtime; - /* the value of text.modiff at the last auto-save. */ + /* the value of text->modiff at the last auto-save. */ int auto_save_modified; /* The time at which we detected a failure to auto-save, Or -1 if we didn't have a failure. */ int auto_save_failure_time; /* Position in buffer at which display started - the last time this buffer was displayed */ + the last time this buffer was displayed. */ int last_window_start; - /* Properties of this buffer's text -- conditionally compiled. */ - DECLARE_INTERVALS - - /* This is a special exception -- as this slot should not be - marked by gc_sweep, and as it is not lisp-accessible as - a local variable -- so we regard it as not really being of type - Lisp_Object */ - /* the markers that refer to this buffer. - This is actually a single marker --- - successive elements in its marker `chain' - are the other markers referring to this - buffer */ - Lisp_Object markers; - /* If the long line scan cache is enabled (i.e. the buffer-local variable cache-long-line-scans is non-nil), newline_cache points to the newline cache, and width_run_cache points to the @@ -222,45 +248,48 @@ /* Everything from here down must be a Lisp_Object */ - /* the name of this buffer */ + /* The name of this buffer. */ Lisp_Object name; - /* Nuked: buffer number, assigned when buffer made Lisp_Object number;*/ - /* the name of the file associated with this buffer */ + /* The name of the file visited in this buffer, or nil. */ Lisp_Object filename; - /* Dir for expanding relative pathnames */ + /* Dir for expanding relative file names. */ Lisp_Object directory; - /* true iff this buffer has been backed - up (if you write to its associated file - and it hasn't been backed up, then a - backup will be made) */ + /* True iff 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). */ /* This isn't really used by the C code, so could be deleted. */ Lisp_Object backed_up; - /* Length of file when last read or saved. */ + /* Length of file when last read or saved. + This is not in the struct buffer_text + because it's not used in indirect buffers at all. */ Lisp_Object save_length; - /* file name used for auto-saving this buffer */ + /* 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 auto_save_file_name; - /* Non-nil if buffer read-only */ + + /* Non-nil if buffer read-only. */ Lisp_Object read_only; - /* "The mark"; no longer allowed to be nil */ + /* "The mark". This is a marker which may + point into this buffer or may point nowhere. */ Lisp_Object mark; /* Alist of elements (SYMBOL . VALUE-IN-THIS-BUFFER) for all per-buffer variables of this buffer. */ Lisp_Object local_var_alist; - - /* Symbol naming major mode (eg lisp-mode) */ + /* Symbol naming major mode (eg, lisp-mode). */ Lisp_Object major_mode; - /* Pretty name of major mode (eg "Lisp") */ + /* Pretty name of major mode (eg, "Lisp"). */ Lisp_Object mode_name; - /* Format string for mode line */ + /* Mode line element that controls format of mode line. */ Lisp_Object mode_line_format; - /* Keys that are bound local to this buffer */ + /* Keys that are bound local to this buffer. */ Lisp_Object keymap; - /* This buffer's local abbrev table */ + /* This buffer's local abbrev table. */ Lisp_Object abbrev_table; - /* This buffer's syntax table. */ + /* This buffer's syntax table. */ Lisp_Object syntax_table; /* Values of several buffer-local variables */ @@ -270,48 +299,52 @@ Lisp_Object tab_width; Lisp_Object fill_column; Lisp_Object left_margin; - /* Function to call when insert space past fill column */ + /* Function to call when insert space past fill column. */ Lisp_Object auto_fill_function; -#ifdef DOS_NT - /* nil: text, t: binary. */ + /* nil: text, t: binary. + This value is meaningful only on certain operating systems. */ Lisp_Object buffer_file_type; -#endif /* DOS_NT */ /* String of length 256 mapping each char to its lower-case version. */ Lisp_Object downcase_table; /* String of length 256 mapping each char to its upper-case version. */ Lisp_Object upcase_table; + /* Translate table for case-folding search. */ + Lisp_Object case_canon_table; + /* Inverse translate (equivalence class) table for case-folding search. */ + Lisp_Object case_eqv_table; - /* Non-nil means do not display continuation lines */ + /* Non-nil means do not display continuation lines. */ Lisp_Object truncate_lines; - /* Non-nil means display ctl chars with uparrow */ + /* Non-nil means display ctl chars with uparrow. */ Lisp_Object ctl_arrow; /* Non-nil means do selective display; - See doc string in syms_of_buffer (buffer.c) for details. */ + see doc string in syms_of_buffer (buffer.c) for details. */ Lisp_Object selective_display; #ifndef old /* Non-nil means show ... at end of line followed by invisible lines. */ Lisp_Object selective_display_ellipses; #endif - /* Alist of (FUNCTION . STRING) for each minor mode enabled in buffer. */ + /* Alist of (FUNCTION . STRING) for each minor mode enabled in buffer. */ 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 overwrite_mode; - /* non-nil means abbrev mode is on. Expand abbrevs automatically. */ + /* non-nil means abbrev mode is on. Expand abbrevs automatically. */ Lisp_Object abbrev_mode; - /* Display table to use for text in this buffer. */ + /* Display table to use for text in this buffer. */ Lisp_Object display_table; - /* Translate table for case-folding search. */ - Lisp_Object case_canon_table; - /* Inverse translate (equivalence class) table for case-folding search. */ - Lisp_Object case_eqv_table; - /* Changes in the buffer are recorded here for undo. - t means don't record anything. */ - Lisp_Object undo_list; /* t means the mark and region are currently active. */ Lisp_Object mark_active; + /* Changes in the buffer are recorded here for undo. + t means don't record anything. + This information belongs to the base 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 undo_list; + /* List of overlays that end at or before the current center, in order of end-position. */ Lisp_Object overlays_before; @@ -332,9 +365,24 @@ do a thorough redisplay, we compare this against the buffer's 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. */ + invalidate the width run cache, and re-initialize 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 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 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 zv_marker; + }; /* This points to the current buffer. */ @@ -381,7 +429,7 @@ /* Point in the current buffer. This is an obsolete alias and should be eliminated. */ -#define point (current_buffer->text.pt + 0) +#define point (current_buffer->pt + 0) /* Return character at position n. No range checking. */ #define FETCH_CHAR(n) *(((n)>= GPT ? GAP_SIZE : 0) + (n) + BEG_ADDR - 1) @@ -401,7 +449,7 @@ extern Lisp_Object Fget_file_buffer (); extern Lisp_Object Fnext_overlay_change (); -/* Functions to call before and after each text change. */ +/* Functions to call before and after each text change. */ extern Lisp_Object Vbefore_change_function; extern Lisp_Object Vafter_change_function; extern Lisp_Object Vbefore_change_functions;