2 * UCW Library: Reading and writing of UTF-8 and UTF-16 on Fastbuf Streams
4 * (c) 2001--2004 Martin Mares <mj@ucw.cz>
5 * (c) 2004 Robert Spalek <robert@ucw.cz>
6 * (c) 2007--2008 Pavel Charvat <pchar@ucw.cz>
8 * This software may be freely distributed and used according to the terms
9 * of the GNU Lesser General Public License.
12 #ifndef _UCW_FF_UNICODE_H
13 #define _UCW_FF_UNICODE_H
15 #include <ucw/fastbuf.h>
16 #include <ucw/unicode.h>
20 int bget_utf8_slow(struct fastbuf *b, uns repl);
21 int bget_utf8_32_slow(struct fastbuf *b, uns repl);
22 void bput_utf8_slow(struct fastbuf *b, uns u);
23 void bput_utf8_32_slow(struct fastbuf *b, uns u);
26 bget_utf8_repl(struct fastbuf *b, uns repl)
31 b->bptr = utf8_get_repl(b->bptr, &u, repl);
35 return bget_utf8_slow(b, repl);
39 bget_utf8_32_repl(struct fastbuf *b, uns repl)
44 b->bptr = utf8_32_get_repl(b->bptr, &u, repl);
48 return bget_utf8_32_slow(b, repl);
51 static inline int bget_utf8(struct fastbuf *b) /** Read a single utf8 character from range [0, 0xffff]. **/
53 return bget_utf8_repl(b, UNI_REPLACEMENT);
56 static inline int bget_utf8_32(struct fastbuf *b) /** Read a single utf8 character (from the whole unicode range). **/
58 return bget_utf8_32_repl(b, UNI_REPLACEMENT);
61 static inline void bput_utf8(struct fastbuf *b, uns u) /** Write a single utf8 character from range [0, 0xffff]. **/
64 b->bptr = utf8_put(b->bptr, u);
69 static inline void bput_utf8_32(struct fastbuf *b, uns u) /** Write a single utf8 character (from the whole unicode range). **/
72 b->bptr = utf8_32_put(b->bptr, u);
74 bput_utf8_32_slow(b, u);
79 int bget_utf16_be_slow(struct fastbuf *b, uns repl);
80 int bget_utf16_le_slow(struct fastbuf *b, uns repl);
81 void bput_utf16_be_slow(struct fastbuf *b, uns u);
82 void bput_utf16_le_slow(struct fastbuf *b, uns u);
85 bget_utf16_be_repl(struct fastbuf *b, uns repl)
90 b->bptr = utf16_be_get_repl(b->bptr, &u, repl);
94 return bget_utf16_be_slow(b, repl);
98 bget_utf16_le_repl(struct fastbuf *b, uns repl)
103 b->bptr = utf16_le_get_repl(b->bptr, &u, repl);
107 return bget_utf16_le_slow(b, repl);
111 * Read an utf16 character from fastbuf.
112 * Big endian version.
114 static inline int bget_utf16_be(struct fastbuf *b)
116 return bget_utf16_be_repl(b, UNI_REPLACEMENT);
120 * Read an utf16 character from fastbuf.
121 * Little endian version.
123 static inline int bget_utf16_le(struct fastbuf *b)
125 return bget_utf16_le_repl(b, UNI_REPLACEMENT);
129 * Write an utf16 character to fastbuf.
130 * Big endian version.
132 static inline void bput_utf16_be(struct fastbuf *b, uns u)
135 b->bptr = utf16_be_put(b->bptr, u);
137 bput_utf16_be_slow(b, u);
141 * Write an utf16 character to fastbuf.
142 * Little endian version.
144 static inline void bput_utf16_le(struct fastbuf *b, uns u)
147 b->bptr = utf16_le_put(b->bptr, u);
149 bput_utf16_le_slow(b, u);