lambda-calculus/wcostream/ostream/write.c
2025-01-13 20:36:07 -06:00

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;
}