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