X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=unicode.h;h=b6a16e37afe21466577bacc4ba5e27cb8a3c872e;hb=1b1b7cdc86ac07b9b79bfeb201a23d048aefcae6;hp=208819766e46c877de3ec3e987baa4992b24eb19;hpb=5e80d9852edea8472cd478655d70f5c4a1eddbdc;p=cparser diff --git a/unicode.h b/unicode.h index 2088197..b6a16e3 100644 --- a/unicode.h +++ b/unicode.h @@ -2,6 +2,7 @@ #define UNICODE_H #include +#include "adt/obst.h" typedef unsigned int utf32; #define UTF32_PRINTF_FORMAT "%u" @@ -44,4 +45,24 @@ static inline utf32 read_utf8_char(const char **p) return result; } +static inline void obstack_grow_utf8(struct obstack *const obst, utf32 const c) +{ + if (c < 0x80U) { + obstack_1grow(obst, c); + } else if (c < 0x800) { + obstack_1grow(obst, 0xC0 | (c >> 6)); + goto one_more; + } else if (c < 0x10000) { + obstack_1grow(obst, 0xE0 | (c >> 12)); + goto two_more; + } else { + obstack_1grow(obst, 0xF0 | (c >> 18)); + obstack_1grow(obst, 0x80 | ((c >> 12) & 0x3F)); +two_more: + obstack_1grow(obst, 0x80 | ((c >> 6) & 0x3F)); +one_more: + obstack_1grow(obst, 0x80 | ( c & 0x3F)); + } +} + #endif