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
80
81
|
#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);
}
}
|