summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKai Stevenson <kai@kaistevenson.com>2023-03-05 00:19:36 -0800
committerKai Stevenson <kai@kaistevenson.com>2023-03-05 00:19:36 -0800
commit56bab06f7ba8a853eedfbf9c07d97a340efc2824 (patch)
tree8e3962d2ec13dc35e844299f73730bbd2b879f52
parent79fa249aa729e03b17991c3991f5bb090ffb6b61 (diff)
started leaderboard library
-rw-r--r--src/leaderboard.c64
-rw-r--r--src/leaderboard.h18
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