1*21473Smckusick /* 2*21473Smckusick * Copyright (c) 1980 Regents of the University of California. 3*21473Smckusick * All rights reserved. The Berkeley software License Agreement 4*21473Smckusick * specifies the terms and conditions for redistribution. 5*21473Smckusick */ 6*21473Smckusick 7*21473Smckusick #ifndef lint 8*21473Smckusick static char sccsid[] = "@(#)score.c 5.1 (Berkeley) 05/30/85"; 9*21473Smckusick #endif not lint 10*21473Smckusick 11*21473Smckusick # include "robots.h" 12*21473Smckusick # include <pwd.h> 13*21473Smckusick 14*21473Smckusick typedef struct { 15*21473Smckusick int s_uid; 16*21473Smckusick int s_score; 17*21473Smckusick char s_name[MAXNAME]; 18*21473Smckusick } SCORE; 19*21473Smckusick 20*21473Smckusick typedef struct passwd PASSWD; 21*21473Smckusick 22*21473Smckusick char *Scorefile = SCOREFILE; 23*21473Smckusick 24*21473Smckusick int Max_per_uid = MAX_PER_UID; 25*21473Smckusick 26*21473Smckusick static SCORE Top[MAXSCORES]; 27*21473Smckusick 28*21473Smckusick /* 29*21473Smckusick * score: 30*21473Smckusick * Post the player's score, if reasonable, and then print out the 31*21473Smckusick * top list. 32*21473Smckusick */ 33*21473Smckusick score() 34*21473Smckusick { 35*21473Smckusick register int inf; 36*21473Smckusick register SCORE *scp; 37*21473Smckusick register int uid; 38*21473Smckusick register bool done_show = FALSE; 39*21473Smckusick static int numscores, max_uid; 40*21473Smckusick 41*21473Smckusick Newscore = FALSE; 42*21473Smckusick if ((inf = open(Scorefile, 2)) < 0) { 43*21473Smckusick perror(Scorefile); 44*21473Smckusick return; 45*21473Smckusick } 46*21473Smckusick 47*21473Smckusick if (read(inf, &max_uid, sizeof max_uid) == sizeof max_uid) 48*21473Smckusick read(inf, Top, sizeof Top); 49*21473Smckusick else { 50*21473Smckusick for (scp = Top; scp < &Top[MAXSCORES]; scp++) 51*21473Smckusick scp->s_score = -1; 52*21473Smckusick max_uid = Max_per_uid; 53*21473Smckusick } 54*21473Smckusick 55*21473Smckusick uid = getuid(); 56*21473Smckusick if (Top[MAXSCORES-1].s_score <= Score) { 57*21473Smckusick numscores = 0; 58*21473Smckusick for (scp = Top; scp < &Top[MAXSCORES]; scp++) 59*21473Smckusick if (scp->s_score < 0 || 60*21473Smckusick (scp->s_uid == uid && ++numscores == max_uid)) { 61*21473Smckusick if (scp->s_score > Score) 62*21473Smckusick break; 63*21473Smckusick scp->s_score = Score; 64*21473Smckusick scp->s_uid = uid; 65*21473Smckusick set_name(scp); 66*21473Smckusick Newscore = TRUE; 67*21473Smckusick break; 68*21473Smckusick } 69*21473Smckusick if (scp == &Top[MAXSCORES]) { 70*21473Smckusick Top[MAXSCORES-1].s_score = Score; 71*21473Smckusick Top[MAXSCORES-1].s_uid = uid; 72*21473Smckusick set_name(&Top[MAXSCORES-1]); 73*21473Smckusick Newscore = TRUE; 74*21473Smckusick } 75*21473Smckusick if (Newscore) 76*21473Smckusick qsort(Top, MAXSCORES, sizeof Top[0], cmp_sc); 77*21473Smckusick } 78*21473Smckusick 79*21473Smckusick if (!Newscore) { 80*21473Smckusick Full_clear = FALSE; 81*21473Smckusick close(inf); 82*21473Smckusick return; 83*21473Smckusick } 84*21473Smckusick else 85*21473Smckusick Full_clear = TRUE; 86*21473Smckusick 87*21473Smckusick for (scp = Top; scp < &Top[MAXSCORES]; scp++) { 88*21473Smckusick if (scp->s_score < 0) 89*21473Smckusick break; 90*21473Smckusick move((scp - Top) + 1, 15); 91*21473Smckusick if (!done_show && scp->s_uid == uid && scp->s_score == Score) 92*21473Smckusick standout(); 93*21473Smckusick printw(" %d\t%d\t%-8.8s ", (scp - Top) + 1, scp->s_score, scp->s_name); 94*21473Smckusick if (!done_show && scp->s_uid == uid && scp->s_score == Score) { 95*21473Smckusick standend(); 96*21473Smckusick done_show = TRUE; 97*21473Smckusick } 98*21473Smckusick } 99*21473Smckusick Num_scores = scp - Top; 100*21473Smckusick refresh(); 101*21473Smckusick 102*21473Smckusick if (Newscore) { 103*21473Smckusick lseek(inf, 0L, 0); 104*21473Smckusick write(inf, &max_uid, sizeof max_uid); 105*21473Smckusick write(inf, Top, sizeof Top); 106*21473Smckusick } 107*21473Smckusick close(inf); 108*21473Smckusick } 109*21473Smckusick 110*21473Smckusick set_name(scp) 111*21473Smckusick register SCORE *scp; 112*21473Smckusick { 113*21473Smckusick register PASSWD *pp; 114*21473Smckusick 115*21473Smckusick if ((pp = getpwuid(scp->s_uid)) == NULL) 116*21473Smckusick pp->pw_name = "???"; 117*21473Smckusick strncpy(scp->s_name, pp->pw_name, MAXNAME); 118*21473Smckusick } 119*21473Smckusick 120*21473Smckusick /* 121*21473Smckusick * cmp_sc: 122*21473Smckusick * Compare two scores. 123*21473Smckusick */ 124*21473Smckusick cmp_sc(s1, s2) 125*21473Smckusick register SCORE *s1, *s2; 126*21473Smckusick { 127*21473Smckusick return s2->s_score - s1->s_score; 128*21473Smckusick } 129*21473Smckusick 130*21473Smckusick /* 131*21473Smckusick * show_score: 132*21473Smckusick * Show the score list for the '-s' option. 133*21473Smckusick */ 134*21473Smckusick show_score() 135*21473Smckusick { 136*21473Smckusick register SCORE *scp; 137*21473Smckusick register int inf; 138*21473Smckusick static int max_score; 139*21473Smckusick 140*21473Smckusick if ((inf = open(Scorefile, 0)) < 0) { 141*21473Smckusick perror(Scorefile); 142*21473Smckusick return; 143*21473Smckusick } 144*21473Smckusick 145*21473Smckusick for (scp = Top; scp < &Top[MAXSCORES]; scp++) 146*21473Smckusick scp->s_score = -1; 147*21473Smckusick 148*21473Smckusick read(inf, &max_score, sizeof max_score); 149*21473Smckusick read(inf, Top, sizeof Top); 150*21473Smckusick close(inf); 151*21473Smckusick inf = 1; 152*21473Smckusick for (scp = Top; scp < &Top[MAXSCORES]; scp++) 153*21473Smckusick if (scp->s_score >= 0) 154*21473Smckusick printf("%d\t%d\t%.*s\n", inf++, scp->s_score, sizeof scp->s_name, scp->s_name); 155*21473Smckusick } 156