15 char *result = (
char *)malloc(1);
67 if (codepoint <= 0x7F)
70 if (codepoint >= 0xA0 && codepoint <= 0xFF)
73 for (i = 0; i < 32; ++i)
101 output[out_pos++] = (char)b0;
104 else if (b0 >= 0xC2 && b0 <= 0xDF && i + 1 < input_len)
107 if ((b1 & 0xC0) == 0x80)
115 output[out_pos++] = (char)b0;
119 else if (b0 >= 0xE0 && b0 <= 0xEF && i + 2 < input_len)
123 if ((b1 & 0xC0) == 0x80 && (b2 & 0xC0) == 0x80)
131 output[out_pos++] = (char)b0;
135 else if (b0 >= 0xF0 && b0 <= 0xF4 && i + 3 < input_len)
140 if ((b1 & 0xC0) == 0x80 && (b2 & 0xC0) == 0x80 && (b3 & 0xC0) == 0x80)
143 output[out_pos++] =
'?';
148 output[out_pos++] = (char)b0;
155 output[out_pos++] = (char)b0;
160 output[out_pos] =
'\0';
178 in_len = strlen(value);
179 out = (
char *)malloc(in_len + 1);
193 return "EO_SUCCESS: operation completed successfully";
195 return "EO_NULL_PTR: a required pointer argument was NULL";
197 return "EO_OVERFLOW: internal size calculation would overflow";
199 return "EO_ALLOC_FAILED: memory allocation failed";
201 return "EO_NUMBER_TOO_LARGE: numeric value exceeds EO encoding range";
203 return "EO_BUFFER_UNDERRUN: not enough bytes available for read";
205 return "EO_CHUNKED_MODE_DISABLED: chunked reading mode is not active";
207 return "EO_INVALID_SEQUENCE_RANGE: calculated sequence range is empty";
209 return "EO_SEQUENCE_OUT_OF_RANGE: sequence value out of encodable range";
211 return "EO_INVALID_DATA: data is structurally invalid";
213 return "EO_STR_OUT_OF_RANGE: string exceeds the allowed fixed length";
215 return "EO_STR_TOO_SHORT: string is shorter than the required fixed length";
217 return "EO_INVALID_CHAR: character value is outside the valid range";
219 return "EO_INVALID_SHORT: short integer value is outside the valid range";
221 return "EO_INVALID_THREE: three-byte integer value is outside the valid range";
223 return "EO_INVALID_INT: integer value is outside the valid range";
225 return "unknown EoResult value";
240 writer.
data = capacity > 0 ? (
uint8_t *)malloc(capacity) : NULL;
272 required = writer->
length + additional;
278 new_capacity = required == 0 ? 1 : required;
279 new_data = (
uint8_t *)realloc(writer->
data, new_capacity);
285 writer->
data = new_data;
330 out_bytes[0] = (
uint8_t)value + 1;
340 for (i = 0; i < 4; ++i)
342 if (bytes && length > i && bytes[i] != 0)
367 if (!buf || length == 0)
372 for (i = 0; i < length / 2; ++i)
375 buf[i] = buf[length - 1 - i];
376 buf[length - 1 - i] = tmp;
379 parity = (length + 1) % 2;
380 for (i = 0; i < length; ++i)
383 int odd = ((i % 2) != parity);
385 if (odd && ch >= 34 && ch <= 125)
387 buf[i] = (
uint8_t)(125 - ch + 34);
389 else if (!odd && ch >= 34 && ch <= 79)
391 buf[i] = (
uint8_t)(79 - ch + 34);
393 else if (!odd && ch >= 80 && ch <= 125)
395 buf[i] = (
uint8_t)(125 - ch + 80);
405 if (!buf || length == 0)
410 parity = (length + 1) % 2;
411 for (i = 0; i < length; ++i)
414 int odd = ((i % 2) != parity);
416 if (odd && ch >= 34 && ch <= 125)
418 buf[i] = (
uint8_t)(125 - ch + 34);
420 else if (!odd && ch >= 34 && ch <= 79)
422 buf[i] = (
uint8_t)(79 - ch + 34);
424 else if (!odd && ch >= 80 && ch <= 125)
426 buf[i] = (
uint8_t)(125 - ch + 80);
430 for (i = 0; i < length / 2; ++i)
433 buf[i] = buf[length - 1 - i];
434 buf[length - 1 - i] = tmp;
612 in_len = strlen(value);
613 normalized = (
char *)malloc(in_len + 1);
630 for (k = 0; k < length; ++k)
638 memcpy(writer->
data + writer->
length, normalized, length);
665 in_len = strlen(value);
666 normalized = (
char *)malloc(in_len + 1);
679 encoded = (
uint8_t *)malloc(length);
690 for (k = 0; k < length; ++k)
697 memcpy(encoded, normalized, length);
703 memcpy(writer->
data + writer->
length, encoded, length);
729 in_len = strlen(value);
730 normalized = (
char *)malloc(in_len + 1);
737 if (padded && value_len > length)
743 if (!padded && value_len != length)
759 for (k = 0; k < value_len; ++k)
767 size_t to_copy = padded ? value_len : length;
768 memcpy(writer->
data + writer->
length, normalized, to_copy);
769 writer->
length += to_copy;
779 remaining = length > value_len ? length - value_len : 0;
780 for (i = 0; i < remaining; ++i)
808 in_len = strlen(value);
809 normalized = (
char *)malloc(in_len + 1);
816 if (padded && value_len > length)
822 if (!padded && value_len != length)
834 encoded = (
uint8_t *)malloc(length);
845 for (k = 0; k < value_len; ++k)
852 size_t to_copy = padded ? value_len : length;
853 memcpy(encoded, normalized, to_copy);
863 remaining = length > value_len ? length - value_len : 0;
864 for (i = 0; i < remaining; ++i)
872 memcpy(writer->
data + writer->
length, encoded, length);
884 if (!writer || !data)
894 memcpy(writer->
data + writer->
length, data, length);
941 if (next_break < reader->offset)
946 return next_break - reader->
offset;
982 return reader ? reader->
length : 0;
1000 if (!reader || !out_value)
1029 if (!reader || !out_value)
1058 if (!reader || !out_value)
1088 if (!reader || !out_value)
1119 if (!reader || !out_value)
1151 if (!reader || !out_value)
1170 if (!reader || !out_value)
1187 if (!reader || !out_value)
1204 *out_value = (
char *)malloc(length + 1);
1210 memcpy(*out_value, reader->
data + reader->
offset, length);
1211 (*out_value)[length] =
'\0';
1212 reader->
offset += length;
1218 if (!reader || !out_value)
1234 *out_value = (
char *)malloc(length + 1);
1240 memcpy(*out_value, reader->
data + reader->
offset, length);
1242 (*out_value)[length] =
'\0';
1243 reader->
offset += length;
1249 if (!reader || !out_value)
1265 *out_value = (
uint8_t *)malloc(length);
1271 memcpy(*out_value, reader->
data + reader->
offset, length);
1272 reader->
offset += length;
EoResult eo_writer_add_string(EoWriter *writer, const char *value)
static const uint32_t cp1252_unicode_extras[32]
EoResult eo_string_to_windows_1252(const char *value, char **out_value)
EoResult eo_reader_get_fixed_encoded_string(EoReader *reader, size_t length, char **out_value)
bool eo_reader_get_chunked_reading_mode(const EoReader *reader)
EoResult eo_reader_get_string(EoReader *reader, char **out_value)
void eo_reader_activate_chunked_reading(EoReader *reader)
EoResult eo_reader_get_encoded_string(EoReader *reader, char **out_value)
EoResult eo_writer_add_encoded_string(EoWriter *writer, const char *value)
EoResult eo_writer_add_fixed_string(EoWriter *writer, const char *value, size_t length, bool padded)
EoResult eo_reader_get_int(EoReader *reader, int32_t *out_value)
int32_t eo_decode_number(const uint8_t *bytes, size_t length)
EoResult eo_writer_add_byte(EoWriter *writer, uint8_t value)
EoWriter eo_writer_init_with_capacity(size_t capacity)
static size_t eo_reader_next_break_index(const EoReader *reader)
EoResult eo_reader_get_short(EoReader *reader, int32_t *out_value)
const char * eo_result_string(EoResult result)
EoResult eo_reader_next_chunk(EoReader *reader)
static uint8_t unicode_to_cp1252(uint32_t codepoint)
EoResult eo_reader_get_char(EoReader *reader, int32_t *out_value)
static size_t normalize_to_cp1252(const char *input, char *output, size_t input_len)
EoResult eo_writer_add_short(EoWriter *writer, int32_t value)
void eo_encode_string(uint8_t *buf, size_t length)
EoResult eo_writer_add_bytes(EoWriter *writer, const uint8_t *data, size_t length)
bool eo_writer_get_string_sanitization_mode(const EoWriter *writer)
EoResult eo_writer_add_char(EoWriter *writer, int32_t value)
EoResult eo_writer_ensure_capacity(EoWriter *writer, size_t additional)
static char * eo_empty_string(void)
EoWriter eo_writer_init(void)
EoResult eo_reader_get_three(EoReader *reader, int32_t *out_value)
EoResult eo_writer_add_three(EoWriter *writer, int32_t value)
EoResult eo_writer_add_int(EoWriter *writer, int32_t value)
EoResult eo_writer_add_fixed_encoded_string(EoWriter *writer, const char *value, size_t length, bool padded)
void eo_writer_free(EoWriter *writer)
EoReader eo_reader_init(const uint8_t *data, size_t length)
void eo_decode_string(uint8_t *buf, size_t length)
EoResult eo_reader_get_bytes(EoReader *reader, size_t length, uint8_t **out_value)
void eo_writer_set_string_sanitization_mode(EoWriter *writer, bool enabled)
size_t eo_reader_remaining(const EoReader *reader)
EoResult eo_reader_get_fixed_string(EoReader *reader, size_t length, char **out_value)
EoResult eo_encode_number(int32_t number, uint8_t out_bytes[4])
EoResult eo_reader_get_byte(EoReader *reader, uint8_t *out_value)
#define EO_NUMBER_PADDING
@ EO_INVALID_SEQUENCE_RANGE
@ EO_SEQUENCE_OUT_OF_RANGE
@ EO_CHUNKED_MODE_DISABLED
bool chunked_reading_mode
bool string_sanitization_mode