eolib 0.5.0
A core C library for writing applications related to Endless Online
Loading...
Searching...
No Matches
data.h
Go to the documentation of this file.
1#ifndef EOLIB_EO_DATA_H
2#define EOLIB_EO_DATA_H
3
4#include <stdbool.h>
5#include <stddef.h>
6#include <stdint.h>
7
8#include "result.h"
9
11#define EO_CHAR_MAX 253
13#define EO_SHORT_MAX 64009
15#define EO_THREE_MAX 16194277
17#define EO_INT_MAX 4097152081
19#define EO_NUMBER_PADDING 0xFE
21#define EO_BREAK_BYTE 0xFF
22
24typedef struct EoWriter
25{
26 uint8_t *data;
27 size_t length;
29 size_t capacity;
31
33typedef struct EoReader
34{
35 const uint8_t *data;
36 size_t length;
37 size_t offset;
39 size_t chunk_offset;
42
54EoResult eo_string_to_windows_1252(const char *value, char **out_value);
55
61
68
75void eo_writer_free(EoWriter *writer);
76
87EoResult eo_writer_ensure_capacity(EoWriter *writer, size_t additional);
88
99EoResult eo_encode_number(int32_t number, uint8_t out_bytes[4]);
100
110int32_t eo_decode_number(const uint8_t *bytes, size_t length);
111
121void eo_decode_string(uint8_t *buf, size_t length);
122
132void eo_encode_string(uint8_t *buf, size_t length);
133
145void eo_writer_set_string_sanitization_mode(EoWriter *writer, bool enabled);
146
153EoResult eo_writer_add_byte(EoWriter *writer, uint8_t value);
154
161EoResult eo_writer_add_char(EoWriter *writer, int32_t value);
162
169EoResult eo_writer_add_short(EoWriter *writer, int32_t value);
170
177EoResult eo_writer_add_three(EoWriter *writer, int32_t value);
178
189EoResult eo_writer_add_int(EoWriter *writer, int32_t value);
190
197EoResult eo_writer_add_string(EoWriter *writer, const char *value);
198
205EoResult eo_writer_add_encoded_string(EoWriter *writer, const char *value);
206
217EoResult eo_writer_add_fixed_string(EoWriter *writer, const char *value, size_t length, bool padded);
218
229EoResult eo_writer_add_fixed_encoded_string(EoWriter *writer, const char *value, size_t length, bool padded);
230
238EoResult eo_writer_add_bytes(EoWriter *writer, const uint8_t *data, size_t length);
239
247EoReader eo_reader_init(const uint8_t *data, size_t length);
248
255
261void eo_reader_set_chunked_reading_mode(EoReader *reader, bool enabled);
262
268size_t eo_reader_remaining(const EoReader *reader);
269
277
288EoResult eo_reader_get_byte(EoReader *reader, uint8_t *out_value);
289
300EoResult eo_reader_get_char(EoReader *reader, int32_t *out_value);
301
312EoResult eo_reader_get_short(EoReader *reader, int32_t *out_value);
313
324EoResult eo_reader_get_three(EoReader *reader, int32_t *out_value);
325
336EoResult eo_reader_get_int(EoReader *reader, int32_t *out_value);
337
345EoResult eo_reader_get_string(EoReader *reader, char **out_value);
346
354EoResult eo_reader_get_encoded_string(EoReader *reader, char **out_value);
355
365EoResult eo_reader_get_fixed_string(EoReader *reader, size_t length, char **out_value);
366
376EoResult eo_reader_get_fixed_encoded_string(EoReader *reader, size_t length, char **out_value);
377
387EoResult eo_reader_get_bytes(EoReader *reader, size_t length, uint8_t **out_value);
388
393
394typedef struct
395{
397 EoResult (*serialize)(const EoSerialize *self, EoWriter *writer);
398 size_t (*get_size)(const EoSerialize *self);
399 void (*free)(EoSerialize *self);
401
403{
405};
406
414static inline EoResult eo_deserialize(EoSerialize *serialize, EoReader *reader)
415{
416 if (!serialize || !reader)
417 return EO_NULL_PTR;
418 return serialize->vtable->deserialize(serialize, reader);
419}
420
428static inline EoResult eo_serialize(const EoSerialize *serialize, EoWriter *writer)
429{
430 if (!serialize || !writer)
431 return EO_NULL_PTR;
432 return serialize->vtable->serialize(serialize, writer);
433}
434
440static inline size_t eo_get_size(const EoSerialize *serialize)
441{
442 if (!serialize)
443 return 0;
444 return serialize->vtable->get_size(serialize);
445}
446
452static inline void eo_free(EoSerialize *serialize)
453{
454 if (!serialize || !serialize->vtable || !serialize->vtable->free)
455 return;
456 serialize->vtable->free(serialize);
457}
458
462typedef struct EoPacket EoPacket;
463typedef struct
464{
465 uint8_t (*get_family)(const EoPacket *self);
466 uint8_t (*get_action)(const EoPacket *self);
468
474
480static inline uint8_t eo_packet_get_family(const EoPacket *packet)
481{
482 if (!packet)
483 return 0;
484 return packet->vtable->get_family(packet);
485}
486
492static inline uint8_t eo_packet_get_action(const EoPacket *packet)
493{
494 if (!packet)
495 return 0;
496 return packet->vtable->get_action(packet);
497}
498
499#endif
EoResult eo_writer_add_string(EoWriter *writer, const char *value)
Definition data.c:561
EoResult eo_string_to_windows_1252(const char *value, char **out_value)
Definition data.c:154
EoResult eo_reader_get_fixed_encoded_string(EoReader *reader, size_t length, char **out_value)
Definition data.c:1138
bool eo_reader_get_chunked_reading_mode(const EoReader *reader)
Definition data.c:846
static EoResult eo_serialize(const EoSerialize *serialize, EoWriter *writer)
Definition data.h:428
EoResult eo_reader_get_string(EoReader *reader, char **out_value)
Definition data.c:1073
static size_t eo_get_size(const EoSerialize *serialize)
Definition data.h:440
EoResult eo_reader_get_encoded_string(EoReader *reader, char **out_value)
Definition data.c:1090
EoResult eo_writer_add_encoded_string(EoWriter *writer, const char *value)
Definition data.c:607
EoResult eo_writer_add_fixed_string(EoWriter *writer, const char *value, size_t length, bool padded)
Definition data.c:665
EoResult eo_reader_get_int(EoReader *reader, int32_t *out_value)
Definition data.c:1042
int32_t eo_decode_number(const uint8_t *bytes, size_t length)
Definition data.c:314
EoResult eo_writer_add_byte(EoWriter *writer, uint8_t value)
Definition data.c:423
EoWriter eo_writer_init_with_capacity(size_t capacity)
Definition data.c:221
EoResult eo_reader_get_short(EoReader *reader, int32_t *out_value)
Definition data.c:985
void eo_reader_set_chunked_reading_mode(EoReader *reader, bool enabled)
Definition data.c:851
EoResult eo_reader_next_chunk(EoReader *reader)
Definition data.c:889
EoResult eo_reader_get_char(EoReader *reader, int32_t *out_value)
Definition data.c:958
EoResult eo_writer_add_short(EoWriter *writer, int32_t value)
Definition data.c:469
void eo_encode_string(uint8_t *buf, size_t length)
Definition data.c:375
EoResult eo_writer_add_bytes(EoWriter *writer, const uint8_t *data, size_t length)
Definition data.c:815
bool eo_writer_get_string_sanitization_mode(const EoWriter *writer)
Definition data.c:410
EoResult eo_writer_add_char(EoWriter *writer, int32_t value)
Definition data.c:440
EoResult eo_writer_ensure_capacity(EoWriter *writer, size_t additional)
Definition data.c:243
static uint8_t eo_packet_get_action(const EoPacket *packet)
Gets the action of an EO packet.
Definition data.h:492
EoWriter eo_writer_init(void)
Definition data.c:216
EoResult eo_reader_get_three(EoReader *reader, int32_t *out_value)
Definition data.c:1012
EoResult eo_writer_add_three(EoWriter *writer, int32_t value)
Definition data.c:499
EoResult eo_writer_add_int(EoWriter *writer, int32_t value)
Definition data.c:529
EoResult eo_writer_add_fixed_encoded_string(EoWriter *writer, const char *value, size_t length, bool padded)
Definition data.c:734
void eo_writer_free(EoWriter *writer)
Definition data.c:231
EoReader eo_reader_init(const uint8_t *data, size_t length)
Definition data.c:834
void eo_decode_string(uint8_t *buf, size_t length)
Definition data.c:340
EoResult eo_reader_get_bytes(EoReader *reader, size_t length, uint8_t **out_value)
Definition data.c:1169
void eo_writer_set_string_sanitization_mode(EoWriter *writer, bool enabled)
Definition data.c:415
size_t eo_reader_remaining(const EoReader *reader)
Definition data.c:863
static EoResult eo_deserialize(EoSerialize *serialize, EoReader *reader)
Definition data.h:414
EoResult eo_reader_get_fixed_string(EoReader *reader, size_t length, char **out_value)
Definition data.c:1107
EoResult eo_encode_number(int32_t number, uint8_t out_bytes[4])
Definition data.c:273
static uint8_t eo_packet_get_family(const EoPacket *packet)
Gets the family of an EO packet.
Definition data.h:480
static void eo_free(EoSerialize *serialize)
Definition data.h:452
EoResult eo_reader_get_byte(EoReader *reader, uint8_t *out_value)
Definition data.c:931
EoResult
Definition result.h:12
@ EO_NULL_PTR
Definition result.h:22
uint8_t(* get_family)(const EoPacket *self)
Definition data.h:465
uint8_t(* get_action)(const EoPacket *self)
Definition data.h:466
EoSerialize base
Definition data.h:471
const EoPacketVTable * vtable
Definition data.h:472
size_t next_chunk_offset
Definition data.h:40
size_t offset
Definition data.h:37
size_t chunk_offset
Definition data.h:39
const uint8_t * data
Definition data.h:35
size_t length
Definition data.h:36
bool chunked_reading_mode
Definition data.h:38
EoResult(* deserialize)(EoSerialize *self, EoReader *reader)
Definition data.h:396
EoResult(* serialize)(const EoSerialize *self, EoWriter *writer)
Definition data.h:397
void(* free)(EoSerialize *self)
Definition data.h:399
size_t(* get_size)(const EoSerialize *self)
Definition data.h:398
const EoSerializeVTable * vtable
Definition data.h:404
bool string_sanitization_mode
Definition data.h:28
size_t length
Definition data.h:27
size_t capacity
Definition data.h:29
uint8_t * data
Definition data.h:26