1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29: #define BEG (1)
30: #define BEG_BYTE (BEG)
31:
32:
33: #define BEGV (current_buffer->begv)
34: #define BEGV_BYTE (current_buffer->begv_byte)
35:
36:
37:
38: #define PT (current_buffer->pt + 0)
39: #define PT_BYTE (current_buffer->pt_byte + 0)
40:
41:
42: #define GPT (current_buffer->text->gpt)
43: #define GPT_BYTE (current_buffer->text->gpt_byte)
44:
45:
46: #define ZV (current_buffer->zv)
47: #define ZV_BYTE (current_buffer->zv_byte)
48:
49:
50: #define Z (current_buffer->text->z)
51: #define Z_BYTE (current_buffer->text->z_byte)
52:
53:
54:
55:
56: #define BEG_ADDR (current_buffer->text->beg)
57:
58:
59: #define BEGV_ADDR (BYTE_POS_ADDR (current_buffer->begv_byte))
60:
61:
62: #define PT_ADDR (BYTE_POS_ADDR (current_buffer->pt_byte))
63:
64:
65: #define GPT_ADDR (current_buffer->text->beg + current_buffer->text->gpt_byte - BEG_BYTE)
66:
67:
68: #define GAP_END_ADDR (current_buffer->text->beg + current_buffer->text->gpt_byte + current_buffer->text->gap_size - BEG_BYTE)
69:
70:
71: #define ZV_ADDR (BYTE_POS_ADDR (current_buffer->zv_byte))
72:
73:
74: #define Z_ADDR (current_buffer->text->beg + current_buffer->text->gap_size + current_buffer->text->z_byte - BEG_BYTE)
75:
76:
77: #define GAP_SIZE (current_buffer->text->gap_size)
78:
79:
80: #define NARROWED ((BEGV != BEG) || (ZV != Z))
81:
82:
83: #define MODIFF (current_buffer->text->modiff)
84:
85:
86: #define CHARS_MODIFF (current_buffer->text->chars_modiff)
87:
88:
89: #define OVERLAY_MODIFF (current_buffer->text->overlay_modiff)
90:
91:
92: #define SAVE_MODIFF (current_buffer->text->save_modiff)
93:
94:
95:
96:
97:
98:
99: #define BUFFER_CEILING_OF(BYTEPOS) \
100: (((BYTEPOS) < GPT_BYTE && GPT < ZV ? GPT_BYTE : ZV_BYTE) - 1)
101: #define BUFFER_FLOOR_OF(BYTEPOS) \
102: (BEGV <= GPT && GPT_BYTE <= (BYTEPOS) ? GPT_BYTE : BEGV_BYTE)
103: ^L
104:
105:
106:
107:
108: #define BUF_BEG(buf) (BEG)
109: #define BUF_BEG_BYTE(buf) (BEG_BYTE)
110:
111:
112: #define BUF_BEGV(buf) ((buf)->begv)
113: #define BUF_BEGV_BYTE(buf) ((buf)->begv_byte)
114:
115:
116: #define BUF_PT(buf) ((buf)->pt)
117: #define BUF_PT_BYTE(buf) ((buf)->pt_byte)
118:
119:
120: #define BUF_GPT(buf) ((buf)->text->gpt)
121: #define BUF_GPT_BYTE(buf) ((buf)->text->gpt_byte)
122:
123:
124: #define BUF_ZV(buf) ((buf)->zv)
125: #define BUF_ZV_BYTE(buf) ((buf)->zv_byte)
126:
127:
128: #define BUF_Z(buf) ((buf)->text->z)
129: #define BUF_Z_BYTE(buf) ((buf)->text->z_byte)
130:
131:
132: #define BUF_BEG_ADDR(buf) ((buf)->text->beg)
133:
134:
135: #define BUF_GPT_ADDR(buf) ((buf)->text->beg + (buf)->text->gpt_byte - BEG_BYTE)
136:
137:
138: #define BUF_Z_ADDR(buf) ((buf)->text->beg + (buf)->text->gap_size + (buf)->text->z_byte - BEG_BYTE)
139:
140:
141: #define BUF_GAP_END_ADDR(buf) ((buf)->text->beg + (buf)->text->gpt_byte + (buf)->text->gap_size - BEG_BYTE)
142:
143:
144: #define BUF_GAP_SIZE(buf) ((buf)->text->gap_size)
145:
146:
147: #define BUF_NARROWED(buf) ((BUF_BEGV (buf) != BUF_BEG (buf)) \
148: || (BUF_ZV (buf) != BUF_Z (buf)))
149:
150:
151: #define BUF_MODIFF(buf) ((buf)->text->modiff)
152:
153:
154: #define BUF_CHARS_MODIFF(buf) ((buf)->text->chars_modiff)
155:
156:
157: #define BUF_SAVE_MODIFF(buf) ((buf)->text->save_modiff)
158:
159:
160: #define BUF_OVERLAY_MODIFF(buf) ((buf)->text->overlay_modiff)
161:
162:
163: #define BUF_INTERVALS(buf) ((buf)->text->intervals)
164:
165:
166: #define BUF_MARKERS(buf) ((buf)->text->markers)
167:
168: #define BUF_UNCHANGED_MODIFIED(buf) \
169: ((buf)->text->unchanged_modified)
170:
171: #define BUF_OVERLAY_UNCHANGED_MODIFIED(buf) \
172: ((buf)->text->overlay_unchanged_modified)
173: #define BUF_BEG_UNCHANGED(buf) ((buf)->text->beg_unchanged)
174: #define BUF_END_UNCHANGED(buf) ((buf)->text->end_unchanged)
175:
176: #define UNCHANGED_MODIFIED \
177: BUF_UNCHANGED_MODIFIED (current_buffer)
178: #define OVERLAY_UNCHANGED_MODIFIED \
179: BUF_OVERLAY_UNCHANGED_MODIFIED (current_buffer)
180: #define BEG_UNCHANGED BUF_BEG_UNCHANGED (current_buffer)
181: #define END_UNCHANGED BUF_END_UNCHANGED (current_buffer)
182:
183:
184:
185:
186:
187: #define BUF_COMPUTE_UNCHANGED(buf, start, end) \
188: do \
189: { \
190: if (BUF_UNCHANGED_MODIFIED (buf) == BUF_MODIFF (buf) \
191: && (BUF_OVERLAY_UNCHANGED_MODIFIED (buf) \
192: == BUF_OVERLAY_MODIFF (buf))) \
193: { \
194: BUF_BEG_UNCHANGED (buf) = (start) - BUF_BEG (buf); \
195: BUF_END_UNCHANGED (buf) = BUF_Z (buf) - (end); \
196: } \
197: else \
198: { \
199: if (BUF_Z (buf) - (end) < BUF_END_UNCHANGED (buf)) \
200: BUF_END_UNCHANGED (buf) = BUF_Z (buf) - (end); \
201: if ((start) - BUF_BEG (buf) < BUF_BEG_UNCHANGED (buf)) \
202: BUF_BEG_UNCHANGED (buf) = (start) - BUF_BEG (buf); \
203: } \
204: } \
205: while (0)
206:
207: ^L
208:
209:
210: #define SET_PT(position) (set_point (current_buffer, (position)))
211: #define TEMP_SET_PT(position) (temp_set_point (current_buffer, (position)))
212:
213: #define SET_PT_BOTH(position, byte) \
214: (set_point_both (current_buffer, (position), (byte)))
215: #define TEMP_SET_PT_BOTH(position, byte) \
216: (temp_set_point_both (current_buffer, (position), (byte)))
217:
218: #define BUF_SET_PT(buffer, position) \
219: (set_point ((buffer), (position)))
220: #define BUF_TEMP_SET_PT(buffer, position) \
221: (temp_set_point ((buffer), (position)))
222:
223: extern void set_point P_ ((struct buffer *, int));
224: extern INLINE void temp_set_point P_ ((struct buffer *, int));
225: extern void set_point_both P_ ((struct buffer *, int, int));
226: extern INLINE void temp_set_point_both P_ ((struct buffer *, int, int));
227: extern void enlarge_buffer_text P_ ((struct buffer *, int));
228:
229: ^L
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240: #define SET_BUF_BEGV(buf, charpos) \
241: ((buf)->begv_byte = buf_charpos_to_bytepos ((buf), (charpos)), \
242: (buf)->begv = (charpos))
243:
244: #define SET_BUF_ZV(buf, charpos) \
245: ((buf)->zv_byte = buf_charpos_to_bytepos ((buf), (charpos)), \
246: (buf)->zv = (charpos))
247:
248: #define SET_BUF_BEGV_BOTH(buf, charpos, byte) \
249: ((buf)->begv = (charpos), \
250: (buf)->begv_byte = (byte))
251:
252: #define SET_BUF_ZV_BOTH(buf, charpos, byte) \
253: ((buf)->zv = (charpos), \
254: (buf)->zv_byte = (byte))
255:
256: #define SET_BUF_PT_BOTH(buf, charpos, byte) \
257: ((buf)->pt = (charpos), \
258: (buf)->pt_byte = (byte))
259: ^L
260:
261:
262:
263:
264:
265:
266:
267: #define DECODE_POSITION(charpos, bytepos, pos) \
268: if (1) \
269: { \
270: Lisp_Object __pos = (pos); \
271: if (NUMBERP (__pos)) \
272: { \
273: charpos = __pos; \
274: bytepos = buf_charpos_to_bytepos (current_buffer, __pos); \
275: } \
276: else if (MARKERP (__pos)) \
277: { \
278: charpos = marker_position (__pos); \
279: bytepos = marker_byte_position (__pos); \
280: } \
281: else \
282: wrong_type_argument (Qinteger_or_marker_p, __pos); \
283: } \
284: else
285:
286:
287:
288: #define BYTE_POS_ADDR(n) \
289: (((n) >= GPT_BYTE ? GAP_SIZE : 0) + (n) + BEG_ADDR - BEG_BYTE)
290:
291:
292:
293: #define CHAR_POS_ADDR(n) \
294: (((n) >= GPT ? GAP_SIZE : 0) \
295: + buf_charpos_to_bytepos (current_buffer, n) \
296: + BEG_ADDR - BEG_BYTE)
297:
298:
299:
300: #define CHAR_TO_BYTE(charpos) \
301: (buf_charpos_to_bytepos (current_buffer, charpos))
302:
303:
304:
305: #define BYTE_TO_CHAR(bytepos) \
306: (buf_bytepos_to_charpos (current_buffer, bytepos))
307:
308:
309:
310: #define PTR_BYTE_POS(ptr) \
311: ((ptr) - (current_buffer)->text->beg \
312: - (ptr - (current_buffer)->text->beg <= (unsigned) (GPT_BYTE - BEG_BYTE) ? 0 : GAP_SIZE) \
313: + BEG_BYTE)
314:
315:
316:
317: #define FETCH_CHAR(pos) \
318: (!NILP (current_buffer->enable_multibyte_characters) \
319: ? FETCH_MULTIBYTE_CHAR ((pos)) \
320: : FETCH_BYTE ((pos)))
321:
322:
323:
324: #define FETCH_BYTE(n) *(BYTE_POS_ADDR ((n)))
325:
326:
327: extern unsigned char *_fetch_multibyte_char_p;
328: extern int _fetch_multibyte_char_len;
329:
330:
331:
332:
333:
334: #define FETCH_MULTIBYTE_CHAR(pos) \
335: (_fetch_multibyte_char_p = (((pos) >= GPT_BYTE ? GAP_SIZE : 0) \
336: + (pos) + BEG_ADDR - BEG_BYTE), \
337: _fetch_multibyte_char_len \
338: = ((pos) >= GPT_BYTE ? ZV_BYTE : GPT_BYTE) - (pos), \
339: STRING_CHAR (_fetch_multibyte_char_p, _fetch_multibyte_char_len))
340: ^L
341:
342:
343:
344:
345:
346:
347:
348: #define BUF_BYTE_ADDRESS(buf, pos) \
349: ((buf)->text->beg + (pos) - BEG_BYTE \
350: + ((pos) >= (buf)->text->gpt_byte ? (buf)->text->gap_size : 0))
351:
352:
353:
354:
355: #define BUF_CHAR_ADDRESS(buf, pos) \
356: ((buf)->text->beg + buf_charpos_to_bytepos ((buf), (pos)) - BEG_BYTE \
357: + ((pos) >= (buf)->text->gpt ? (buf)->text->gap_size : 0))
358:
359:
360:
361:
362: #define BUF_PTR_BYTE_POS(buf, ptr) \
363: ((ptr) - (buf)->text->beg \
364: - (ptr - (buf)->text->beg <= (unsigned) (BUF_GPT_BYTE ((buf)) - BEG_BYTE)\
365: ? 0 : BUF_GAP_SIZE ((buf))) \
366: + BEG_BYTE)
367:
368:
369:
370: #define BUF_FETCH_CHAR(buf, pos) \
371: (!NILP (buf->enable_multibyte_characters) \
372: ? BUF_FETCH_MULTIBYTE_CHAR ((buf), (pos)) \
373: : BUF_FETCH_BYTE ((buf), (pos)))
374:
375:
376:
377: #define BUF_FETCH_BYTE(buf, n) \
378: *(BUF_BYTE_ADDRESS ((buf), (n)))
379:
380:
381:
382:
383:
384: #define BUF_FETCH_MULTIBYTE_CHAR(buf, pos) \
385: (_fetch_multibyte_char_p \
386: = (((pos) >= BUF_GPT_BYTE (buf) ? BUF_GAP_SIZE (buf) : 0) \
387: + (pos) + BUF_BEG_ADDR (buf) - BEG_BYTE), \
388: _fetch_multibyte_char_len \
389: = (((pos) >= BUF_GPT_BYTE (buf) ? BUF_ZV_BYTE (buf) : BUF_GPT_BYTE (buf)) \
390: - (pos)), \
391: STRING_CHAR (_fetch_multibyte_char_p, _fetch_multibyte_char_len))
392: ^L
393:
394:
395:
396:
397:
398: struct buffer_text
399: {
400:
401:
402:
403:
404: unsigned char *beg;
405:
406: EMACS_INT gpt;
407: EMACS_INT z;
408: EMACS_INT gpt_byte;
409: EMACS_INT z_byte;
410: EMACS_INT gap_size;
411: int modiff;
412:
413:
414:
415: int chars_modiff;
416:
417:
418:
419: int save_modiff;
420:
421:
422: int overlay_modiff;
423:
424:
425: EMACS_INT beg_unchanged;
426:
427:
428: EMACS_INT end_unchanged;
429:
430:
431:
432: int unchanged_modified;
433:
434:
435:
436:
437: int overlay_unchanged_modified;
438:
439:
440: INTERVAL intervals;
441:
442:
443:
444:
445:
446: struct Lisp_Marker *markers;
447: };
448:
449:
450:
451: struct buffer
452: {
453:
454:
455:
456:
457:
458: EMACS_INT size;
459:
460:
461:
462:
463:
464:
465: struct buffer *next;
466:
467:
468:
469: struct buffer_text own_text;
470:
471:
472:
473:
474: struct buffer_text *text;
475:
476:
477: EMACS_INT pt;
478:
479: EMACS_INT pt_byte;
480:
481: EMACS_INT begv;
482:
483: EMACS_INT begv_byte;
484:
485: EMACS_INT zv;
486:
487: EMACS_INT zv_byte;
488:
489:
490:
491: struct buffer *base_buffer;
492:
493:
494:
495:
496:
497:
498: #define MAX_PER_BUFFER_VARS 50
499: char local_flags[MAX_PER_BUFFER_VARS];
500:
501:
502:
503:
504:
505: int modtime;
506:
507: int auto_save_modified;
508:
509:
510: int display_error_modiff;
511:
512:
513: int auto_save_failure_time;
514:
515:
516: EMACS_INT last_window_start;
517:
518:
519: int clip_changed;
520:
521:
522:
523:
524:
525:
526:
527:
528:
529:
530:
531:
532:
533:
534:
535:
536:
537: struct region_cache *newline_cache;
538: struct region_cache *width_run_cache;
539:
540:
541:
542: unsigned prevent_redisplay_optimizations_p : 1;
543:
544:
545:
546: struct Lisp_Overlay *overlays_before;
547:
548:
549:
550: struct Lisp_Overlay *overlays_after;
551:
552: