diff options
| author | Paul Eggert | 2015-01-05 09:07:45 -0800 |
|---|---|---|
| committer | Paul Eggert | 2015-01-05 10:14:58 -0800 |
| commit | 58f2d6ef32b28a787fcc4e0d98b3f331ceb2a68c (patch) | |
| tree | d6d79ad7b7cceafc78c5a9c54f5be1ac441a8ed7 /src/font.c | |
| parent | d2cf05d1bac19d8564d0806f515b9f40fe57f4df (diff) | |
| download | emacs-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.c | 68 |
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 | ||
| 44 | Lisp_Object Qopentype; | ||
| 45 | |||
| 46 | /* Important character set strings. */ | ||
| 47 | Lisp_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'. */ | ||
| 52 | static 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. */ |
| 55 | static Lisp_Object font_style_table; | 47 | static 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 | ||
| 113 | Lisp_Object QCfoundry; | ||
| 114 | static Lisp_Object QCadstyle, QCregistry; | ||
| 115 | /* Symbols representing keys of font extra info. */ | ||
| 116 | Lisp_Object QCspacing, QCdpi, QCscalable, QCotf, QClang, QCscript, QCavgwidth; | ||
| 117 | Lisp_Object QCantialias, QCfont_entity; | ||
| 118 | static Lisp_Object QCfc_unknown_spec; | ||
| 119 | /* Symbols representing values of font spacing property. */ | ||
| 120 | static Lisp_Object Qc, Qm, Qd; | ||
| 121 | Lisp_Object Qp; | ||
| 122 | /* Special ADSTYLE properties to avoid fonts used for Latin | ||
| 123 | characters; used in xfont.c and ftfont.c. */ | ||
| 124 | Lisp_Object Qja, Qko; | ||
| 125 | |||
| 126 | static 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) | |||
| 663 | static const struct | 640 | static 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 | ||