Annotation of 43BSDTahoe/games/robots/score.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1980 Regents of the University of California.
                      3:  * All rights reserved.
                      4:  *
                      5:  * Redistribution and use in source and binary forms are permitted
                      6:  * provided that the above copyright notice and this paragraph are
                      7:  * duplicated in all such forms and that any documentation,
                      8:  * advertising materials, and other materials related to such
                      9:  * distribution and use acknowledge that the software was developed
                     10:  * by the University of California, Berkeley.  The name of the
                     11:  * University may not be used to endorse or promote products derived
                     12:  * from this software without specific prior written permission.
                     13:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
                     14:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
                     15:  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     16:  */
                     17: 
                     18: #ifndef lint
                     19: static char sccsid[] = "@(#)score.c    5.3 (Berkeley) 6/18/88";
                     20: #endif /* not lint */
                     21: 
                     22: # include      "robots.h"
                     23: # include      <pwd.h>
                     24: 
                     25: typedef struct {
                     26:        int     s_uid;
                     27:        int     s_score;
                     28:        char    s_name[MAXNAME];
                     29: } SCORE;
                     30: 
                     31: typedef struct passwd  PASSWD;
                     32: 
                     33: char   *Scorefile = SCOREFILE;
                     34: 
                     35: int    Max_per_uid = MAX_PER_UID;
                     36: 
                     37: static SCORE   Top[MAXSCORES];
                     38: 
                     39: /*
                     40:  * score:
                     41:  *     Post the player's score, if reasonable, and then print out the
                     42:  *     top list.
                     43:  */
                     44: score()
                     45: {
                     46:        register int    inf;
                     47:        register SCORE  *scp;
                     48:        register int    uid;
                     49:        register bool   done_show = FALSE;
                     50:        static int      numscores, max_uid;
                     51: 
                     52:        Newscore = FALSE;
                     53:        if ((inf = open(Scorefile, 2)) < 0) {
                     54:                perror(Scorefile);
                     55:                return;
                     56:        }
                     57: 
                     58:        if (read(inf, &max_uid, sizeof max_uid) == sizeof max_uid)
                     59:                read(inf, Top, sizeof Top);
                     60:        else {
                     61:                for (scp = Top; scp < &Top[MAXSCORES]; scp++)
                     62:                        scp->s_score = -1;
                     63:                max_uid = Max_per_uid;
                     64:        }
                     65: 
                     66:        uid = getuid();
                     67:        if (Top[MAXSCORES-1].s_score <= Score) {
                     68:                numscores = 0;
                     69:                for (scp = Top; scp < &Top[MAXSCORES]; scp++)
                     70:                        if (scp->s_score < 0 ||
                     71:                            (scp->s_uid == uid && ++numscores == max_uid)) {
                     72:                                if (scp->s_score > Score)
                     73:                                        break;
                     74:                                scp->s_score = Score;
                     75:                                scp->s_uid = uid;
                     76:                                set_name(scp);
                     77:                                Newscore = TRUE;
                     78:                                break;
                     79:                        }
                     80:                if (scp == &Top[MAXSCORES]) {
                     81:                        Top[MAXSCORES-1].s_score = Score;
                     82:                        Top[MAXSCORES-1].s_uid = uid;
                     83:                        set_name(&Top[MAXSCORES-1]);
                     84:                        Newscore = TRUE;
                     85:                }
                     86:                if (Newscore)
                     87:                        qsort(Top, MAXSCORES, sizeof Top[0], cmp_sc);
                     88:        }
                     89: 
                     90:        if (!Newscore) {
                     91:                Full_clear = FALSE;
                     92:                close(inf);
                     93:                return;
                     94:        }
                     95:        else
                     96:                Full_clear = TRUE;
                     97: 
                     98:        for (scp = Top; scp < &Top[MAXSCORES]; scp++) {
                     99:                if (scp->s_score < 0)
                    100:                        break;
                    101:                move((scp - Top) + 1, 15);
                    102:                if (!done_show && scp->s_uid == uid && scp->s_score == Score)
                    103:                        standout();
                    104:                printw(" %d\t%d\t%-8.8s ", (scp - Top) + 1, scp->s_score, scp->s_name);
                    105:                if (!done_show && scp->s_uid == uid && scp->s_score == Score) {
                    106:                        standend();
                    107:                        done_show = TRUE;
                    108:                }
                    109:        }
                    110:        Num_scores = scp - Top;
                    111:        refresh();
                    112: 
                    113:        if (Newscore) {
                    114:                lseek(inf, 0L, 0);
                    115:                write(inf, &max_uid, sizeof max_uid);
                    116:                write(inf, Top, sizeof Top);
                    117:        }
                    118:        close(inf);
                    119: }
                    120: 
                    121: set_name(scp)
                    122: register SCORE *scp;
                    123: {
                    124:        register PASSWD *pp;
                    125: 
                    126:        if ((pp = getpwuid(scp->s_uid)) == NULL)
                    127:                pp->pw_name = "???";
                    128:        strncpy(scp->s_name, pp->pw_name, MAXNAME);
                    129: }
                    130: 
                    131: /*
                    132:  * cmp_sc:
                    133:  *     Compare two scores.
                    134:  */
                    135: cmp_sc(s1, s2)
                    136: register SCORE *s1, *s2;
                    137: {
                    138:        return s2->s_score - s1->s_score;
                    139: }
                    140: 
                    141: /*
                    142:  * show_score:
                    143:  *     Show the score list for the '-s' option.
                    144:  */
                    145: show_score()
                    146: {
                    147:        register SCORE  *scp;
                    148:        register int    inf;
                    149:        static int      max_score;
                    150: 
                    151:        if ((inf = open(Scorefile, 0)) < 0) {
                    152:                perror(Scorefile);
                    153:                return;
                    154:        }
                    155: 
                    156:        for (scp = Top; scp < &Top[MAXSCORES]; scp++)
                    157:                scp->s_score = -1;
                    158: 
                    159:        read(inf, &max_score, sizeof max_score);
                    160:        read(inf, Top, sizeof Top);
                    161:        close(inf);
                    162:        inf = 1;
                    163:        for (scp = Top; scp < &Top[MAXSCORES]; scp++)
                    164:                if (scp->s_score >= 0)
                    165:                        printf("%d\t%d\t%.*s\n", inf++, scp->s_score, sizeof scp->s_name, scp->s_name);
                    166: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.