]> git.cameronkatri.com Git - bsdgames-darwin.git/blobdiff - monop/initdeck.c
Fix (another) typo in comment
[bsdgames-darwin.git] / monop / initdeck.c
index 9474f43d83873805877c046a4c32d125f839ffd9..894ad835654e80f601ed58029bf12341fa412b46 100644 (file)
@@ -1,4 +1,4 @@
-/*     $NetBSD: initdeck.c,v 1.7 1999/08/21 10:40:03 simonb Exp $      */
+/*     $NetBSD: initdeck.c,v 1.16 2008/02/19 08:07:51 dholland Exp $   */
 
 /*
  * Copyright (c) 1980, 1993
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
+ * 3. Neither the name of the University nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
  *
@@ -33,6 +29,7 @@
  * SUCH DAMAGE.
  */
 
+#ifdef __NetBSD__
 #include <sys/cdefs.h>
 #ifndef lint
 __COPYRIGHT("@(#) Copyright (c) 1980, 1993\n\
@@ -43,21 +40,41 @@ __COPYRIGHT("@(#) Copyright (c) 1980, 1993\n\
 #if 0
 static char sccsid[] = "@(#)initdeck.c 8.1 (Berkeley) 5/31/93";
 #else
-__RCSID("$NetBSD: initdeck.c,v 1.7 1999/08/21 10:40:03 simonb Exp $");
+__RCSID("$NetBSD: initdeck.c,v 1.16 2008/02/19 08:07:51 dholland Exp $");
 #endif
 #endif /* not lint */
+#endif /* __NetBSD__ */
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <sys/types.h>
-#include <sys/endian.h>
 #include "deck.h"
 
+#ifndef u_int32_t
+#define        u_int32_t       unsigned int
+#endif
+
+u_int32_t
+h2nl(u_int32_t h)
+{
+       unsigned char c[4];
+       u_int32_t rv;
+
+       c[0] = (h >> 24) & 0xff;
+       c[1] = (h >> 16) & 0xff;
+       c[2] = (h >>  8) & 0xff;
+       c[3] = (h >>  0) & 0xff;
+       memcpy(&rv, c, sizeof rv);
+
+       return (rv);
+}
+
 /*
  *     This program initializes the card files for monopoly.
  * It reads in a data file with Com. Chest cards, followed by
- * the Chance card.  The two are seperated by a line of "%-".
- * All other cards are seperated by lines of "%%".  In the front
+ * the Chance card.  The two are separated by a line of "%-".
+ * All other cards are separated by lines of "%%".  In the front
  * of the file is the data for the decks in the same order.
  * This includes the seek pointer for the start of each card.
  * All cards start with their execution code, followed by the
@@ -69,26 +86,32 @@ __RCSID("$NetBSD: initdeck.c,v 1.7 1999/08/21 10:40:03 simonb Exp $");
 
 #define        bool    char
 
-char   *infile         = "cards.inp",          /* input file           */
-       *outfile        = "cards.pck";          /* "packed" file        */
+const char     *infile         = "cards.inp",  /* input file           */
+               *outfile        = "cards.pck";  /* "packed" file        */
 
 DECK   deck[2];
 
 FILE   *inf, *outf;
 
 /* initdeck.c */
-int main __P((int, char *[]));
-static void getargs __P((int, char *[]));
-static void count __P((void));
-static void putem __P((void));
+int            main(int, char *[]);
+static void    getargs(int, char *[]);
+static void    fwrite_be_offt(off_t, FILE *);
+static void    count(void);
+static void    putem(void);
 
 int
 main(ac, av)
        int ac;
        char *av[];
 {
-       int i;
-       int32_t nc;
+       int i, nc;
+
+       /* sanity test */
+       if (sizeof(int) != 4) {
+               fprintf(stderr, "sizeof(int) != 4\n");
+               exit(1);
+       }
 
        getargs(ac, av);
        if ((inf = fopen(infile, "r")) == NULL) {
@@ -99,12 +122,16 @@ main(ac, av)
        /*
         * allocate space for pointers.
         */
-       CC_D.offsets = (off_t *)calloc(CC_D.num_cards + 1, sizeof (off_t));
-       CH_D.offsets = (off_t *)calloc(CH_D.num_cards + 1, sizeof (off_t));
-       fseek(inf, 0L, 0);
+       CC_D.offsets = (off_t *)calloc(CC_D.num_cards + 1, /* sizeof (off_t) */ 8);
+       CH_D.offsets = (off_t *)calloc(CH_D.num_cards + 1, /* sizeof (off_t) */ 8);
+       if (CC_D.offsets == NULL || CH_D.offsets == NULL) {
+               fprintf(stderr, "out of memory\n");
+               exit(1);
+       }
+       fseek(inf, 0L, SEEK_SET);
        if ((outf = fopen(outfile, "w")) == NULL) {
                perror(outfile);
-               exit(0);
+               exit(1);
        }
 
        /*
@@ -113,8 +140,8 @@ main(ac, av)
         */
        fwrite(&nc, sizeof(nc), 1, outf);
        fwrite(&nc, sizeof(nc), 1, outf);
-       fwrite(CC_D.offsets, sizeof (off_t), CC_D.num_cards, outf);
-       fwrite(CH_D.offsets, sizeof (off_t), CH_D.num_cards, outf);
+       fwrite(CC_D.offsets, /* sizeof (off_t) */ 8, CC_D.num_cards, outf);
+       fwrite(CH_D.offsets, /* sizeof (off_t) */ 8, CH_D.num_cards, outf);
 
        /*
         * write out the cards themselves (calculating the offsets).
@@ -122,24 +149,26 @@ main(ac, av)
        putem();
 
        fclose(inf);
-       fseek(outf, 0, 0L);
+       fseek(outf, 0, SEEK_SET);
 
        /* number of community chest cards first... */
-       nc = htobe32(CC_D.num_cards);
+       nc = h2nl(CC_D.num_cards);
        fwrite(&nc, sizeof(nc), 1, outf);
        /* ... then number of chance cards. */
-       nc = htobe32(CH_D.num_cards);
+       nc = h2nl(CH_D.num_cards);
        fwrite(&nc, sizeof(nc), 1, outf);
 
-       /* convert offsets to big-endian byte order */
+       /* dump offsets in big-endian byte order */
        for (i = 0; i < CC_D.num_cards; i++)
-               HTOBE64(CC_D.offsets[i]);
+               fwrite_be_offt(CC_D.offsets[i], outf);
        for (i = 0; i < CH_D.num_cards; i++)
-               HTOBE64(CH_D.offsets[i]);
-       /* then dump the offsets out */
-       fwrite(CC_D.offsets, sizeof (off_t), CC_D.num_cards, outf);
-       fwrite(CH_D.offsets, sizeof (off_t), CH_D.num_cards, outf);
+               fwrite_be_offt(CH_D.offsets[i], outf);
 
+       fflush(outf);
+       if (ferror(outf)) {
+               perror(outfile);
+               exit(1);
+       }
        fclose(outf);
        printf("There were %d com. chest and %d chance cards\n",
            CC_D.num_cards, CH_D.num_cards);
@@ -200,7 +229,7 @@ putem()
        putc(getc(inf), outf);
        for (num = 0; (c=getc(inf)) != '\n'; )
                num = num * 10 + (c - '0');
-       putw(num, outf);
+       putw(h2nl(num), outf);
        newline = FALSE;
        while ((c=getc(inf)) != EOF)
                if (newline && c == '%') {
@@ -217,7 +246,7 @@ putem()
                        putc(c = getc(inf), outf);
                        for (num = 0; (c=getc(inf)) != EOF && c != '\n'; )
                                num = num * 10 + (c - '0');
-                       putw(num, outf);
+                       putw(h2nl(num), outf);
                }
                else {
                        putc(c, outf);
@@ -225,3 +254,23 @@ putem()
                }
        putc('\0', outf);
 }
+
+/*
+ * fwrite_be_offt:
+ *     Write out the off parameter as a 64 bit big endian number
+ */
+
+static void
+fwrite_be_offt(off, f)
+       off_t    off;
+       FILE    *f;
+{
+       int             i;
+       unsigned char   c[8];
+
+       for (i = 7; i >= 0; i--) {
+               c[i] = off & 0xff;
+               off >>= 8;
+       }
+       fwrite(c, sizeof(c), 1, f);
+}