diff options
| author | Kai Stevenson <kai@kaistevenson.com> | 2023-03-05 00:19:36 -0800 |
|---|---|---|
| committer | Kai Stevenson <kai@kaistevenson.com> | 2023-03-05 00:19:36 -0800 |
| commit | 56bab06f7ba8a853eedfbf9c07d97a340efc2824 (patch) | |
| tree | 8e3962d2ec13dc35e844299f73730bbd2b879f52 | |
| parent | 79fa249aa729e03b17991c3991f5bb090ffb6b61 (diff) | |
started leaderboard library
| -rw-r--r-- | src/leaderboard.c | 64 | ||||
| -rw-r--r-- | src/leaderboard.h | 18 |
2 files changed, 82 insertions, 0 deletions
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 <stdlib.h> +#include <fcntl.h> +#include <stdio.h> +#include <sys/file.h> +#include <string.h> +#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 |
