X-Git-Url: https://git.cameronkatri.com/bsdgames-darwin.git/blobdiff_plain/462fca95471224f85b85be911e72faee16cd1597..e05b1c0de535fc268d8d5ccb5f1d3d9c0f6d0d42:/monop/initdeck.c?ds=sidebyside diff --git a/monop/initdeck.c b/monop/initdeck.c index f378ed6a..396b0b59 100644 --- a/monop/initdeck.c +++ b/monop/initdeck.c @@ -1,6 +1,8 @@ +/* $NetBSD: initdeck.c,v 1.14 2001/07/22 13:34:01 wiz Exp $ */ + /* - * Copyright (c) 1980 Regents of the University of California. - * All rights reserved. + * Copyright (c) 1980, 1993 + * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -31,50 +33,89 @@ * SUCH DAMAGE. */ +#ifdef __NetBSD__ +#include #ifndef lint -char copyright[] = -"@(#) Copyright (c) 1980 Regents of the University of California.\n\ - All rights reserved.\n"; +__COPYRIGHT("@(#) Copyright (c) 1980, 1993\n\ + The Regents of the University of California. All rights reserved.\n"); #endif /* not lint */ #ifndef lint -/*static char sccsid[] = "from: @(#)initdeck.c 5.5 (Berkeley) 6/1/90";*/ -static char rcsid[] = "$Id: initdeck.c,v 1.2 1993/08/01 18:53:39 mycroft Exp $"; +#if 0 +static char sccsid[] = "@(#)initdeck.c 8.1 (Berkeley) 5/31/93"; +#else +__RCSID("$NetBSD: initdeck.c,v 1.14 2001/07/22 13:34:01 wiz Exp $"); +#endif #endif /* not lint */ +#endif /* __NetBSD__ */ + +#include +#include +#include +#include +#include "deck.h" + +#ifndef u_int32_t +#define u_int32_t unsigned int +#endif -# include -# include "deck.h" +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 * string to print, terminated with a null byte. */ -# define TRUE 1 -# define FALSE 0 - -# define bool char -# define reg register +#define TRUE 1 +#define FALSE 0 -char *infile = "cards.inp", /* input file */ - *outfile = "cards.pck"; /* "packed" file */ +#define bool char -extern long ftell(); -extern char *calloc(); +const char *infile = "cards.inp", /* input file */ + *outfile = "cards.pck"; /* "packed" file */ DECK deck[2]; FILE *inf, *outf; +/* initdeck.c */ +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 ac; + char *av[]; +{ + 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) { @@ -85,33 +126,64 @@ char *av[]; { /* * allocate space for pointers. */ - CC_D.offsets = (long *)calloc(CC_D.num_cards + 1, sizeof (long)); - CH_D.offsets = (long *)calloc(CH_D.num_cards + 1, sizeof (long)); - 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); } - fwrite(deck, sizeof (DECK), 2, outf); - fwrite(CC_D.offsets, sizeof (long), CC_D.num_cards, outf); - fwrite(CH_D.offsets, sizeof (long), CH_D.num_cards, outf); + /* + * these fields will be overwritten after the offsets are calculated, + * so byte-order doesn't matter yet. + */ + fwrite(&nc, sizeof(nc), 1, outf); + fwrite(&nc, sizeof(nc), 1, 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). + */ putem(); fclose(inf); - fseek(outf, 0, 0L); - fwrite(deck, sizeof (DECK), 2, outf); - fwrite(CC_D.offsets, sizeof (long), CC_D.num_cards, outf); - fwrite(CH_D.offsets, sizeof (long), CH_D.num_cards, outf); + fseek(outf, 0, SEEK_SET); + + /* number of community chest cards first... */ + nc = h2nl(CC_D.num_cards); + fwrite(&nc, sizeof(nc), 1, outf); + /* ... then number of chance cards. */ + nc = h2nl(CH_D.num_cards); + fwrite(&nc, sizeof(nc), 1, outf); + + /* dump offsets in big-endian byte order */ + for (i = 0; i < CC_D.num_cards; i++) + fwrite_be_offt(CC_D.offsets[i], outf); + for (i = 0; i < CH_D.num_cards; i++) + 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); + printf("There were %d com. chest and %d chance cards\n", + CC_D.num_cards, CH_D.num_cards); exit(0); } +static void getargs(ac, av) -int ac; -char *av[]; { - + int ac; + char *av[]; +{ if (ac > 1) infile = av[1]; if (ac > 2) @@ -121,11 +193,12 @@ char *av[]; { /* * count the cards */ -count() { - - reg bool newline; - reg DECK *in_deck; - reg char c; +static void +count() +{ + bool newline; + DECK *in_deck; + int c; newline = TRUE; in_deck = &CC_D; @@ -140,15 +213,17 @@ count() { newline = (c == '\n'); in_deck->num_cards++; } + /* * put strings in the file */ -putem() { - - reg bool newline; - reg DECK *in_deck; - reg char c; - reg int num; +static void +putem() +{ + bool newline; + DECK *in_deck; + int c; + int num; in_deck = &CC_D; CC_D.num_cards = 1; @@ -158,7 +233,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 == '%') { @@ -175,7 +250,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); @@ -183,3 +258,23 @@ putem() { } putc('\0', outf); } + +/* + * fwrite_be_offt: + * Write out the off paramater 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); +}