summaryrefslogtreecommitdiff
path: root/src/leaderboard.c
blob: 3a87ffa6abde7ce6e5b6273db2acdbb555435cf8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#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"); /* a appends to file */
	int res = flock(fileno(file), LOCK_EX);
	int i;
	leaderscore_t cur;
	if (res != 0) {
		fclose(file);
		return;
	}
	/* got lock */
	for (i = 0; i < leaderboard.count; i ++) {
		cur = leaderboard.scores[i];
		/* append to file: name,score\n */
		fprintf(file, "%s,%ld\n", cur.name, cur.score); /* prints to file stream */
	}
	flock(fileno(file), LOCK_UN);
	fclose(file);
}

void draw_leaderboard(leaderboard_t leaderboard) {
	int i;
	leaderscore_t cur;
	for (i = 0; i < leaderboard.count; i ++) {
		cur = leaderboard.scores[i];
		printf("%s\t%ld\n", cur.name, cur.score);
	}
}