-/* $NetBSD: main.c,v 1.17 2008/08/08 16:10:47 drochner Exp $ */
+/* $NetBSD: main.c,v 1.24 2019/02/03 03:19:25 mrg Exp $ */
/*
* Phantasia 3.3.2 -- Interterminal fantasy game
* AT&T is in no way connected with this game.
*/
-#include <sys/stat.h>
#include <sys/types.h>
+#include <sys/stat.h>
+#include <err.h>
+#include <math.h>
#include <pwd.h>
+#include <setjmp.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "macros.h"
+#include "phantdefs.h"
+#include "phantstruct.h"
+#include "phantglobs.h"
+#include "pathnames.h"
+
+#undef bool
+#include <curses.h>
/*
* The program allocates as much file space as it needs to store characters,
* main.c Main routines for Phantasia
*/
-#include "include.h"
-#undef bool
-#include <curses.h>
+static void genchar(int);
+static void initialstate(void);
+static void neatstuff(void);
+static void playinit(void);
+static void procmain(void);
+static long recallplayer(void);
+static long rollnewplayer(void);
+static void titlelist(void);
int main(int, char **);
int
-main(argc, argv)
- int argc;
- char **argv;
+main(int argc, char **argv)
{
bool noheader = FALSE; /* set if don't want header */
bool headeronly = FALSE; /* set if only want header */
case 'a': /* all users */
activelist();
cleanup(TRUE);
+ __unreachable();
/* NOTREACHED */
case 'p': /* purge old players */
purgeoldplayers();
cleanup(TRUE);
+ __unreachable();
/* NOTREACHED */
case 'S': /* set 'Wizard' */
case 'm': /* monsters */
monstlist();
cleanup(TRUE);
+ __unreachable();
/* NOTREACHED */
case 'b': /* scoreboard */
scorelist();
cleanup(TRUE);
+ __unreachable();
/* NOTREACHED */
}
if (examine) {
changestats(FALSE);
cleanup(TRUE);
+ __unreachable();
/* NOTREACHED */
}
if (!noheader) {
titlelist();
purgeoldplayers(); /* clean up old characters */
}
- if (headeronly)
+ if (headeronly) {
cleanup(TRUE);
- /* NOTREACHED */
+ __unreachable();
+ /* NOTREACHED */
+ }
do
/* get the player structure filled */
case 'Q':
cleanup(TRUE);
+ __unreachable();
/* NOTREACHED */
default:
Timeout = TRUE;
/* update some important player statistics */
- strcpy(Player.p_login, Login);
+ strlcpy(Player.p_login, Login, sizeof(Player.p_login));
time(&seconds);
Player.p_lastused = localtime(&seconds)->tm_yday;
Player.p_status = S_PLAYING;
}
}
-void
-initialstate()
+static void
+initialstate(void)
{
struct stat sb;
+ struct passwd *pw;
Beyond = FALSE;
Marsh = FALSE;
Echo = TRUE;
/* setup login name */
- if ((Login = getlogin()) == NULL)
- Login = getpwuid(getuid())->pw_name;
+ if ((Login = getlogin()) == NULL) {
+ pw = getpwuid(getuid());
+ if (pw == NULL) {
+ errx(1, "Who are you?");
+ }
+ Login = pw->pw_name;
+ }
/* open some files */
if ((Playersfp = fopen(_PATH_PEOPLE, "r+")) == NULL)
srandom((unsigned) time(NULL)); /* prime random numbers */
}
-long
-rollnewplayer()
+static long
+rollnewplayer(void)
{
int chartype; /* character type */
int ch; /* input */
return (allocrecord());
}
-void
-procmain()
+static void
+procmain(void)
{
int ch; /* input */
double x; /* desired new x coordinate */
case '5': /* good-bye */
leavegame();
+ __unreachable();
/* NOTREACHED */
case '6': /* cloak */
}
}
-void
-titlelist()
+static void
+titlelist(void)
{
FILE *fp; /* used for opening various files */
bool councilfound = FALSE; /* set if we find a member of the
Other.p_status != S_NOTUSED)
/* found the king */
{
- sprintf(Databuf, "The present ruler is %s Level:%.0f",
+ snprintf(Databuf, SZ_DATABUF,
+ "The present ruler is %s Level:%.0f",
Other.p_name, Other.p_level);
mvaddstr(4, 40 - strlen(Databuf) / 2, Databuf);
kingfound = TRUE;
if (Other.p_specialtype == SC_VALAR && Other.p_status != S_NOTUSED)
/* found the valar */
{
- sprintf(Databuf, "The Valar is %s Login: %s", Other.p_name, Other.p_login);
+ snprintf(Databuf, SZ_DATABUF,
+ "The Valar is %s Login: %s",
+ Other.p_name, Other.p_login);
mvaddstr(6, 40 - strlen(Databuf) / 2, Databuf);
break;
}
councilfound = TRUE;
}
/* This assumes a finite (<=5) number of C.O.W.: */
- sprintf(Databuf, "%s Login: %s", Other.p_name, Other.p_login);
+ snprintf(Databuf, SZ_DATABUF,
+ "%s Login: %s", Other.p_name, Other.p_login);
mvaddstr(Lines++, 40 - strlen(Databuf) / 2, Databuf);
}
/* search for the two highest players */
strcpy(nxtname, Other.p_name);
}
mvaddstr(15, 28, "Highest characters are:");
- sprintf(Databuf, "%s Level:%.0f and %s Level:%.0f",
+ snprintf(Databuf, SZ_DATABUF,
+ "%s Level:%.0f and %s Level:%.0f",
hiname, hilvl, nxtname, nxtlvl);
mvaddstr(17, 40 - strlen(Databuf) / 2, Databuf);
refresh();
}
-long
-recallplayer()
+static long
+recallplayer(void)
{
long loc = 0L; /* location in player file */
int loop; /* loop counter */
return (-1L);
}
-void
-neatstuff()
+static void
+neatstuff(void)
{
double temp; /* for temporary calculations */
int ch; /* input */
}
}
-void
-genchar(type)
- int type;
+static void
+genchar(int type)
{
int subscript; /* used for subscripting into Stattable */
const struct charstats *statptr; /* for pointing into Stattable */
Player.p_experience = ROLL(600.0, 200.0);
}
-void
-playinit()
+static void
+playinit(void)
{
/* catch/ingnore signals */
}
void
-cleanup(doexit)
- int doexit;
+cleanup(int doexit)
{
if (Windows) {
move(LINES - 2, 0);