diff --git a/licenses.txt b/licenses.txt index 6336b470e0dc9933d1fad883c84eaf86174573d6..6c2230d095005b46d45822b684d5ca4ef1684368 100644 --- a/licenses.txt +++ b/licenses.txt @@ -1,3 +1,7 @@ MIT: = https://spdx.org/licenses/MIT - This +- git https://github.com/nektro/zig-unicode-ucd + +Unspecified: +- git https://github.com/unicode-org/icu diff --git a/src/main.zig b/src/main.zig index 95a0b682a71942e4010a9c8ee96461fb9a3b53a3..559241f5046d9e0ba34cf58b2c2c15e2a6dd9df0 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1 +1,146 @@ const std = @import("std"); +const icu = @import("icu"); + +const t = @import("./types.zig"); + +// +// + +export fn u_hasBinaryProperty(cp: u32, prop: t.UProperty) bool { + return switch (prop) { + .UCHAR_ALPHABETIC => icu.hasDerivedCoreProperty(cp, .Alphabetic), + .UCHAR_ASCII_HEX_DIGIT => icu.hasProperty(cp, .ASCII_Hex_Digit), + .UCHAR_BIDI_CONTROL => icu.hasProperty(cp, .Bidi_Control), + .UCHAR_BIDI_MIRRORED => false, // TODO + .UCHAR_DASH => icu.hasProperty(cp, .Dash), + .UCHAR_DEFAULT_IGNORABLE_CODE_POINT => icu.hasDerivedCoreProperty(cp, .Default_Ignorable_Code_Point), + .UCHAR_DEPRECATED => icu.hasProperty(cp, .Deprecated), + .UCHAR_DIACRITIC => icu.hasProperty(cp, .Diacritic), + .UCHAR_EXTENDER => icu.hasProperty(cp, .Extender), + .UCHAR_FULL_COMPOSITION_EXCLUSION => false, // TODO + .UCHAR_GRAPHEME_BASE => icu.hasDerivedCoreProperty(cp, .Grapheme_Base), + .UCHAR_GRAPHEME_EXTEND => icu.hasDerivedCoreProperty(cp, .Grapheme_Extend), + .UCHAR_GRAPHEME_LINK => icu.hasDerivedCoreProperty(cp, .Grapheme_Link), + .UCHAR_HEX_DIGIT => icu.hasProperty(cp, .Hex_Digit), + .UCHAR_HYPHEN => icu.hasProperty(cp, .Hyphen), + .UCHAR_ID_CONTINUE => icu.hasDerivedCoreProperty(cp, .ID_Continue), + .UCHAR_ID_START => icu.hasDerivedCoreProperty(cp, .ID_Start), + .UCHAR_IDEOGRAPHIC => icu.hasProperty(cp, .Ideographic), + .UCHAR_IDS_BINARY_OPERATOR => icu.hasProperty(cp, .IDS_Binary_Operator), + .UCHAR_IDS_TRINARY_OPERATOR => icu.hasProperty(cp, .IDS_Trinary_Operator), + .UCHAR_JOIN_CONTROL => icu.hasProperty(cp, .Join_Control), + .UCHAR_LOGICAL_ORDER_EXCEPTION => icu.hasProperty(cp, .Logical_Order_Exception), + .UCHAR_LOWERCASE => icu.hasDerivedCoreProperty(cp, .Lowercase), + .UCHAR_MATH => icu.hasDerivedCoreProperty(cp, .Math), + .UCHAR_NONCHARACTER_CODE_POINT => icu.hasProperty(cp, .Noncharacter_Code_Point), + .UCHAR_QUOTATION_MARK => icu.hasProperty(cp, .Quotation_Mark), + .UCHAR_RADICAL => icu.hasProperty(cp, .Radical), + .UCHAR_SOFT_DOTTED => icu.hasProperty(cp, .Soft_Dotted), + .UCHAR_TERMINAL_PUNCTUATION => icu.hasProperty(cp, .Terminal_Punctuation), + .UCHAR_UNIFIED_IDEOGRAPH => icu.hasProperty(cp, .Unified_Ideograph), + .UCHAR_UPPERCASE => icu.hasDerivedCoreProperty(cp, .Uppercase), + .UCHAR_WHITE_SPACE => icu.hasProperty(cp, .White_Space), + .UCHAR_XID_CONTINUE => icu.hasDerivedCoreProperty(cp, .XID_Continue), + .UCHAR_XID_START => icu.hasDerivedCoreProperty(cp, .XID_Start), + .UCHAR_CASE_SENSITIVE => false, // TODO + .UCHAR_S_TERM => false, // TODO + .UCHAR_VARIATION_SELECTOR => false, // TODO + .UCHAR_NFD_INERT => false, // TODO + .UCHAR_NFKD_INERT => false, // TODO + .UCHAR_NFC_INERT => false, // TODO + .UCHAR_NFKC_INERT => false, // TODO + .UCHAR_SEGMENT_STARTER => false, // TODO + .UCHAR_PATTERN_SYNTAX => false, // TODO + .UCHAR_PATTERN_WHITE_SPACE => false, // TODO + .UCHAR_POSIX_ALNUM => false, // TODO + .UCHAR_POSIX_BLANK => false, // TODO + .UCHAR_POSIX_GRAPH => false, // TODO + .UCHAR_POSIX_PRINT => false, // TODO + .UCHAR_POSIX_XDIGIT => false, // TODO + .UCHAR_CASED => icu.hasDerivedCoreProperty(cp, .Cased), + .UCHAR_CASE_IGNORABLE => icu.hasDerivedCoreProperty(cp, .Case_Ignorable), + .UCHAR_CHANGES_WHEN_LOWERCASED => icu.hasDerivedCoreProperty(cp, .Changes_When_Lowercased), + .UCHAR_CHANGES_WHEN_UPPERCASED => icu.hasDerivedCoreProperty(cp, .Changes_When_Uppercased), + .UCHAR_CHANGES_WHEN_TITLECASED => icu.hasDerivedCoreProperty(cp, .Changes_When_Titlecased), + .UCHAR_CHANGES_WHEN_CASEFOLDED => icu.hasDerivedCoreProperty(cp, .Changes_When_Casefolded), + .UCHAR_CHANGES_WHEN_CASEMAPPED => icu.hasDerivedCoreProperty(cp, .Changes_When_Casemapped), + .UCHAR_CHANGES_WHEN_NFKC_CASEFOLDED => false, // TODO + .UCHAR_EMOJI => false, // TODO + .UCHAR_EMOJI_PRESENTATION => false, // TODO + .UCHAR_EMOJI_MODIFIER => false, // TODO + .UCHAR_EMOJI_MODIFIER_BASE => false, // TODO + .UCHAR_EMOJI_COMPONENT => false, // TODO + .UCHAR_REGIONAL_INDICATOR => icu.hasProperty(cp, .Regional_Indicator), + .UCHAR_PREPENDED_CONCATENATION_MARK => false, // TODO + .UCHAR_EXTENDED_PICTOGRAPHIC => false, // TODO + .UCHAR_BASIC_EMOJI => false, // TODO + .UCHAR_EMOJI_KEYCAP_SEQUENCE => false, // TODO + .UCHAR_RGI_EMOJI_MODIFIER_SEQUENCE => false, // TODO + .UCHAR_RGI_EMOJI_FLAG_SEQUENCE => false, // TODO + .UCHAR_RGI_EMOJI_TAG_SEQUENCE => false, // TODO + .UCHAR_RGI_EMOJI_ZWJ_SEQUENCE => false, // TODO + .UCHAR_RGI_EMOJI => false, // TODO + .UCHAR_IDS_UNARY_OPERATOR => false, // TODO + .UCHAR_ID_COMPAT_MATH_START => icu.hasProperty(cp, .ID_Compat_Math_Start), + .UCHAR_ID_COMPAT_MATH_CONTINUE => icu.hasProperty(cp, .ID_Compat_Math_Continue), + .UCHAR_BIDI_CLASS => false, // TODO + .UCHAR_BLOCK => false, // TODO + .UCHAR_CANONICAL_COMBINING_CLASS => false, // TODO + .UCHAR_DECOMPOSITION_TYPE => false, // TODO + .UCHAR_EAST_ASIAN_WIDTH => false, // TODO + .UCHAR_GENERAL_CATEGORY => false, // TODO + .UCHAR_JOINING_GROUP => false, // TODO + .UCHAR_JOINING_TYPE => false, // TODO + .UCHAR_LINE_BREAK => false, // TODO + .UCHAR_NUMERIC_TYPE => false, // TODO + .UCHAR_SCRIPT => false, // TODO + .UCHAR_HANGUL_SYLLABLE_TYPE => false, // TODO + .UCHAR_NFD_QUICK_CHECK => false, // TODO + .UCHAR_NFKD_QUICK_CHECK => false, // TODO + .UCHAR_NFC_QUICK_CHECK => false, // TODO + .UCHAR_NFKC_QUICK_CHECK => false, // TODO + .UCHAR_LEAD_CANONICAL_COMBINING_CLASS => false, // TODO + .UCHAR_TRAIL_CANONICAL_COMBINING_CLASS => false, // TODO + .UCHAR_GRAPHEME_CLUSTER_BREAK => false, // TODO + .UCHAR_SENTENCE_BREAK => false, // TODO + .UCHAR_WORD_BREAK => false, // TODO + .UCHAR_BIDI_PAIRED_BRACKET_TYPE => false, // TODO + .UCHAR_INDIC_POSITIONAL_CATEGORY => false, // TODO + .UCHAR_INDIC_SYLLABIC_CATEGORY => false, // TODO + .UCHAR_VERTICAL_ORIENTATION => false, // TODO + .UCHAR_GENERAL_CATEGORY_MASK => false, // TODO + .UCHAR_NUMERIC_VALUE => false, // TODO + .UCHAR_AGE => false, // TODO + .UCHAR_BIDI_MIRRORING_GLYPH => false, // TODO + .UCHAR_CASE_FOLDING => false, // TODO + .UCHAR_LOWERCASE_MAPPING => false, // TODO + .UCHAR_NAME => false, // TODO + .UCHAR_SIMPLE_CASE_FOLDING => false, // TODO + .UCHAR_SIMPLE_LOWERCASE_MAPPING => false, // TODO + .UCHAR_SIMPLE_TITLECASE_MAPPING => false, // TODO + .UCHAR_SIMPLE_UPPERCASE_MAPPING => false, // TODO + .UCHAR_TITLECASE_MAPPING => false, // TODO + .UCHAR_UPPERCASE_MAPPING => false, // TODO + .UCHAR_BIDI_PAIRED_BRACKET => false, // TODO + .UCHAR_SCRIPT_EXTENSIONS => false, // TODO + _ => false, + + // InCB, + + // Other_Math, + // Other_Alphabetic, + // Other_Lowercase, + // Other_Uppercase, + // Other_Grapheme_Extend, + // Other_Default_Ignorable_Code_Point, + // Other_ID_Start, + // Other_ID_Continue, + // Sentence_Terminal, + // Variation_Selector, + // Pattern_White_Space, + // Pattern_Syntax, + // Prepended_Concatenation_Mark, + // IDS_Unary_Operator, + // Modifier_Combining_Mark, + }; +} diff --git a/src/root.zig b/src/root.zig index 95a0b682a71942e4010a9c8ee96461fb9a3b53a3..57413d1572412e255a5b5741f030991cb454f043 100644 --- a/src/root.zig +++ b/src/root.zig @@ -1 +1,26 @@ const std = @import("std"); +const unicodeucd = @import("unicode-ucd"); + +pub fn hasDerivedCoreProperty(cp: u32, comptime prop: unicodeucd.derived_core_properties.CoreProperty.Property) bool { + @setEvalBranchQuota(100_000); + inline for (unicodeucd.derived_core_properties.data) |item| { + if (item.property == prop) { + if (cp >= item.from and cp <= item.to) { + return true; + } + } + } + return false; +} + +pub fn hasProperty(cp: u32, comptime prop: unicodeucd.prop_list.PropList.Property) bool { + @setEvalBranchQuota(100_000); + inline for (unicodeucd.prop_list.data) |item| { + if (item.property == prop) { + if (cp >= item.from and cp <= item.to) { + return true; + } + } + } + return false; +} diff --git a/src/types.zig b/src/types.zig new file mode 100644 index 0000000000000000000000000000000000000000..935ee64b739dd4794278e0b66569d5f170c8a4d9 --- /dev/null +++ b/src/types.zig @@ -0,0 +1,131 @@ +pub const UProperty = enum(c_uint) { + UCHAR_ALPHABETIC = 0, + UCHAR_ASCII_HEX_DIGIT = 1, + UCHAR_BIDI_CONTROL = 2, + UCHAR_BIDI_MIRRORED = 3, + UCHAR_DASH = 4, + UCHAR_DEFAULT_IGNORABLE_CODE_POINT = 5, + UCHAR_DEPRECATED = 6, + UCHAR_DIACRITIC = 7, + UCHAR_EXTENDER = 8, + UCHAR_FULL_COMPOSITION_EXCLUSION = 9, + UCHAR_GRAPHEME_BASE = 10, + UCHAR_GRAPHEME_EXTEND = 11, + UCHAR_GRAPHEME_LINK = 12, + UCHAR_HEX_DIGIT = 13, + UCHAR_HYPHEN = 14, + UCHAR_ID_CONTINUE = 15, + UCHAR_ID_START = 16, + UCHAR_IDEOGRAPHIC = 17, + UCHAR_IDS_BINARY_OPERATOR = 18, + UCHAR_IDS_TRINARY_OPERATOR = 19, + UCHAR_JOIN_CONTROL = 20, + UCHAR_LOGICAL_ORDER_EXCEPTION = 21, + UCHAR_LOWERCASE = 22, + UCHAR_MATH = 23, + UCHAR_NONCHARACTER_CODE_POINT = 24, + UCHAR_QUOTATION_MARK = 25, + UCHAR_RADICAL = 26, + UCHAR_SOFT_DOTTED = 27, + UCHAR_TERMINAL_PUNCTUATION = 28, + UCHAR_UNIFIED_IDEOGRAPH = 29, + UCHAR_UPPERCASE = 30, + UCHAR_WHITE_SPACE = 31, + UCHAR_XID_CONTINUE = 32, + UCHAR_XID_START = 33, + UCHAR_CASE_SENSITIVE = 34, + UCHAR_S_TERM = 35, + UCHAR_VARIATION_SELECTOR = 36, + UCHAR_NFD_INERT = 37, + UCHAR_NFKD_INERT = 38, + UCHAR_NFC_INERT = 39, + UCHAR_NFKC_INERT = 40, + UCHAR_SEGMENT_STARTER = 41, + UCHAR_PATTERN_SYNTAX = 42, + UCHAR_PATTERN_WHITE_SPACE = 43, + UCHAR_POSIX_ALNUM = 44, + UCHAR_POSIX_BLANK = 45, + UCHAR_POSIX_GRAPH = 46, + UCHAR_POSIX_PRINT = 47, + UCHAR_POSIX_XDIGIT = 48, + UCHAR_CASED = 49, + UCHAR_CASE_IGNORABLE = 50, + UCHAR_CHANGES_WHEN_LOWERCASED = 51, + UCHAR_CHANGES_WHEN_UPPERCASED = 52, + UCHAR_CHANGES_WHEN_TITLECASED = 53, + UCHAR_CHANGES_WHEN_CASEFOLDED = 54, + UCHAR_CHANGES_WHEN_CASEMAPPED = 55, + UCHAR_CHANGES_WHEN_NFKC_CASEFOLDED = 56, + UCHAR_EMOJI = 57, + UCHAR_EMOJI_PRESENTATION = 58, + UCHAR_EMOJI_MODIFIER = 59, + UCHAR_EMOJI_MODIFIER_BASE = 60, + UCHAR_EMOJI_COMPONENT = 61, + UCHAR_REGIONAL_INDICATOR = 62, + UCHAR_PREPENDED_CONCATENATION_MARK = 63, + UCHAR_EXTENDED_PICTOGRAPHIC = 64, + UCHAR_BASIC_EMOJI = 65, + UCHAR_EMOJI_KEYCAP_SEQUENCE = 66, + UCHAR_RGI_EMOJI_MODIFIER_SEQUENCE = 67, + UCHAR_RGI_EMOJI_FLAG_SEQUENCE = 68, + UCHAR_RGI_EMOJI_TAG_SEQUENCE = 69, + UCHAR_RGI_EMOJI_ZWJ_SEQUENCE = 70, + UCHAR_RGI_EMOJI = 71, + UCHAR_IDS_UNARY_OPERATOR = 72, + UCHAR_ID_COMPAT_MATH_START = 73, + UCHAR_ID_COMPAT_MATH_CONTINUE = 74, + + UCHAR_BIDI_CLASS = 0x1000, + UCHAR_BLOCK = 0x1001, + UCHAR_CANONICAL_COMBINING_CLASS = 0x1002, + UCHAR_DECOMPOSITION_TYPE = 0x1003, + UCHAR_EAST_ASIAN_WIDTH = 0x1004, + UCHAR_GENERAL_CATEGORY = 0x1005, + UCHAR_JOINING_GROUP = 0x1006, + UCHAR_JOINING_TYPE = 0x1007, + UCHAR_LINE_BREAK = 0x1008, + UCHAR_NUMERIC_TYPE = 0x1009, + UCHAR_SCRIPT = 0x100A, + UCHAR_HANGUL_SYLLABLE_TYPE = 0x100B, + UCHAR_NFD_QUICK_CHECK = 0x100C, + UCHAR_NFKD_QUICK_CHECK = 0x100D, + UCHAR_NFC_QUICK_CHECK = 0x100E, + UCHAR_NFKC_QUICK_CHECK = 0x100F, + UCHAR_LEAD_CANONICAL_COMBINING_CLASS = 0x1010, + UCHAR_TRAIL_CANONICAL_COMBINING_CLASS = 0x1011, + UCHAR_GRAPHEME_CLUSTER_BREAK = 0x1012, + UCHAR_SENTENCE_BREAK = 0x1013, + UCHAR_WORD_BREAK = 0x1014, + UCHAR_BIDI_PAIRED_BRACKET_TYPE = 0x1015, + UCHAR_INDIC_POSITIONAL_CATEGORY = 0x1016, + UCHAR_INDIC_SYLLABIC_CATEGORY = 0x1017, + UCHAR_VERTICAL_ORIENTATION = 0x1018, + + UCHAR_GENERAL_CATEGORY_MASK = 0x2000, + + UCHAR_NUMERIC_VALUE = 0x3000, + + UCHAR_AGE = 0x4000, + UCHAR_BIDI_MIRRORING_GLYPH = 0x4001, + UCHAR_CASE_FOLDING = 0x4002, + UCHAR_LOWERCASE_MAPPING = 0x4004, + UCHAR_NAME = 0x4005, + UCHAR_SIMPLE_CASE_FOLDING = 0x4006, + UCHAR_SIMPLE_LOWERCASE_MAPPING = 0x4007, + UCHAR_SIMPLE_TITLECASE_MAPPING = 0x4008, + UCHAR_SIMPLE_UPPERCASE_MAPPING = 0x4009, + UCHAR_TITLECASE_MAPPING = 0x400A, + UCHAR_UPPERCASE_MAPPING = 0x400C, + UCHAR_BIDI_PAIRED_BRACKET = 0x400D, + + UCHAR_SCRIPT_EXTENSIONS = 0x7000, + + _, + + const UCHAR_BINARY_START: UProperty = .UCHAR_ALPHABETIC; + const UCHAR_INT_START: UProperty = .UCHAR_BIDI_CLASS; + const UCHAR_MASK_START: UProperty = .UCHAR_GENERAL_CATEGORY_MASK; + const UCHAR_DOUBLE_START: UProperty = .UCHAR_NUMERIC_VALUE; + const UCHAR_STRING_START: UProperty = .UCHAR_AGE; + const UCHAR_OTHER_PROPERTY_START: UProperty = .UCHAR_SCRIPT_EXTENSIONS; +}; diff --git a/zigmod.yml b/zigmod.yml index 4741bbbe9f74447572c4e07f5c58af067d80097b..1636b3dd3468edd3f978a22d2cf3b7acd0303171 100644 --- a/zigmod.yml +++ b/zigmod.yml @@ -4,3 +4,7 @@ main: src/root.zig license: MIT description: An implementation of International Components for Unicode in only Zig dependencies: + - src: git https://github.com/nektro/zig-unicode-ucd + - src: git https://github.com/unicode-org/icu + id: w3gat1zdicytwwvxn7rqgs0a9wgv7om530itr1t7 + keep: true