1 #include <stdio.h>
2 #include <strings.h>
3 #include <sys/types.h>
4 #include <sys/file.h>
5 #include <pwd.h>
6
7
8 FILE *scoreFile;
9 #ifndef SCOREfILE
10 #define SCOREfILE "/usr/X386/lib/X11/games/xbomb-scores"
11 #endif
12 #define NUMsCORES 10
13 #define NAMEsIZE 50
14 #define SCOREfORMAT "%5d %s\n"
15 #define MAXpERnAME 2
16
17 struct
18 {
19 unsigned score;
20 char name[NAMEsIZE];
21 } scores[NUMsCORES] = {{999,""}};
22
openScores()23 openScores()
24 {
25 if ((scoreFile = fopen (SCOREfILE, "r+")) == NULL)
26 {
27 fprintf(stderr,"Error: can't open score file: %s\n", SCOREfILE);
28 }
29 }
30
readScores()31 readScores()
32 {
33 int i;
34
35 if (scoreFile == NULL) return;
36
37 rewind(scoreFile);
38
39 for (i = 0; i < NUMsCORES; i++) {
40 fscanf (scoreFile,SCOREfORMAT, &scores[i].score, scores[i].name);
41 }
42 }
43
44
printScores()45 printScores()
46 {
47 int i;
48
49 for (i = 0; i < NUMsCORES; i++) {
50 printf (SCOREfORMAT, scores[i].score, scores[i].name);
51 }
52 }
53
writeScores()54 writeScores()
55 {
56 int i;
57
58 if (scoreFile == NULL) return;
59
60 rewind(scoreFile); /* okay, so the file never gets shorter */
61 for (i = 0; i < NUMsCORES; i++) {
62 fprintf (scoreFile, SCOREfORMAT, scores[i].score, scores[i].name);
63 }
64 }
65
newScore(score)66 newScore(score)
67 unsigned score;
68 {
69 int i,
70 loser;
71 unsigned scoresPerName;
72 char *name;
73
74 if (scoreFile != NULL)
75 flock (fileno(scoreFile), LOCK_EX);
76 readScores ();
77
78 scoresPerName = 0;
79 name = getpwuid (getuid ()) -> pw_name;
80 for (i = 0; i < NUMsCORES; i++) {
81 if (strncmp (scores[i].name, name, NAMEsIZE) == 0) {
82 scoresPerName += 1;
83 loser = i;
84 }
85 }
86
87 if (scoresPerName < MAXpERnAME) {/* push off the last person */
88 loser = NUMsCORES - 1;
89 }
90 if (score < scores[loser].score) {/* deserves a high score */
91 for (i = loser; i > 0; i--) {
92 if (score >= scores[i - 1].score)
93 break;
94 scores[i].score = scores[i - 1].score;
95 strncpy (scores[i].name, scores[i - 1].name, NAMEsIZE - 1);
96 }
97 scores[i].score = score;
98 strncpy (scores[i].name, name, NAMEsIZE);
99 writeScores ();
100 }
101
102 if (scoreFile != NULL)
103 flock (fileno(scoreFile), LOCK_UN);
104 }
105
print_scores()106 print_scores()
107 {
108 int i;
109 char s[80];
110
111 for (i = 0; i < NUMsCORES; i++)
112 {
113 sprintf(s,"%5d %s",scores[i].score,scores[i].name);
114 WriteScore(i,s);
115 }
116 }
117