1 /*- 2 * Copyright (c) 1991, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * The game adventure was originally written in Fortran by Will Crowther 6 * and Don Woods. It was later translated to C and enhanced by Jim 7 * Gillogly. This code is derived from software contributed to Berkeley 8 * by Jim Gillogly at The Rand Corporation. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. All advertising materials mentioning features or use of this software 19 * must display the following acknowledgement: 20 * This product includes software developed by the University of 21 * California, Berkeley and its contributors. 22 * 4. Neither the name of the University nor the names of its contributors 23 * may be used to endorse or promote products derived from this software 24 * without specific prior written permission. 25 * 26 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 29 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36 * SUCH DAMAGE. 37 * 38 * @(#)vocab.c 8.1 (Berkeley) 5/31/93 39 * $FreeBSD: src/games/adventure/vocab.c,v 1.9 1999/12/19 00:21:51 billf Exp $ 40 * $DragonFly: src/games/adventure/vocab.c,v 1.4 2007/04/18 18:32:12 swildner Exp $ 41 */ 42 43 /* Re-coding of advent in C: data structure routines */ 44 45 #include <stdio.h> 46 #include <stdlib.h> 47 #include <string.h> 48 #include <err.h> 49 #include "hdr.h" 50 51 void 52 dstroy(int object) 53 { move(object,0); 54 } 55 56 void 57 juggle(int object) 58 { int i,j; 59 60 i=place[object]; 61 j=fixed[object]; 62 move(object,i); 63 move(object+100,j); 64 } 65 66 67 void 68 move(int object, int where) 69 { int from; 70 71 if (object<=100) 72 from=place[object]; 73 else 74 from=fixed[object-100]; 75 if (from>0 && from<=300) carry(object,from); 76 drop(object,where); 77 } 78 79 80 int 81 put(int object, int where, int pval) 82 { move(object,where); 83 return(-1-pval); 84 } 85 86 void 87 carry(int object, int where) 88 { int temp; 89 90 if (object<=100) 91 { if (place[object]== -1) return; 92 place[object] = -1; 93 holdng++; 94 } 95 if (atloc[where]==object) 96 { atloc[where]=linkx[object]; 97 return; 98 } 99 for (temp=atloc[where]; linkx[temp]!=object; temp=linkx[temp]); 100 linkx[temp]=linkx[object]; 101 } 102 103 104 void 105 drop(int object, int where) 106 { if (object>100) fixed[object-100]=where; 107 else 108 { if (place[object]== -1) holdng--; 109 place[object]=where; 110 } 111 if (where<=0) return; 112 linkx[object]=atloc[where]; 113 atloc[where]=object; 114 } 115 116 117 /* look up or store a word */ 118 /* type is -2 for store, -1 for user word, >=0 for canned lookup*/ 119 /* value is used for storing only */ 120 int 121 vocab(const char *word, int type, int value) 122 { int adr; 123 const char *s; 124 char *t; 125 int hash, i; 126 struct hashtab *h; 127 128 for (hash=0,s=word,i=0; i<5 &&*s; i++) /* some kind of hash */ 129 hash += *s++; /* add all chars in the word */ 130 hash = (hash*3719)&077777; /* pulled that one out of a hat */ 131 hash %= HTSIZE; /* put it into range of table */ 132 133 for(adr=hash;; adr++) /* look for entry in table */ 134 { if (adr==HTSIZE) adr=0; /* wrap around */ 135 h = &voc[adr]; /* point at the entry */ 136 switch(type) 137 { case -2: /* fill in entry */ 138 if (h->val) /* already got an entry? */ 139 goto exitloop2; 140 h->val=value; 141 h->atab=malloc(strlen(word)+1); 142 if (h->atab == NULL) 143 errx(1, "Out of memory!"); 144 for (s=word,t=h->atab; *s;) 145 *t++ = *s++ ^ '='; 146 *t=0^'='; 147 /* encrypt slightly to thwart core reader */ 148 /* printf("Stored \"%s\" (%d ch) as entry %d\n", */ 149 /* word, strlen(word)+1, adr); */ 150 return(0); /* entry unused */ 151 case -1: /* looking up user word */ 152 if (h->val==0) return(-1); /* not found */ 153 for (s=word, t=h->atab;*t ^ '=';) 154 if ((*s++ ^ '=') != *t++) 155 goto exitloop2; 156 if ((*s ^ '=') != *t && s-word<5) goto exitloop2; 157 /* the word matched o.k. */ 158 return(h->val); 159 default: /* looking up known word */ 160 if (h->val==0) 161 { errx(1, "Unable to find %s in vocab", word); 162 } 163 for (s=word, t=h->atab;*t ^ '=';) 164 if ((*s++ ^ '=') != *t++) goto exitloop2; 165 /* the word matched o.k. */ 166 if (h->val/1000 != type) continue; 167 return(h->val%1000); 168 } 169 170 exitloop2: /* hashed entry does not match */ 171 if (adr+1==hash || (adr==HTSIZE && hash==0)) 172 { errx(1, "Hash table overflow"); 173 } 174 } 175 } 176