]> git.cameronkatri.com Git - bsdgames-darwin.git/blobdiff - larn/main.c
Fix merge conflicts
[bsdgames-darwin.git] / larn / main.c
index 54d0e20e8a40d219713d63093a3e7d2c1205062e..81f427ea91e34e87322f9615e0a08da58e273c2a 100644 (file)
@@ -1,9 +1,9 @@
-/*     $NetBSD: main.c,v 1.12 1998/02/12 08:07:49 mikel Exp $  */
+/*     $NetBSD: main.c,v 1.27 2021/05/02 12:50:45 rillig Exp $ */
 
 /* main.c               */
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: main.c,v 1.12 1998/02/12 08:07:49 mikel Exp $");
+__RCSID("$NetBSD: main.c,v 1.27 2021/05/02 12:50:45 rillig Exp $");
 #endif                         /* not lint */
 
 #include <sys/types.h>
@@ -15,12 +15,36 @@ __RCSID("$NetBSD: main.c,v 1.12 1998/02/12 08:07:49 mikel Exp $");
 #include "header.h"
 #include "extern.h"
 
+static void showstr(void);
+static void t_setup(int);
+static void t_endup(int);
+static void showwear(void);
+static void showwield(void);
+static void showread(void);
+static void showeat(void);
+static void showquaff(void);
+static void show1(int, const char *[]);
+static void randmonst(void);
+static void parse(void);
+static void run(int);
+static void wield(void);
+static void ydhi(int);
+static void ycwi(int);
+static void wear(void);
+static void dropobj(void);
+static void readscr(void);
+static void eatcookie(void);
+static void quaff(void);
+static int whatitem(const char *);
+
+#define __unreachable() __builtin_unreachable()
+
 static char     copyright[] = "\nLarn is copyrighted 1986 by Noah Morgan.\n";
 int             srcount = 0;   /* line counter for showstr()    */
 int             dropflag = 0;  /* if 1 then don't lookforobject() next round */
 int             rmst = 80;     /* random monster creation counter               */
 int             userid;                /* the players login user id number */
-uid_t           uid, euid;     /* used for security */
+gid_t           gid, egid;     /* used for security */
 u_char          nowelcome = 0, nomove = 0;     /* if (nomove) then don't
                                                 * count next iteration as a
                                                 * move */
