]> git.cameronkatri.com Git - bsdgames-darwin.git/blobdiff - phantasia/main.c
PR/52976: Eitan Adler: handle larger primes
[bsdgames-darwin.git] / phantasia / main.c
index 794eb42aedab99b2748de24b1b8fe13cdb965147..bd17453e0660bd1987ea8ef407e89592ca4589de 100644 (file)
@@ -1,4 +1,4 @@
-/*     $NetBSD: main.c,v 1.13 2004/04/07 17:46:47 ross Exp $   */
+/*     $NetBSD: main.c,v 1.23 2009/08/31 08:27:16 dholland Exp $       */
 
 /*
  * Phantasia 3.3.2 -- Interterminal fantasy game
  */
 
 #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"
-#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 */
@@ -161,7 +182,7 @@ main(argc, argv)
                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;
@@ -267,9 +288,12 @@ main(argc, argv)
        }
 }
 
-void
-initialstate()
+static void
+initialstate(void)
 {
+       struct stat sb;
+       struct passwd *pw;
+
        Beyond = FALSE;
        Marsh = FALSE;
        Throne = FALSE;
@@ -281,8 +305,13 @@ initialstate()
        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)
@@ -301,13 +330,23 @@ initialstate()
 
        if ((Energyvoidfp = fopen(_PATH_VOID, "r+")) == NULL)
                error(_PATH_VOID);
+       if (fstat(fileno(Energyvoidfp), &sb) == -1)
+               error("stat");
+       if (sb.st_size == 0) {
+               /* initialize grail to new location */
+               Enrgyvoid.ev_active = TRUE;
+               Enrgyvoid.ev_x = ROLL(-1.0e6, 2.0e6);
+               Enrgyvoid.ev_y = ROLL(-1.0e6, 2.0e6);
+               writevoid(&Enrgyvoid, 0L);
+       }
+
        /* NOTREACHED */
 
        srandom((unsigned) time(NULL)); /* prime random numbers */
 }
 
-long
-rollnewplayer()
+static long
+rollnewplayer(void)
 {
        int     chartype;       /* character type */
        int     ch;             /* input */
@@ -396,8 +435,8 @@ rollnewplayer()
        return (allocrecord());
 }
 
-void
-procmain()
+static void
+procmain(void)
 {
        int     ch;             /* input */
        double  x;              /* desired new x coordinate */
@@ -606,8 +645,8 @@ procmain()
        }
 }
 
-void
-titlelist()
+static void
+titlelist(void)
 {
        FILE   *fp;             /* used for opening various files */
        bool    councilfound = FALSE;   /* set if we find a member of the
@@ -635,7 +674,8 @@ titlelist()
                    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;
@@ -650,7 +690,9 @@ titlelist()
                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;
                }
@@ -666,7 +708,8 @@ titlelist()
                                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 */
@@ -696,7 +739,8 @@ titlelist()
                                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);
 
@@ -705,13 +749,14 @@ titlelist()
            && fgets(Databuf, SZ_DATABUF, fp) != NULL) {
                mvaddstr(19, 25, "The last character to die was:");
                mvaddstr(20, 40 - strlen(Databuf) / 2, Databuf);
-               fclose(fp);
        }
+       if (fp)
+               fclose(fp);
        refresh();
 }
 
-long
-recallplayer()
+static long
+recallplayer(void)
 {
        long    loc = 0L;       /* location in player file */
        int     loop;           /* loop counter */
@@ -769,8 +814,8 @@ recallplayer()
        return (-1L);
 }
 
-void
-neatstuff()
+static void
+neatstuff(void)
 {
        double  temp;           /* for temporary calculations */
        int     ch;             /* input */
@@ -871,9 +916,8 @@ neatstuff()
        }
 }
 
-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 */
@@ -908,8 +952,8 @@ genchar(type)
                Player.p_experience = ROLL(600.0, 200.0);
 }
 
-void
-playinit()
+static void
+playinit(void)
 {
        /* catch/ingnore signals */
 
@@ -980,7 +1024,10 @@ playinit()
        signal(SIGPIPE, ill_sig);
 #endif
 
-       initscr();              /* turn on curses */
+       if (!initscr()) {       /* turn on curses */
+               fprintf(stderr, "couldn't initialize screen\n");
+               exit (0);
+       }
        noecho();               /* do not echo input */
        cbreak();               /* do not process erase, kill */
        clear();
@@ -989,8 +1036,7 @@ playinit()
 }
 
 void
-cleanup(doexit)
-       int    doexit;
+cleanup(int doexit)
 {
        if (Windows) {
                move(LINES - 2, 0);