1 #ifndef lint 2 static char sccsid[] = "@(#)snscore.c 4.1 (Berkeley) 07/04/83"; 3 #endif 4 5 #include <stdio.h> 6 #include <pwd.h> 7 char *recfile = "/usr/games/lib/snakerawscores"; 8 #define MAXPLAYERS 256 9 10 struct passwd *getpwuid(); 11 char *malloc(); 12 13 struct player { 14 short uids; 15 short scores; 16 char *name; 17 } players[MAXPLAYERS], temp; 18 19 main() 20 { 21 char buf[80], cp; 22 short uid, score; 23 FILE *fd; 24 int noplayers; 25 int i, j, notsorted; 26 short whoallbest, allbest; 27 char *q; 28 struct passwd *p; 29 30 fd = fopen(recfile, "r"); 31 if (fd == NULL) { 32 perror(recfile); 33 exit(1); 34 } 35 printf("Snake players scores to date\n"); 36 fread(&whoallbest, sizeof(short), 1, fd); 37 fread(&allbest, sizeof(short), 1, fd); 38 for (uid=2;;uid++) { 39 if(fread(&score, sizeof(short), 1, fd) == 0) 40 break; 41 if (score > 0) { 42 if (noplayers > MAXPLAYERS) { 43 printf("too many players\n"); 44 exit(2); 45 } 46 players[noplayers].uids = uid; 47 players[noplayers].scores = score; 48 /* This is faster if passwd is sorted by uid. */ 49 p = getpwuid(uid); 50 if (p == NULL) 51 continue; 52 q = p -> pw_name; 53 players[noplayers].name = malloc(strlen(q)+1); 54 strcpy(players[noplayers].name, q); 55 noplayers++; 56 } 57 } 58 59 /* bubble sort scores */ 60 for (notsorted=1; notsorted; ) { 61 notsorted = 0; 62 for (i=0; i<noplayers-1; i++) 63 if (players[i].scores < players[i+1].scores) { 64 temp = players[i]; 65 players[i] = players[i+1]; 66 players[i+1] = temp; 67 notsorted++; 68 } 69 } 70 71 j = 1; 72 for (i=0; i<noplayers; i++) { 73 printf("%d:\t$%d\t%s\n", j, players[i].scores, players[i].name); 74 if (players[i].scores > players[i+1].scores) 75 j = i+2; 76 } 77 exit(0); 78 } 79 80 struct passwd * 81 getpwuid(uid) 82 register uid; 83 { 84 register struct passwd *p; 85 struct passwd *getpwent(); 86 87 while( (p = getpwent()) && p->pw_uid != uid ); 88 if (p->pw_uid == uid) 89 return(p); 90 setpwent(); 91 while( (p = getpwent()) && p->pw_uid != uid ); 92 endpwent(); 93 return(p); 94 } 95