From d67d49ceb31777cb731a56b9518bf1a1f2a94d25 Mon Sep 17 00:00:00 2001 From: Glenn Morris Date: Tue, 16 Jun 2015 23:43:03 -0700 Subject: [PATCH] Generate char-script-table from Unicode source. (Bug#20789) * admin/unidata/Makefile.in (AWK): New, set by configure. (all): Add charscript.el. (blocks): New variable. (charscript.el, ${unidir}/charscript.el): New targets. (extraclean): Also remove generated charscript.el. * admin/unidata/blocks.awk: New script. * admin/unidata/Blocks.txt: New data file, from unicode.org. * lisp/international/characters.el: Load charscript. * src/Makefile.in (charscript): New variable. (${charscript}): New target. (${lispintdir}/characters.elc): Depend on charscript.elc. (temacs$(EXEEXT)): Depend on charscript. ; * admin/unidata/README: Mention Blocks.txt. ; * .gitignore: Add lisp/international/charscript.el. --- .gitignore | 1 + admin/unidata/Blocks.txt | 298 +++++++++++++++++++++++++++++++ admin/unidata/Makefile.in | 16 +- admin/unidata/README | 4 + admin/unidata/blocks.awk | 225 +++++++++++++++++++++++ lisp/international/characters.el | 234 +----------------------- src/Makefile.in | 8 +- 7 files changed, 554 insertions(+), 232 deletions(-) create mode 100644 admin/unidata/Blocks.txt create mode 100755 admin/unidata/blocks.awk diff --git a/.gitignore b/.gitignore index 092fd03fb64..1e2f2065581 100644 --- a/.gitignore +++ b/.gitignore @@ -195,6 +195,7 @@ admin/charsets/jisx2131-filter admin/unidata/unidata.txt etc/charsets/*.map lisp/international/charprop.el +lisp/international/charscript.el lisp/international/cp51932.el lisp/international/eucjp-ms.el lisp/international/uni-*.el diff --git a/admin/unidata/Blocks.txt b/admin/unidata/Blocks.txt new file mode 100644 index 00000000000..0a4a5807635 --- /dev/null +++ b/admin/unidata/Blocks.txt @@ -0,0 +1,298 @@ +# Blocks-8.0.0.txt +# Date: 2014-11-10, 23:04:00 GMT [KW] +# +# Unicode Character Database +# Copyright (c) 1991-2014 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# For documentation, see http://www.unicode.org/reports/tr44/ +# +# Format: +# Start Code..End Code; Block Name + +# ================================================ + +# Note: When comparing block names, casing, whitespace, hyphens, +# and underbars are ignored. +# For example, "Latin Extended-A" and "latin extended a" are equivalent. +# For more information on the comparison of property values, +# see UAX #44: http://www.unicode.org/reports/tr44/ +# +# All block ranges start with a value where (cp MOD 16) = 0, +# and end with a value where (cp MOD 16) = 15. In other words, +# the last hexadecimal digit of the start of range is ...0 +# and the last hexadecimal digit of the end of range is ...F. +# This constraint on block ranges guarantees that allocations +# are done in terms of whole columns, and that code chart display +# never involves splitting columns in the charts. +# +# All code points not explicitly listed for Block +# have the value No_Block. + +# Property: Block +# +# @missing: 0000..10FFFF; No_Block + +0000..007F; Basic Latin +0080..00FF; Latin-1 Supplement +0100..017F; Latin Extended-A +0180..024F; Latin Extended-B +0250..02AF; IPA Extensions +02B0..02FF; Spacing Modifier Letters +0300..036F; Combining Diacritical Marks +0370..03FF; Greek and Coptic +0400..04FF; Cyrillic +0500..052F; Cyrillic Supplement +0530..058F; Armenian +0590..05FF; Hebrew +0600..06FF; Arabic +0700..074F; Syriac +0750..077F; Arabic Supplement +0780..07BF; Thaana +07C0..07FF; NKo +0800..083F; Samaritan +0840..085F; Mandaic +08A0..08FF; Arabic Extended-A +0900..097F; Devanagari +0980..09FF; Bengali +0A00..0A7F; Gurmukhi +0A80..0AFF; Gujarati +0B00..0B7F; Oriya +0B80..0BFF; Tamil +0C00..0C7F; Telugu +0C80..0CFF; Kannada +0D00..0D7F; Malayalam +0D80..0DFF; Sinhala +0E00..0E7F; Thai +0E80..0EFF; Lao +0F00..0FFF; Tibetan +1000..109F; Myanmar +10A0..10FF; Georgian +1100..11FF; Hangul Jamo +1200..137F; Ethiopic +1380..139F; Ethiopic Supplement +13A0..13FF; Cherokee +1400..167F; Unified Canadian Aboriginal Syllabics +1680..169F; Ogham +16A0..16FF; Runic +1700..171F; Tagalog +1720..173F; Hanunoo +1740..175F; Buhid +1760..177F; Tagbanwa +1780..17FF; Khmer +1800..18AF; Mongolian +18B0..18FF; Unified Canadian Aboriginal Syllabics Extended +1900..194F; Limbu +1950..197F; Tai Le +1980..19DF; New Tai Lue +19E0..19FF; Khmer Symbols +1A00..1A1F; Buginese +1A20..1AAF; Tai Tham +1AB0..1AFF; Combining Diacritical Marks Extended +1B00..1B7F; Balinese +1B80..1BBF; Sundanese +1BC0..1BFF; Batak +1C00..1C4F; Lepcha +1C50..1C7F; Ol Chiki +1CC0..1CCF; Sundanese Supplement +1CD0..1CFF; Vedic Extensions +1D00..1D7F; Phonetic Extensions +1D80..1DBF; Phonetic Extensions Supplement +1DC0..1DFF; Combining Diacritical Marks Supplement +1E00..1EFF; Latin Extended Additional +1F00..1FFF; Greek Extended +2000..206F; General Punctuation +2070..209F; Superscripts and Subscripts +20A0..20CF; Currency Symbols +20D0..20FF; Combining Diacritical Marks for Symbols +2100..214F; Letterlike Symbols +2150..218F; Number Forms +2190..21FF; Arrows +2200..22FF; Mathematical Operators +2300..23FF; Miscellaneous Technical +2400..243F; Control Pictures +2440..245F; Optical Character Recognition +2460..24FF; Enclosed Alphanumerics +2500..257F; Box Drawing +2580..259F; Block Elements +25A0..25FF; Geometric Shapes +2600..26FF; Miscellaneous Symbols +2700..27BF; Dingbats +27C0..27EF; Miscellaneous Mathematical Symbols-A +27F0..27FF; Supplemental Arrows-A +2800..28FF; Braille Patterns +2900..297F; Supplemental Arrows-B +2980..29FF; Miscellaneous Mathematical Symbols-B +2A00..2AFF; Supplemental Mathematical Operators +2B00..2BFF; Miscellaneous Symbols and Arrows +2C00..2C5F; Glagolitic +2C60..2C7F; Latin Extended-C +2C80..2CFF; Coptic +2D00..2D2F; Georgian Supplement +2D30..2D7F; Tifinagh +2D80..2DDF; Ethiopic Extended +2DE0..2DFF; Cyrillic Extended-A +2E00..2E7F; Supplemental Punctuation +2E80..2EFF; CJK Radicals Supplement +2F00..2FDF; Kangxi Radicals +2FF0..2FFF; Ideographic Description Characters +3000..303F; CJK Symbols and Punctuation +3040..309F; Hiragana +30A0..30FF; Katakana +3100..312F; Bopomofo +3130..318F; Hangul Compatibility Jamo +3190..319F; Kanbun +31A0..31BF; Bopomofo Extended +31C0..31EF; CJK Strokes +31F0..31FF; Katakana Phonetic Extensions +3200..32FF; Enclosed CJK Letters and Months +3300..33FF; CJK Compatibility +3400..4DBF; CJK Unified Ideographs Extension A +4DC0..4DFF; Yijing Hexagram Symbols +4E00..9FFF; CJK Unified Ideographs +A000..A48F; Yi Syllables +A490..A4CF; Yi Radicals +A4D0..A4FF; Lisu +A500..A63F; Vai +A640..A69F; Cyrillic Extended-B +A6A0..A6FF; Bamum +A700..A71F; Modifier Tone Letters +A720..A7FF; Latin Extended-D +A800..A82F; Syloti Nagri +A830..A83F; Common Indic Number Forms +A840..A87F; Phags-pa +A880..A8DF; Saurashtra +A8E0..A8FF; Devanagari Extended +A900..A92F; Kayah Li +A930..A95F; Rejang +A960..A97F; Hangul Jamo Extended-A +A980..A9DF; Javanese +A9E0..A9FF; Myanmar Extended-B +AA00..AA5F; Cham +AA60..AA7F; Myanmar Extended-A +AA80..AADF; Tai Viet +AAE0..AAFF; Meetei Mayek Extensions +AB00..AB2F; Ethiopic Extended-A +AB30..AB6F; Latin Extended-E +AB70..ABBF; Cherokee Supplement +ABC0..ABFF; Meetei Mayek +AC00..D7AF; Hangul Syllables +D7B0..D7FF; Hangul Jamo Extended-B +D800..DB7F; High Surrogates +DB80..DBFF; High Private Use Surrogates +DC00..DFFF; Low Surrogates +E000..F8FF; Private Use Area +F900..FAFF; CJK Compatibility Ideographs +FB00..FB4F; Alphabetic Presentation Forms +FB50..FDFF; Arabic Presentation Forms-A +FE00..FE0F; Variation Selectors +FE10..FE1F; Vertical Forms +FE20..FE2F; Combining Half Marks +FE30..FE4F; CJK Compatibility Forms +FE50..FE6F; Small Form Variants +FE70..FEFF; Arabic Presentation Forms-B +FF00..FFEF; Halfwidth and Fullwidth Forms +FFF0..FFFF; Specials +10000..1007F; Linear B Syllabary +10080..100FF; Linear B Ideograms +10100..1013F; Aegean Numbers +10140..1018F; Ancient Greek Numbers +10190..101CF; Ancient Symbols +101D0..101FF; Phaistos Disc +10280..1029F; Lycian +102A0..102DF; Carian +102E0..102FF; Coptic Epact Numbers +10300..1032F; Old Italic +10330..1034F; Gothic +10350..1037F; Old Permic +10380..1039F; Ugaritic +103A0..103DF; Old Persian +10400..1044F; Deseret +10450..1047F; Shavian +10480..104AF; Osmanya +10500..1052F; Elbasan +10530..1056F; Caucasian Albanian +10600..1077F; Linear A +10800..1083F; Cypriot Syllabary +10840..1085F; Imperial Aramaic +10860..1087F; Palmyrene +10880..108AF; Nabataean +108E0..108FF; Hatran +10900..1091F; Phoenician +10920..1093F; Lydian +10980..1099F; Meroitic Hieroglyphs +109A0..109FF; Meroitic Cursive +10A00..10A5F; Kharoshthi +10A60..10A7F; Old South Arabian +10A80..10A9F; Old North Arabian +10AC0..10AFF; Manichaean +10B00..10B3F; Avestan +10B40..10B5F; Inscriptional Parthian +10B60..10B7F; Inscriptional Pahlavi +10B80..10BAF; Psalter Pahlavi +10C00..10C4F; Old Turkic +10C80..10CFF; Old Hungarian +10E60..10E7F; Rumi Numeral Symbols +11000..1107F; Brahmi +11080..110CF; Kaithi +110D0..110FF; Sora Sompeng +11100..1114F; Chakma +11150..1117F; Mahajani +11180..111DF; Sharada +111E0..111FF; Sinhala Archaic Numbers +11200..1124F; Khojki +11280..112AF; Multani +112B0..112FF; Khudawadi +11300..1137F; Grantha +11480..114DF; Tirhuta +11580..115FF; Siddham +11600..1165F; Modi +11680..116CF; Takri +11700..1173F; Ahom +118A0..118FF; Warang Citi +11AC0..11AFF; Pau Cin Hau +12000..123FF; Cuneiform +12400..1247F; Cuneiform Numbers and Punctuation +12480..1254F; Early Dynastic Cuneiform +13000..1342F; Egyptian Hieroglyphs +14400..1467F; Anatolian Hieroglyphs +16800..16A3F; Bamum Supplement +16A40..16A6F; Mro +16AD0..16AFF; Bassa Vah +16B00..16B8F; Pahawh Hmong +16F00..16F9F; Miao +1B000..1B0FF; Kana Supplement +1BC00..1BC9F; Duployan +1BCA0..1BCAF; Shorthand Format Controls +1D000..1D0FF; Byzantine Musical Symbols +1D100..1D1FF; Musical Symbols +1D200..1D24F; Ancient Greek Musical Notation +1D300..1D35F; Tai Xuan Jing Symbols +1D360..1D37F; Counting Rod Numerals +1D400..1D7FF; Mathematical Alphanumeric Symbols +1D800..1DAAF; Sutton SignWriting +1E800..1E8DF; Mende Kikakui +1EE00..1EEFF; Arabic Mathematical Alphabetic Symbols +1F000..1F02F; Mahjong Tiles +1F030..1F09F; Domino Tiles +1F0A0..1F0FF; Playing Cards +1F100..1F1FF; Enclosed Alphanumeric Supplement +1F200..1F2FF; Enclosed Ideographic Supplement +1F300..1F5FF; Miscellaneous Symbols and Pictographs +1F600..1F64F; Emoticons +1F650..1F67F; Ornamental Dingbats +1F680..1F6FF; Transport and Map Symbols +1F700..1F77F; Alchemical Symbols +1F780..1F7FF; Geometric Shapes Extended +1F800..1F8FF; Supplemental Arrows-C +1F900..1F9FF; Supplemental Symbols and Pictographs +20000..2A6DF; CJK Unified Ideographs Extension B +2A700..2B73F; CJK Unified Ideographs Extension C +2B740..2B81F; CJK Unified Ideographs Extension D +2B820..2CEAF; CJK Unified Ideographs Extension E +2F800..2FA1F; CJK Compatibility Ideographs Supplement +E0000..E007F; Tags +E0100..E01EF; Variation Selectors Supplement +F0000..FFFFF; Supplementary Private Use Area-A +100000..10FFFF; Supplementary Private Use Area-B + +# EOF diff --git a/admin/unidata/Makefile.in b/admin/unidata/Makefile.in index 6c81d32484a..954e9faacae 100644 --- a/admin/unidata/Makefile.in +++ b/admin/unidata/Makefile.in @@ -23,6 +23,8 @@ SHELL = @SHELL@ +AWK = @AWK@ + srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ @@ -51,7 +53,7 @@ am__v_at_1 = .PHONY: all unifiles -all: ${top_srcdir}/src/macuvs.h unifiles +all: ${top_srcdir}/src/macuvs.h unifiles ${unidir}/charscript.el ## Specify .elc as an order-only prereq so as to not needlessly rebuild ## target just because the .elc is missing. @@ -94,6 +96,16 @@ unifiles: ${unidir}/charprop.el [ -f $(unidir)/$$f ] || exec $(MAKE) PHONY_EXTRAS=$< $<; \ done + +.PHONY: charscript.el +charscript.el: ${unidir}/charscript.el + +blocks = ${srcdir}/blocks.awk + +${unidir}/charscript.el: ${srcdir}/Blocks.txt ${blocks} + $(AM_V_GEN)$(AWK) -f ${blocks} < $< > $@ + + .PHONY: clean bootstrap-clean distclean maintainer-clean extraclean clean: @@ -110,7 +122,7 @@ maintainer-clean: distclean ## change and it slows down bootstrap (a tiny bit). ## Cf leim/ja-dic (which is much slower). extraclean: - rm -f ${top_srcdir}/src/macuvs.h + rm -f ${top_srcdir}/src/macuvs.h ${unidir}/charscript.el* ifneq (,$(wildcard $(unidir)/charprop.el)) cd $(unidir) && \ rm -f `sed -n 's/^;; FILE: //p' < charprop.el` charprop.el diff --git a/admin/unidata/README b/admin/unidata/README index e0d0e00417f..8ad0a12d728 100644 --- a/admin/unidata/README +++ b/admin/unidata/README @@ -16,3 +16,7 @@ http://www.unicode.org/ivd/data/2014-05-16/IVD_Sequences.txt UnicodeData.txt http://www.unicode.org/Public/UNIDATA/UnicodeData.txt 2014-03-10 + +Blocks.txt +http://www.unicode.org/Public/8.0.0/ucd/Blocks.txt +2014-11-10 diff --git a/admin/unidata/blocks.awk b/admin/unidata/blocks.awk new file mode 100755 index 00000000000..892ac58c927 --- /dev/null +++ b/admin/unidata/blocks.awk @@ -0,0 +1,225 @@ +#!/usr/bin/awk -f + +## Copyright (C) 2015 Free Software Foundation, Inc. + +## Author: Glenn Morris + +## This file is part of GNU Emacs. + +## GNU Emacs is free software: you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. + +## 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 +## along with GNU Emacs. If not, see . + +### Commentary: + +## This script takes as input Unicode's Blocks.txt +## (http://www.unicode.org/Public/UNIDATA/Blocks.txt) +## and produces output for Emacs's lisp/international/charscript.el. + +## It lumps together all the blocks belonging to the same language. +## E.g., "Basic Latin", "Latin-1 Supplement", "Latin Extended-A", +## etc. are all lumped together under "latin". + +## The Unicode blocks actually extend past some of these ranges with +## undefined codepoints. + +## For additional details, see . + +## Things to do after installing a new version of Blocks.txt: +## Check the output against the old output. +## Adjust the alias array, and the name2alias function for any new +## entries, if necessary. +## Check fix_start (and fix_end) to see if entries need adding/removing. +## Review the hard-coded splits at the end of the main body. + +### Code: + +BEGIN { + ## Hard-coded names. See name2alias for the rest. + alias["ipa extensions"] = "phonetic" + alias["letterlike symbols"] = "symbol" + alias["number forms"] = "symbol" + alias["miscellaneous technical"] = "symbol" + alias["control pictures"] = "symbol" + alias["optical character recognition"] = "symbol" + alias["enclosed alphanumerics"] = "symbol" + alias["box drawing"] = "symbol" + alias["block elements"] = "symbol" + alias["miscellaneous symbols"] = "symbol" + alias["cjk strokes"] = "cjk-misc" + alias["cjk symbols and punctuation"] = "cjk-misc" + alias["halfwidth and fullwidth forms"] = "cjk-misc" + alias["common indic number forms"] = "north-indic-number" + + tohex["a"] = 10 + tohex["b"] = 11 + tohex["c"] = 12 + tohex["d"] = 13 + tohex["e"] = 14 + tohex["f"] = 15 + + fix_start["0080"] = "00A0" + ## Define fix_end here if you need it. +} + +## From admin/charsets/. +## With gawk's --non-decimal-data switch we wouldn't need this. +function decode_hex(str , n, len, i, c) { + n = 0 + len = length(str) + for (i = 1; i <= len; i++) + { + c = substr (str, i, 1) + if (c >= "0" && c <= "9") + n = n * 16 + (c - "0") + else + n = n * 16 + tohex[tolower(c)] + } + return n +} + +function name2alias(name , w, w2) { + name = tolower(name) + if (alias[name]) return alias[name] + else if (name ~ /for symbols/) return "symbol" + else if (name ~ /latin|combining .* marks|spacing modifier|tone letters|alphabetic presentation/) return "latin" + else if (name ~ /cjk|yijing|enclosed ideograph|kangxi/) return "han" + else if (name ~ /arabic/) return "arabic" + else if (name ~ /^greek/) return "greek" + else if (name ~ /^coptic/) return "coptic" + else if (name ~ /cuneiform number/) return "cuneiform-numbers-and-punctuation" + else if (name ~ /cuneiform/) return "cuneiform" + else if (name ~ /mathematical alphanumeric symbol/) return "mathematical" + else if (name ~ /punctuation|mathematical|arrows|currency|superscript|small form variants|geometric|dingbats|enclosed|alchemical|pictograph|emoticon|transport/) return "symbol" + else if (name ~ /canadian aboriginal/) return "canadian-aboriginal" + else if (name ~ /katakana|hiragana/) return "kana" + else if (name ~ /myanmar/) return "burmese" + else if (name ~ /hangul/) return "hangul" + else if (name ~ /khmer/) return "khmer" + else if (name ~ /braille/) return "braille" + else if (name ~ /^yi /) return "yi" + else if (name ~ /surrogates|private use|variation selectors/) return 0 + else if (name ~/^(specials|tags)$/) return 0 + else if (name ~ /linear b/) return "linear-b" + else if (name ~ /aramaic/) return "aramaic" + else if (name ~ /rumi num/) return "rumi-number" + else if (name ~ /duployan|shorthand/) return "duployan-shorthand" + else if (name ~ /sutton signwriting/) return "sutton-sign-writing" + + sub(/ (extended|extensions|supplement).*/, "", name) + sub(/numbers/, "number", name) + sub(/numerals/, "numeral", name) + sub(/symbols/, "symbol", name) + sub(/forms$/, "form", name) + sub(/tiles$/, "tile", name) + sub(/^new /, "", name) + sub(/ (characters|hieroglyphs|cursive)$/, "", name) + gsub(/ /, "-", name) + + return name +} + +/^[0-9A-F]/ { + sep = index($1, "..") + len = length($1) + s = substr($1,1,sep-1) + e = substr($1,sep+2,len-sep-2) + $1 = "" + sub(/^ */, "", $0) + i++ + start[i] = fix_start[s] ? fix_start[s] : s + end[i] = fix_end[e] ? fix_end[e]: e + name[i] = $0 + + alt[i] = name2alias(name[i]) + + if (!alt[i]) + { + i-- + next + } + + ## Combine adjacent ranges with the same name. + if (alt[i] == alt[i-1] && decode_hex(start[i]) == 1 + decode_hex(end[i-1])) + { + end[i-1] = end[i] + name[i-1] = (name[i-1] ", " name[i]) + i-- + } + + ## Some hard-coded splits. + if (start[i] == "0370") + { + end[i] = "03E1" + i++ + start[i] = "03E2" + end[i] = "03EF" + alt[i] = "coptic" + i++ + start[i] = "03F0" + end[i] = "03FF" + alt[i] = "greek" + } + else if (start[i] == "FB00") + { + end[i] = "FB06" + i++ + start[i] = "FB13" + end[i] = "FB17" + alt[i] = "armenian" + i++ + start[i] = "FB1D" + end[i] = "FB4F" + alt[i] = "hebrew" + } + else if (start[i] == "FF00") + { + end[i] = "FF60" + i++ + start[i] = "FF61" + end[i] = "FF9F" + alt[i] = "kana" + i++ + start[i] = "FFA0" + end[i] = "FFDF" + alt[i] = "hangul" + i++ + start[i] = "FFE0" + end[i] = "FFEF" + alt[i] = "cjk-misc" + } +} + +END { + print ";;; charscript.el --- character script table" + print ";;; Automatically generated from admin/unidata/Blocks.txt" + print "(let (script-list)" + print " (dolist (elt '(" + + for (j=1;j<=i;j++) + { + printf(" (#x%s #x%s %s)", start[j], end[j], alt[j]) + ## Fuzz to decide whether worth printing original name as a comment. + if (name[j] && alt[j] != tolower(name[j]) && alt[j] !~ /-/) + printf(" ; %s", name[j]) + printf("\n") + } + + print " ))" + print " (set-char-table-range char-script-table" + print " (cons (car elt) (nth 1 elt)) (nth 2 elt))" + print " (or (memq (nth 2 elt) script-list)" + print " (setq script-list (cons (nth 2 elt) script-list))))" + print " (set-char-table-extra-slot char-script-table 0 (nreverse script-list)))" + print "" + print "(provide 'charscript)" +} diff --git a/lisp/international/characters.el b/lisp/international/characters.el index c4c9060d842..310384aa969 100644 --- a/lisp/international/characters.el +++ b/lisp/international/characters.el @@ -1163,235 +1163,11 @@ Setup char-width-table appropriate for non-CJK language environment." ;; Setting char-script-table. - -;; The data is compiled from Blocks.txt and Scripts.txt in the -;; "Unicode Character Database", simplified to lump together all the -;; blocks belonging to the same language. E.g., "Basic Latin", -;; "Latin-1 Supplement", "Latin Extended-A", etc. are all lumped -;; together under "latin". -;; -;; The Unicode blocks actually extend past some of these ranges with -;; undefined codepoints. -;; -;; Last update: http://www.unicode.org/Public/8.0.0/ucd/Blocks-8.0.0d3.txt -(let ((script-list nil)) - (dolist - (elt - '((#x0000 #x007F latin) - (#x00A0 #x024F latin) - (#x0250 #x02AF phonetic) ; IPA Extensions - (#x02B0 #x036F latin) ; Spacing Modifiers and Diacriticals - (#x0370 #x03E1 greek) - (#x03E2 #x03EF coptic) - (#x03F0 #x03FF greek) - (#x0400 #x052F cyrillic) - (#x0530 #x058F armenian) - (#x0590 #x05FF hebrew) - (#x0600 #x06FF arabic) - (#x0700 #x074F syriac) - (#x0750 #x077F arabic) ; Arabic Supplement - (#x0780 #x07BF thaana) - (#x07C0 #x07FF nko) - (#x0800 #x083F samaritan) - (#x0840 #x085F mandaic) - (#x08A0 #x08FF arabic) ; Arabic Extended-A - (#x0900 #x097F devanagari) - (#x0980 #x09FF bengali) - (#x0A00 #x0A7F gurmukhi) - (#x0A80 #x0AFF gujarati) - (#x0B00 #x0B7F oriya) - (#x0B80 #x0BFF tamil) - (#x0C00 #x0C7F telugu) - (#x0C80 #x0CFF kannada) - (#x0D00 #x0D7F malayalam) - (#x0D80 #x0DFF sinhala) - (#x0E00 #x0E7F thai) - (#x0E80 #x0EFF lao) - (#x0F00 #x0FFF tibetan) - (#x1000 #x109F burmese) ; Myanmar - (#x10A0 #x10FF georgian) - (#x1100 #x11FF hangul) - (#x1200 #x139F ethiopic) ; Ethiopic and Ethiopic Supplement - (#x13A0 #x13FF cherokee) - (#x1400 #x167F canadian-aboriginal) - (#x1680 #x169F ogham) - (#x16A0 #x16FF runic) - (#x1700 #x171F tagalog) - (#x1720 #x173F hanunoo) - (#x1740 #x175F buhid) - (#x1760 #x177F tagbanwa) - (#x1780 #x17FF khmer) - (#x1800 #x18AF mongolian) - (#x18B0 #x18FF canadian-aboriginal) ; Canadian Aboriginal Syllabics Extended - (#x1900 #x194F limbu) - (#x1950 #x197F tai-le) - (#x1980 #x19DF tai-lue) ; New Tai Lue - (#x19E0 #x19FF khmer) ; Khmer Symbols - (#x1A00 #x1A1F buginese) - (#x1A20 #x1AAF tai-tham) - (#x1AB0 #x1AFF latin) ; Combining Diacritical Marks Extended - (#x1B00 #x1B7F balinese) - (#x1B80 #x1BBF sundanese) - (#x1BC0 #x1BFF batak) - (#x1C00 #x1C4F lepcha) - (#x1C50 #x1C7F ol-chiki) - (#x1CC0 #x1CCF sundanese) - (#x1CD0 #x1CFF vedic) - (#x1D00 #x1DBF phonetic) ; Phonetic Extensions & Supplement - (#x1DC0 #x1EFF latin) ; Latin Extended Additional - (#x1F00 #x1FFF greek) ; Greek Extended - (#x2000 #x27FF symbol) - (#x2800 #x28FF braille) - (#x2900 #x2BFF symbol) - (#x2C00 #x2C5F glagolitic) - (#x2C60 #x2C7F latin) ; Latin Extended-C - (#x2C80 #x2CFF coptic) - (#x2D00 #x2D2F georgian) ; Georgian Supplement - (#x2D30 #x2D7F tifinagh) - (#x2D80 #x2DDF ethiopic) ; Ethiopic Extended - (#x2DE0 #x2DFF cyrillic) ; Cyrillic Extended-A - (#x2E00 #x2E7F symbol) - (#x2E80 #x2FDF han) - (#x2FF0 #x2FFF ideographic-description) - (#x3000 #x303F cjk-misc) - (#x3040 #x30FF kana) ; Hiragana and Katakana - (#x3100 #x312F bopomofo) - (#x3130 #x318F hangul) ; Hangul Compatibility Jamo - (#x3190 #x319F kanbun) - (#x31A0 #x31BF bopomofo) ; Bopomofo Extended - (#x31C0 #x31EF cjk-misc) ; CJK Strokes - (#x31F0 #x31FF kana) ; Katakana Phonetic Extensions - (#x3200 #x9FFF han) - (#xA000 #xA4CF yi) - (#xA4D0 #xA4FF lisu) - (#xA500 #xA63F vai) - (#xA640 #xA69F cyrillic) ; Cyrillic Extended-B - (#xA6A0 #xA6FF bamum) - (#xA700 #xA7FF latin) - (#xA800 #xA82F syloti-nagri) - (#xA830 #xA83F north-indic-number) - (#xA840 #xA87F phags-pa) - (#xA880 #xA8DF saurashtra) - (#xA8E0 #xA8FF devanagari) ; Devanagari Extended - (#xA900 #xA92F kayah-li) - (#xA930 #xA95F rejang) - (#xA960 #xA97F hangul) ; Hangul Jamo Extended - (#xA980 #xA9DF javanese) - (#xA9E0 #xA9FF burmese) ; Myanmar Extended-B - (#xAA00 #xAA5F cham) - (#xAA60 #xAA7F burmese) ; Myanmar Extended-A - (#xAA80 #xAADF tai-viet) - (#xAAE0 #xAAFF meetei-mayek) ; Meetei Mayek Extensions - (#xAB00 #xAB2F ethiopic) ; Ethiopic Extended-A - (#xAB30 #xAB6F latin) ; Latin Extended-E - (#xAB70 #xABBF cherokee) ; Cherokee Supplement - (#xABC0 #xABFF meetei-mayek) - (#xAC00 #xD7FF hangul) - (#xF900 #xFAFF han) - (#xFB00 #xFB06 latin) ; Latin ligatures - (#xFB13 #xFB17 armenian) ; Armenian ligatures - (#xFB1D #xFB4F hebrew) ; Alphabetic Presentation Forms - (#xFB50 #xFDFF arabic) ; Arabic Presentation Forms-A - (#xFE10 #xFE1F vertical-form) - (#xFE20 #xFE2F latin) ; Combining Half Marks - (#xFE30 #xFE4F han) - (#xFE50 #xFE6F symbol) ; Small Form Variants - (#xFE70 #xFEFF arabic) ; Arabic Presentation Forms-B - (#xFF00 #xFF60 cjk-misc) - (#xFF61 #xFF9F kana) - (#xFFA0 #xFFDF hangul) - (#xFFE0 #xFFEF cjk-misc) - (#x10000 #x100FF linear-b) - (#x10100 #x1013F aegean-number) - (#x10140 #x1018F ancient-greek-number) - (#x10190 #x101CF ancient-symbol) - (#x101D0 #x101FF phaistos-disc) - (#x10280 #x1029F lycian) - (#x102A0 #x102DF carian) - (#x102E0 #x102FF coptic) ; Coptic Epact Numbers - (#x10300 #x1032F old-italic) - (#x10330 #x1034F gothic) - (#x10350 #x1037F old-permic) - (#x10380 #x1039F ugaritic) - (#x103A0 #x103DF old-persian) - (#x10400 #x1044F deseret) - (#x10450 #x1047F shavian) - (#x10480 #x104AF osmanya) - (#x10500 #x1052F elbasan) - (#x10530 #x1056F caucasian-albanian) - (#x10600 #x1077F linear-a) - (#x10800 #x1083F cypriot-syllabary) - (#x10840 #x1085F aramaic) - (#x10860 #x1087F palmyrene) - (#x10880 #x108AF nabataean) - (#x108E0 #x108FF hatran) - (#x10900 #x1091F phoenician) - (#x10920 #x1093F lydian) - (#x10980 #x109FF meroitic) - (#x10A00 #x10A5F kharoshthi) - (#x10A60 #x10A7F old-south-arabian) - (#x10A80 #x10A9F old-north-arabian) - (#x10AC0 #x10AFF manichaean) - (#x10B00 #x10B3F avestan) - (#x10B40 #x10B5F inscriptional-parthian) - (#x10B60 #x10B7F inscriptional-pahlavi) - (#x10B80 #x10BAF psalter-pahlavi) - (#x10C00 #x10C4F old-turkic) - (#x10C80 #x10CFF old-hungarian) - (#x10E60 #x10E7F rumi-number) - (#x11000 #x1107F brahmi) - (#x11080 #x110CF kaithi) - (#x110D0 #x110FF sora-sompeng) - (#x11100 #x1114F chakma) - (#x11150 #x1117F mahajani) - (#x11180 #x111DF sharada) - (#x111E0 #x111FF sinhala-archaic-number) - (#x11200 #x1124F khojki) - (#x11280 #x112AF multani) - (#x112B0 #x112FF khudawadi) - (#x11300 #x1137F grantha) - (#x11480 #x114DF tirhuta) - (#x11580 #x115FF siddham) - (#x11600 #x1165F modi) - (#x11680 #x116CF takri) - (#x11700 #x1173F ahom) - (#x118A0 #x118FF warang-citi) - (#x11AC0 #x11AFF pau-cin-hau) - (#x12000 #x123FF cuneiform) - (#x12400 #x1247F cuneiform-numbers-and-punctuation) - (#x12480 #x1254F cuneiform) ; Early Dynastic Cuneiform - (#x13000 #x1342F egyptian) - (#x14400 #x1467F anatolian) - (#x16800 #x16A3F bamum) - (#x16A40 #x16A6F mro) - (#x16AD0 #x16AFF bassa-vah) - (#x16B00 #x16B8F pahawh-hmong) - (#x16F00 #x16F9F miao) - (#x1B000 #x1B0FF kana) ; Kana Supplement - (#x1BC00 #x1BCAF duployan-shorthand) - (#x1D000 #x1D0FF byzantine-musical-symbol) - (#x1D100 #x1D1FF musical-symbol) - (#x1D200 #x1D24F ancient-greek-musical-notation) - (#x1D300 #x1D35F tai-xuan-jing-symbol) - (#x1D360 #x1D37F counting-rod-numeral) - (#x1D400 #x1D7FF mathematical) - (#x1D800 #x1DAAF sutton-sign-writing) - (#x1E800 #x1E8DF mende-kikakui) - (#x1EE00 #x1EEFF arabic) ; Arabic Mathematical Alphabetic Symbols - (#x1F000 #x1F02F mahjong-tile) - (#x1F030 #x1F09F domino-tile) - (#x1F0A0 #x1F0FF playing-cards) - (#x1F100 #x1F1FF symbol) ; Enclosed Alphanumeric Supplement - (#x1F200 #x1F2FF han) ; Enclosed Ideographic Supplement - (#x1F300 #x1F9FF symbol) - (#x20000 #x2A6DF han) - (#x2A700 #x2CEAF han) - (#x2F800 #x2FA1F han))) - (set-char-table-range char-script-table - (cons (car elt) (nth 1 elt)) (nth 2 elt)) - (or (memq (nth 2 elt) script-list) - (setq script-list (cons (nth 2 elt) script-list)))) - (set-char-table-extra-slot char-script-table 0 (nreverse script-list))) +(if purify-flag + ;; While dumping, we can't use require, and international is not + ;; in load-path. + (load "international/charscript") + (require 'charscript)) (map-charset-chars #'(lambda (range _ignore) diff --git a/src/Makefile.in b/src/Makefile.in index 172fa8e47cd..e5c5ddbcbc6 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -488,6 +488,12 @@ charsets = ${top_srcdir}/admin/charsets/charsets.stamp ${charsets}: FORCE ${MAKE} -C ../admin/charsets all +charscript = ${lispintdir}/charscript.el +${charscript}: FORCE + $(MAKE) -C ../admin/unidata $(notdir $@) + +${lispintdir}/characters.elc: ${charscript:.el=.elc} + ## The dumped Emacs is as functional and more efficient than ## bootstrap-emacs, so we replace the latter with the former. ## Strictly speaking, emacs does not depend directly on all of $lisp, @@ -557,7 +563,7 @@ $(lib)/libgnu.a: $(config_h) ## This goes on to affect various things, and the emacs binary fails ## to start if Vinstallation_directory has the wrong value. temacs$(EXEEXT): $(LIBXMENU) $(ALLOBJS) \ - $(lib)/libgnu.a $(EMACSRES) ${charsets} + $(lib)/libgnu.a $(EMACSRES) ${charsets} ${charscript} $(AM_V_CCLD)$(CC) $(ALL_CFLAGS) $(TEMACS_LDFLAGS) $(LDFLAGS) \ -o temacs $(ALLOBJS) $(lib)/libgnu.a $(W32_RES_LINK) $(LIBES) $(MKDIR_P) $(etc) -- 2.39.2