48 lines
1.3 KiB
C++
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);
|
|
} |