Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mRemoteNG/PuTTYNG.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'terminal/bidi.h')
-rw-r--r--terminal/bidi.h147
1 files changed, 147 insertions, 0 deletions
diff --git a/terminal/bidi.h b/terminal/bidi.h
new file mode 100644
index 00000000..90d68e5b
--- /dev/null
+++ b/terminal/bidi.h
@@ -0,0 +1,147 @@
+/*
+ * Header file shared between bidi.c and its tests. Not used by
+ * anything outside the bidi subsystem.
+ */
+
+#ifndef PUTTY_BIDI_H
+#define PUTTY_BIDI_H
+
+#define LMASK 0x3F /* Embedding Level mask */
+#define OMASK 0xC0 /* Override mask */
+#define OISL 0x80 /* Override is L */
+#define OISR 0x40 /* Override is R */
+
+/* Shaping Helpers */
+#define STYPE(xh) ((((xh) >= SHAPE_FIRST) && ((xh) <= SHAPE_LAST)) ? \
+shapetypes[(xh)-SHAPE_FIRST].type : SU) /*))*/
+#define SISOLATED(xh) (shapetypes[(xh)-SHAPE_FIRST].form_b)
+#define SFINAL(xh) ((xh)+1)
+#define SINITIAL(xh) ((xh)+2)
+#define SMEDIAL(ch) ((ch)+3)
+
+#define leastGreaterOdd(x) ( ((x)+1) | 1 )
+#define leastGreaterEven(x) ( ((x)+2) &~ 1 )
+
+/* Function declarations used outside bidi.c */
+unsigned char bidi_getType(int ch);
+
+/* Bidi character types */
+#define BIDI_CHAR_TYPE_LIST(X) \
+ X(L) \
+ X(LRE) \
+ X(LRO) \
+ X(LRI) \
+ X(R) \
+ X(AL) \
+ X(RLE) \
+ X(RLO) \
+ X(RLI) \
+ X(PDF) \
+ X(PDI) \
+ X(FSI) \
+ X(EN) \
+ X(ES) \
+ X(ET) \
+ X(AN) \
+ X(CS) \
+ X(NSM) \
+ X(BN) \
+ X(B) \
+ X(S) \
+ X(WS) \
+ X(ON) \
+ /* end of list */
+
+/* Shaping Types */
+#define SHAPING_CHAR_TYPE_LIST(X) \
+ X(SL) /* Left-Joining, doesn't exist in U+0600 - U+06FF */ \
+ X(SR) /* Right-Joining, ie has Isolated, Final */ \
+ X(SD) /* Dual-Joining, ie has Isolated, Final, Initial, Medial */ \
+ X(SU) /* Non-Joining */ \
+ X(SC) /* Join-Causing, like U+0640 (TATWEEL) */ \
+ /* end of list */
+
+#define ENUM_DECL(name) name,
+typedef enum { BIDI_CHAR_TYPE_LIST(ENUM_DECL) N_BIDI_TYPES } BidiType;
+typedef enum { SHAPING_CHAR_TYPE_LIST(ENUM_DECL) N_SHAPING_TYPES } ShapingType;
+#undef ENUM_DECL
+
+static inline bool typeIsStrong(BidiType t)
+{
+ return ((1<<L) | (1<<R) | (1<<AL)) & (1 << t);
+}
+static inline bool typeIsWeak(BidiType t)
+{
+ return ((1<<EN) | (1<<ES) | (1<<ET) | (1<<AN) |
+ (1<<CS) | (1<<NSM) | (1<<BN)) & (1 << t);
+}
+static inline bool typeIsNeutral(BidiType t)
+{
+ return ((1<<B) | (1<<S) | (1<<WS) | (1<<ON)) & (1 << t);
+}
+static inline bool typeIsBidiActive(BidiType t)
+{
+ return ((1<<R) | (1<<AL) | (1<<AN) | (1<<RLE) | (1<<LRE) | (1<<RLO) |
+ (1<<LRO) | (1<<PDF) | (1<<RLI)) & (1 << t);
+}
+static inline bool typeIsIsolateInitiator(BidiType t)
+{
+ return ((1<<LRI) | (1<<RLI) | (1<<FSI)) & (1 << t);
+}
+static inline bool typeIsIsolateInitiatorOrPDI(BidiType t)
+{
+ return ((1<<LRI) | (1<<RLI) | (1<<FSI) | (1<<PDI)) & (1 << t);
+}
+static inline bool typeIsEmbeddingInitiator(BidiType t)
+{
+ return ((1<<LRE) | (1<<RLE) | (1<<LRO) | (1<<RLO)) & (1 << t);
+}
+static inline bool typeIsEmbeddingInitiatorOrPDF(BidiType t)
+{
+ return ((1<<LRE) | (1<<RLE) | (1<<LRO) | (1<<RLO) | (1<<PDF)) & (1 << t);
+}
+static inline bool typeIsWeakSeparatorOrTerminator(BidiType t)
+{
+ return ((1<<ES) | (1<<ET) | (1<<CS)) & (1 << t);
+}
+static inline bool typeIsNeutralOrIsolate(BidiType t)
+{
+ return ((1<<S) | (1<<WS) | (1<<ON) | (1<<FSI) | (1<<LRI) | (1<<RLI) |
+ (1<<PDI)) & (1 << t);
+}
+static inline bool typeIsSegmentOrParaSeparator(BidiType t)
+{
+ return ((1<<S) | (1<<B)) & (1 << t);
+}
+static inline bool typeIsWhitespaceOrIsolate(BidiType t)
+{
+ return ((1<<WS) | (1<<FSI) | (1<<LRI) | (1<<RLI) | (1<<PDI)) & (1 << t);
+}
+static inline bool typeIsRemovedDuringProcessing(BidiType t)
+{
+ return ((1<<RLE) | (1<<LRE) | (1<<RLO) | (1<<LRO) | (1<<PDF) |
+ (1<<BN)) & (1 << t);
+}
+static inline bool typeIsStrongOrNumber(BidiType t)
+{
+ return ((1<<L) | (1<<R) | (1<<AL) | (1<<EN) | (1<<AN)) & (1 << t);
+}
+static inline bool typeIsETOrBN(BidiType t)
+{
+ return ((1<<ET) | (1<<BN)) & (1 << t);
+}
+
+/*
+ * More featureful interface to the bidi code, for use in bidi_test.c.
+ * It returns a potentially different value of textlen (in case we're
+ * compiling in REMOVE_FORMATTING_CHARACTERS mode), and also permits
+ * you to pass in an override to the paragraph direction (because many
+ * of the UCD conformance tests use one).
+ *
+ * 'override' is 0 for no override, +1 for left-to-right, -1 for
+ * right-to-left.
+ */
+size_t do_bidi_test(BidiContext *ctx, bidi_char *text, size_t textlen,
+ int override);
+
+#endif /* PUTTY_BIDI_H */