Home | History | Annotate | Line # | Download | only in phantasia
setup.c revision 1.19
      1  1.19  dholland /*	$NetBSD: setup.c,v 1.19 2009/05/25 23:08:45 dholland Exp $	*/
      2   1.3       cgd 
      3   1.1       jtc /*
      4   1.1       jtc  * setup.c - set up all files for Phantasia
      5  1.17    dogcow  * n.b.: this is used at build-time - i.e. during build.sh.
      6   1.1       jtc  */
      7  1.18     lukem #ifdef __NetBSD__
      8  1.15     perry #include <sys/cdefs.h>
      9  1.18     lukem #endif
     10  1.18     lukem 
     11   1.2        pk #include <sys/param.h>
     12   1.1       jtc #include <sys/stat.h>
     13  1.10       jsm #include <fcntl.h>
     14   1.4       cgd #include "include.h"
     15  1.10       jsm 
     16  1.17    dogcow #ifndef __dead /* Not NetBSD */
     17  1.18     lukem #define __dead
     18  1.17    dogcow #endif
     19  1.17    dogcow 
     20  1.12       wiz int main(int, char *[]);
     21  1.16     perry void Error(const char *, const char *) __dead;
     22  1.12       wiz double drandom(void);
     23  1.10       jsm 
     24   1.1       jtc /**/
     26   1.1       jtc /************************************************************************
     27   1.1       jtc /
     28   1.1       jtc / FUNCTION NAME: main()
     29   1.1       jtc /
     30   1.1       jtc / FUNCTION: setup files for Phantasia 3.3.2
     31   1.1       jtc /
     32   1.1       jtc / AUTHOR: E. A. Estes, 12/4/85
     33   1.1       jtc /
     34   1.1       jtc / ARGUMENTS: none
     35   1.1       jtc /
     36   1.1       jtc / RETURN VALUE: none
     37   1.1       jtc /
     38   1.1       jtc / MODULES CALLED: time(), exit(), stat(), Error(), creat(), close(), fopen(),
     39   1.1       jtc /	fgets(), floor(), srandom(), umask(), drandom(), strcpy(), getuid(),
     40   1.1       jtc /	unlink(), fwrite(), fclose(), sscanf(), printf(), strlen(), fprintf()
     41   1.1       jtc /
     42   1.1       jtc / GLOBAL INPUTS: Curmonster, _iob[], Databuf[], *Monstfp, Enrgyvoid
     43   1.1       jtc /
     44   1.1       jtc / GLOBAL OUTPUTS: Curmonster, Databuf[], *Monstfp, Enrgyvoid
     45   1.1       jtc /
     46   1.1       jtc / DESCRIPTION:
     47   1.1       jtc /
     48   1.1       jtc /	This program tries to verify the parameters specified in
     49   1.1       jtc /	the Makefile.
     50   1.1       jtc /
     51   1.1       jtc /	Create all necessary files.  Note that nothing needs to be
     52   1.1       jtc /	put in these files.
     53   1.1       jtc /	Also, the monster binary data base is created here.
     54  1.10       jsm /
     55   1.1       jtc / ************************************************************************/
     56   1.9       jsm 
     57   1.1       jtc static const char *const files[] = {		/* all files to create */
     58   1.1       jtc 	_PATH_MONST,
     59   1.1       jtc 	_PATH_PEOPLE,
     60   1.1       jtc 	_PATH_MESS,
     61   1.1       jtc 	_PATH_LASTDEAD,
     62   1.1       jtc 	_PATH_MOTD,
     63   1.1       jtc 	_PATH_GOLD,
     64   1.1       jtc 	_PATH_VOID,
     65   1.1       jtc 	_PATH_SCORE,
     66   1.1       jtc 	NULL,
     67   1.1       jtc };
     68   1.9       jsm 
     69   1.1       jtc const char *monsterfile = "monsters.asc";
     70   1.1       jtc 
     71  1.19  dholland int
     72   1.1       jtc main(int argc, char *argv[])
     73  1.11    simonb {
     74  1.11    simonb 	const char *const *filename; /* for pointing to file names */
     75  1.11    simonb 	int		fd;		/* file descriptor */
     76   1.1       jtc 	FILE		*fp;			/* for opening files */
     77   1.1       jtc 	struct stat	fbuf;		/* for getting files statistics */
     78  1.11    simonb 	int ch;
     79   1.1       jtc 	char *path;
     80   1.6     lukem 
     81   1.1       jtc 	while ((ch = getopt(argc, argv, "m:")) != -1)
     82   1.1       jtc 		switch(ch) {
     83   1.1       jtc 		case 'm':
     84   1.1       jtc 			monsterfile = optarg;
     85   1.1       jtc 			break;
     86   1.1       jtc 		case '?':
     87   1.1       jtc 		default:
     88   1.1       jtc 			break;
     89   1.1       jtc 		}
     90   1.1       jtc 	argc -= optind;
     91   1.1       jtc 	argv += optind;
     92   1.4       cgd 
     93   1.1       jtc     srandom((unsigned) time(NULL));	/* prime random numbers */
     94   1.1       jtc 
     95   1.1       jtc     umask(0117);		/* only owner can read/write created files */
     96   1.1       jtc 
     97   1.1       jtc     /* try to create data files */
     98   1.1       jtc     filename = &files[0];
     99   1.1       jtc     while (*filename != NULL)
    100   1.1       jtc 	/* create each file */
    101  1.11    simonb 	{
    102   1.2        pk 	path = strrchr(*filename, '/') + 1;
    103   1.1       jtc 	if (stat(path, &fbuf) == 0)
    104   1.1       jtc 	    /* file exists; remove it */
    105   1.2        pk 	    {
    106   1.2        pk 	    if (unlink(path) < 0)
    107   1.1       jtc 		Error("Cannot unlink %s.\n", path);
    108   1.1       jtc 		/*NOTREACHED*/
    109   1.1       jtc 	    }
    110   1.2        pk 
    111   1.2        pk 	if ((fd = creat(path, 0660)) < 0)
    112   1.1       jtc 	    Error("Cannot create %s.\n", path);
    113   1.1       jtc 	    /*NOTREACHED*/
    114   1.1       jtc 
    115   1.1       jtc 	close(fd);			/* close newly created file */
    116   1.1       jtc 
    117   1.1       jtc 	++filename;			/* process next file */
    118   1.1       jtc 	}
    119  1.14       jmc 
    120   1.2        pk     /* Initialize an empty file placeholder for the grail location. */
    121  1.14       jmc     if ((fp = fopen(path, "w")) == NULL)
    122  1.14       jmc 	Error("Cannot create %s.\n", path);
    123   1.1       jtc     fclose(fp);
    124   1.1       jtc 
    125  1.11    simonb     /* create binary monster data base */
    126   1.2        pk     path = strrchr(_PATH_MONST, '/') + 1;
    127   1.2        pk     if ((Monstfp = fopen(path, "w")) == NULL)
    128   1.1       jtc 	Error("Cannot update %s.\n", path);
    129   1.1       jtc     else
    130   1.1       jtc 	{
    131   1.1       jtc 	if ((fp = fopen(monsterfile, "r")) == NULL)
    132   1.1       jtc 	    {
    133   1.1       jtc 	    fclose(Monstfp);
    134   1.1       jtc 	    Error("cannot open %s to create monster database.\n", "monsters.asc");
    135   1.1       jtc 	    }
    136   1.1       jtc 	else
    137   1.1       jtc 	    {
    138   1.1       jtc 	    Curmonster.m_o_strength =
    139   1.1       jtc 	    Curmonster.m_o_speed =
    140   1.1       jtc 	    Curmonster.m_maxspeed =
    141   1.1       jtc 	    Curmonster.m_o_energy =
    142   1.1       jtc 	    Curmonster.m_melee =
    143   1.1       jtc 	    Curmonster.m_skirmish = 0.0;
    144   1.1       jtc 
    145   1.1       jtc 	    while (fgets(Databuf, SZ_DATABUF, fp) != NULL)
    146   1.1       jtc 		/* read in text file, convert to binary */
    147   1.1       jtc 		{
    148   1.1       jtc 		sscanf(&Databuf[24], "%lf%lf%lf%lf%lf%d%d%lf",
    149   1.1       jtc 		    &Curmonster.m_strength, &Curmonster.m_brains,
    150   1.1       jtc 		    &Curmonster.m_speed, &Curmonster.m_energy,
    151   1.1       jtc 		    &Curmonster.m_experience, &Curmonster.m_treasuretype,
    152   1.1       jtc 		    &Curmonster.m_type, &Curmonster.m_flock);
    153   1.1       jtc 		Databuf[24] = '\0';
    154   1.1       jtc 		strcpy(Curmonster.m_name, Databuf);
    155   1.1       jtc 		fwrite((char *) &Curmonster, SZ_MONSTERSTRUCT, 1, Monstfp);
    156   1.1       jtc 		}
    157  1.10       jsm 	    fclose(fp);
    158  1.10       jsm 	    fflush(Monstfp);
    159  1.10       jsm 	    if (ferror(Monstfp))
    160   1.1       jtc 		Error("Writing %s.\n", path);
    161   1.1       jtc 	    fclose(Monstfp);
    162   1.1       jtc 	    }
    163   1.1       jtc 	}
    164   1.1       jtc 
    165   1.1       jtc #ifdef MAKE_INSTALLS_THIS_AND_DOESNT_WANT_TO_HEAR_ABOUT_IT
    166   1.1       jtc     /* write to motd file */
    167   1.1       jtc     printf("One line 'motd' ? ");
    168   1.1       jtc     if (fgets(Databuf, SZ_DATABUF, stdin) == NULL)
    169  1.11    simonb 	Databuf[0] = '\0';
    170   1.2        pk     path = strrchr(_PATH_MOTD, '/') + 1;
    171   1.2        pk     if ((fp = fopen(path, "w")) == NULL)
    172   1.1       jtc 	Error("Cannot update %s.\n", path);
    173   1.1       jtc     else
    174   1.1       jtc 	{
    175   1.1       jtc 	fwrite(Databuf, sizeof(char), strlen(Databuf), fp);
    176   1.1       jtc 	fclose(fp);
    177   1.1       jtc 	}
    178   1.1       jtc 
    179   1.1       jtc     /* report compile-time options */
    180   1.1       jtc     printf("Compiled options:\n\n");
    181   1.1       jtc     printf("Phantasia destination directory:  %s\n", _PATH_PHANTDIR);
    182   1.1       jtc     printf("Wizard: root UID: 0\n");
    183   1.1       jtc 
    184   1.1       jtc #ifdef BSD41
    185   1.1       jtc     printf("Compiled for BSD 4.1\n");
    186   1.1       jtc #endif
    187   1.1       jtc 
    188   1.1       jtc #ifdef BSD42
    189   1.1       jtc     printf("Compiled for BSD 4.2\n");
    190   1.1       jtc #endif
    191   1.1       jtc 
    192   1.1       jtc #ifdef SYS3
    193   1.1       jtc     printf("Compiled for System III\n");
    194   1.1       jtc #endif
    195   1.1       jtc 
    196   1.1       jtc #ifdef SYS5
    197   1.1       jtc     printf("Compiled for System V\n");
    198   1.1       jtc #endif
    199   1.1       jtc #endif
    200   1.1       jtc 
    201   1.1       jtc     exit(0);
    202   1.1       jtc     /*NOTREACHED*/
    203   1.1       jtc }
    204   1.1       jtc /**/
    206   1.1       jtc /************************************************************************
    207   1.1       jtc /
    208   1.1       jtc / FUNCTION NAME: Error()
    209   1.1       jtc /
    210   1.1       jtc / FUNCTION: print an error message, and exit
    211   1.1       jtc /
    212   1.1       jtc / AUTHOR: E. A. Estes, 12/4/85
    213   1.1       jtc /
    214   1.1       jtc / ARGUMENTS:
    215   1.1       jtc /	char *str - format string for printf()
    216   1.1       jtc /	char *file - file which caused error
    217   1.1       jtc /
    218   1.1       jtc / RETURN VALUE: none
    219   1.1       jtc /
    220   1.1       jtc / MODULES CALLED: exit(), perror(), fprintf()
    221   1.1       jtc /
    222   1.1       jtc / GLOBAL INPUTS: _iob[]
    223   1.1       jtc /
    224   1.1       jtc / GLOBAL OUTPUTS: none
    225   1.1       jtc /
    226   1.1       jtc / DESCRIPTION:
    227  1.10       jsm /	Print an error message, then exit.
    228   1.1       jtc /
    229  1.10       jsm / ************************************************************************/
    230  1.19  dholland 
    231   1.1       jtc void
    232   1.1       jtc Error(const char *str, const char *file)
    233   1.1       jtc {
    234   1.1       jtc     fprintf(stderr, "Error: ");
    235   1.1       jtc     fprintf(stderr, str, file);
    236   1.1       jtc     perror(file);
    237   1.1       jtc     exit(1);
    238   1.1       jtc     /*NOTREACHED*/
    239   1.1       jtc }
    240   1.1       jtc /**/
    242   1.1       jtc /************************************************************************
    243   1.1       jtc /
    244   1.1       jtc / FUNCTION NAME: drandom()
    245   1.1       jtc /
    246   1.1       jtc / FUNCTION: return a random number
    247   1.1       jtc /
    248   1.1       jtc / AUTHOR: E. A. Estes, 2/7/86
    249   1.1       jtc /
    250   1.1       jtc / ARGUMENTS: none
    251   1.1       jtc /
    252   1.1       jtc / RETURN VALUE: none
    253   1.1       jtc /
    254   1.1       jtc / MODULES CALLED: random()
    255   1.1       jtc /
    256   1.1       jtc / GLOBAL INPUTS: none
    257   1.1       jtc /
    258   1.1       jtc / GLOBAL OUTPUTS: none
    259  1.10       jsm /
    260   1.1       jtc / DESCRIPTION:
    261   1.1       jtc /
    262  1.19  dholland / ************************************************************************/
    263   1.1       jtc 
    264   1.1       jtc double
    265   1.1       jtc drandom(void)
    266   1.1       jtc {
    267   1.1       jtc     if (sizeof(int) != 2)
    268   1.1       jtc 	return((double) (random() & 0x7fff) / 32768.0);
    269                     else
    270                 	return((double) random() / 32768.0);
    271                 }
    272