]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/tools/toolutil/ppucd.h
ICU-491.11.1.tar.gz
[apple/icu.git] / icuSources / tools / toolutil / ppucd.h
diff --git a/icuSources/tools/toolutil/ppucd.h b/icuSources/tools/toolutil/ppucd.h
new file mode 100644 (file)
index 0000000..ae90b20
--- /dev/null
@@ -0,0 +1,174 @@
+/*
+*******************************************************************************
+*   Copyright (C) 2011-2012, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*******************************************************************************
+*   file name:  ppucd.h
+*   encoding:   US-ASCII
+*   tab size:   8 (not used)
+*   indentation:4
+*
+*   created on: 2011dec11
+*   created by: Markus W. Scherer
+*/
+
+#ifndef __PPUCD_H__
+#define __PPUCD_H__
+
+#include "unicode/utypes.h"
+#include "unicode/uniset.h"
+#include "unicode/unistr.h"
+
+#include <stdio.h>
+
+/** Additions to the uchar.h enum UProperty. */
+enum {
+    /** Name_Alias */
+    PPUCD_NAME_ALIAS=UCHAR_STRING_LIMIT,
+    PPUCD_CONDITIONAL_CASE_MAPPINGS,
+    PPUCD_TURKIC_CASE_FOLDING
+};
+
+U_NAMESPACE_BEGIN
+
+class U_TOOLUTIL_API PropertyNames {
+public:
+    virtual ~PropertyNames();
+    virtual int32_t getPropertyEnum(const char *name) const;
+    virtual int32_t getPropertyValueEnum(int32_t property, const char *name) const;
+};
+
+struct U_TOOLUTIL_API UniProps {
+    UniProps();
+    ~UniProps();
+
+    int32_t getIntProp(int32_t prop) const { return intProps[prop-UCHAR_INT_START]; }
+
+    UChar32 start, end;
+    UBool binProps[UCHAR_BINARY_LIMIT];
+    int32_t intProps[UCHAR_INT_LIMIT-UCHAR_INT_START];
+    UVersionInfo age;
+    UChar32 bmg;
+    UChar32 scf, slc, stc, suc;
+    int32_t digitValue;
+    const char *numericValue;
+    const char *name;
+    const char *nameAlias;
+    UnicodeString cf, lc, tc, uc;
+    UnicodeSet scx;
+};
+
+class U_TOOLUTIL_API PreparsedUCD {
+public:
+    enum LineType {
+        /** No line, end of file. */
+        NO_LINE,
+        /** Empty line. (Might contain a comment.) */
+        EMPTY_LINE,
+
+        /** ucd;6.1.0 */
+        UNICODE_VERSION_LINE,
+
+        /** property;Binary;Alpha;Alphabetic */
+        PROPERTY_LINE,
+        /** binary;N;No;F;False */
+        BINARY_LINE,
+        /** value;gc;Zs;Space_Separator */
+        VALUE_LINE,
+
+        /** defaults;0000..10FFFF;age=NA;bc=L;... */
+        DEFAULTS_LINE,
+        /** block;0000..007F;age=1.1;blk=ASCII;ea=Na;... */
+        BLOCK_LINE,
+        /** cp;0030;AHex;bc=EN;gc=Nd;na=DIGIT ZERO;... */
+        CP_LINE,
+
+        /** algnamesrange;4E00..9FCC;han;CJK UNIFIED IDEOGRAPH- */
+        ALG_NAMES_RANGE_LINE,
+
+        LINE_TYPE_COUNT
+    };
+
+    /**
+     * Constructor.
+     * Prepare this object for a new, empty package.
+     */
+    PreparsedUCD(const char *filename, UErrorCode &errorCode);
+
+    /** Destructor. */
+    ~PreparsedUCD();
+
+    /** Sets (aliases) a non-standard PropertyNames implementation. Caller retains ownership. */
+    void setPropertyNames(const PropertyNames *pn) { pnames=pn; }
+
+    /**
+     * Reads a line from the preparsed UCD file.
+     * Splits the line by replacing each ';' with a NUL.
+     */
+    LineType readLine(UErrorCode &errorCode);
+
+    /** Returns the number of the line read by readLine(). */
+    int32_t getLineNumber() const { return lineNumber; }
+
+    /** Returns the line's next field, or NULL. */
+    const char *nextField();
+
+    /** Returns the Unicode version when or after the UNICODE_VERSION_LINE has been read. */
+    const UVersionInfo &getUnicodeVersion() const { return ucdVersion; }
+
+    /** Returns TRUE if the current line has property values. */
+    UBool lineHasPropertyValues() const { return DEFAULTS_LINE<=lineType && lineType<=CP_LINE; }
+
+    /**
+     * Parses properties from the current line.
+     * Clears newValues and sets UProperty codes for property values mentioned
+     * on the current line (as opposed to being inherited).
+     * Returns a pointer to the filled-in UniProps, or NULL if something went wrong.
+     * The returned UniProps are usable until the next line of the same type is read.
+     */
+    const UniProps *getProps(UnicodeSet &newValues, UErrorCode &errorCode);
+
+    /**
+     * Returns the code point range for the current algnamesrange line.
+     * Calls & parses nextField().
+     * Further nextField() calls will yield the range's type & prefix string.
+     * Returns U_SUCCESS(errorCode).
+     */
+    UBool getRangeForAlgNames(UChar32 &start, UChar32 &end, UErrorCode &errorCode);
+
+private:
+    UBool isLineBufferAvailable(int32_t i) {
+        return defaultLineIndex!=i && blockLineIndex!=i;
+    }
+
+    /** Resets the field iterator and returns the line's first field (the line type field). */
+    const char *firstField();
+
+    UBool parseProperty(UniProps &props, const char *field, UnicodeSet &newValues,
+                        UErrorCode &errorCode);
+    UChar32 parseCodePoint(const char *s, UErrorCode &errorCode);
+    UBool parseCodePointRange(const char *s, UChar32 &start, UChar32 &end, UErrorCode &errorCode);
+    void parseString(const char *s, UnicodeString &uni, UErrorCode &errorCode);
+    void parseScriptExtensions(const char *s, UnicodeSet &scx, UErrorCode &errorCode);
+
+    static const int32_t kNumLineBuffers=3;
+
+    PropertyNames *icuPnames;  // owned
+    const PropertyNames *pnames;  // aliased
+    FILE *file;
+    int32_t defaultLineIndex, blockLineIndex, lineIndex;
+    int32_t lineNumber;
+    LineType lineType;
+    char *fieldLimit;
+    char *lineLimit;
+
+    UVersionInfo ucdVersion;
+    UniProps defaultProps, blockProps, cpProps;
+    // Multiple lines so that default and block properties can maintain pointers
+    // into their line buffers.
+    char lines[kNumLineBuffers][4096];
+};
+
+U_NAMESPACE_END
+
+#endif  // __PPUCD_H__