1 1.23 dholland /* $NetBSD: misc.c,v 1.23 2012/06/19 05:35:32 dholland Exp $ */ 2 1.4 cgd 3 1.1 cgd /* 4 1.4 cgd * Copyright (c) 1980, 1993 5 1.4 cgd * The Regents of the University of California. All rights reserved. 6 1.1 cgd * 7 1.1 cgd * Redistribution and use in source and binary forms, with or without 8 1.1 cgd * modification, are permitted provided that the following conditions 9 1.1 cgd * are met: 10 1.1 cgd * 1. Redistributions of source code must retain the above copyright 11 1.1 cgd * notice, this list of conditions and the following disclaimer. 12 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 cgd * notice, this list of conditions and the following disclaimer in the 14 1.1 cgd * documentation and/or other materials provided with the distribution. 15 1.11 agc * 3. Neither the name of the University nor the names of its contributors 16 1.1 cgd * may be used to endorse or promote products derived from this software 17 1.1 cgd * without specific prior written permission. 18 1.1 cgd * 19 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 1.1 cgd * SUCH DAMAGE. 30 1.1 cgd */ 31 1.1 cgd 32 1.6 christos #include <sys/cdefs.h> 33 1.1 cgd #ifndef lint 34 1.4 cgd #if 0 35 1.4 cgd static char sccsid[] = "@(#)misc.c 8.1 (Berkeley) 5/31/93"; 36 1.4 cgd #else 37 1.23 dholland __RCSID("$NetBSD: misc.c,v 1.23 2012/06/19 05:35:32 dholland Exp $"); 38 1.4 cgd #endif 39 1.1 cgd #endif /* not lint */ 40 1.1 cgd 41 1.7 simonb #include <ctype.h> 42 1.18 dholland #include <limits.h> 43 1.7 simonb #include <signal.h> 44 1.20 christos #include <errno.h> 45 1.1 cgd 46 1.19 dholland #include "monop.h" 47 1.19 dholland 48 1.21 dholland static void is_monop(MON *, int); 49 1.21 dholland 50 1.1 cgd /* 51 1.1 cgd * This routine executes a truncated set of commands until a 52 1.1 cgd * "yes or "no" answer is gotten. 53 1.1 cgd */ 54 1.6 christos int 55 1.23 dholland getyn(const char *prompt) 56 1.6 christos { 57 1.7 simonb int com; 58 1.1 cgd 59 1.1 cgd for (;;) 60 1.12 jsm if ((com=getinp(prompt, yncoms)) < 2) 61 1.1 cgd return com; 62 1.1 cgd else 63 1.1 cgd (*func[com-2])(); 64 1.1 cgd } 65 1.7 simonb 66 1.1 cgd /* 67 1.1 cgd * This routine tells the player if he's out of money. 68 1.1 cgd */ 69 1.6 christos void 70 1.23 dholland notify(void) 71 1.6 christos { 72 1.1 cgd if (cur_p->money < 0) 73 1.1 cgd printf("That leaves you $%d in debt\n", -cur_p->money); 74 1.1 cgd else if (cur_p->money == 0) 75 1.1 cgd printf("that leaves you broke\n"); 76 1.1 cgd else if (fixing && !told_em && cur_p->money > 0) { 77 1.1 cgd printf("-- You are now Solvent ---\n"); 78 1.1 cgd told_em = TRUE; 79 1.1 cgd } 80 1.1 cgd } 81 1.7 simonb 82 1.1 cgd /* 83 1.1 cgd * This routine switches to the next player 84 1.1 cgd */ 85 1.6 christos void 86 1.23 dholland next_play(void) 87 1.6 christos { 88 1.10 cgd player = (player + 1) % num_play; 89 1.1 cgd cur_p = &play[player]; 90 1.1 cgd num_doub = 0; 91 1.1 cgd } 92 1.7 simonb 93 1.1 cgd /* 94 1.1 cgd * This routine gets an integer from the keyboard after the 95 1.1 cgd * given prompt. 96 1.1 cgd */ 97 1.6 christos int 98 1.23 dholland get_int(const char *prompt) 99 1.6 christos { 100 1.18 dholland long num; 101 1.7 simonb char *sp; 102 1.7 simonb char buf[257]; 103 1.1 cgd 104 1.1 cgd for (;;) { 105 1.17 dholland printf("%s", prompt); 106 1.18 dholland fgets(buf, sizeof(buf), stdin); 107 1.22 ahoka /* if stdin is closed we cant really play anymore */ 108 1.18 dholland if (feof(stdin)) 109 1.22 ahoka quit(); 110 1.18 dholland sp = strchr(buf, '\n'); 111 1.18 dholland if (sp) 112 1.18 dholland *sp = '\0'; 113 1.18 dholland errno = 0; 114 1.18 dholland num = strtol(buf, &sp, 10); 115 1.18 dholland if (errno || strlen(sp) > 0 || num < 0 || num >= INT_MAX) { 116 1.18 dholland printf("I can't understand that\n"); 117 1.1 cgd continue; 118 1.18 dholland } 119 1.18 dholland return num; 120 1.1 cgd } 121 1.1 cgd } 122 1.7 simonb 123 1.1 cgd /* 124 1.1 cgd * This routine sets the monopoly flag from the list given. 125 1.1 cgd */ 126 1.6 christos void 127 1.23 dholland set_ownlist(int pl) 128 1.6 christos { 129 1.7 simonb int num; /* general counter */ 130 1.7 simonb MON *orig; /* remember starting monop ptr */ 131 1.7 simonb OWN *op; /* current owned prop */ 132 1.15 dholland OWN *orig_op; /* original prop before loop */ 133 1.1 cgd 134 1.1 cgd op = play[pl].own_list; 135 1.1 cgd #ifdef DEBUG 136 1.16 dholland printf("op [%p] = play[pl [%d] ].own_list;\n", op, pl); 137 1.1 cgd #endif 138 1.1 cgd while (op) { 139 1.1 cgd #ifdef DEBUG 140 1.1 cgd printf("op->sqr->type = %d\n", op->sqr->type); 141 1.1 cgd #endif 142 1.1 cgd switch (op->sqr->type) { 143 1.1 cgd case UTIL: 144 1.1 cgd #ifdef DEBUG 145 1.1 cgd printf(" case UTIL:\n"); 146 1.1 cgd #endif 147 1.7 simonb for (num = 0; op && op->sqr->type == UTIL; 148 1.7 simonb op = op->next) 149 1.1 cgd num++; 150 1.1 cgd play[pl].num_util = num; 151 1.1 cgd #ifdef DEBUG 152 1.1 cgd printf("play[pl].num_util = num [%d];\n", num); 153 1.1 cgd #endif 154 1.1 cgd break; 155 1.1 cgd case RR: 156 1.1 cgd #ifdef DEBUG 157 1.1 cgd printf(" case RR:\n"); 158 1.1 cgd #endif 159 1.7 simonb for (num = 0; op && op->sqr->type == RR; 160 1.7 simonb op = op->next) { 161 1.1 cgd #ifdef DEBUG 162 1.1 cgd printf("iter: %d\n", num); 163 1.16 dholland printf("op = %p, op->sqr = %p, " 164 1.7 simonb "op->sqr->type = %d\n", op, op->sqr, 165 1.7 simonb op->sqr->type); 166 1.1 cgd #endif 167 1.1 cgd num++; 168 1.1 cgd } 169 1.1 cgd play[pl].num_rr = num; 170 1.1 cgd #ifdef DEBUG 171 1.1 cgd printf("play[pl].num_rr = num [%d];\n", num); 172 1.1 cgd #endif 173 1.1 cgd break; 174 1.1 cgd case PRPTY: 175 1.1 cgd #ifdef DEBUG 176 1.1 cgd printf(" case PRPTY:\n"); 177 1.1 cgd #endif 178 1.1 cgd orig = op->sqr->desc->mon_desc; 179 1.1 cgd orig_op = op; 180 1.1 cgd num = 0; 181 1.1 cgd while (op && op->sqr->desc->mon_desc == orig) { 182 1.1 cgd #ifdef DEBUG 183 1.1 cgd printf("iter: %d\n", num); 184 1.1 cgd #endif 185 1.1 cgd num++; 186 1.1 cgd #ifdef DEBUG 187 1.1 cgd printf("op = op->next "); 188 1.1 cgd #endif 189 1.1 cgd op = op->next; 190 1.1 cgd #ifdef DEBUG 191 1.16 dholland printf("[%p];\n", op); 192 1.1 cgd #endif 193 1.1 cgd } 194 1.1 cgd #ifdef DEBUG 195 1.16 dholland printf("num = %d\n", num); 196 1.1 cgd #endif 197 1.16 dholland if (orig == NULL) { 198 1.7 simonb printf("panic: bad monopoly descriptor: " 199 1.7 simonb "orig = %p\n", orig); 200 1.1 cgd printf("player # %d\n", pl+1); 201 1.1 cgd printhold(pl); 202 1.6 christos printf("orig_op = %p\n", orig_op); 203 1.14 christos if (orig_op) { 204 1.14 christos printf("orig_op->sqr->type = %d (PRPTY)\n", 205 1.14 christos orig_op->sqr->type); 206 1.16 dholland printf("orig_op->next = %p\n", 207 1.16 dholland orig_op->next); 208 1.14 christos printf("orig_op->sqr->desc = %p\n", 209 1.14 christos orig_op->sqr->desc); 210 1.14 christos } 211 1.6 christos printf("op = %p\n", op); 212 1.14 christos if (op) { 213 1.14 christos printf("op->sqr->type = %d (PRPTY)\n", 214 1.14 christos op->sqr->type); 215 1.14 christos printf("op->next = %p\n", op->next); 216 1.14 christos printf("op->sqr->desc = %p\n", 217 1.14 christos op->sqr->desc); 218 1.14 christos } 219 1.1 cgd printf("num = %d\n", num); 220 1.18 dholland exit(1); 221 1.1 cgd } 222 1.1 cgd #ifdef DEBUG 223 1.1 cgd printf("orig->num_in = %d\n", orig->num_in); 224 1.1 cgd #endif 225 1.1 cgd if (num == orig->num_in) 226 1.1 cgd is_monop(orig, pl); 227 1.1 cgd else 228 1.9 jsm is_not_monop(orig); 229 1.1 cgd break; 230 1.1 cgd } 231 1.1 cgd } 232 1.1 cgd } 233 1.7 simonb 234 1.1 cgd /* 235 1.1 cgd * This routine sets things up as if it is a new monopoly 236 1.1 cgd */ 237 1.21 dholland static void 238 1.23 dholland is_monop(MON *mp, int pl) 239 1.6 christos { 240 1.7 simonb int i; 241 1.1 cgd 242 1.1 cgd mp->owner = pl; 243 1.1 cgd mp->num_own = mp->num_in; 244 1.1 cgd for (i = 0; i < mp->num_in; i++) 245 1.1 cgd mp->sq[i]->desc->monop = TRUE; 246 1.1 cgd mp->name = mp->mon_n; 247 1.1 cgd } 248 1.7 simonb 249 1.1 cgd /* 250 1.1 cgd * This routine sets things up as if it is no longer a monopoly 251 1.1 cgd */ 252 1.6 christos void 253 1.23 dholland is_not_monop(MON *mp) 254 1.6 christos { 255 1.7 simonb int i; 256 1.1 cgd 257 1.1 cgd mp->owner = -1; 258 1.1 cgd for (i = 0; i < mp->num_in; i++) 259 1.1 cgd mp->sq[i]->desc->monop = FALSE; 260 1.1 cgd mp->name = mp->not_m; 261 1.1 cgd } 262 1.7 simonb 263 1.1 cgd /* 264 1.1 cgd * This routine gives a list of the current player's routine 265 1.1 cgd */ 266 1.6 christos void 267 1.23 dholland list(void) 268 1.6 christos { 269 1.1 cgd printhold(player); 270 1.1 cgd } 271 1.7 simonb 272 1.1 cgd /* 273 1.1 cgd * This routine gives a list of a given players holdings 274 1.1 cgd */ 275 1.6 christos void 276 1.23 dholland list_all(void) 277 1.6 christos { 278 1.7 simonb int pl; 279 1.1 cgd 280 1.7 simonb while ((pl = getinp("Whose holdings do you want to see? ", name_list)) 281 1.7 simonb < num_play) 282 1.1 cgd printhold(pl); 283 1.1 cgd } 284 1.7 simonb 285 1.1 cgd /* 286 1.1 cgd * This routine gives the players a chance before it exits. 287 1.1 cgd */ 288 1.1 cgd void 289 1.23 dholland quit(void) 290 1.6 christos { 291 1.1 cgd putchar('\n'); 292 1.22 ahoka 293 1.22 ahoka /* We dont even have a chance to input y/n if stdin is closed */ 294 1.22 ahoka if (feof(stdin)) 295 1.22 ahoka exit(0); 296 1.22 ahoka 297 1.6 christos if (getyn("Do you all really want to quit? ") == 0) 298 1.1 cgd exit(0); 299 1.1 cgd } 300