minix/commands/advent/vocab.c
2005-04-21 14:53:53 +00:00

594 lines
14 KiB
C
Executable file

/*
look-up vocabulary word in lex-ordered table. words may have
two entries with different codes. if minimum acceptable type
= 0, then return minimum of different codes. last word CANNOT
have two entries(due to binary sort).
word is the word to look up.
type is the minimum acceptable value,
if != 0 return %1000
*/
#include <string.h>
#include <stdio.h>
#include "advent.h"
#include "advdec.h"
static _CONST struct wac wc[] = {
"\"spelunker\"", 1016,
"22", 2053,
"22", 3012,
"34", 2053,
"34", 3013,
"4-leafed", 5034,
"7", 2053,
"7", 3011,
"?", 3051,
"above", 29,
"abra", 3050,
"abracd", 3050,
"across", 42,
"alacaz", 3050,
"all", 1109,
"altar", 90,
"and", 6001,
"answer", 2035,
"anvil", 1091,
"ascend", 29,
"at", 4009,
"attack", 2012,
"awaken", 2029,
"awkward", 26,
"axe", 1028,
"back", 8,
"ball", 1120,
"barren", 40,
"bat", 1104,
"bats", 1104,
"batshit", 1104,
"batteries", 1039,
"beans", 1024,
"bear", 1035,
"bed", 16,
"bedquilt", 70,
"bee", 1087,
"beehive", 1097,
"bees", 1087,
"billboard", 1116,
"bird", 1101,
"bitch", 2048,
"black", 5006,
"blast", 2023,
"blow", 2036,
"blowup", 2023,
"boat", 1048,
"book", 1110,
"booth", 1093,
"bottle", 1020,
"box", 1055,
"brass", 5004,
"break", 2028,
"bridge", 89,
"brief", 2026,
"broken", 54,
"broom", 1114,
"brush", 1114,
"brush", 2054,
"building", 12,
"bumble", 1087,
"burn", 2047,
"cage", 1004,
"cake", 1107, /* value must be
mushrooms + 1 */
"cakes", 1107,
"call", 2038,
"calm", 2010,
"canister", 1118,
"canyon", 25,
"cape", 1047,
"capture", 2001,
"carpet", 1040,
"carry", 2001,
"carving", 1115,
"cask", 1071,
"catch", 2001,
"cave", 67,
"cavern", 73,
"chain", 1064,
"chalice", 1070,
"chant", 2003,
"chasm", 1021, /* troll bridge */
"chest", 1055,
"chimney", 78,
"clam", 1014,
"click", 85,
"climb", 56,
"cloak", 1047,
"close", 2006,
"clover", 1073,
"cobble", 18,
"coins", 1054,
"comb", 1096,
"complain", 2048,
"continue", 7,
"continue", 2011,
"crack", 33,
"crap", 3106,
"crap!", 3106,
"crawl", 17,
"cross", 69,
"crown", 1066,
"crystal", 5033,
"cup", 1070,
"cupcakes", 1107,
"d", 30,
"dark", 22,
"debris", 51,
"defile", 23,
"depression", 63,
"descend", 30,
"describe", 2052,
"detonate", 2023,
"devour", 2014,
"diagnose", 2051,
"dial", 2039,
"diamond", 1051,
"diamonds", 1051,
"dig", 3066,
"discard", 2002,
"disturb", 2029,
"doff", 2002,
"dog", 1098,
"dome", 35,
"don", 2033,
"door", 1041, /* giant door */
"down", 30,
"down", 4008,
"downstream", 5,
"downward", 30,
"dragon", 1031,
"drawing", 1029,
"drink", 2015,
"drop", 2002,
"droplet", 1075,
"dump", 2002,
"dust", 2054,
"dwarf", 1017,
"dwarves", 1017,
"e", 43,
"east", 43,
"eat", 2014,
"egg", 1056,
"eggs", 1056,
"elfin", 5019,
"emerald", 1059,
"empty", 2013,
"enter", 3,
"entrance", 64,
"everything", 1109,
"examine", 2052,
"excavate", 3066,
"exit", 11,
"explore", 2011,
"extinguish", 2008,
"fee", 2025,
"fee", 3001,
"feed", 2021,
"fie", 2025,
"fie", 3002,
"fight", 2012,
"figure", 1027,
"fill", 2022,
"find", 2019,
"fissure", 1012,
"fling", 2017,
"floor", 58,
"flower", 1046,
"flowers", 1046,
"foe", 2025,
"foe", 3003,
"follow", 2011,
"foo", 2025,
"foo", 3004,
"food", 1019,
"forcd", 1,
"forest", 6,
"fork", 77,
"forward", 7,
"fountain", 1103,
"four-leafed", 5034,
"free", 2002,
"fresh", 5010,
"from", 4005,
"fuck", 3079,
"fuck!", 3079,
"fum", 2025,
"fum", 3005,
"gate", 2058,
"get", 2044,
"geyser", 1037, /* same as volcano */
"giant", 27,
"giant", 5029,
"glowing", 5031,
"gnome", 1105,
"go", 2011,
"gold", 1050,
"golden", 5001,
"goto", 2011,
"grab", 2032,
"grail", 1070,
"grate", 1003,
"green", 5032,
"grey", 5032,
"gripe", 2048,
"grotto", 91,
"guano", 1104,
"gully", 13,
"h20", 1081,
"hall", 38,
"headlamp", 1002,
"health", 2051,
"heave", 2017,
"heels", 1067,
"help", 3051,
"hike", 2011,
"hill", 2,
"hit", 2034,
"hive", 1097,
"hocus", 3050,
"hole", 52,
"holy", 5021,
"honey", 1096,
"honeycomb", 1096,
"horn", 1052,
"hound", 1098,
"house", 12,
"hurl", 2017,
"i", 2020,
"ice", 88,
"ignite", 2023,
"in", 19,
"in", 4001,
"insert", 2045,
"inside", 19,
"inside", 4001,
"into", 4001,
"inventory", 2020,
"inward", 19,
"iron", 5011,
"issue", 1016,
"jar", 1020,
"jerk", 2032,
"jewelry", 1053,
"jewels", 1053,
"jump", 39,
"keep", 2001,
"keg", 1071,
"key", 1090,
"keys", 1102,
"kick", 2034,
"kill", 2012,
"knapsack", 1108,
"knife", 1018,
"knives", 1018,
"knoll", 81,
"l", 2052,
"lamp", 1002,
"lantern", 1002,
"lead", 5023,
"leaden", 5023,
"leap", 39,
"leather", 5024,
"leave", 11,
"leave", 2037,
"ledge", 83,
"left", 36,
"light", 1002,
"little", 5012,
"lock", 2049,
"look", 2052,
"lost", 3068,
"low", 24,
"lyre", 1068,
"machine", 1038,
"magazine", 1016,
"main", 76,
"map", 2057,
"message", 1036,
"metal", 5035,
"ming", 5016,
"mirror", 1023,
"mist", 3069,
"moss", 1040,
"mumble", 2003,
"mushroom", 1106,
"mushrooms", 1106,
"n", 45,
"ne", 47,
"nest", 1056,
"north", 45,
"northeast", 47,
"northwest", 50,
"nothing", 2005,
"nowhere", 21,
"nugget", 1050,
"null", 21,
"nw", 50,
"oak", 5022,
"oaken", 5022,
"off", 4006,
"office", 76,
"oil", 1083, /* in bottle */
"on", 4002,
"onto", 4002,
"onward", 7,
"open", 2004,
"opensesame", 3050,
"oriental", 72,
"out", 11,
"outdoors", 32,
"outside", 11,
"over", 41,
"oyster", 1015,
"pantry", 57,
"passage", 23,
"pause", 2030,
"pearl", 1061,
"persian", 5002,
"peruse", 2027,
"peyote", 1106,
"phone", 1094,
"phonebooth", 1094,
"phuce", 82,
"pick", 2041,
"pillow", 1010,
"pirate", 1030,
"pirloc", 2059,
"piss", 3107,
"piss!", 3107,
"pit", 31,
"placate", 2010,
"plant", 1024,
"platinum", 5017,
"play", 2040,
"plover", 71,
"plugh", 65,
"pocus", 3050,
"pole", 1009,
"pool", 80,
"poster", 1113,
"pottery", 1058,
"pound", 2034,
"pour", 2013,
"pray", 92,
"prayer", 92,
"proceed", 2011,
"pull", 2032,
"punch", 2034,
"put", 2042,
"pyramid", 1060,
"q", 2018,
"quartz", 5036,
"quit", 2018,
"radium", 1119,
"rare", 5018,
"ration", 1019,
"read", 2027,
"refill", 2022,
"release", 2002,
"remove", 2046,
"reply", 2035,
"report", 2048,
"reservoir", 75,
"restore", 2031,
"retreat", 8,
"return", 8,
"right", 37,
"ring", 1072,
"road", 2,
"rock", 1119,
"rock", 15,
"rocks", 1092,
"rocks", 1115,
"rod", 1005,
"room", 59,
"rowboat", 1048,
"rub", 2016,
"ruby", 5020,
"rug", 1062,
"run", 2011,
"rusty", 5028,
"s", 46,
"sack", 1108,
"safe", 1112,
"saint-michel", 93,
"sandwich", 1019,
"sapphire", 1069,
"save", 2030,
"say", 2003,
"score", 2024,
"se", 48,
"secret", 66,
"sesame", 3050,
"shadowy", 5027,
"shake", 2009,
"shards", 1058,
"shatter", 2028,
"shazam", 3050,
"shelf", 83,
"shell", 74,
"shield", 1118,
"ship", 1048,
"shit", 3106,
"shit!", 3106,
"shoes", 1067,
"shut", 2006,
"silk", 5013,
"silken", 5013,
"silver", 5014,
"sing", 2003,
"slab", 61,
"slabroom", 61,
"slay", 2012,
"slide", 79,
"slippers", 1067,
"slit", 60,
"slugs", 1095,
"small", 5012,
"smash", 2028,
"snake", 1011,
"south", 46,
"southeast", 48,
"southwest", 49,
"spelunker", 1016,
"sphere", 1120,
"spices", 1063,
"stair", 10,
"stairs", 10,
"stalagmite", 1026,
"star", 5026,
"statue", 1074,
"steal", 2001,
"steel", 5025,
"steps", 1007,
"steps", 34,
"stick", 1049,
"sticks", 1049,
"stone", 1119,
"stop", 3139,
"stream", 14,
"strike", 2034,
"strum", 2040,
"suggest", 2048,
"surface", 20,
"suspend", 2030,
"sw", 49,
"sweep", 2054,
"swim", 3147,
"swing", 2009,
"sword", 1065,
"tablet", 1013,
"take", 2001,
"tame", 2010,
"tasty", 5030,
"telephone", 1094,
"terse", 2055,
"then", 6002,
"throw", 2017,
"thunder", 84,
"tiny", 5012,
"to", 4004,
"tome", 1110,
"toss", 2017,
"tote", 2001,
"travel", 2011,
"treasure", 5015,
"tree", 1074,
"tree", 3064,
"trees", 3064,
"trident", 1057,
"troll", 1033,
"tube", 1118,
"tunnel", 23,
"turn", 2043,
"u", 29,
"unbrief", 2026,
"unlock", 2050,
"unterse", 2055,
"up", 29,
"up", 4007,
"upon", 4002,
"upstream", 4,
"upward", 29,
"used", 5009,
"utter", 2003,
"valley", 9,
"vase", 1058,
"velvet", 5007,
"vending", 5008,
"view", 28,
"volcano", 1037,
"volume", 1110,
"w", 44,
"wake", 2029,
"waken", 2029,
"walk", 2011,
"wall", 53,
"wall", 1088, /* in blue grotto */
"wand", 1005,
"water", 1081, /* in bottle */
"wave", 2009,
"wear", 2033,
"west", 44,
"whack", 2034,
"where", 2019,
"whirl", 80,
"whirlpool", 80,
"whisk", 1114,
"whiskbroom", 1114,
"wicker", 5005,
"wine", 1085, /* in bottle */
"with", 4003,
"wiz", 2056,
"wolf", 1098,
"wooden", 5003,
"worn", 5009,
"worn-out", 5009,
"wornout", 5009,
"wumpus", 1099,
"xyzzy", 62,
"y2", 55,
"yank", 2032
};
#define MAXWC (sizeof(wc) / sizeof(struct wac))
_PROTOTYPE(int binary, (char *));
int vocab(word, type)
char *word;
int type;
{
int v1, v2, temp;
if ((v1 = binary(word)) >= 0) {
if (v1 > 0 && strcmp(word, wc[v1 - 1].aword) == 0)
v2 = v1 - 1;
else if (v1 < (MAXWC - 1) && strcmp(word, wc[v1 + 1].aword) == 0)
v2 = v1 + 1;
else
v2 = v1;
if (wc[v1].acode > wc[v2].acode) {
temp = v1;
v1 = v2;
v2 = temp;
}
if (type <= CLASS(wc[v1].acode))
return (wc[v1].acode);
else if (type <= CLASS(wc[v2].acode))
return (wc[v2].acode);
else
return (-1);
} else
return (-1);
}
int binary(w)
char *w;
{
int lo, mid, hi, check;
lo = 0;
hi = MAXWC - 1;
do {
mid = (lo + hi) / 2;
check = strcmp(w, wc[mid].aword);
if (check == 0)
return (mid);
else if (check < 0)
hi = mid - 1;
else
lo = mid + 1;
} while (lo <= hi);
return (-1);
}