From 56bab06f7ba8a853eedfbf9c07d97a340efc2824 Mon Sep 17 00:00:00 2001 From: Kai Stevenson Date: Sun, 5 Mar 2023 00:19:36 -0800 Subject: started leaderboard library --- src/leaderboard.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/leaderboard.h | 18 ++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 src/leaderboard.c create mode 100644 src/leaderboard.h diff --git a/src/leaderboard.c b/src/leaderboard.c new file mode 100644 index 0000000..755cff7 --- /dev/null +++ b/src/leaderboard.c @@ -0,0 +1,64 @@ +#include +#include +#include +#include +#include +#include "leaderboard.h" +leaderScore_t init_leaderscore(char* name, unsigned long int score) { + leaderscore_t score; + score.name = name; + score.score = score; + return score; +} +leaderboard_t init_leaderboard(unsigned int capacity) { + leaderboard_t lb; + lb.capacity = capacity; + lb.count = 0; +} +leaderboard_t leaderboard_add_score(leaderboard_t leaderboard, leaderscore_t score) { + leaderboard.scores[leaderboard.count] = score; + leaderboard.count++; + return leaderboard; +} +leaderboard_t read_leaderboard(char* path, unsigned int capacity) { + FILE* file = fopen(path, "r"); + if (file == NULL) { + return NULL; + } + leaderboard_t lb = init_leaderboard(capacity); + while (char c = fgetc(file) != EOF) { + /* name */ + int ni = 0; + char* name = malloc(15 * sizeof(char)); + while (c != ',') { + name[ni] = c; + ni++; + } + name[ni] = '\0'; + name = realloc(name, ni); + /* score */ + int si = 0; + char* scoreStr = malloc(20 * sizeof(char)); + while (c != '\n') { + scoreStr[si] = c; + si++; + } + scoreStr[si] = '\0'; + unsigned long int score = atoi(scoreStr); + leaderscore_t ls = init_leaderscore(name, score); + leaderboard_add_score(lb, ls); + } + fclose(file); + return lb; +} +void save_leaderboard(leaderboard_t leaderboard, char* path) { + FILE* file = fopen(path, "w"); + int res = flock(fileno(file), LOCK_EX); + if (res != 0) { + return; + } + /* got lock */ + /* TODO: actually write the leaderboard */ + flock(fileno(file), LOCK_UN); +} +void draw_leaderboard(leaderboard_t leaderboard); diff --git a/src/leaderboard.h b/src/leaderboard.h new file mode 100644 index 0000000..0488608 --- /dev/null +++ b/src/leaderboard.h @@ -0,0 +1,18 @@ +#ifndef LEADERBOARD +#define LEADERBOARD +typedef struct LeaderScore { + char* name; + unsigned long int score; +} leaderscore_t; +leaderscore_t init_leaderscore(char* name, unsigned long int score); +typedef struct Leaderboard { + leaderscore_t* scores; + unsigned int capacity; + unsigned long int count; +} leaderboard_t; +leaderboard_t init_leaderboard(unsigned int capacity); +leaderboard_t leaderboard_add_score(leaderboard_t leaderboard, leaderscore_t score); +leaderboard_t read_leaderboard(char* path); +void save_leaderboard(leaderboard_t leaderboard, char* path); +void draw_leaderboard(leaderboard_t leaderboard); +#endif -- cgit v1.3.1