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