|
|
1.1 root 1: /* Header file for the buffer manipulation primitives.
2: Copyright (C) 1985, 1986 Free Software Foundation, Inc.
3:
4: This file is part of GNU Emacs.
5:
6: GNU Emacs is distributed in the hope that it will be useful,
7: but WITHOUT ANY WARRANTY. No author or distributor
8: accepts responsibility to anyone for the consequences of using it
9: or for whether it serves any particular purpose or works at all,
10: unless he says so in writing. Refer to the GNU Emacs General Public
11: License for full details.
12:
13: Everyone is granted permission to copy, modify and redistribute
14: GNU Emacs, but only under the conditions described in the
15: GNU Emacs General Public License. A copy of this license is
16: supposed to have been given to you along with GNU Emacs so you
17: can know your rights and responsibilities. It should be in a
18: file named COPYING. Among other things, the copyright notice
19: and this notice must be preserved on all copies. */
20:
21:
22: #ifdef lint
23: #include "undo.h"
24: #endif /* lint */
25:
26:
27: #define SetPoint point =
28:
29: #define PointRight point +=
30: #define PointLeft point -=
31:
32: struct buffer_text
33: {
34: unsigned char *p1; /* Address of first data char, minus 1 */
35: unsigned char *p2; /* p1 plus gap size */
36: int size1; /* # characters before gap */
37: int size2; /* # characters after gap */
38: int gap; /* gap size in chars */
39: int modified; /* tick at which contents last modified */
40: int head_clip; /* # of first char that's visible (origin 1) */
41: int tail_clip; /* # chars not visible at end of buffer */
42: int pointloc; /* # of char point is at (origin 1) */
43: };
44:
45: /* structure that defines a buffer */
46: struct buffer
47: {
48: /* Everything before the `name' slot must be of a non-Lisp_Object type,
49: and every slot after `name' must be a Lisp_Object
50: This is known about by both mark_buffer (alloc.c) and
51: Flist_buffer_local_variables (buffer.c)
52: */
53:
54: /* This describes the buffer's text */
55: struct buffer_text text;
56: /* Next buffer, in chain of all buffers that exist. */
57: struct buffer *next;
58: /* Flags saying which DefBufferLispVar variables
59: are local to this buffer. */
60: int local_var_flags;
61: /* Value of text.modified when buffer last saved */
62: int save_modified;
63: /* Set to the modtime of the visited file when read or written.
64: -1 means visited file was nonexistent.
65: 0 means visited file modtime unknown; in no case complain
66: about any mismatch on next save attempt. */
67: int modtime;
68: /* the value of text.modified at the last auto-save. */
69: int auto_save_modified;
70: /* Position in buffer at which display started
71: the last time this buffer was displayed */
72: int last_window_start;
73: /* Undo records for changes in this buffer. */
74: struct UndoData *undodata;
75: /* the syntax table in use */
76: struct Lisp_Vector *syntax_table_v;
77:
78: /* This is a special exception -- as this slot should not be
79: marked by gc_sweep, and as it is not lisp-accessible as
80: a local variable -- so re regard it as not really being of type
81: Lisp_Object */
82: /* the markers that refer to this buffer.
83: This is actually a single marker ---
84: successive elements in its marker `chain'
85: are the other markers referring to this
86: buffer */
87: Lisp_Object markers;
88:
89:
90: /* Everything from here down must be a Lisp_Object */
91:
92:
93: /* the name of this buffer */
94: Lisp_Object name;
95: /* Nuked: buffer number, assigned when buffer made Lisp_Object number;*/
96: /* the name of the file associated with this buffer */
97: Lisp_Object filename;
98: /* Dir for expanding relative pathnames */
99: Lisp_Object directory;
100: /* true iff this buffer has been been backed
101: up (if you write to its associated file
102: and it hasn't been backed up, then a
103: backup will be made) */
104: Lisp_Object backed_up;
105: /* Length of file when last read or saved. */
106: Lisp_Object save_length;
107: /* file name used for auto-saving this buffer */
108: Lisp_Object auto_save_file_name;
109: /* Non-nil if buffer read-only */
110: Lisp_Object read_only;
111: /* "The mark"; no longer allowed to be nil */
112: Lisp_Object mark;
113:
114: /* Alist of elements (SYMBOL . VALUE-IN-THIS-BUFFER)
115: for all per-buffer variables of this buffer. */
116: Lisp_Object local_var_alist;
117:
118:
119: /* Symbol naming major mode (eg lisp-mode) */
120: Lisp_Object major_mode;
121: /* Pretty name of major mode (eg "Lisp") */
122: Lisp_Object mode_name;
123: /* Format string for mode line */
124: Lisp_Object mode_line_format;
125:
126: /* Keys that are bound local to this buffer */
127: Lisp_Object keymap;
128: /* This buffer's local abbrev table */
129: Lisp_Object abbrev_table;
130:
131: /* Values of several buffer-local variables */
132: /* tab-width is buffer-local so that redisplay can find it
133: in buffers that are not current */
134: Lisp_Object case_fold_search;
135: Lisp_Object tab_width;
136: Lisp_Object fill_column;
137: Lisp_Object left_margin;
138: /* Function to call when insert space past fiull column */
139: Lisp_Object auto_fill_hook;
140:
141: /* Non-nil means do not display continuation lines */
142: Lisp_Object truncate_lines;
143: /* Non-nil means display ctl chars with uparrow */
144: Lisp_Object ctl_arrow;
145: /* Non-nil means do selective display;
146: See doc string in syms_of_buffer (buffer.c) for details. */
147: Lisp_Object selective_display;
148: /* Non-nil means show ... at end of line followed by invisible lines. */
149: Lisp_Object selective_display_ellipses;
150: /* Alist of (FUNCTION . STRING) for each minor mode enabled in buffer. */
151: Lisp_Object minor_modes;
152: /* t if "self-insertion" should overwrite */
153: Lisp_Object overwrite_mode;
154: /* non-nil means abbrev mode is on. Expand abbrevs automatically. */
155: Lisp_Object abbrev_mode;
156: };
157:
158: extern struct buffer *bf_cur; /* points to the current buffer */
159:
160: /* This structure contains data describing the text of the current buffer.
161: Switching buffers swaps their text data in and out of here */
162:
163: extern struct buffer_text bf_text;
164:
165: /* This structure holds the default values of the buffer-local variables
166: defined with DefBufferLispVar, that have special slots in each buffer.
167: The default value occupies the same slot in this structure
168: as an individual buffer's value occupies in that buffer.
169: Setting the default value also goes through the alist of buffers
170: and stores into each buffer that does not say it has a local value. */
171:
172: extern struct buffer buffer_defaults;
173:
174: /* This structure marks which slots in a buffer have corresponding
175: default values in buffer_defaults.
176: Each such slot has a nonzero value in this structure.
177: The value has only one nonzero bit.
178:
179: When a buffer has its own local value for a slot,
180: the bit for that slot (found in the same slot in this structure)
181: is turned on in the buffer's local_var_flags slot.
182:
183: If a slot in this structure is zero, then even though there may
184: be a DefBufferLispVar for the slot, there is no default valuefeor it;
185: and the corresponding slot in buffer_defaults is not used. */
186:
187: extern struct buffer buffer_local_flags;
188:
189: /* For each buffer slot, this points to the Lisp symbol name
190: for that slot in the current buffer. It is 0 for slots
191: that don't have such names. */
192:
193: extern struct buffer buffer_local_symbols;
194:
195: /* Some aliases for info about the current buffer. */
196:
197: #define bf_p1 bf_text.p1
198: #define bf_p2 bf_text.p2
199: #define bf_s1 bf_text.size1
200: #define bf_s2 bf_text.size2
201: #define bf_gap bf_text.gap
202: #define bf_modified bf_text.modified
203: #define bf_head_clip bf_text.head_clip
204: #define bf_tail_clip bf_text.tail_clip
205: #define point bf_text.pointloc
206:
207: /* Lowest legal value of point for current buffer */
208: #define FirstCharacter bf_text.head_clip
209:
210: /* Number of last visible character in current buffer */
211: /* The highest legal value for point is one greater than this */
212: #define NumCharacters (bf_text.size1+bf_text.size2-bf_text.tail_clip)
213:
214: /* Return character at position n. No range checking */
215: #define CharAt(n) *(((n)>bf_s1 ? bf_p2 : bf_p1) + (n))
216:
217: /* BufferSafeCeiling (resp. BufferSafeFloor), when applied to n, return */
218: /* the max (resp. min) p such that &CharAt (p) - &CharAt (n) == p - n */
219: #define BufferSafeCeiling(n) (bf_s1 + (((n) <= bf_s1) ? 0 : bf_s2))
220:
221: #define BufferSafeFloor(n) (((n) <= bf_s1) ? 1 : bf_s1 + 1)
222:
223: extern void reset_buffer ();
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.