122 lines
2.8 KiB
C
122 lines
2.8 KiB
C
|
|
#include <assert.h>
|
|
|
|
#include <debug.h>
|
|
|
|
#include <ostream/write.h>
|
|
|
|
#include "struct.h"
|
|
#include "write.h"
|
|
|
|
void ostream_wcostream_write(
|
|
struct wcostream* super,
|
|
const wchar_t* data,
|
|
size_t len)
|
|
{
|
|
ENTER;
|
|
|
|
dpvi(data[0]);
|
|
dpvlu(len);
|
|
|
|
struct ostream_wcostream* this = (void*) super;
|
|
|
|
uint8_t buffer[6 * len], *start = buffer, *writing = buffer;
|
|
|
|
for (size_t i = 0; i < len; i++)
|
|
{
|
|
wchar_t wc = data[i];
|
|
|
|
switch (wc)
|
|
{
|
|
// 0x00000000 - 0x0000007F:
|
|
// 0xxxxxxx
|
|
|
|
case 0x00000000 ... 0x0000007F:
|
|
{
|
|
*writing++ = (uint8_t) data[i];
|
|
|
|
break;
|
|
}
|
|
|
|
// 0x00000080 - 0x000007FF:
|
|
// 110xxxxx 10xxxxxx
|
|
case 0x00000080 ... 0x000007FF:
|
|
{
|
|
*writing++ = 0b11000000 | (0b011111 & (wc >> 6));
|
|
|
|
*writing++ = 0b10000000 | (0b111111 & (wc >> 0));
|
|
|
|
break;
|
|
}
|
|
|
|
// 0x00000800 - 0x0000FFFF:
|
|
// 1110xxxx 10xxxxxx 10xxxxxx
|
|
|
|
case 0x00000800 ... 0x0000FFFF:
|
|
{
|
|
*writing++ = 0b11100000 | (0b001111 & (wc >> 12));
|
|
|
|
*writing++ = 0b10000000 | (0b111111 & (wc >> 6));
|
|
|
|
*writing++ = 0b10000000 | (0b111111 & (wc >> 0));
|
|
|
|
break;
|
|
}
|
|
|
|
// 0x00010000 - 0x001FFFFF:
|
|
// 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
|
|
|
|
case 0x00010000 ... 0x001FFFFF:
|
|
{
|
|
*writing++ = 0b11110000 | (0b000111 & (wc >> 18));
|
|
|
|
*writing++ = 0b10000000 | (0b111111 & (wc >> 12));
|
|
|
|
*writing++ = 0b10000000 | (0b111111 & (wc >> 6));
|
|
|
|
*writing++ = 0b10000000 | (0b111111 & (wc >> 0));
|
|
|
|
break;
|
|
}
|
|
|
|
// 0x00200000 - 0x03FFFFFF:
|
|
// 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
|
|
|
|
case 0x00200000 ... 0x03FFFFFF:
|
|
{
|
|
TODO;
|
|
|
|
break;
|
|
}
|
|
|
|
// 0x04000000 - 0x7FFFFFFF:
|
|
// 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
|
|
|
|
case 0x04000000 ... 0x7FFFFFFF:
|
|
{
|
|
TODO;
|
|
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
dpvi(data[i]);
|
|
|
|
TODO;
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
dpvsn(start, writing - start);
|
|
|
|
ostream_write(this->stream, buffer, (size_t) (writing - start));
|
|
|
|
EXIT;
|
|
}
|
|
|
|
|
|
|
|
|