You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
287 lines
7.2 KiB
Plaintext
287 lines
7.2 KiB
Plaintext
#include <raylib.h>
|
|
#include <stdlib.h>
|
|
#include <math.h>
|
|
|
|
#include "splits.h"
|
|
#include "timer.h"
|
|
#include "xml.h"
|
|
#include "fmt.h"
|
|
|
|
extern Font font;
|
|
extern void error(const char *msg);
|
|
|
|
void print_segment(segment *seg) {
|
|
printf("%s\n", seg->name);
|
|
//printf("%ld.%ld\n", seg->realtime.tv_sec, seg->realtime.tv_nsec);
|
|
}
|
|
|
|
//utils
|
|
int get_file_size(FILE *file) {
|
|
int size;
|
|
fseek(file, 0L, SEEK_END);
|
|
size = ftell(file);
|
|
fseek(file, 0L, SEEK_SET);
|
|
return size;
|
|
}
|
|
|
|
void log_node(struct xml_node *node) {
|
|
//struct xml_node *root = xml_document_root(document);
|
|
struct xml_string *name = xml_node_name(node);
|
|
struct xml_string *content = xml_node_content(node);
|
|
int name_len = xml_string_length(name);
|
|
int content_len = xml_string_length(content);
|
|
uint8_t *name_buffer = calloc(name_len + 1, sizeof(uint8_t));
|
|
uint8_t *content_buffer = calloc(content_len + 1, sizeof(uint8_t));
|
|
xml_string_copy(name, name_buffer, name_len);
|
|
xml_string_copy(content, content_buffer, content_len);
|
|
printf("%s: %s\n", name_buffer, content_buffer);
|
|
free(name_buffer);
|
|
free(content_buffer);
|
|
}
|
|
|
|
//print children of node
|
|
void enum_node(struct xml_node *node) {
|
|
int children;
|
|
children = xml_node_children(node);
|
|
|
|
for (int i = 0; i < children; i++) {
|
|
struct xml_node *child = xml_node_child(node, i);
|
|
log_node(child);
|
|
//enum_node(child);
|
|
}
|
|
}
|
|
|
|
void enum_node_recursive(struct xml_node *node) {
|
|
int children;
|
|
children = xml_node_children(node);
|
|
|
|
for (int i = 0; i < children; i++) {
|
|
struct xml_node *child = xml_node_child(node, i);
|
|
log_node(child);
|
|
enum_node(child);
|
|
}
|
|
}
|
|
|
|
bool xml_name_compare(struct xml_node *node, const char *str) {
|
|
bool equal;
|
|
struct xml_string *name = xml_node_name(node);
|
|
int len = xml_string_length(name);
|
|
|
|
uint8_t *buffer = calloc(len + 1, sizeof(uint8_t));
|
|
xml_string_copy(name, buffer, len);
|
|
equal = !strcmp(buffer, str);
|
|
free(buffer);
|
|
return equal;
|
|
}
|
|
|
|
typedef struct segment_nodes {
|
|
struct xml_node **nodes;
|
|
int count;
|
|
} segment_nodes;
|
|
|
|
segment_nodes get_node_children(struct xml_node *node) {
|
|
segment_nodes segments;
|
|
|
|
segments.count = xml_node_children(node);
|
|
printf("get_node_children: %d\n", segments.count);
|
|
segments.nodes = calloc(segments.count, sizeof(struct xml_node *));
|
|
|
|
for (int i = 0; i < segments.count; i++) {
|
|
segments.nodes[i] = xml_node_child(node, i);
|
|
}
|
|
|
|
return segments;
|
|
}
|
|
|
|
uint8_t *convert(struct xml_string *xml) {
|
|
int len = xml_string_length(xml);
|
|
uint8_t *buffer = calloc(len + 1, sizeof(uint8_t));
|
|
xml_string_copy(xml, buffer, len);
|
|
return buffer;
|
|
}
|
|
|
|
struct xml_string *get_name_string(struct xml_node *node) {
|
|
for (int i = 0; i < xml_node_children(node); i++) {
|
|
struct xml_node *child = xml_node_child(node, i);
|
|
if (xml_name_compare(child, "Name")) {
|
|
return xml_node_content(child);
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
struct xml_string *get_time_string(struct xml_node *node) {
|
|
struct xml_node *iter;
|
|
|
|
for (int i = 0; i < xml_node_children(node); i++) {
|
|
if (xml_name_compare(xml_node_child(node, i), "SplitTimes")) {
|
|
iter = xml_node_child(node, i);
|
|
break;
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < xml_node_children(iter); i++) {
|
|
if (xml_name_compare(xml_node_child(iter, i), "SplitTime")) {
|
|
iter = xml_node_child(iter, i);
|
|
break;
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < xml_node_children(iter); i++) {
|
|
if (xml_name_compare(xml_node_child(iter, i), "RealTime")) {
|
|
iter = xml_node_child(iter, i);
|
|
return xml_node_content(iter);
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
uint8_t **extract(segment_nodes segments, struct xml_string *(operation)(struct xml_node *)) {
|
|
struct xml_string **xml_strings = calloc(segments.count, sizeof(struct xml_string *));
|
|
|
|
for (int i = 0; i < segments.count; i++) {
|
|
xml_strings[i] = operation(segments.nodes[i]);
|
|
}
|
|
|
|
uint8_t **strings = calloc(segments.count, sizeof(uint8_t *));
|
|
|
|
for (int i = 0; i < segments.count; i++) {
|
|
strings[i] = convert(xml_strings[i]);
|
|
}
|
|
|
|
return strings;
|
|
}
|
|
|
|
struct xml_node *get_segments_node(struct xml_node *root) {
|
|
struct xml_node *child;
|
|
|
|
for (int i = 0; i < xml_node_children(root); i++) {
|
|
struct xml_node *child = xml_node_child(root, i);
|
|
if (xml_name_compare(child, "Segments")) {
|
|
return child;
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
struct xml_string **get_segment_names(struct xml_node *segments) {
|
|
int segments_count;
|
|
struct xml_string **segment_names;
|
|
|
|
segments_count = xml_node_children(segments);
|
|
|
|
}
|
|
|
|
void print_all_segment_names(struct xml_node *node) {
|
|
struct xml_node *segments = get_segments_node(node);
|
|
if (!segments) {
|
|
error("couldnt get em");
|
|
}
|
|
|
|
enum_node(segments);
|
|
}
|
|
|
|
segment *create_segment(char *name) {
|
|
segment *seg = calloc(1, sizeof(segment));
|
|
seg->name = name;
|
|
return seg;
|
|
}
|
|
|
|
segment_list open_splits_file(const char *path) {
|
|
FILE *xml_file = fopen(path, "r");
|
|
if (!xml_file) {
|
|
error("Could not open file");
|
|
}
|
|
|
|
int xml_file_size = get_file_size(xml_file);
|
|
uint8_t *buffer = calloc(sizeof(uint8_t), xml_file_size);
|
|
int no = fread(buffer, sizeof(uint8_t), xml_file_size, xml_file);
|
|
|
|
struct xml_document *xml = xml_parse_document(buffer, xml_file_size);
|
|
if (!xml) {
|
|
error("Could not parse xml");
|
|
}
|
|
|
|
//printf("splits.c: parsed %s successfully\n", path);
|
|
|
|
int children = 0;
|
|
struct xml_node *root = xml_document_root(xml);
|
|
|
|
struct xml_node *segments_node = get_segments_node(root);
|
|
segment_nodes segments = get_node_children(segments_node);
|
|
uint8_t **segment_names = extract(segments, get_name_string);
|
|
uint8_t **segment_times = extract(segments, get_time_string);
|
|
|
|
printf("open_splits_file: %d\n", segments.count);
|
|
|
|
for (int i = 0; i < segments.count; i++) {
|
|
printf("%s\n", segment_names[i]);
|
|
}
|
|
|
|
segment_list seglist = {0};
|
|
printf("open_splits_file: %d\n", segments.count);
|
|
|
|
//printf("%ld\n", segments.count * sizeof(segment));
|
|
//long long what = segments.count * sizeof(segment);
|
|
//printf("what: %lld\n", what);
|
|
//segment *segs = malloc(1008);
|
|
segment *segs = malloc(segments.count * sizeof(*segs));
|
|
//printf("?\n");
|
|
|
|
for (int i = 0; i < segments.count; i++) {
|
|
segs[i].name = segment_names[i];
|
|
if (segment_times[i] != NULL) {
|
|
segs[i].realtime = parse_time(segment_times[i]);
|
|
printf("%s\n", segment_times[i]);
|
|
}
|
|
}
|
|
|
|
printf("splits.c: parsed %s successfully\n", path);
|
|
|
|
seglist.segments = segs;
|
|
seglist.count = segments.count;
|
|
return seglist;
|
|
}
|
|
|
|
char *save_fmt(segment_list *sl) {
|
|
#define buffer_size 8192
|
|
static char buffer[buffer_size];
|
|
char *bfp;
|
|
bfp = &buffer[0];
|
|
memset(bfp, 0, buffer_size);
|
|
|
|
char unparse_buffer[64];
|
|
char *unp;
|
|
|
|
for (int i = 0; i < sl->count; i++) {
|
|
unp = time_unparse(unparse_buffer, 64, &sl->segments[i].realtime);
|
|
sprintf(bfp, "%s=%s%%", sl->segments[i].name, unp);
|
|
bfp += strlen(bfp);
|
|
}
|
|
|
|
printf("%s\n", buffer);
|
|
return buffer;
|
|
#undef buffer_size
|
|
}
|
|
/*void render_splits(segment_list *segments) {
|
|
char buffer[100];
|
|
|
|
for (int i = 0; i < segments->count; i++) {
|
|
DrawTextEx(font, segments->segments[i].name, (Vector2){10, 30 * i}, (float)font.baseSize/16, 2, WHITE);
|
|
//DrawTextEx(font, time_unparse(buffer, 100, &segments->segments[i].realtime), (Vector2){200, 30 * i}, (float)font.baseSize/16, 2, BLACK);
|
|
}
|
|
}*/
|
|
|
|
void debug_print_list(segment_list *segments) {
|
|
for (int i = 0; i < segments->count; i++) {
|
|
printf("fucker %d\n", i);
|
|
printf("%s\n", segments->segments[i].name);
|
|
}
|
|
}
|
|
|
|
//probably need a thing to free all the segments
|
|
|