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