1 /* $NetBSD: main.c,v 1.10 2001/07/22 13:34:01 wiz Exp $ */ 2 3 /* 4 * Copyright (c) 1980, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed by the University of 18 * California, Berkeley and its contributors. 19 * 4. Neither the name of the University nor the names of its contributors 20 * may be used to endorse or promote products derived from this software 21 * without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 */ 35 36 #include <sys/cdefs.h> 37 #ifndef lint 38 __COPYRIGHT("@(#) Copyright (c) 1980, 1993\n\ 39 The Regents of the University of California. All rights reserved.\n"); 40 #endif /* not lint */ 41 42 #ifndef lint 43 #if 0 44 static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 5/31/93"; 45 #else 46 __RCSID("$NetBSD: main.c,v 1.10 2001/07/22 13:34:01 wiz Exp $"); 47 #endif 48 #endif /* not lint */ 49 50 #include <stdio.h> 51 #include <setjmp.h> 52 #include <termios.h> 53 #include <stdlib.h> 54 #include <unistd.h> 55 #include <err.h> 56 #include <time.h> 57 #include <sys/types.h> 58 #include "trek.h" 59 #include "getpar.h" 60 61 # define PRIO 00 /* default priority */ 62 63 uid_t Mother = 51 + (51 << 8); 64 65 /* 66 ** #### ##### # #### ##### #### ##### # # 67 ** # # # # # # # # # # # # 68 ** ### # ##### #### # #### ### ### 69 ** # # # # # # # # # # # # 70 ** #### # # # # # # # # ##### # # 71 ** 72 ** C version by Eric P. Allman 5/76 (U.C. Berkeley) with help 73 ** from Jeff Poskanzer and Pete Rubinstein. 74 ** 75 ** I also want to thank everyone here at Berkeley who 76 ** where crazy enough to play the undebugged game. I want to 77 ** particularly thank Nick Whyte, who made considerable 78 ** suggestions regarding the content of the game. Why, I'll 79 ** never forget the time he suggested the name for the 80 ** "capture" command. 81 ** 82 ** Please send comments, questions, and suggestions about this 83 ** game to: 84 ** Eric P. Allman 85 ** Project INGRES 86 ** Electronics Research Laboratory 87 ** Cory Hall 88 ** University of California 89 ** Berkeley, California 94720 90 ** 91 ** If you make ANY changes in the game, I sure would like to 92 ** know about them. It is sort of an ongoing project for me, 93 ** and I very much want to put in any bug fixes and improvements 94 ** that you might come up with. 95 ** 96 ** FORTRASH version by Kay R. Fisher (DEC) "and countless others". 97 ** That was adapted from the "original BASIC program" (ha!) by 98 ** Mike Mayfield (Centerline Engineering). 99 ** 100 ** Additional inspiration taken from FORTRAN version by 101 ** David Matuszek and Paul Reynolds which runs on the CDC 102 ** 7600 at Lawrence Berkeley Lab, maintained there by 103 ** Andy Davidson. This version is also available at LLL 104 ** and at LMSC. In all fairness, this version was the 105 ** major inspiration for this version of the game (trans- 106 ** lation: I ripped off a whole lot of code). 107 ** 108 ** Minor other input from the "Battelle Version 7A" by Joe Miller 109 ** (Graphics Systems Group, Battelle-Columbus Labs) and 110 ** Ross Pavlac (Systems Programmer, Battelle Memorial 111 ** Institute). That version was written in December '74 112 ** and extensively modified June '75. It was adapted 113 ** from the FTN version by Ron Williams of CDC Sunnyvale, 114 ** which was adapted from the Basic version distributed 115 ** by DEC. It also had "neat stuff swiped" from T. T. 116 ** Terry and Jim Korp (University of Texas), Hicks (Penn 117 ** U.), and Rick Maus (Georgia Tech). Unfortunately, it 118 ** was not as readable as it could have been and so the 119 ** translation effort was severely hampered. None the 120 ** less, I got the idea of inhabited starsystems from this 121 ** version. 122 ** 123 ** Permission is given for use, copying, and modification of 124 ** all or part of this program and related documentation, 125 ** provided that all reference to the authors are maintained. 126 ** 127 ** 128 ********************************************************************** 129 ** 130 ** NOTES TO THE MAINTAINER: 131 ** 132 ** There is a compilation option xTRACE which must be set for any 133 ** trace information to be generated. It is probably defined in 134 ** the version that you get. It can be removed, however, if you 135 ** have trouble finding room in core. 136 ** 137 ** Many things in trek are not as clear as they might be, but are 138 ** done to reduce space. I compile with the -f and -O flags. I 139 ** am constrained to running with non-separated I/D space, since 140 ** we don't have doubleing point hardware here; even if we did, I 141 ** would like trek to be available to the large number of people 142 ** who either have an 11/40 or do not have FP hardware. I also 143 ** found it desirable to make the code run reentrant, so this 144 ** added even more space constraints. 145 ** 146 ** I use the portable C library to do my I/O. This is done be- 147 ** cause I wanted the game easily transportable to other C 148 ** implementations, and because I was too lazy to do the doubleing 149 ** point input myself. Little did I know. The portable C library 150 ** released by Bell Labs has more bugs than you would believe, so 151 ** I ended up rewriting the whole blessed thing. Trek excercises 152 ** many of the bugs in it, as well as bugs in some of the section 153 ** III UNIX routines. We have fixed them here. One main problem 154 ** was a bug in alloc() that caused it to always ask for a large 155 ** hunk of memory, which worked fine unless you were almost out, 156 ** which I inevitably was. If you want the code for all of this 157 ** stuff, it is also available through me. 158 ** 159 *********************************************************************** 160 */ 161 162 jmp_buf env; 163 164 int main __P((int, char **)); 165 166 int 167 main(argc, argv) 168 int argc; 169 char **argv; 170 { 171 time_t curtime; 172 long vect; 173 char opencode; 174 int prio; 175 int ac; 176 char **av; 177 struct termios argp; 178 179 /* Revoke setgid privileges */ 180 setgid(getgid()); 181 182 av = argv; 183 ac = argc; 184 av++; 185 time(&curtime); 186 vect = (long) curtime; 187 srand(vect); 188 opencode = 'w'; 189 prio = PRIO; 190 191 if (tcgetattr(1, &argp) == 0) 192 { 193 if (cfgetispeed(&argp) < B1200) 194 Etc.fast++; 195 } 196 197 while (ac > 1 && av[0][0] == '-') 198 { 199 switch (av[0][1]) 200 { 201 case 'a': /* append to log file */ 202 opencode = 'a'; 203 break; 204 205 case 'f': /* set fast mode */ 206 Etc.fast++; 207 break; 208 209 case 's': /* set slow mode */ 210 Etc.fast = 0; 211 break; 212 213 # ifdef xTRACE 214 case 't': /* trace */ 215 if (getuid() != Mother) 216 goto badflag; 217 Trace++; 218 break; 219 # endif 220 221 case 'p': /* set priority */ 222 if (getuid() != Mother) 223 goto badflag; 224 prio = atoi(av[0] + 2); 225 break; 226 227 default: 228 badflag: 229 printf("Invalid option: %s\n", av[0]); 230 231 } 232 ac--; 233 av++; 234 } 235 if (ac > 2) 236 errx(1, "arg count"); 237 /* 238 if (ac > 1) 239 f_log = fopen(av[0], opencode); 240 */ 241 242 printf("\n * * * S T A R T R E K * * *\n\nPress return to continue.\n"); 243 244 if (setjmp(env)) 245 { 246 if ( !getynpar("Another game") ) 247 exit(0); 248 } 249 do 250 { 251 setup(); 252 play(); 253 } while (getynpar("Another game")); 254 255 fflush(stdout); 256 return 0; 257 } 258