Initial commit
This commit is contained in:
48
lib/rtlf.cpp
Normal file
48
lib/rtlf.cpp
Normal file
@@ -0,0 +1,48 @@
|
||||
#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);
|
||||
}
|
||||
Reference in New Issue
Block a user