00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef UNICODEMAP_H
00012 #define UNICODEMAP_H
00013
00014 #ifdef __GNUC__
00015 #pragma interface
00016 #endif
00017
00018 #include "gtypes.h"
00019 #include "CharTypes.h"
00020
00021 class GString;
00022
00023
00024
00025 enum UnicodeMapKind {
00026 unicodeMapUser,
00027 unicodeMapResident,
00028 unicodeMapFunc
00029 };
00030
00031 typedef int (*UnicodeMapFunc)(Unicode u, char *buf, int bufSize);
00032
00033 struct UnicodeMapRange {
00034 Unicode start, end;
00035 Guint code, nBytes;
00036 };
00037
00038 struct UnicodeMapExt;
00039
00040
00041
00042 class UnicodeMap {
00043 public:
00044
00045
00046
00047 static UnicodeMap *parse(GString *encodingNameA);
00048
00049
00050 UnicodeMap(char *encodingNameA,
00051 UnicodeMapRange *rangesA, int lenA);
00052
00053
00054
00055 UnicodeMap(char *encodingNameA, UnicodeMapFunc funcA);
00056
00057 ~UnicodeMap();
00058
00059 void incRefCnt();
00060 void decRefCnt();
00061
00062 GString *getEncodingName() { return encodingName; }
00063
00064
00065
00066 GBool match(GString *encodingNameA);
00067
00068
00069
00070
00071
00072 int mapUnicode(Unicode u, char *buf, int bufSize);
00073
00074 private:
00075
00076 UnicodeMap(GString *encodingNameA);
00077
00078 GString *encodingName;
00079 UnicodeMapKind kind;
00080 union {
00081 UnicodeMapRange *ranges;
00082 UnicodeMapFunc func;
00083 };
00084 int len;
00085 UnicodeMapExt *eMaps;
00086 int eMapsLen;
00087 int refCnt;
00088 };
00089
00090
00091
00092 #define unicodeMapCacheSize 4
00093
00094 class UnicodeMapCache {
00095 public:
00096
00097 UnicodeMapCache();
00098 ~UnicodeMapCache();
00099
00100
00101
00102
00103 UnicodeMap *getUnicodeMap(GString *encodingName);
00104
00105 private:
00106
00107 UnicodeMap *cache[unicodeMapCacheSize];
00108 };
00109
00110 #endif