disptab.h 3.71 KB
Newer Older
Jim Blandy's avatar
Jim Blandy committed
1
/* Things for GLYPHS and glyph tables.
Paul Eggert's avatar
Paul Eggert committed
2
   Copyright (C) 1993, 2001-2020 Free Software Foundation, Inc.
Jim Blandy's avatar
Jim Blandy committed
3 4 5

This file is part of GNU Emacs.

6
GNU Emacs is free software: you can redistribute it and/or modify
Jim Blandy's avatar
Jim Blandy committed
7
it under the terms of the GNU General Public License as published by
8 9
the Free Software Foundation, either version 3 of the License, or (at
your option) any later version.
Jim Blandy's avatar
Jim Blandy committed
10 11 12 13 14 15 16

GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
17
along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
Jim Blandy's avatar
Jim Blandy committed
18 19 20

/* Access the slots of a display-table, according to their purpose.  */

21 22 23 24 25
#ifndef EMACS_DISPTAB_H
#define EMACS_DISPTAB_H

#include "lisp.h"

26 27
#define DISP_TABLE_P(obj)						    \
  (CHAR_TABLE_P (obj)							    \
28
   && EQ (XCHAR_TABLE (obj)->purpose, Qdisplay_table)			    \
29 30 31 32 33 34 35 36 37 38
   && CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (obj)) == DISP_TABLE_EXTRA_SLOTS)

#define DISP_TABLE_EXTRA_SLOTS 6
#define DISP_TRUNC_GLYPH(dp) ((dp)->extras[0])
#define DISP_CONTINUE_GLYPH(dp) ((dp)->extras[1])
#define DISP_ESCAPE_GLYPH(dp) ((dp)->extras[2])
#define DISP_CTRL_GLYPH(dp) ((dp)->extras[3])
#define DISP_INVIS_VECTOR(dp) ((dp)->extras[4])
#define DISP_BORDER_GLYPH(dp) ((dp)->extras[5])

Jan D's avatar
Jan D committed
39
extern Lisp_Object disp_char_vector (struct Lisp_Char_Table *, int);
Kenichi Handa's avatar
Kenichi Handa committed
40

41 42 43 44 45 46 47 48
#define DISP_CHAR_VECTOR(dp, c)				\
  (ASCII_CHAR_P(c)					\
   ? (NILP ((dp)->ascii)				\
      ? (dp)->defalt					\
      : (SUB_CHAR_TABLE_P ((dp)->ascii)			\
	 ? XSUB_CHAR_TABLE ((dp)->ascii)->contents[c]	\
	 : (dp)->ascii))				\
   : disp_char_vector ((dp), (c)))
Jim Blandy's avatar
Jim Blandy committed
49

50
/* Defined in window.c.  */
Jan D's avatar
Jan D committed
51
extern struct Lisp_Char_Table *window_display_table (struct window *);
52 53

/* Defined in indent.c.  */
Jan D's avatar
Jan D committed
54
extern struct Lisp_Char_Table *buffer_display_table (void);
Jim Blandy's avatar
Jim Blandy committed
55 56 57 58

/* Return the current length of the GLYPH table,
   or 0 if the table isn't currently valid.  */
#define GLYPH_TABLE_LENGTH  \
59
  ((VECTORP (Vglyph_table)) ? ASIZE (Vglyph_table) : 0)
Jim Blandy's avatar
Jim Blandy committed
60 61 62 63

/* Return the current base (for indexing) of the GLYPH table,
   or 0 if the table isn't currently valid.  */
#define GLYPH_TABLE_BASE  \
Paul Eggert's avatar
Paul Eggert committed
64
  ((VECTORP (Vglyph_table)) ? XVECTOR (Vglyph_table)->contents : 0)
Jim Blandy's avatar
Jim Blandy committed
65 66 67 68

/* Given BASE and LEN returned by the two previous macros,
   return nonzero if the GLYPH code G should be output as a single
   character with code G.  Return zero if G has a string in the table.  */
Kim F. Storm's avatar
Kim F. Storm committed
69 70
#define GLYPH_SIMPLE_P(base,len,g) \
  (GLYPH_FACE (g) != DEFAULT_FACE_ID || GLYPH_CHAR (g) >= (len) || !STRINGP (base[GLYPH_CHAR (g)]))
Jim Blandy's avatar
Jim Blandy committed
71 72 73

/* Given BASE and LEN returned by the two previous macros,
   return nonzero if GLYPH code G is aliased to a different code.  */
Kim F. Storm's avatar
Kim F. Storm committed
74
#define GLYPH_ALIAS_P(base,len,g) \
75
  (GLYPH_FACE (g) == DEFAULT_FACE_ID && GLYPH_CHAR (g) < (len) && FIXNUMP (base[GLYPH_CHAR (g)]))
Jim Blandy's avatar
Jim Blandy committed
76

77 78
/* Follow all aliases for G in the glyph table given by (BASE,
   LENGTH), and set G to the final glyph.  */
Kim F. Storm's avatar
Kim F. Storm committed
79 80 81
#define GLYPH_FOLLOW_ALIASES(base, length, g)			\
  do {								\
    while (GLYPH_ALIAS_P ((base), (length), (g)))		\
Tom Tromey's avatar
Tom Tromey committed
82
      SET_GLYPH_CHAR ((g), XFIXNUM ((base)[GLYPH_CHAR (g)]));	\
Kim F. Storm's avatar
Kim F. Storm committed
83 84
    if (!GLYPH_CHAR_VALID_P (g))				\
      SET_GLYPH_CHAR (g, ' ');					\
85
  } while (false)
86

Jim Blandy's avatar
Jim Blandy committed
87 88 89
/* Assuming that GLYPH_SIMPLE_P (BASE, LEN, G) is 0,
   return the length and the address of the character-sequence
   used for outputting GLYPH G.  */
Kim F. Storm's avatar
Kim F. Storm committed
90 91
#define GLYPH_LENGTH(base,g)   SCHARS (base[GLYPH_CHAR (g)])
#define GLYPH_STRING(base,g)   SDATA (base[GLYPH_CHAR (g)])
Jim Blandy's avatar
Jim Blandy committed
92 93 94 95 96 97

/* GLYPH for a space character.  */

#define SPACEGLYPH 040
#define NULL_GLYPH 00

Kim F. Storm's avatar
Kim F. Storm committed
98 99
#define SET_GLYPH_FROM_CHAR(glyph, c) \
  SET_GLYPH (glyph, c, DEFAULT_FACE_ID)
100 101

#endif /* EMACS_DISPTAB_H */