f0d8c930c7284ccd3120920b99cf5e8f9610c35c
[crawl.git] / crawl-ref / source / unicode.h
1 /**
2  * @file
3  * @brief Conversions between Unicode and local charsets, string
4  *        manipulation functions that act on character types.
5 **/
6 #ifndef UNICODE_H
7 #define UNICODE_H
8
9 int wctoutf8(char *d, ucs_t s);
10 int utf8towc(ucs_t *d, const char *s);
11 #ifdef TARGET_OS_WINDOWS
12 std::wstring utf8_to_16(const char *s);
13 std::string utf16_to_8(const wchar_t *s);
14
15 static inline std::wstring utf8_to_16(const std::string &s)
16 {
17     return utf8_to_16(s.c_str());
18 }
19 static inline std::string utf16_to_8(const std::wstring &s)
20 {
21     return utf16_to_8(s.c_str());
22 }
23 #endif
24 std::string utf8_to_mb(const char *s);
25 std::string mb_to_utf8(const char *s);
26
27 static inline std::string utf8_to_mb(const std::string &s)
28 {
29     return utf8_to_mb(s.c_str());
30 }
31 static inline std::string mb_to_utf8(const std::string &s)
32 {
33     return mb_to_utf8(s.c_str());
34 }
35
36 int wclen(ucs_t c);
37
38 #ifndef UNIX
39 int wcwidth(ucs_t c);
40 #endif
41
42 char *prev_glyph(char *s, char *start);
43 char *next_glyph(char *s);
44
45 #define OUTS(x) utf8_to_mb(x).c_str()
46 #define OUTW(x) utf8_to_16(x).c_str()
47
48 class LineInput
49 {
50 public:
51     virtual ~LineInput() {}
52     virtual bool eof() = 0;
53     virtual bool error() { return false; };
54     virtual std::string get_line() = 0;
55 };
56
57 class FileLineInput : public LineInput
58 {
59     enum bom_type
60     {
61         BOM_NORMAL, // system locale
62         BOM_UTF8,
63         BOM_UTF16LE,
64         BOM_UTF16BE,
65         BOM_UTF32LE,
66         BOM_UTF32BE,
67     };
68     FILE *f;
69     bom_type bom;
70     bool seen_eof;
71 public:
72     FileLineInput(const char *name);
73     ~FileLineInput();
74     bool eof() { return seen_eof || !f; };
75     bool error() { return !f; };
76     std::string get_line();
77 };
78
79 // The file is always UTF-8, no BOM.
80 // Just read it as-is, merely validating for a well-formed stream.
81 class UTF8FileLineInput : public LineInput
82 {
83     FILE *f;
84     bool seen_eof;
85 public:
86     UTF8FileLineInput(const char *name);
87     ~UTF8FileLineInput();
88     bool eof() { return seen_eof || !f; };
89     bool error() { return !f; };
90     std::string get_line();
91 };
92
93 extern unsigned short charset_vt100[128];
94 extern unsigned short charset_cp437[256];
95 #endif