changeset 10310:b0f6fc3f80b1

(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):
author Richard M. Stallman <rms@gnu.org>
date Mon, 02 Jan 1995 09:19:34 +0000
parents fe2243b3186b
children 0de21e27722f
files src/buffer.h
diffstat 1 files changed, 153 insertions(+), 105 deletions(-) [+]
line wrap: on
line diff
--- 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;