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