Files
MCRLSdcard/lib/rtlf.cpp
2026-02-20 20:44:13 +01:00

48 lines
1.3 KiB
C++

#include "rtlf.h"
#include "cassert"
static int write_header_block(FILE* file, __uint32_t car_id, const char* track_name) {
RTLF_Header_Fixed header;
const size_t track_len = strlen(track_name);
memcpy(header.magic_number, RTLF_MAGIC_NUMBER, 4);
header.version = RTLF_VERSION;
header.car_id = car_id;
header.track_name_len = static_cast<__uint32_t>(track_len);
assert(fwrite(&header, sizeof(RTLF_Header_Fixed), 1, file) == 1);
assert(fwrite(track_name, 1, track_len, file) == track_len);
return 0;
}
RTLF_Context* rtlf_open_write(const char* filename, __uint32_t car_id, const char* track_name) {
FILE* file = fopen(filename, "wb");
assert(file != nullptr);
write_header_block(file, car_id, track_name);
auto* ctx = static_cast<RTLF_Context *>(malloc(sizeof(RTLF_Context)));
if (!ctx) {
fclose(file);
return nullptr;
}
ctx->file = file;
ctx->track_name = strdup(track_name);
return ctx;
}
int rtlf_write_record(RTLF_Context* ctx, const RTLF_Data_Record* record) {
if (!ctx || !ctx->file) return -1;
if (fwrite(record, RTLF_RECORD_SIZE, 1, ctx->file) != 1) return -1;
return 0;
}
void rtlf_close(RTLF_Context* ctx) {
if (!ctx) return;
if (ctx->file) fclose(ctx->file);
if (ctx->track_name) free(ctx->track_name);
free(ctx);
}