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

Defined functions

cmp_sc defined in line 124; used 2 times
score defined in line 33; used 1 times
set_name defined in line 110; used 2 times
show_score defined in line 134; used 1 times

Defined variables

Max_per_uid defined in line 24; used 1 times
  • in line 52
Scorefile defined in line 22; used 4 times
sccsid defined in line 8; never used

Defined typedef's

PASSWD defined in line 20; used 1 times
Last modified: 1985-05-31
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1249
Valid CSS Valid XHTML 1.0 Strict