aboutsummaryrefslogtreecommitdiffstats
path: root/libcmap.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--libcmap.h162
1 files changed, 162 insertions, 0 deletions
diff --git a/libcmap.h b/libcmap.h
index a62ddee..9c32c77 100644
--- a/libcmap.h
+++ b/libcmap.h
@@ -36,6 +36,88 @@
#define LIBCMAP_RANGE_SIZE(RANGE) ((size_t)((RANGE)->last - (RANGE)->first + 1u))
+enum libcmap_general_supercategory {
+ LIBCMAP_GENERAL_SUPERCATEGORY_LETTER = 0x0100u,
+ LIBCMAP_GENERAL_SUPERCATEGORY_MARK = 0x0200u,
+ LIBCMAP_GENERAL_SUPERCATEGORY_NUMBER = 0x0300u,
+ LIBCMAP_GENERAL_SUPERCATEGORY_PUNCTUATION = 0x0400u,
+ LIBCMAP_GENERAL_SUPERCATEGORY_SYMBOL = 0x0500u,
+ LIBCMAP_GENERAL_SUPERCATEGORY_SEPARATOR = 0x0600u,
+ LIBCMAP_GENERAL_SUPERCATEGORY_OTHER = 0x0700u
+};
+
+enum libcmap_general_category {
+ LIBCMAP_GENERAL_CATEGORY_LETTER_UPPERCASE = LIBCMAP_GENERAL_SUPERCATEGORY_LETTER + 1u,
+ LIBCMAP_GENERAL_CATEGORY_LETTER_LOWERCASE,
+ LIBCMAP_GENERAL_CATEGORY_LETTER_TITLECASE,
+ LIBCMAP_GENERAL_CATEGORY_LETTER_MODIFIER,
+ LIBCMAP_GENERAL_CATEGORY_LETTER_OTHER,
+ LIBCMAP_GENERAL_CATEGORY_MARK_NONSPACING = LIBCMAP_GENERAL_SUPERCATEGORY_MARK + 1u,
+ LIBCMAP_GENERAL_CATEGORY_MARK_SPACING_COMBINING,
+ LIBCMAP_GENERAL_CATEGORY_MARK_ENCODING,
+ LIBCMAP_GENERAL_CATEGORY_NUMBER_DECIMAL_DIGIT = LIBCMAP_GENERAL_SUPERCATEGORY_NUMBER + 1u,
+ LIBCMAP_GENERAL_CATEGORY_NUMBER_LETTER,
+ LIBCMAP_GENERAL_CATEGORY_NUMBER_OTHER,
+ LIBCMAP_GENERAL_CATEGORY_PUNCTUATION_CONNECTOR = LIBCMAP_GENERAL_SUPERCATEGORY_PUNCTUATION + 1u,
+ LIBCMAP_GENERAL_CATEGORY_PUNCTUATION_DASH,
+ LIBCMAP_GENERAL_CATEGORY_PUNCTUATION_OPEN,
+ LIBCMAP_GENERAL_CATEGORY_PUNCTUATION_CLOSE,
+ LIBCMAP_GENERAL_CATEGORY_PUNCTUATION_INITIAL_QUOTE,
+ LIBCMAP_GENERAL_CATEGORY_PUNCTUATION_FINAL_QUOTE,
+ LIBCMAP_GENERAL_CATEGORY_PUNCTUATION_OTHER,
+ LIBCMAP_GENERAL_CATEGORY_SYMBOL_MATH = LIBCMAP_GENERAL_SUPERCATEGORY_SYMBOL + 1u,
+ LIBCMAP_GENERAL_CATEGORY_SYMBOL_CURRENCY,
+ LIBCMAP_GENERAL_CATEGORY_SYMBOL_MODIFIER,
+ LIBCMAP_GENERAL_CATEGORY_SYMBOL_OTHER,
+ LIBCMAP_GENERAL_CATEGORY_SEPARATOR_SPACE = LIBCMAP_GENERAL_SUPERCATEGORY_SEPARATOR + 1u,
+ LIBCMAP_GENERAL_CATEGORY_SEPARATOR_LINE,
+ LIBCMAP_GENERAL_CATEGORY_SEPARATOR_PARAGRAPH,
+ LIBCMAP_GENERAL_CATEGORY_OTHER_CONTROL = LIBCMAP_GENERAL_SUPERCATEGORY_OTHER + 1u,
+ LIBCMAP_GENERAL_CATEGORY_OTHER_FORMAT,
+ LIBCMAP_GENERAL_CATEGORY_OTHER_SURROGATE,
+ LIBCMAP_GENERAL_CATEGORY_OTHER_PRIVATE_USE,
+ LIBCMAP_GENERAL_CATEGORY_OTHER_NOT_ASSIGNED
+};
+
+#define LIBCMAP_GENERAL_SUPERCATEGORY_MASK 0x7F00u
+
+
+enum libcmap_bidirectional_supercategory {
+ LIBCMAP_BIDIRECTIONAL_SUPERCATEGORY_STRONG = 0x0100u,
+ LIBCMAP_BIDIRECTIONAL_SUPERCATEGORY_WEAK = 0x0200u,
+ LIBCMAP_BIDIRECTIONAL_SUPERCATEGORY_NEUTRAL = 0x0300u,
+ LIBCMAP_BIDIRECTIONAL_SUPERCATEGORY_EXPLICIT = 0x0400u
+};
+
+enum libcmap_bidirectional_category {
+ LIBCMAP_BIDIRECTIONAL_CATEGORY_LEFT_TO_RIGHT = LIBCMAP_BIDIRECTIONAL_SUPERCATEGORY_STRONG + 1u,
+ LIBCMAP_BIDIRECTIONAL_CATEGORY_RIGHT_TO_LEFT,
+ LIBCMAP_BIDIRECTIONAL_CATEGORY_RIGHT_TO_LEFT_ARABIC,
+ LIBCMAP_BIDIRECTIONAL_CATEGORY_EUROPEAN_NUMBER = LIBCMAP_BIDIRECTIONAL_SUPERCATEGORY_WEAK + 1u,
+ LIBCMAP_BIDIRECTIONAL_CATEGORY_EUROPEAN_NUMBER_SEPARATOR,
+ LIBCMAP_BIDIRECTIONAL_CATEGORY_EUROPEAN_NUMBER_TERMINATOR,
+ LIBCMAP_BIDIRECTIONAL_CATEGORY_ARABIC_NUMBER,
+ LIBCMAP_BIDIRECTIONAL_CATEGORY_COMMON_SEPARATOR,
+ LIBCMAP_BIDIRECTIONAL_CATEGORY_NONSPACING_MARK,
+ LIBCMAP_BIDIRECTIONAL_CATEGORY_BOUNDARY_NEUTRAL,
+ LIBCMAP_BIDIRECTIONAL_CATEGORY_PARAGRAPH_SEPARATOR = LIBCMAP_BIDIRECTIONAL_SUPERCATEGORY_NEUTRAL + 1u,
+ LIBCMAP_BIDIRECTIONAL_CATEGORY_SEGMENT_SEPARATOR,
+ LIBCMAP_BIDIRECTIONAL_CATEGORY_WHITESPACE,
+ LIBCMAP_BIDIRECTIONAL_CATEGORY_OTHER_NEUTRALS,
+ LIBCMAP_BIDIRECTIONAL_CATEGORY_LEFT_TO_RIGHT_EMBEDDING = LIBCMAP_BIDIRECTIONAL_SUPERCATEGORY_EXPLICIT + 1u,
+ LIBCMAP_BIDIRECTIONAL_CATEGORY_LEFT_TO_RIGHT_OVERRIDE,
+ LIBCMAP_BIDIRECTIONAL_CATEGORY_RIGHT_TO_LEFT_EMBEDDING,
+ LIBCMAP_BIDIRECTIONAL_CATEGORY_RIGHT_TO_LEFT_OVERRIDE,
+ LIBCMAP_BIDIRECTIONAL_CATEGORY_POP_DIRECTIONAL_FORMAT,
+ LIBCMAP_BIDIRECTIONAL_CATEGORY_LEFT_TO_RIGHT_ISOLATE,
+ LIBCMAP_BIDIRECTIONAL_CATEGORY_RIGHT_TO_LEFT_ISOLATE,
+ LIBCMAP_BIDIRECTIONAL_CATEGORY_FIRST_STRONG_ISOLATE,
+ LIBCMAP_BIDIRECTIONAL_CATEGORY_POP_DIRECTIONAL_ISOLATE
+};
+
+#define LIBCMAP_BIDIRECTIONAL_SUPERCATEGORY_MASK 0x7F00u
+
+
/**
* Contiguous range of Unicode codepoints
*
@@ -107,6 +189,52 @@ struct libcmap_script {
/**
+ * Information about a specific codepoint
+ */
+struct libcmap_codepoint_data {
+ /**
+ * The name as published in the Unicode Standard code charts
+ *
+ * It uniquely identifies the character unless it starts with '<'
+ */
+ const char *name;
+
+ /* TODO documentation is needed */
+ enum libcmap_general_category general_category;
+ enum libcmap_bidirectional_category bidirectional_category;
+ uint16_t canonical_combining_classes;
+ uint16_t bidirectional_mirrored;
+ const char *unicode_1_name;
+};
+
+
+/**
+ * Contiguous block of codepoints with
+ * data for each codepoint
+ */
+struct libcmap_codepoint_segment {
+ /**
+ * The range of codepoints the segment covers
+ */
+ struct libcmap_range range;
+
+ /**
+ * data for each codepoint in the segment,
+ *
+ * `.data[codepoint - .range.first]` gives the entry for
+ * a specific codepoint without [`.range.first, `.range.last`]
+ */
+ const struct libcmap_codepoint_data *data;
+};
+
+
+/**
+ * The version of the Unicode Standard that the library is
+ * compiled with data for
+ */
+extern const char *const libcmap_unicode_version;
+
+/**
* Listing of all Unicode codepoints not assigned any block
*
* This listing can potentially be empty
@@ -163,6 +291,23 @@ extern const struct libcmap_script *const libcmap_script_list;
*/
extern const size_t libcmap_script_list_size;
+/**
+ * Data about codepoints
+ *
+ * There are gaps, hence the list is segmented
+ *
+ * The list is sorted in ascending order
+ *
+ * @seealso libcmap_codepoint_list_size
+ * @seealso libcmap_find_codepoint_data
+ */
+extern const struct libcmap_codepoint_segment *const libcmap_codepoint_list;
+
+/**
+ * The number of elements in `libcmap_codepoint_list`
+ */
+extern const size_t libcmap_codepoint_list_size;
+
/**
* Find a codepoint within `libcmap_no_block`
@@ -237,6 +382,23 @@ const struct libcmap_script *libcmap_find_script(uint32_t codepoint, size_t *off
/**
+ * Find data about a specified codepoint
+ *
+ * @param codepoint The codepoint
+ * @return Information from UnicodeData about the codepoint,
+ * `NULL` if not found
+ *
+ * `NULL`-return doesn't necessary mean it is unassigned,
+ * but rather just that it doesn't appear in UnicodeData,
+ * which is common for ideographs
+ *
+ * @seealso libcmap_codepoint_list
+ */
+LIBCMAP_PURE_
+const struct libcmap_codepoint_data *libcmap_find_codepoint_data(uint32_t codepoint);
+
+
+/**
* Print a string representing a Unicode codepoint range
*
* @param buf Output buffer to print to, must be sufficiently large;