@@ -53,18 +77,17 @@ static char    *termtypes[] = {"vt100", "vt101", "vt102", "vt103", "vt125",
        ************
  */
 int
-main(argc, argv)
-       int             argc;
-       char          **argv;
+main(int argc, char **argv)
 {
        int    i;
        int             hard;
-       char           *ptr = 0;
+       const char     *ptr = 0;
        struct passwd  *pwe;
 
-       euid = geteuid();
-       uid = getuid();
-       seteuid(uid);           /* give up "games" if we have it */
+       i = 0;
+       egid = getegid();
+       gid = getgid();
+       setegid(gid);           /* give up "games" if we have it */
        /*
         *      first task is to identify the player
         */
@@ -72,15 +95,17 @@ main(argc, argv)
        init_term();            /* setup the terminal (find out what type)
                                 * for termcap */
 #endif /* VT100 */
-       if (((ptr = getlogin()) == 0) || (*ptr == 0))   /* try to get login name */
-               if ((pwe = getpwuid(getuid())) != NULL)/* can we get it from
-                                                * /etc/passwd? */
+       /* try to get login name */
+       if (((ptr = getlogin()) == 0) || (*ptr == 0)) {
+               /* can we get it from /etc/passwd? */
+               if ((pwe = getpwuid(getuid())) != NULL)
                        ptr = pwe->pw_name;
                else if ((ptr = getenv("USER")) == 0)
                        if ((ptr = getenv("LOGNAME")) == 0) {
                noone:          write(2, "Can't find your logname.  Who Are You?\n", 39);
                                exit(1);
                        }
+       }
        if (ptr == 0)
                goto noone;
        if (strlen(ptr) == 0)
@@ -97,7 +122,8 @@ main(argc, argv)
        strcpy(savefilename, ptr);
        strcat(savefilename, "/Larn.sav");      /* save file name in home
                                                 * directory */
-       sprintf(optsfile, "%s/.larnopts", ptr); /* the .larnopts filename */
+       snprintf(optsfile, sizeof(optsfile), "%s/.larnopts", ptr);
+       /* the .larnopts filename */
 
        /*
         *      now malloc the memory for the dungeon
@@ -125,7 +151,7 @@ main(argc, argv)
                        break;
                }
        if (j) {
-               lprcat("Sorry, Larn needs a VT100 family terminal for all it's features.\n");
+               lprcat("Sorry, Larn needs a VT100 family terminal for all its features.\n");
                lflush();
                exit(1);
        }
@@ -303,8 +329,8 @@ main(argc, argv)
 
        show character's inventory
  */
-void
-showstr()
+static void
+showstr(void)
 {
        int    i, number;
        for (number = 3, i = 0; i < 26; i++)
@@ -316,14 +342,14 @@ showstr()
 }
 
 void
-qshowstr()
+qshowstr(void)
 {
        int    i, j, k, sigsav;
        srcount = 0;
        sigsav = nosignal;
        nosignal = 1;           /* don't allow ^c etc */
        if (c[GOLD]) {
-               lprintf(".)   %d gold pieces", (long) c[GOLD]);
+               lprintf(".)   %ld gold pieces", (long) c[GOLD]);
                srcount++;
        }
        for (k = 26; k >= 0; k--)
@@ -334,7 +360,7 @@ qshowstr()
                                                show3(j);
                        k = 0;
                }
-       lprintf("\nElapsed time is %d.  You have %d mobuls left", (long) ((gltime + 99) / 100 + 1), (long) ((TIMELIMIT - gltime) / 100));
+       lprintf("\nElapsed time is %ld.  You have %ld mobuls left", (long) ((gltime + 99) / 100 + 1), (long) ((TIMELIMIT - gltime) / 100));
        more();
        nosignal = sigsav;
 }
@@ -342,9 +368,8 @@ qshowstr()
 /*
  *     subroutine to clear screen depending on # lines to display
  */
-void
-t_setup(count)
-       int    count;
+static void
+t_setup(int count)
 {
        if (count < 20) {       /* how do we clear the screen? */
                cl_up(79, count);
@@ -358,9 +383,8 @@ t_setup(count)
 /*
  *     subroutine to restore normal display screen depending on t_setup()
  */
-void
-t_endup(count)
-       int    count;
+static void
+t_endup(int count)
 {
        if (count < 18)         /* how did we clear the screen? */
                draws(0, MAXX, 0, (count > MAXY) ? MAXY : count);
@@ -373,8 +397,8 @@ t_endup(count)
 /*
        function to show the things player is wearing only
  */
-void
-showwear()
+static void
+showwear(void)
 {
        int    i, j, sigsav, count;
        sigsav = nosignal;
@@ -422,8 +446,8 @@ showwear()
 /*
        function to show the things player can wield only
  */
-void
-showwield()
+static void
+showwield(void)
 {
        int    i, j, sigsav, count;
        sigsav = nosignal;
@@ -480,8 +504,8 @@ showwield()
 /*
  *     function to show the things player can read only
  */
-void
-showread()
+static void
+showread(void)
 {
        int    i, j, sigsav, count;
        sigsav = nosignal;
@@ -512,8 +536,8 @@ showread()
 /*
  *     function to show the things player can eat only
  */
-void
-showeat()
+static void
+showeat(void)
 {
        int    i, j, sigsav, count;
        sigsav = nosignal;
@@ -542,8 +566,8 @@ showeat()
 /*
        function to show the things player can quaff only
  */
-void
-showquaff()
+static void
+showquaff(void)
 {
        int    i, j, sigsav, count;
        sigsav = nosignal;
@@ -569,10 +593,8 @@ showquaff()
        t_endup(count);
 }
 
-void
-show1(idx, str2)
-       int    idx;
-       char  *str2[];
+static void
+show1(int idx, const char *str2[])
 {
        lprintf("\n%c)   %s", idx + 'a', objectname[iven[idx]]);
        if (str2 != 0 && str2[ivenarg[idx]][0] != 0)
@@ -580,15 +602,14 @@ show1(idx, str2)
 }
 
 void
-show3(index)
-       int    index;
+show3(int indx)
 {
-       switch (iven[index]) {
+       switch (iven[indx]) {
        case OPOTION:
-               show1(index, potionname);
+               show1(indx, potionname);
                break;
        case OSCROLL:
-               show1(index, scrollname);
+               show1(indx, scrollname);
                break;
 
        case OLARNEYE:
@@ -602,20 +623,20 @@ show3(index)
        case OCOOKIE:
        case OSAPPHIRE:
        case ONOTHEFT:
-               show1(index, (char **) 0);
+               show1(indx, NULL);
                break;
 
        default:
-               lprintf("\n%c)   %s", index + 'a', objectname[iven[index]]);
-               if (ivenarg[index] > 0)
-                       lprintf(" + %d", (long) ivenarg[index]);
-               else if (ivenarg[index] < 0)
-                       lprintf(" %d", (long) ivenarg[index]);
+               lprintf("\n%c)   %s", indx + 'a', objectname[iven[indx]]);
+               if (ivenarg[indx] > 0)
+                       lprintf(" + %ld", (long) ivenarg[indx]);
+               else if (ivenarg[indx] < 0)
+                       lprintf(" %ld", (long) ivenarg[indx]);
                break;
        }
-       if (c[WIELD] == index)
+       if (c[WIELD] == indx)
                lprcat(" (weapon in hand)");
-       if ((c[WEAR] == index) || (c[SHIELD] == index))
+       if ((c[WEAR] == indx) || (c[SHIELD] == indx))
                lprcat(" (being worn)");
        if (++srcount >= 22) {
                srcount = 0;
@@ -627,8 +648,8 @@ show3(index)
 /*
        subroutine to randomly create monsters if needed
  */
-void
-randmonst()
+static void
+randmonst(void)
 {
        if (c[TIMESTOP])
                return;         /* don't make monsters if time is stopped        */
@@ -645,8 +666,8 @@ randmonst()
 
        get and execute a command
  */
-void
-parse()
+static void
+parse(void)
 {
        int    i, j, k, flag;
        while (1) {
@@ -774,6 +795,7 @@ parse()
                        savegame(savefilename);
                        wizard = 1;
                        died(-257);     /* save the game - doesn't return        */
+                       __unreachable();
 
                case 'Z':
                        yrepcount = 0;
@@ -804,7 +826,7 @@ parse()
                                        case ODARTRAP:
                                        case OTRAPARROW:
                                        case OTELEPORTER:
-                                               lprcat("\nIts ");
+                                               lprcat("\nIt's ");
                                                lprcat(objectname[item[i][j]]);
                                                flag++;
                                        };
@@ -898,7 +920,8 @@ parse()
 
                case 'g':
                        cursors();
-                       lprintf("\nThe stuff you are carrying presently weighs %d pounds", (long) packweight());
+                       lprintf("\nThe stuff you are carrying presently weighs %ld pounds", (long) packweight());
+                       /* FALLTHROUGH */
                case ' ':
                        yrepcount = 0;
                        nomove = 1;
@@ -907,7 +930,9 @@ parse()
                case 'v':
                        yrepcount = 0;
                        cursors();
-                       lprintf("\nCaverns of Larn, Version %d.%d, Diff=%d", (long) VERSION, (long) SUBVERSION, (long) c[HARDGAME]);
+                       lprintf("\nCaverns of Larn, Version %ld.%ld, Diff=%ld",
+                               (long) VERSION, (long) SUBVERSION,
+                               (long) c[HARDGAME]);
                        if (wizard)
                                lprcat(" Wizard");
                        nomove = 1;
@@ -943,7 +968,8 @@ parse()
                case 'P':
                        cursors();
                        if (outstanding_taxes > 0)
-                               lprintf("\nYou presently owe %d gp in taxes.", (long) outstanding_taxes);
+                               lprintf("\nYou presently owe %ld gp in taxes.",
+                                       (long) outstanding_taxes);
                        else
                                lprcat("\nYou do not owe any taxes.");
                        return;
@@ -952,7 +978,7 @@ parse()
 }
 
 void
-parse2()
+parse2(void)
 {
        if (c[HASTEMONST])
                movemonst();
@@ -961,9 +987,8 @@ parse2()
        regen();
 }
 
-void
-run(dir)
-       int             dir;
+static void
+run(int dir)
 {
        int    i;
        i = 1;
@@ -986,8 +1011,8 @@ run(dir)
 /*
        function to wield a weapon
  */
-void
-wield()
+static void
+wield(void)
 {
        int    i;
        while (1) {
@@ -1024,16 +1049,14 @@ wield()
 /*
        common routine to say you don't have an item
  */
-void
-ydhi(x)
-       int             x;
+static void
+ydhi(int x)
 {
        cursors();
        lprintf("\nYou don't have item %c!", x);
 }
-void
-ycwi(x)
-       int             x;
+static void
+ycwi(int x)
 {
        cursors();
        lprintf("\nYou can't wield item %c!", x);
@@ -1042,8 +1065,8 @@ ycwi(x)
 /*
        function to wear armor
  */
-void
-wear()
+static void
+wear(void)
 {
        int    i;
        while (1) {
@@ -1094,11 +1117,11 @@ wear()
 /*
        function to drop an object
  */
-void
-dropobj()
+static void
+dropobj(void)
 {
        int    i;
-       char  *p;
+       unsigned char  *p;
        long            amt;
        p = &item[playerx][playery];
        while (1) {
@@ -1142,7 +1165,7 @@ dropobj()
                                        amt = 32767000L;
                                }
                                c[GOLD] -= amt;
-                               lprintf("You drop %d gold pieces", (long) amt);
+                               lprintf("You drop %ld gold pieces", (long)amt);
                                iarg[playerx][playery] = i;
                                bottomgold();
                                know[playerx][playery] = 0;
@@ -1158,8 +1181,8 @@ dropobj()
 /*
  *     readscr()               Subroutine to read a scroll one is carrying
  */
-void
-readscr()
+static void
+readscr(void)
 {
        int    i;
        while (1) {
@@ -1193,15 +1216,16 @@ readscr()
 /*
  *     subroutine to eat a cookie one is carrying
  */
-void
-eatcookie()
+static void
+eatcookie(void)
 {
-       int    i;
-       char           *p;
+       const char *p;
+       int i;
+
        while (1) {
                if ((i = whatitem("eat")) == '\33')
                        return;
-               if (i != '.')
+               if (i != '.') {
                        if (i == '*')
                                showeat();
                        else {
@@ -1223,14 +1247,15 @@ eatcookie()
                                lprcat("\nYou can't eat that!");
                                return;
                        }
+               }
        }
 }
 
 /*
  *     subroutine to quaff a potion one is carrying
  */
-void
-quaff()
+static void
+quaff(void)
 {
        int    i;
        while (1) {
@@ -1259,16 +1284,15 @@ quaff()
 /*
        function to ask what player wants to do
  */
-int
-whatitem(str)
-       char           *str;
+static int
+whatitem(const char *str)
 {
        int             i;
        cursors();
        lprintf("\nWhat do you want to %s [* for all] ? ", str);
        i = 0;
        while (i > 'z' || (i < 'a' && i != '*' && i != '\33' && i != '.'))
-               i = getchar();
+               i = ttgetch();
        if (i == '\33')
                lprcat(" aborted");
        return (i);
@@ -1278,14 +1302,13 @@ whatitem(str)
        subroutine to get a number from the player
        and allow * to mean return amt, else return the number entered
  */
-unsigned long 
-readnum(mx)
-       long            mx;
+unsigned long
+readnum(long mx)
 {
        int    i;
        unsigned long amt = 0;
        sncbr();
-       if ((i = getchar()) == '*')
+       if ((i = ttgetch()) == '*')
                amt = mx;       /* allow him to say * for all gold */
        else
                while (i != '\n') {
@@ -1296,7 +1319,7 @@ readnum(mx)
                        }
                        if ((i <= '9') && (i >= '0') && (amt < 99999999))
                                amt = amt * 10 + i - '0';
-                       i = getchar();
+                       i = ttgetch();
                }
        scbr();
        return (amt);