xref: /dragonfly/games/sail/lo_main.c (revision ed183f8c)
1 /*	$NetBSD: lo_main.c,v 1.19 2010/08/06 09:14:40 dholland Exp $	*/
2 
3 /*
4  * Copyright (c) 1983, 1993
5  *	The Regents of the University of California.  All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. Neither the name of the University nor the names of its contributors
16  *    may be used to endorse or promote products derived from this software
17  *    without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  */
31 
32 #include <sys/cdefs.h>
33 #ifndef lint
34 #if 0
35 static char sccsid[] = "@(#)lo_main.c	8.2 (Berkeley) 4/28/95";
36 #else
37 __RCSID("$NetBSD: lo_main.c,v 1.19 2010/08/06 09:14:40 dholland Exp $");
38 #endif
39 #endif /* not lint */
40 
41 /*
42  * Print out the top ten SAILors
43  *
44  * -l force a long listing (print out real usernames)
45  */
46 
47 #include <err.h>
48 #include <errno.h>
49 #include <stdio.h>
50 #include <stdlib.h>
51 #include <string.h>
52 #include <pwd.h>
53 #include <curses.h>
54 
55 #include "extern.h"
56 #include "pathnames.h"
57 
58 
59 static const char *const title[] = {
60 	"Admiral", "Commodore", "Captain", "Captain",
61 	"Captain", "Captain", "Captain", "Commander",
62 	"Commander", "Lieutenant"
63 };
64 
65 void
66 lo_curses(void)
67 {
68 	FILE *fp;
69 	char sbuf[32];
70 	int n = 0, npeople;
71 	int line;
72 	struct passwd *pass;
73 	struct logs log;
74 	struct ship *ship;
75 
76 	erase();
77 
78 	fp = fopen(_PATH_LOGFILE, "r");
79 	if (fp == NULL) {
80 		mvprintw(5, 10, "%s: %s", _PATH_LOGFILE, strerror(errno));
81 		mvaddstr(7, 10, "Press any key...");
82 		getch();
83 		return;
84 	}
85 	switch (fread(&npeople, sizeof npeople, 1, fp)) {
86 	    case 0:
87 		mvprintw(5, 10, "Nobody has sailed yet.");
88 		mvaddstr(7, 10, "Press any key...");
89 		getch();
90 		return;
91 	    case 1:
92 		break;
93 	    default:
94 		mvprintw(5, 10, "%s: %s", _PATH_LOGFILE, strerror(errno));
95 		mvaddstr(7, 10, "Press any key...");
96 		getch();
97 		return;
98 	}
99 	line = 0;
100 	while (fread(&log, sizeof log, 1, fp) == 1 &&
101 	       log.l_name[0] != '\0' &&
102 		line < LINES - 2) {
103 		if (longfmt && (pass = getpwuid(log.l_uid)) != NULL)
104 			snprintf(sbuf, sizeof(sbuf),
105 				"%10.10s (%s)", log.l_name, pass->pw_name);
106 		else
107 			snprintf(sbuf, sizeof(sbuf),
108 				"%20.20s", log.l_name);
109 		ship = &scene[log.l_gamenum].ship[log.l_shipnum];
110 		mvprintw(line, 0,
111 			"%-10s %21s of the %15s %3d points, %5.2f equiv",
112 			title[n++], sbuf, ship->shipname, log.l_netpoints,
113 			(float) log.l_netpoints / ship->specs->pts);
114 		line++;
115 	}
116 	fclose(fp);
117 	mvprintw(line+1, 0, "%d people have played. Press any key.", npeople);
118 	getch();
119 }
120 
121 int
122 lo_main(void)
123 {
124 	FILE *fp;
125 	char sbuf[32];
126 	int n = 0, npeople;
127 	struct passwd *pass;
128 	struct logs log;
129 	struct ship *ship;
130 
131 	if ((fp = fopen(_PATH_LOGFILE, "r")) == 0) {
132 		err(1, "%s", _PATH_LOGFILE);
133 	}
134 	switch (fread(&npeople, sizeof npeople, 1, fp)) {
135 	case 0:
136 		printf("Nobody has sailed yet.\n");
137 		exit(0);
138 	case 1:
139 		break;
140 	default:
141 		err(1, "%s", _PATH_LOGFILE);
142 	}
143 	while (fread(&log, sizeof log, 1, fp) == 1 &&
144 	       log.l_name[0] != '\0') {
145 		if (longfmt && (pass = getpwuid(log.l_uid)) != NULL)
146 			snprintf(sbuf, sizeof(sbuf),
147 				"%10.10s (%s)", log.l_name, pass->pw_name);
148 		else
149 			snprintf(sbuf, sizeof(sbuf),
150 				"%20.20s", log.l_name);
151 		ship = &scene[log.l_gamenum].ship[log.l_shipnum];
152 		printf("%-10s %21s of the %15s %3d points, %5.2f equiv\n",
153 			title[n++], sbuf, ship->shipname, log.l_netpoints,
154 			(float) log.l_netpoints / ship->specs->pts);
155 	}
156 	fclose(fp);
157 	printf("\n%d people have played.\n", npeople);
158 	return 0;
159 }
160