aboutsummaryrefslogtreecommitdiffstats
path: root/src/font.c
diff options
context:
space:
mode:
authorPaul Eggert2015-01-05 09:07:45 -0800
committerPaul Eggert2015-01-05 10:14:58 -0800
commit58f2d6ef32b28a787fcc4e0d98b3f331ceb2a68c (patch)
treed6d79ad7b7cceafc78c5a9c54f5be1ac441a8ed7 /src/font.c
parentd2cf05d1bac19d8564d0806f515b9f40fe57f4df (diff)
downloademacs-58f2d6ef32b28a787fcc4e0d98b3f331ceb2a68c.tar.gz
emacs-58f2d6ef32b28a787fcc4e0d98b3f331ceb2a68c.zip
Compute C decls for DEFSYMs automatically
Fixes Bug#15880. This patch also makes Q constants (e.g., Qnil) constant addresses from the C point of view. * make-docfile.c: Revamp to generate table of symbols, too. Include <stdbool.h>. (xstrdup): New function. (main): Don't process the same file twice. (SYMBOL): New constant in enum global_type. (struct symbol): Turn 'value' member into a union, either v.value for int or v.svalue for string. All uses changed. (add_global): New arg svalue, which overrides value, so that globals can have a string value. (close_emacs_global): New arg num_symbols; all uses changed. Output lispsym decl. (write_globals): Output symbol globals too. Output more ATTRIBUTE_CONST, now that Qnil etc. are C constants. Output defsym_name table. (scan_c_file): Move most of guts into ... (scan_c_stream): ... new function. Scan for DEFSYMs and record symbols found. Don't read past EOF if file doesn't end in newline. * alloc.c, bidi.c, buffer.c, bytecode.c, callint.c, casefiddle: * casetab.c, category.c, ccl.c, charset.c, chartab.c, cmds.c, coding.c: * composite.c, data.c, dbusbind.c, decompress.c, dired.c, dispnew.c: * doc.c, editfns.c, emacs.c, eval.c, fileio.c, fns.c, font.c, fontset.c: * frame.c, fringe.c, ftfont.c, ftxfont.c, gfilenotify.c, gnutls.c: * image.c, inotify.c, insdel.c, keyboard.c, keymap.c, lread.c: * macfont.m, macros.c, minibuf.c, nsfns.m, nsfont.m, nsimage.m: * nsmenu.m, nsselect.m, nsterm.m, print.c, process.c, profiler.c: * search.c, sound.c, syntax.c, term.c, terminal.c, textprop.c, undo.c: * window.c, xdisp.c, xfaces.c, xfns.c, xftfont.c, xmenu.c, xml.c: * xselect.c, xsettings.c, xterm.c: Remove Q vars that represent symbols (e.g., Qnil, Qt, Qemacs). These names are now defined automatically by make-docfile. * alloc.c (init_symbol): New function. (Fmake_symbol): Use it. (c_symbol_p): New function. (valid_lisp_object_p, purecopy): Use it. * alloc.c (marked_pinned_symbols): Use make_lisp_symbol instead of make_lisp_ptr. (garbage_collect_1): Mark lispsym symbols. (CHECK_ALLOCATED_AND_LIVE_SYMBOL): New macro. (mark_object): Use it. (sweep_symbols): Sweep lispsym symbols. (symbol_uses_obj): New function. (which_symbols): Use it. Work for lispsym symbols, too. (init_alloc_once): Initialize Vpurify_flag here; no need to wait, since Qt's address is already known now. (syms_of_alloc): Add lispsym count to symbols_consed. * buffer.c (init_buffer_once): Compare to Qnil, not to make_number (0), when testing whether storage is all bits zero. * dispextern (struct image_type): * font.c (font_property_table): * frame.c (struct frame_parm_table, frame_parms): * keyboard.c (scroll_bar_parts, struct event_head): * xdisp.c (struct props): Use XSYMBOL_INIT (Qfoo) and struct Lisp_Symbol * rather than &Qfoo and Lisp_Object *, since Qfoo is no longer an object whose address can be taken. All uses changed. * eval.c (run_hook): New function. Most uses of Frun_hooks changed to use it, so that they no longer need to take the address of a Lisp sym. (syms_of_eval): Don't use DEFSYM on Vrun_hooks, as it's a variable. * frame.c (syms_of_frame): Add defsyms for the frame_parms table. * keyboard.c (syms_of_keyboard): Don't DEFSYM Qmenu_bar here. DEFSYM Qdeactivate_mark before the corresponding var. * keymap.c (syms_of_keymap): Use DEFSYM for Qmenu_bar and Qmode_line instead of interning their symbols; this avoids duplicates. (LISP_INITIALLY, TAG_PTR) (DEFINE_LISP_SYMBOL_BEGIN, DEFINE_LISP_SYMBOL_END, XSYMBOL_INIT): New macros. (LISP_INITIALLY_ZERO): Use it. (enum symbol_interned, enum symbol_redirect, struct Lisp_Symbol) (EXFUN, DEFUN_ARGS_MANY, DEFUN_ARGS_UNEVALLED, DEFUN_ARGS_*): Move decls up, to avoid forward uses. Include globals.h earlier, too. (make_lisp_symbol): New function. (XSETSYMBOL): Use it. (DEFSYM): Now just a placeholder for make-docfile. * lread.c (DEFINE_SYMBOLS): Define, for globals.h. (intern_sym): New function, with body taken from old intern_driver. (intern_driver): Use it. Last arg is now Lisp integer, not ptrdiff_t. All uses changed. (define_symbol): New function. (init_obarray): Define the C symbols taken from lispsym. Use plain DEFSYM for Qt and Qnil. * syntax.c (init_syntax_once): No need to worry about Qchar_table_extra_slots.
Diffstat (limited to 'src/font.c')
-rw-r--r--src/font.c68
1 files changed, 25 insertions, 43 deletions
diff --git a/src/font.c b/src/font.c
index dea18a1e939..60134b1de5b 100644
--- a/src/font.c
+++ b/src/font.c
@@ -41,16 +41,8 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
41#include TERM_HEADER 41#include TERM_HEADER
42#endif /* HAVE_WINDOW_SYSTEM */ 42#endif /* HAVE_WINDOW_SYSTEM */
43 43
44Lisp_Object Qopentype;
45
46/* Important character set strings. */
47Lisp_Object Qascii_0, Qiso8859_1, Qiso10646_1, Qunicode_bmp, Qunicode_sip;
48
49#define DEFAULT_ENCODING Qiso8859_1 44#define DEFAULT_ENCODING Qiso8859_1
50 45
51/* Unicode category `Cf'. */
52static Lisp_Object QCf;
53
54/* Vector of Vfont_weight_table, Vfont_slant_table, and Vfont_width_table. */ 46/* Vector of Vfont_weight_table, Vfont_slant_table, and Vfont_width_table. */
55static Lisp_Object font_style_table; 47static Lisp_Object font_style_table;
56 48
@@ -110,21 +102,6 @@ static const struct table_entry width_table[] =
110 { 200, { "ultra-expanded", "ultraexpanded", "wide" }} 102 { 200, { "ultra-expanded", "ultraexpanded", "wide" }}
111}; 103};
112 104
113Lisp_Object QCfoundry;
114static Lisp_Object QCadstyle, QCregistry;
115/* Symbols representing keys of font extra info. */
116Lisp_Object QCspacing, QCdpi, QCscalable, QCotf, QClang, QCscript, QCavgwidth;
117Lisp_Object QCantialias, QCfont_entity;
118static Lisp_Object QCfc_unknown_spec;
119/* Symbols representing values of font spacing property. */
120static Lisp_Object Qc, Qm, Qd;
121Lisp_Object Qp;
122/* Special ADSTYLE properties to avoid fonts used for Latin
123 characters; used in xfont.c and ftfont.c. */
124Lisp_Object Qja, Qko;
125
126static Lisp_Object QCuser_spec;
127
128/* Alist of font registry symbols and the corresponding charset 105/* Alist of font registry symbols and the corresponding charset
129 information. The information is retrieved from 106 information. The information is retrieved from
130 Vfont_encoding_alist on demand. 107 Vfont_encoding_alist on demand.
@@ -309,7 +286,7 @@ font_intern_prop (const char *str, ptrdiff_t len, bool force_symbol)
309 return tem; 286 return tem;
310 name = make_specified_string (str, nchars, len, 287 name = make_specified_string (str, nchars, len,
311 len != nchars && len == nbytes); 288 len != nchars && len == nbytes);
312 return intern_driver (name, obarray, XINT (tem)); 289 return intern_driver (name, obarray, tem);
313} 290}
314 291
315/* Return a pixel size of font-spec SPEC on frame F. */ 292/* Return a pixel size of font-spec SPEC on frame F. */
@@ -663,29 +640,29 @@ font_prop_validate_otf (Lisp_Object prop, Lisp_Object val)
663static const struct 640static const struct
664{ 641{
665 /* Pointer to the key symbol. */ 642 /* Pointer to the key symbol. */
666 Lisp_Object *key; 643 struct Lisp_Symbol *key;
667 /* Function to validate PROP's value VAL, or NULL if any value is 644 /* Function to validate PROP's value VAL, or NULL if any value is
668 ok. The value is VAL or its regularized value if VAL is valid, 645 ok. The value is VAL or its regularized value if VAL is valid,
669 and Qerror if not. */ 646 and Qerror if not. */
670 Lisp_Object (*validator) (Lisp_Object prop, Lisp_Object val); 647 Lisp_Object (*validator) (Lisp_Object prop, Lisp_Object val);
671} font_property_table[] = 648} font_property_table[] =
672 { { &QCtype, font_prop_validate_symbol }, 649 { { XSYMBOL_INIT (QCtype), font_prop_validate_symbol },
673 { &QCfoundry, font_prop_validate_symbol }, 650 { XSYMBOL_INIT (QCfoundry), font_prop_validate_symbol },
674 { &QCfamily, font_prop_validate_symbol }, 651 { XSYMBOL_INIT (QCfamily), font_prop_validate_symbol },
675 { &QCadstyle, font_prop_validate_symbol }, 652 { XSYMBOL_INIT (QCadstyle), font_prop_validate_symbol },
676 { &QCregistry, font_prop_validate_symbol }, 653 { XSYMBOL_INIT (QCregistry), font_prop_validate_symbol },
677 { &QCweight, font_prop_validate_style }, 654 { XSYMBOL_INIT (QCweight), font_prop_validate_style },
678 { &QCslant, font_prop_validate_style }, 655 { XSYMBOL_INIT (QCslant), font_prop_validate_style },
679 { &QCwidth, font_prop_validate_style }, 656 { XSYMBOL_INIT (QCwidth), font_prop_validate_style },
680 { &QCsize, font_prop_validate_non_neg }, 657 { XSYMBOL_INIT (QCsize), font_prop_validate_non_neg },
681 { &QCdpi, font_prop_validate_non_neg }, 658 { XSYMBOL_INIT (QCdpi), font_prop_validate_non_neg },
682 { &QCspacing, font_prop_validate_spacing }, 659 { XSYMBOL_INIT (QCspacing), font_prop_validate_spacing },
683 { &QCavgwidth, font_prop_validate_non_neg }, 660 { XSYMBOL_INIT (QCavgwidth), font_prop_validate_non_neg },
684 /* The order of the above entries must match with enum 661 /* The order of the above entries must match with enum
685 font_property_index. */ 662 font_property_index. */
686 { &QClang, font_prop_validate_symbol }, 663 { XSYMBOL_INIT (QClang), font_prop_validate_symbol },
687 { &QCscript, font_prop_validate_symbol }, 664 { XSYMBOL_INIT (QCscript), font_prop_validate_symbol },
688 { &QCotf, font_prop_validate_otf } 665 { XSYMBOL_INIT (QCotf), font_prop_validate_otf }
689 }; 666 };
690 667
691/* Return an index number of font property KEY or -1 if KEY is not an 668/* Return an index number of font property KEY or -1 if KEY is not an
@@ -697,7 +674,7 @@ get_font_prop_index (Lisp_Object key)
697 int i; 674 int i;
698 675
699 for (i = 0; i < ARRAYELTS (font_property_table); i++) 676 for (i = 0; i < ARRAYELTS (font_property_table); i++)
700 if (EQ (key, *font_property_table[i].key)) 677 if (EQ (key, make_lisp_symbol (font_property_table[i].key)))
701 return i; 678 return i;
702 return -1; 679 return -1;
703} 680}
@@ -714,7 +691,7 @@ font_prop_validate (int idx, Lisp_Object prop, Lisp_Object val)
714 if (NILP (val)) 691 if (NILP (val))
715 return val; 692 return val;
716 if (NILP (prop)) 693 if (NILP (prop))
717 prop = *font_property_table[idx].key; 694 prop = make_lisp_symbol (font_property_table[idx].key);
718 else 695 else
719 { 696 {
720 idx = get_font_prop_index (prop); 697 idx = get_font_prop_index (prop);
@@ -5169,19 +5146,21 @@ syms_of_font (void)
5169 5146
5170 DEFSYM (Qopentype, "opentype"); 5147 DEFSYM (Qopentype, "opentype");
5171 5148
5149 /* Important character set symbols. */
5172 DEFSYM (Qascii_0, "ascii-0"); 5150 DEFSYM (Qascii_0, "ascii-0");
5173 DEFSYM (Qiso8859_1, "iso8859-1"); 5151 DEFSYM (Qiso8859_1, "iso8859-1");
5174 DEFSYM (Qiso10646_1, "iso10646-1"); 5152 DEFSYM (Qiso10646_1, "iso10646-1");
5175 DEFSYM (Qunicode_bmp, "unicode-bmp"); 5153 DEFSYM (Qunicode_bmp, "unicode-bmp");
5176 DEFSYM (Qunicode_sip, "unicode-sip"); 5154 DEFSYM (Qunicode_sip, "unicode-sip");
5177 5155
5156 /* Unicode category `Cf'. */
5178 DEFSYM (QCf, "Cf"); 5157 DEFSYM (QCf, "Cf");
5179 5158
5159 /* Symbols representing keys of font extra info. */
5180 DEFSYM (QCotf, ":otf"); 5160 DEFSYM (QCotf, ":otf");
5181 DEFSYM (QClang, ":lang"); 5161 DEFSYM (QClang, ":lang");
5182 DEFSYM (QCscript, ":script"); 5162 DEFSYM (QCscript, ":script");
5183 DEFSYM (QCantialias, ":antialias"); 5163 DEFSYM (QCantialias, ":antialias");
5184
5185 DEFSYM (QCfoundry, ":foundry"); 5164 DEFSYM (QCfoundry, ":foundry");
5186 DEFSYM (QCadstyle, ":adstyle"); 5165 DEFSYM (QCadstyle, ":adstyle");
5187 DEFSYM (QCregistry, ":registry"); 5166 DEFSYM (QCregistry, ":registry");
@@ -5192,11 +5171,14 @@ syms_of_font (void)
5192 DEFSYM (QCfont_entity, ":font-entity"); 5171 DEFSYM (QCfont_entity, ":font-entity");
5193 DEFSYM (QCfc_unknown_spec, ":fc-unknown-spec"); 5172 DEFSYM (QCfc_unknown_spec, ":fc-unknown-spec");
5194 5173
5174 /* Symbols representing values of font spacing property. */
5195 DEFSYM (Qc, "c"); 5175 DEFSYM (Qc, "c");
5196 DEFSYM (Qm, "m"); 5176 DEFSYM (Qm, "m");
5197 DEFSYM (Qp, "p"); 5177 DEFSYM (Qp, "p");
5198 DEFSYM (Qd, "d"); 5178 DEFSYM (Qd, "d");
5199 5179
5180 /* Special ADSTYLE properties to avoid fonts used for Latin
5181 characters; used in xfont.c and ftfont.c. */
5200 DEFSYM (Qja, "ja"); 5182 DEFSYM (Qja, "ja");
5201 DEFSYM (Qko, "ko"); 5183 DEFSYM (Qko, "ko");
5202 5184