1) Added s/key support .
[unix-history] / lib / libskey / put.c
CommitLineData
05a0983d
GR
1#include <stdio.h>
2#include <string.h>
3#include <assert.h>
4#include <ctype.h>
5#include "skey.h"
6
7static unsigned long extract __ARGS((char *s,int start,int length));
8static void standard __ARGS((char *word));
9static void insert __ARGS((char *s, int x, int start, int length));
10static int wsrch __ARGS((char *w,int low,int high));
11
12/* Dictionary for integer-word translations */
13char Wp[2048][4] = {
14"A",
15"ABE",
16"ACE",
17"ACT",
18"AD",
19"ADA",
20"ADD",
21"AGO",
22"AID",
23"AIM",
24"AIR",
25"ALL",
26"ALP",
27"AM",
28"AMY",
29"AN",
30"ANA",
31"AND",
32"ANN",
33"ANT",
34"ANY",
35"APE",
36"APS",
37"APT",
38"ARC",
39"ARE",
40"ARK",
41"ARM",
42"ART",
43"AS",
44"ASH",
45"ASK",
46"AT",
47"ATE",
48"AUG",
49"AUK",
50"AVE",
51"AWE",
52"AWK",
53"AWL",
54"AWN",
55"AX",
56"AYE",
57"BAD",
58"BAG",
59"BAH",
60"BAM",
61"BAN",
62"BAR",
63"BAT",
64"BAY",
65"BE",
66"BED",
67"BEE",
68"BEG",
69"BEN",
70"BET",
71"BEY",
72"BIB",
73"BID",
74"BIG",
75"BIN",
76"BIT",
77"BOB",
78"BOG",
79"BON",
80"BOO",
81"BOP",
82"BOW",
83"BOY",
84"BUB",
85"BUD",
86"BUG",
87"BUM",
88"BUN",
89"BUS",
90"BUT",
91"BUY",
92"BY",
93"BYE",
94"CAB",
95"CAL",
96"CAM",
97"CAN",
98"CAP",
99"CAR",
100"CAT",
101"CAW",
102"COD",
103"COG",
104"COL",
105"CON",
106"COO",
107"COP",
108"COT",
109"COW",
110"COY",
111"CRY",
112"CUB",
113"CUE",
114"CUP",
115"CUR",
116"CUT",
117"DAB",
118"DAD",
119"DAM",
120"DAN",
121"DAR",
122"DAY",
123"DEE",
124"DEL",
125"DEN",
126"DES",
127"DEW",
128"DID",
129"DIE",
130"DIG",
131"DIN",
132"DIP",
133"DO",
134"DOE",
135"DOG",
136"DON",
137"DOT",
138"DOW",
139"DRY",
140"DUB",
141"DUD",
142"DUE",
143"DUG",
144"DUN",
145"EAR",
146"EAT",
147"ED",
148"EEL",
149"EGG",
150"EGO",
151"ELI",
152"ELK",
153"ELM",
154"ELY",
155"EM",
156"END",
157"EST",
158"ETC",
159"EVA",
160"EVE",
161"EWE",
162"EYE",
163"FAD",
164"FAN",
165"FAR",
166"FAT",
167"FAY",
168"FED",
169"FEE",
170"FEW",
171"FIB",
172"FIG",
173"FIN",
174"FIR",
175"FIT",
176"FLO",
177"FLY",
178"FOE",
179"FOG",
180"FOR",
181"FRY",
182"FUM",
183"FUN",
184"FUR",
185"GAB",
186"GAD",
187"GAG",
188"GAL",
189"GAM",
190"GAP",
191"GAS",
192"GAY",
193"GEE",
194"GEL",
195"GEM",
196"GET",
197"GIG",
198"GIL",
199"GIN",
200"GO",
201"GOT",
202"GUM",
203"GUN",
204"GUS",
205"GUT",
206"GUY",
207"GYM",
208"GYP",
209"HA",
210"HAD",
211"HAL",
212"HAM",
213"HAN",
214"HAP",
215"HAS",
216"HAT",
217"HAW",
218"HAY",
219"HE",
220"HEM",
221"HEN",
222"HER",
223"HEW",
224"HEY",
225"HI",
226"HID",
227"HIM",
228"HIP",
229"HIS",
230"HIT",
231"HO",
232"HOB",
233"HOC",
234"HOE",
235"HOG",
236"HOP",
237"HOT",
238"HOW",
239"HUB",
240"HUE",
241"HUG",
242"HUH",
243"HUM",
244"HUT",
245"I",
246"ICY",
247"IDA",
248"IF",
249"IKE",
250"ILL",
251"INK",
252"INN",
253"IO",
254"ION",
255"IQ",
256"IRA",
257"IRE",
258"IRK",
259"IS",
260"IT",
261"ITS",
262"IVY",
263"JAB",
264"JAG",
265"JAM",
266"JAN",
267"JAR",
268"JAW",
269"JAY",
270"JET",
271"JIG",
272"JIM",
273"JO",
274"JOB",
275"JOE",
276"JOG",
277"JOT",
278"JOY",
279"JUG",
280"JUT",
281"KAY",
282"KEG",
283"KEN",
284"KEY",
285"KID",
286"KIM",
287"KIN",
288"KIT",
289"LA",
290"LAB",
291"LAC",
292"LAD",
293"LAG",
294"LAM",
295"LAP",
296"LAW",
297"LAY",
298"LEA",
299"LED",
300"LEE",
301"LEG",
302"LEN",
303"LEO",
304"LET",
305"LEW",
306"LID",
307"LIE",
308"LIN",
309"LIP",
310"LIT",
311"LO",
312"LOB",
313"LOG",
314"LOP",
315"LOS",
316"LOT",
317"LOU",
318"LOW",
319"LOY",
320"LUG",
321"LYE",
322"MA",
323"MAC",
324"MAD",
325"MAE",
326"MAN",
327"MAO",
328"MAP",
329"MAT",
330"MAW",
331"MAY",
332"ME",
333"MEG",
334"MEL",
335"MEN",
336"MET",
337"MEW",
338"MID",
339"MIN",
340"MIT",
341"MOB",
342"MOD",
343"MOE",
344"MOO",
345"MOP",
346"MOS",
347"MOT",
348"MOW",
349"MUD",
350"MUG",
351"MUM",
352"MY",
353"NAB",
354"NAG",
355"NAN",
356"NAP",
357"NAT",
358"NAY",
359"NE",
360"NED",
361"NEE",
362"NET",
363"NEW",
364"NIB",
365"NIL",
366"NIP",
367"NIT",
368"NO",
369"NOB",
370"NOD",
371"NON",
372"NOR",
373"NOT",
374"NOV",
375"NOW",
376"NU",
377"NUN",
378"NUT",
379"O",
380"OAF",
381"OAK",
382"OAR",
383"OAT",
384"ODD",
385"ODE",
386"OF",
387"OFF",
388"OFT",
389"OH",
390"OIL",
391"OK",
392"OLD",
393"ON",
394"ONE",
395"OR",
396"ORB",
397"ORE",
398"ORR",
399"OS",
400"OTT",
401"OUR",
402"OUT",
403"OVA",
404"OW",
405"OWE",
406"OWL",
407"OWN",
408"OX",
409"PA",
410"PAD",
411"PAL",
412"PAM",
413"PAN",
414"PAP",
415"PAR",
416"PAT",
417"PAW",
418"PAY",
419"PEA",
420"PEG",
421"PEN",
422"PEP",
423"PER",
424"PET",
425"PEW",
426"PHI",
427"PI",
428"PIE",
429"PIN",
430"PIT",
431"PLY",
432"PO",
433"POD",
434"POE",
435"POP",
436"POT",
437"POW",
438"PRO",
439"PRY",
440"PUB",
441"PUG",
442"PUN",
443"PUP",
444"PUT",
445"QUO",
446"RAG",
447"RAM",
448"RAN",
449"RAP",
450"RAT",
451"RAW",
452"RAY",
453"REB",
454"RED",
455"REP",
456"RET",
457"RIB",
458"RID",
459"RIG",
460"RIM",
461"RIO",
462"RIP",
463"ROB",
464"ROD",
465"ROE",
466"RON",
467"ROT",
468"ROW",
469"ROY",
470"RUB",
471"RUE",
472"RUG",
473"RUM",
474"RUN",
475"RYE",
476"SAC",
477"SAD",
478"SAG",
479"SAL",
480"SAM",
481"SAN",
482"SAP",
483"SAT",
484"SAW",
485"SAY",
486"SEA",
487"SEC",
488"SEE",
489"SEN",
490"SET",
491"SEW",
492"SHE",
493"SHY",
494"SIN",
495"SIP",
496"SIR",
497"SIS",
498"SIT",
499"SKI",
500"SKY",
501"SLY",
502"SO",
503"SOB",
504"SOD",
505"SON",
506"SOP",
507"SOW",
508"SOY",
509"SPA",
510"SPY",
511"SUB",
512"SUD",
513"SUE",
514"SUM",
515"SUN",
516"SUP",
517"TAB",
518"TAD",
519"TAG",
520"TAN",
521"TAP",
522"TAR",
523"TEA",
524"TED",
525"TEE",
526"TEN",
527"THE",
528"THY",
529"TIC",
530"TIE",
531"TIM",
532"TIN",
533"TIP",
534"TO",
535"TOE",
536"TOG",
537"TOM",
538"TON",
539"TOO",
540"TOP",
541"TOW",
542"TOY",
543"TRY",
544"TUB",
545"TUG",
546"TUM",
547"TUN",
548"TWO",
549"UN",
550"UP",
551"US",
552"USE",
553"VAN",
554"VAT",
555"VET",
556"VIE",
557"WAD",
558"WAG",
559"WAR",
560"WAS",
561"WAY",
562"WE",
563"WEB",
564"WED",
565"WEE",
566"WET",
567"WHO",
568"WHY",
569"WIN",
570"WIT",
571"WOK",
572"WON",
573"WOO",
574"WOW",
575"WRY",
576"WU",
577"YAM",
578"YAP",
579"YAW",
580"YE",
581"YEA",
582"YES",
583"YET",
584"YOU",
585"ABED",
586"ABEL",
587"ABET",
588"ABLE",
589"ABUT",
590"ACHE",
591"ACID",
592"ACME",
593"ACRE",
594"ACTA",
595"ACTS",
596"ADAM",
597"ADDS",
598"ADEN",
599"AFAR",
600"AFRO",
601"AGEE",
602"AHEM",
603"AHOY",
604"AIDA",
605"AIDE",
606"AIDS",
607"AIRY",
608"AJAR",
609"AKIN",
610"ALAN",
611"ALEC",
612"ALGA",
613"ALIA",
614"ALLY",
615"ALMA",
616"ALOE",
617"ALSO",
618"ALTO",
619"ALUM",
620"ALVA",
621"AMEN",
622"AMES",
623"AMID",
624"AMMO",
625"AMOK",
626"AMOS",
627"AMRA",
628"ANDY",
629"ANEW",
630"ANNA",
631"ANNE",
632"ANTE",
633"ANTI",
634"AQUA",
635"ARAB",
636"ARCH",
637"AREA",
638"ARGO",
639"ARID",
640"ARMY",
641"ARTS",
642"ARTY",
643"ASIA",
644"ASKS",
645"ATOM",
646"AUNT",
647"AURA",
648"AUTO",
649"AVER",
650"AVID",
651"AVIS",
652"AVON",
653"AVOW",
654"AWAY",
655"AWRY",
656"BABE",
657"BABY",
658"BACH",
659"BACK",
660"BADE",
661"BAIL",
662"BAIT",
663"BAKE",
664"BALD",
665"BALE",
666"BALI",
667"BALK",
668"BALL",
669"BALM",
670"BAND",
671"BANE",
672"BANG",
673"BANK",
674"BARB",
675"BARD",
676"BARE",
677"BARK",
678"BARN",
679"BARR",
680"BASE",
681"BASH",
682"BASK",
683"BASS",
684"BATE",
685"BATH",
686"BAWD",
687"BAWL",
688"BEAD",
689"BEAK",
690"BEAM",
691"BEAN",
692"BEAR",
693"BEAT",
694"BEAU",
695"BECK",
696"BEEF",
697"BEEN",
698"BEER",
699"BEET",
700"BELA",
701"BELL",
702"BELT",
703"BEND",
704"BENT",
705"BERG",
706"BERN",
707"BERT",
708"BESS",
709"BEST",
710"BETA",
711"BETH",
712"BHOY",
713"BIAS",
714"BIDE",
715"BIEN",
716"BILE",
717"BILK",
718"BILL",
719"BIND",
720"BING",
721"BIRD",
722"BITE",
723"BITS",
724"BLAB",
725"BLAT",
726"BLED",
727"BLEW",
728"BLOB",
729"BLOC",
730"BLOT",
731"BLOW",
732"BLUE",
733"BLUM",
734"BLUR",
735"BOAR",
736"BOAT",
737"BOCA",
738"BOCK",
739"BODE",
740"BODY",
741"BOGY",
742"BOHR",
743"BOIL",
744"BOLD",
745"BOLO",
746"BOLT",
747"BOMB",
748"BONA",
749"BOND",
750"BONE",
751"BONG",
752"BONN",
753"BONY",
754"BOOK",
755"BOOM",
756"BOON",
757"BOOT",
758"BORE",
759"BORG",
760"BORN",
761"BOSE",
762"BOSS",
763"BOTH",
764"BOUT",
765"BOWL",
766"BOYD",
767"BRAD",
768"BRAE",
769"BRAG",
770"BRAN",
771"BRAY",
772"BRED",
773"BREW",
774"BRIG",
775"BRIM",
776"BROW",
777"BUCK",
778"BUDD",
779"BUFF",
780"BULB",
781"BULK",
782"BULL",
783"BUNK",
784"BUNT",
785"BUOY",
786"BURG",
787"BURL",
788"BURN",
789"BURR",
790"BURT",
791"BURY",
792"BUSH",
793"BUSS",
794"BUST",
795"BUSY",
796"BYTE",
797"CADY",
798"CAFE",
799"CAGE",
800"CAIN",
801"CAKE",
802"CALF",
803"CALL",
804"CALM",
805"CAME",
806"CANE",
807"CANT",
808"CARD",
809"CARE",
810"CARL",
811"CARR",
812"CART",
813"CASE",
814"CASH",
815"CASK",
816"CAST",
817"CAVE",
818"CEIL",
819"CELL",
820"CENT",
821"CERN",
822"CHAD",
823"CHAR",
824"CHAT",
825"CHAW",
826"CHEF",
827"CHEN",
828"CHEW",
829"CHIC",
830"CHIN",
831"CHOU",
832"CHOW",
833"CHUB",
834"CHUG",
835"CHUM",
836"CITE",
837"CITY",
838"CLAD",
839"CLAM",
840"CLAN",
841"CLAW",
842"CLAY",
843"CLOD",
844"CLOG",
845"CLOT",
846"CLUB",
847"CLUE",
848"COAL",
849"COAT",
850"COCA",
851"COCK",
852"COCO",
853"CODA",
854"CODE",
855"CODY",
856"COED",
857"COIL",
858"COIN",
859"COKE",
860"COLA",
861"COLD",
862"COLT",
863"COMA",
864"COMB",
865"COME",
866"COOK",
867"COOL",
868"COON",
869"COOT",
870"CORD",
871"CORE",
872"CORK",
873"CORN",
874"COST",
875"COVE",
876"COWL",
877"CRAB",
878"CRAG",
879"CRAM",
880"CRAY",
881"CREW",
882"CRIB",
883"CROW",
884"CRUD",
885"CUBA",
886"CUBE",
887"CUFF",
888"CULL",
889"CULT",
890"CUNY",
891"CURB",
892"CURD",
893"CURE",
894"CURL",
895"CURT",
896"CUTS",
897"DADE",
898"DALE",
899"DAME",
900"DANA",
901"DANE",
902"DANG",
903"DANK",
904"DARE",
905"DARK",
906"DARN",
907"DART",
908"DASH",
909"DATA",
910"DATE",
911"DAVE",
912"DAVY",
913"DAWN",
914"DAYS",
915"DEAD",
916"DEAF",
917"DEAL",
918"DEAN",
919"DEAR",
920"DEBT",
921"DECK",
922"DEED",
923"DEEM",
924"DEER",
925"DEFT",
926"DEFY",
927"DELL",
928"DENT",
929"DENY",
930"DESK",
931"DIAL",
932"DICE",
933"DIED",
934"DIET",
935"DIME",
936"DINE",
937"DING",
938"DINT",
939"DIRE",
940"DIRT",
941"DISC",
942"DISH",
943"DISK",
944"DIVE",
945"DOCK",
946"DOES",
947"DOLE",
948"DOLL",
949"DOLT",
950"DOME",
951"DONE",
952"DOOM",
953"DOOR",
954"DORA",
955"DOSE",
956"DOTE",
957"DOUG",
958"DOUR",
959"DOVE",
960"DOWN",
961"DRAB",
962"DRAG",
963"DRAM",
964"DRAW",
965"DREW",
966"DRUB",
967"DRUG",
968"DRUM",
969"DUAL",
970"DUCK",
971"DUCT",
972"DUEL",
973"DUET",
974"DUKE",
975"DULL",
976"DUMB",
977"DUNE",
978"DUNK",
979"DUSK",
980"DUST",
981"DUTY",
982"EACH",
983"EARL",
984"EARN",
985"EASE",
986"EAST",
987"EASY",
988"EBEN",
989"ECHO",
990"EDDY",
991"EDEN",
992"EDGE",
993"EDGY",
994"EDIT",
995"EDNA",
996"EGAN",
997"ELAN",
998"ELBA",
999"ELLA",
1000"ELSE",
1001"EMIL",
1002"EMIT",
1003"EMMA",
1004"ENDS",
1005"ERIC",
1006"EROS",
1007"EVEN",
1008"EVER",
1009"EVIL",
1010"EYED",
1011"FACE",
1012"FACT",
1013"FADE",
1014"FAIL",
1015"FAIN",
1016"FAIR",
1017"FAKE",
1018"FALL",
1019"FAME",
1020"FANG",
1021"FARM",
1022"FAST",
1023"FATE",
1024"FAWN",
1025"FEAR",
1026"FEAT",
1027"FEED",
1028"FEEL",
1029"FEET",
1030"FELL",
1031"FELT",
1032"FEND",
1033"FERN",
1034"FEST",
1035"FEUD",
1036"FIEF",
1037"FIGS",
1038"FILE",
1039"FILL",
1040"FILM",
1041"FIND",
1042"FINE",
1043"FINK",
1044"FIRE",
1045"FIRM",
1046"FISH",
1047"FISK",
1048"FIST",
1049"FITS",
1050"FIVE",
1051"FLAG",
1052"FLAK",
1053"FLAM",
1054"FLAT",
1055"FLAW",
1056"FLEA",
1057"FLED",
1058"FLEW",
1059"FLIT",
1060"FLOC",
1061"FLOG",
1062"FLOW",
1063"FLUB",
1064"FLUE",
1065"FOAL",
1066"FOAM",
1067"FOGY",
1068"FOIL",
1069"FOLD",
1070"FOLK",
1071"FOND",
1072"FONT",
1073"FOOD",
1074"FOOL",
1075"FOOT",
1076"FORD",
1077"FORE",
1078"FORK",
1079"FORM",
1080"FORT",
1081"FOSS",
1082"FOUL",
1083"FOUR",
1084"FOWL",
1085"FRAU",
1086"FRAY",
1087"FRED",
1088"FREE",
1089"FRET",
1090"FREY",
1091"FROG",
1092"FROM",
1093"FUEL",
1094"FULL",
1095"FUME",
1096"FUND",
1097"FUNK",
1098"FURY",
1099"FUSE",
1100"FUSS",
1101"GAFF",
1102"GAGE",
1103"GAIL",
1104"GAIN",
1105"GAIT",
1106"GALA",
1107"GALE",
1108"GALL",
1109"GALT",
1110"GAME",
1111"GANG",
1112"GARB",
1113"GARY",
1114"GASH",
1115"GATE",
1116"GAUL",
1117"GAUR",
1118"GAVE",
1119"GAWK",
1120"GEAR",
1121"GELD",
1122"GENE",
1123"GENT",
1124"GERM",
1125"GETS",
1126"GIBE",
1127"GIFT",
1128"GILD",
1129"GILL",
1130"GILT",
1131"GINA",
1132"GIRD",
1133"GIRL",
1134"GIST",
1135"GIVE",
1136"GLAD",
1137"GLEE",
1138"GLEN",
1139"GLIB",
1140"GLOB",
1141"GLOM",
1142"GLOW",
1143"GLUE",
1144"GLUM",
1145"GLUT",
1146"GOAD",
1147"GOAL",
1148"GOAT",
1149"GOER",
1150"GOES",
1151"GOLD",
1152"GOLF",
1153"GONE",
1154"GONG",
1155"GOOD",
1156"GOOF",
1157"GORE",
1158"GORY",
1159"GOSH",
1160"GOUT",
1161"GOWN",
1162"GRAB",
1163"GRAD",
1164"GRAY",
1165"GREG",
1166"GREW",
1167"GREY",
1168"GRID",
1169"GRIM",
1170"GRIN",
1171"GRIT",
1172"GROW",
1173"GRUB",
1174"GULF",
1175"GULL",
1176"GUNK",
1177"GURU",
1178"GUSH",
1179"GUST",
1180"GWEN",
1181"GWYN",
1182"HAAG",
1183"HAAS",
1184"HACK",
1185"HAIL",
1186"HAIR",
1187"HALE",
1188"HALF",
1189"HALL",
1190"HALO",
1191"HALT",
1192"HAND",
1193"HANG",
1194"HANK",
1195"HANS",
1196"HARD",
1197"HARK",
1198"HARM",
1199"HART",
1200"HASH",
1201"HAST",
1202"HATE",
1203"HATH",
1204"HAUL",
1205"HAVE",
1206"HAWK",
1207"HAYS",
1208"HEAD",
1209"HEAL",
1210"HEAR",
1211"HEAT",
1212"HEBE",
1213"HECK",
1214"HEED",
1215"HEEL",
1216"HEFT",
1217"HELD",
1218"HELL",
1219"HELM",
1220"HERB",
1221"HERD",
1222"HERE",
1223"HERO",
1224"HERS",
1225"HESS",
1226"HEWN",
1227"HICK",
1228"HIDE",
1229"HIGH",
1230"HIKE",
1231"HILL",
1232"HILT",
1233"HIND",
1234"HINT",
1235"HIRE",
1236"HISS",
1237"HIVE",
1238"HOBO",
1239"HOCK",
1240"HOFF",
1241"HOLD",
1242"HOLE",
1243"HOLM",
1244"HOLT",
1245"HOME",
1246"HONE",
1247"HONK",
1248"HOOD",
1249"HOOF",
1250"HOOK",
1251"HOOT",
1252"HORN",
1253"HOSE",
1254"HOST",
1255"HOUR",
1256"HOVE",
1257"HOWE",
1258"HOWL",
1259"HOYT",
1260"HUCK",
1261"HUED",
1262"HUFF",
1263"HUGE",
1264"HUGH",
1265"HUGO",
1266"HULK",
1267"HULL",
1268"HUNK",
1269"HUNT",
1270"HURD",
1271"HURL",
1272"HURT",
1273"HUSH",
1274"HYDE",
1275"HYMN",
1276"IBIS",
1277"ICON",
1278"IDEA",
1279"IDLE",
1280"IFFY",
1281"INCA",
1282"INCH",
1283"INTO",
1284"IONS",
1285"IOTA",
1286"IOWA",
1287"IRIS",
1288"IRMA",
1289"IRON",
1290"ISLE",
1291"ITCH",
1292"ITEM",
1293"IVAN",
1294"JACK",
1295"JADE",
1296"JAIL",
1297"JAKE",
1298"JANE",
1299"JAVA",
1300"JEAN",
1301"JEFF",
1302"JERK",
1303"JESS",
1304"JEST",
1305"JIBE",
1306"JILL",
1307"JILT",
1308"JIVE",
1309"JOAN",
1310"JOBS",
1311"JOCK",
1312"JOEL",
1313"JOEY",
1314"JOHN",
1315"JOIN",
1316"JOKE",
1317"JOLT",
1318"JOVE",
1319"JUDD",
1320"JUDE",
1321"JUDO",
1322"JUDY",
1323"JUJU",
1324"JUKE",
1325"JULY",
1326"JUNE",
1327"JUNK",
1328"JUNO",
1329"JURY",
1330"JUST",
1331"JUTE",
1332"KAHN",
1333"KALE",
1334"KANE",
1335"KANT",
1336"KARL",
1337"KATE",
1338"KEEL",
1339"KEEN",
1340"KENO",
1341"KENT",
1342"KERN",
1343"KERR",
1344"KEYS",
1345"KICK",
1346"KILL",
1347"KIND",
1348"KING",
1349"KIRK",
1350"KISS",
1351"KITE",
1352"KLAN",
1353"KNEE",
1354"KNEW",
1355"KNIT",
1356"KNOB",
1357"KNOT",
1358"KNOW",
1359"KOCH",
1360"KONG",
1361"KUDO",
1362"KURD",
1363"KURT",
1364"KYLE",
1365"LACE",
1366"LACK",
1367"LACY",
1368"LADY",
1369"LAID",
1370"LAIN",
1371"LAIR",
1372"LAKE",
1373"LAMB",
1374"LAME",
1375"LAND",
1376"LANE",
1377"LANG",
1378"LARD",
1379"LARK",
1380"LASS",
1381"LAST",
1382"LATE",
1383"LAUD",
1384"LAVA",
1385"LAWN",
1386"LAWS",
1387"LAYS",
1388"LEAD",
1389"LEAF",
1390"LEAK",
1391"LEAN",
1392"LEAR",
1393"LEEK",
1394"LEER",
1395"LEFT",
1396"LEND",
1397"LENS",
1398"LENT",
1399"LEON",
1400"LESK",
1401"LESS",
1402"LEST",
1403"LETS",
1404"LIAR",
1405"LICE",
1406"LICK",
1407"LIED",
1408"LIEN",
1409"LIES",
1410"LIEU",
1411"LIFE",
1412"LIFT",
1413"LIKE",
1414"LILA",
1415"LILT",
1416"LILY",
1417"LIMA",
1418"LIMB",
1419"LIME",
1420"LIND",
1421"LINE",
1422"LINK",
1423"LINT",
1424"LION",
1425"LISA",
1426"LIST",
1427"LIVE",
1428"LOAD",
1429"LOAF",
1430"LOAM",
1431"LOAN",
1432"LOCK",
1433"LOFT",
1434"LOGE",
1435"LOIS",
1436"LOLA",
1437"LONE",
1438"LONG",
1439"LOOK",
1440"LOON",
1441"LOOT",
1442"LORD",
1443"LORE",
1444"LOSE",
1445"LOSS",
1446"LOST",
1447"LOUD",
1448"LOVE",
1449"LOWE",
1450"LUCK",
1451"LUCY",
1452"LUGE",
1453"LUKE",
1454"LULU",
1455"LUND",
1456"LUNG",
1457"LURA",
1458"LURE",
1459"LURK",
1460"LUSH",
1461"LUST",
1462"LYLE",
1463"LYNN",
1464"LYON",
1465"LYRA",
1466"MACE",
1467"MADE",
1468"MAGI",
1469"MAID",
1470"MAIL",
1471"MAIN",
1472"MAKE",
1473"MALE",
1474"MALI",
1475"MALL",
1476"MALT",
1477"MANA",
1478"MANN",
1479"MANY",
1480"MARC",
1481"MARE",
1482"MARK",
1483"MARS",
1484"MART",
1485"MARY",
1486"MASH",
1487"MASK",
1488"MASS",
1489"MAST",
1490"MATE",
1491"MATH",
1492"MAUL",
1493"MAYO",
1494"MEAD",
1495"MEAL",
1496"MEAN",
1497"MEAT",
1498"MEEK",
1499"MEET",
1500"MELD",
1501"MELT",
1502"MEMO",
1503"MEND",
1504"MENU",
1505"MERT",
1506"MESH",
1507"MESS",
1508"MICE",
1509"MIKE",
1510"MILD",
1511"MILE",
1512"MILK",
1513"MILL",
1514"MILT",
1515"MIMI",
1516"MIND",
1517"MINE",
1518"MINI",
1519"MINK",
1520"MINT",
1521"MIRE",
1522"MISS",
1523"MIST",
1524"MITE",
1525"MITT",
1526"MOAN",
1527"MOAT",
1528"MOCK",
1529"MODE",
1530"MOLD",
1531"MOLE",
1532"MOLL",
1533"MOLT",
1534"MONA",
1535"MONK",
1536"MONT",
1537"MOOD",
1538"MOON",
1539"MOOR",
1540"MOOT",
1541"MORE",
1542"MORN",
1543"MORT",
1544"MOSS",
1545"MOST",
1546"MOTH",
1547"MOVE",
1548"MUCH",
1549"MUCK",
1550"MUDD",
1551"MUFF",
1552"MULE",
1553"MULL",
1554"MURK",
1555"MUSH",
1556"MUST",
1557"MUTE",
1558"MUTT",
1559"MYRA",
1560"MYTH",
1561"NAGY",
1562"NAIL",
1563"NAIR",
1564"NAME",
1565"NARY",
1566"NASH",
1567"NAVE",
1568"NAVY",
1569"NEAL",
1570"NEAR",
1571"NEAT",
1572"NECK",
1573"NEED",
1574"NEIL",
1575"NELL",
1576"NEON",
1577"NERO",
1578"NESS",
1579"NEST",
1580"NEWS",
1581"NEWT",
1582"NIBS",
1583"NICE",
1584"NICK",
1585"NILE",
1586"NINA",
1587"NINE",
1588"NOAH",
1589"NODE",
1590"NOEL",
1591"NOLL",
1592"NONE",
1593"NOOK",
1594"NOON",
1595"NORM",
1596"NOSE",
1597"NOTE",
1598"NOUN",
1599"NOVA",
1600"NUDE",
1601"NULL",
1602"NUMB",
1603"OATH",
1604"OBEY",
1605"OBOE",
1606"ODIN",
1607"OHIO",
1608"OILY",
1609"OINT",
1610"OKAY",
1611"OLAF",
1612"OLDY",
1613"OLGA",
1614"OLIN",
1615"OMAN",
1616"OMEN",
1617"OMIT",
1618"ONCE",
1619"ONES",
1620"ONLY",
1621"ONTO",
1622"ONUS",
1623"ORAL",
1624"ORGY",
1625"OSLO",
1626"OTIS",
1627"OTTO",
1628"OUCH",
1629"OUST",
1630"OUTS",
1631"OVAL",
1632"OVEN",
1633"OVER",
1634"OWLY",
1635"OWNS",
1636"QUAD",
1637"QUIT",
1638"QUOD",
1639"RACE",
1640"RACK",
1641"RACY",
1642"RAFT",
1643"RAGE",
1644"RAID",
1645"RAIL",
1646"RAIN",
1647"RAKE",
1648"RANK",
1649"RANT",
1650"RARE",
1651"RASH",
1652"RATE",
1653"RAVE",
1654"RAYS",
1655"READ",
1656"REAL",
1657"REAM",
1658"REAR",
1659"RECK",
1660"REED",
1661"REEF",
1662"REEK",
1663"REEL",
1664"REID",
1665"REIN",
1666"RENA",
1667"REND",
1668"RENT",
1669"REST",
1670"RICE",
1671"RICH",
1672"RICK",
1673"RIDE",
1674"RIFT",
1675"RILL",
1676"RIME",
1677"RING",
1678"RINK",
1679"RISE",
1680"RISK",
1681"RITE",
1682"ROAD",
1683"ROAM",
1684"ROAR",
1685"ROBE",
1686"ROCK",
1687"RODE",
1688"ROIL",
1689"ROLL",
1690"ROME",
1691"ROOD",
1692"ROOF",
1693"ROOK",
1694"ROOM",
1695"ROOT",
1696"ROSA",
1697"ROSE",
1698"ROSS",
1699"ROSY",
1700"ROTH",
1701"ROUT",
1702"ROVE",
1703"ROWE",
1704"ROWS",
1705"RUBE",
1706"RUBY",
1707"RUDE",
1708"RUDY",
1709"RUIN",
1710"RULE",
1711"RUNG",
1712"RUNS",
1713"RUNT",
1714"RUSE",
1715"RUSH",
1716"RUSK",
1717"RUSS",
1718"RUST",
1719"RUTH",
1720"SACK",
1721"SAFE",
1722"SAGE",
1723"SAID",
1724"SAIL",
1725"SALE",
1726"SALK",
1727"SALT",
1728"SAME",
1729"SAND",
1730"SANE",
1731"SANG",
1732"SANK",
1733"SARA",
1734"SAUL",
1735"SAVE",
1736"SAYS",
1737"SCAN",
1738"SCAR",
1739"SCAT",
1740"SCOT",
1741"SEAL",
1742"SEAM",
1743"SEAR",
1744"SEAT",
1745"SEED",
1746"SEEK",
1747"SEEM",
1748"SEEN",
1749"SEES",
1750"SELF",
1751"SELL",
1752"SEND",
1753"SENT",
1754"SETS",
1755"SEWN",
1756"SHAG",
1757"SHAM",
1758"SHAW",
1759"SHAY",
1760"SHED",
1761"SHIM",
1762"SHIN",
1763"SHOD",
1764"SHOE",
1765"SHOT",
1766"SHOW",
1767"SHUN",
1768"SHUT",
1769"SICK",
1770"SIDE",
1771"SIFT",
1772"SIGH",
1773"SIGN",
1774"SILK",
1775"SILL",
1776"SILO",
1777"SILT",
1778"SINE",
1779"SING",
1780"SINK",
1781"SIRE",
1782"SITE",
1783"SITS",
1784"SITU",
1785"SKAT",
1786"SKEW",
1787"SKID",
1788"SKIM",
1789"SKIN",
1790"SKIT",
1791"SLAB",
1792"SLAM",
1793"SLAT",
1794"SLAY",
1795"SLED",
1796"SLEW",
1797"SLID",
1798"SLIM",
1799"SLIT",
1800"SLOB",
1801"SLOG",
1802"SLOT",
1803"SLOW",
1804"SLUG",
1805"SLUM",
1806"SLUR",
1807"SMOG",
1808"SMUG",
1809"SNAG",
1810"SNOB",
1811"SNOW",
1812"SNUB",
1813"SNUG",
1814"SOAK",
1815"SOAR",
1816"SOCK",
1817"SODA",
1818"SOFA",
1819"SOFT",
1820"SOIL",
1821"SOLD",
1822"SOME",
1823"SONG",
1824"SOON",
1825"SOOT",
1826"SORE",
1827"SORT",
1828"SOUL",
1829"SOUR",
1830"SOWN",
1831"STAB",
1832"STAG",
1833"STAN",
1834"STAR",
1835"STAY",
1836"STEM",
1837"STEW",
1838"STIR",
1839"STOW",
1840"STUB",
1841"STUN",
1842"SUCH",
1843"SUDS",
1844"SUIT",
1845"SULK",
1846"SUMS",
1847"SUNG",
1848"SUNK",
1849"SURE",
1850"SURF",
1851"SWAB",
1852"SWAG",
1853"SWAM",
1854"SWAN",
1855"SWAT",
1856"SWAY",
1857"SWIM",
1858"SWUM",
1859"TACK",
1860"TACT",
1861"TAIL",
1862"TAKE",
1863"TALE",
1864"TALK",
1865"TALL",
1866"TANK",
1867"TASK",
1868"TATE",
1869"TAUT",
1870"TEAL",
1871"TEAM",
1872"TEAR",
1873"TECH",
1874"TEEM",
1875"TEEN",
1876"TEET",
1877"TELL",
1878"TEND",
1879"TENT",
1880"TERM",
1881"TERN",
1882"TESS",
1883"TEST",
1884"THAN",
1885"THAT",
1886"THEE",
1887"THEM",
1888"THEN",
1889"THEY",
1890"THIN",
1891"THIS",
1892"THUD",
1893"THUG",
1894"TICK",
1895"TIDE",
1896"TIDY",
1897"TIED",
1898"TIER",
1899"TILE",
1900"TILL",
1901"TILT",
1902"TIME",
1903"TINA",
1904"TINE",
1905"TINT",
1906"TINY",
1907"TIRE",
1908"TOAD",
1909"TOGO",
1910"TOIL",
1911"TOLD",
1912"TOLL",
1913"TONE",
1914"TONG",
1915"TONY",
1916"TOOK",
1917"TOOL",
1918"TOOT",
1919"TORE",
1920"TORN",
1921"TOTE",
1922"TOUR",
1923"TOUT",
1924"TOWN",
1925"TRAG",
1926"TRAM",
1927"TRAY",
1928"TREE",
1929"TREK",
1930"TRIG",
1931"TRIM",
1932"TRIO",
1933"TROD",
1934"TROT",
1935"TROY",
1936"TRUE",
1937"TUBA",
1938"TUBE",
1939"TUCK",
1940"TUFT",
1941"TUNA",
1942"TUNE",
1943"TUNG",
1944"TURF",
1945"TURN",
1946"TUSK",
1947"TWIG",
1948"TWIN",
1949"TWIT",
1950"ULAN",
1951"UNIT",
1952"URGE",
1953"USED",
1954"USER",
1955"USES",
1956"UTAH",
1957"VAIL",
1958"VAIN",
1959"VALE",
1960"VARY",
1961"VASE",
1962"VAST",
1963"VEAL",
1964"VEDA",
1965"VEIL",
1966"VEIN",
1967"VEND",
1968"VENT",
1969"VERB",
1970"VERY",
1971"VETO",
1972"VICE",
1973"VIEW",
1974"VINE",
1975"VISE",
1976"VOID",
1977"VOLT",
1978"VOTE",
1979"WACK",
1980"WADE",
1981"WAGE",
1982"WAIL",
1983"WAIT",
1984"WAKE",
1985"WALE",
1986"WALK",
1987"WALL",
1988"WALT",
1989"WAND",
1990"WANE",
1991"WANG",
1992"WANT",
1993"WARD",
1994"WARM",
1995"WARN",
1996"WART",
1997"WASH",
1998"WAST",
1999"WATS",
2000"WATT",
2001"WAVE",
2002"WAVY",
2003"WAYS",
2004"WEAK",
2005"WEAL",
2006"WEAN",
2007"WEAR",
2008"WEED",
2009"WEEK",
2010"WEIR",
2011"WELD",
2012"WELL",
2013"WELT",
2014"WENT",
2015"WERE",
2016"WERT",
2017"WEST",
2018"WHAM",
2019"WHAT",
2020"WHEE",
2021"WHEN",
2022"WHET",
2023"WHOA",
2024"WHOM",
2025"WICK",
2026"WIFE",
2027"WILD",
2028"WILL",
2029"WIND",
2030"WINE",
2031"WING",
2032"WINK",
2033"WINO",
2034"WIRE",
2035"WISE",
2036"WISH",
2037"WITH",
2038"WOLF",
2039"WONT",
2040"WOOD",
2041"WOOL",
2042"WORD",
2043"WORE",
2044"WORK",
2045"WORM",
2046"WORN",
2047"WOVE",
2048"WRIT",
2049"WYNN",
2050"YALE",
2051"YANG",
2052"YANK",
2053"YARD",
2054"YARN",
2055"YAWL",
2056"YAWN",
2057"YEAH",
2058"YEAR",
2059"YELL",
2060"YOGA",
2061"YOKE"
2062};
2063
2064/* Encode 8 bytes in 'c' as a string of English words.
2065 * Returns a pointer to a static buffer
2066 */
2067char *
2068btoe(engout,c)
2069char *c, *engout;
2070{
2071 char cp[9]; /* add in room for the parity 2 bits*/
2072 int p,i ;
2073
2074 engout[0] = '\0';
2075 memcpy(cp, c,8);
2076 /* compute parity */
2077 for(p = 0,i = 0; i < 64;i += 2)
2078 p += extract(cp,i,2);
2079
2080 cp[8] = (char)p << 6;
2081 strncat(engout,&Wp[extract(cp, 0,11)][0],4);
2082 strcat(engout," ");
2083 strncat(engout,&Wp[extract(cp,11,11)][0],4);
2084 strcat(engout," ");
2085 strncat(engout,&Wp[extract(cp,22,11)][0],4);
2086 strcat(engout," ");
2087 strncat(engout,&Wp[extract(cp,33,11)][0],4);
2088 strcat(engout," ");
2089 strncat(engout,&Wp[extract(cp,44,11)][0],4);
2090 strcat(engout," ");
2091 strncat(engout,&Wp[extract(cp,55,11)][0],4);
2092#ifdef notdef
2093 printf("engout is %s\n\r",engout);
2094#endif
2095 return(engout);
2096}
2097
2098/* convert English to binary
2099 * returns 1 OK - all good words and parity is OK
2100 * 0 word not in data base
2101 * -1 badly formed in put ie > 4 char word
2102 * -2 words OK but parity is wrong
2103 */
2104int
2105etob(out, e)
2106char *out;
2107char *e;
2108{
2109 char *word;
2110 int i, p, v,l, low,high;
2111 char b[9];
2112 char input[36];
2113
2114 if(e == NULL)
2115 return -1;
2116
2117 strncpy(input,e,sizeof(input));
2118 memset(b, 0, sizeof(b));
2119 memset(out, 0, 8);
2120 for(i=0,p=0;i<6;i++,p+=11){
2121 if((word = strtok(i == 0 ? input : NULL," ")) == NULL)
2122 return -1;
2123 l = strlen(word);
2124 if(l > 4 || l < 1){
2125 return -1;
2126 } else if(l < 4){
2127 low = 0;
2128 high = 570;
2129 } else {
2130 low = 571;
2131 high = 2047;
2132 }
2133 standard(word);
2134 if( (v = wsrch(word,low,high)) < 0 )
2135 return 0;
2136 insert(b,v,p,11);
2137 }
2138
2139 /* now check the parity of what we got */
2140 for(p = 0, i = 0; i < 64; i +=2)
2141 p += extract(b, i, 2);
2142
2143 if( (p & 3) != extract(b, 64,2) )
2144 return -2;
2145
2146 memcpy(out,b,8);
2147
2148 return 1;
2149}
2150/* Display 8 bytes as a series of 16-bit hex digits */
2151char *
2152put8(out,s)
2153char *out;
2154char *s;
2155{
2156 sprintf(out,"%02X%02X %02X%02X %02X%02X %02X%02X",
2157 s[0] & 0xff,s[1] & 0xff,s[2] & 0xff,
2158 s[3] & 0xff,s[4] & 0xff,s[5] & 0xff,
2159 s[6] & 0xff,s[7] & 0xff);
2160 return out;
2161}
2162#ifdef notdef
2163/* Encode 8 bytes in 'cp' as stream of ascii letters.
2164 * Provided as a possible alternative to btoe()
2165 */
2166char *
2167btoc(cp)
2168char *cp;
2169{
2170 int i;
2171 static char out[31];
2172
2173 /* code out put by characters 6 bits each added to 0x21 (!)*/
2174 for(i=0;i <= 10;i++){
2175 /* last one is only 4 bits not 6*/
2176 out[i] = '!'+ extract(cp,6*i,i >= 10 ? 4:6);
2177 }
2178 out[i] = '\0';
2179 return(out);
2180}
2181#endif
2182
2183/* Internal subroutines for word encoding/decoding */
2184
2185/* Dictionary binary search */
2186static int
2187wsrch(w,low,high)
2188char *w;
2189int low, high;
2190{
2191 int i,j;
2192
2193 for(;;){
2194 i = (low + high)/2;
2195 if((j = strncmp(w,Wp[i],4)) == 0)
2196 return i; /* Found it */
2197 if(high == low+1){
2198 /* Avoid effects of integer truncation in /2 */
2199 if(strncmp(w,Wp[high],4) == 0)
2200 return high;
2201 else
2202 return -1;
2203 }
2204 if(low >= high)
2205 return -1; /* I don't *think* this can happen...*/
2206 if(j < 0)
2207 high = i; /* Search lower half */
2208 else
2209 low = i; /* Search upper half */
2210 }
2211}
2212static void
2213insert(s, x, start, length)
2214char *s;
2215int x;
2216int start, length;
2217{
2218 unsigned char cl;
2219 unsigned char cc;
2220 unsigned char cr;
2221 unsigned long y;
2222 int shift;
2223
2224 assert(length <= 11);
2225 assert(start >= 0);
2226 assert(length >= 0);
2227 assert(start +length <= 66);
2228
2229 shift = ((8 -(( start + length) % 8))%8);
2230 y = (long) x << shift;
2231 cl = (y >> 16) & 0xff;
2232 cc = (y >> 8) & 0xff;
2233 cr = y & 0xff;
2234 if(shift + length > 16){
2235 s[start /8] |= cl;
2236 s[start/8 +1] |= cc;
2237 s[start/8 +2] |= cr;
2238 } else if(shift +length > 8){
2239 s[start/8] |= cc;
2240 s[start/8 + 1] |= cr;
2241 } else {
2242 s[start/8] |= cr;
2243 }
2244}
2245
2246static void
2247standard(word)
2248register char *word;
2249{
2250 while(*word){
2251 if(!isascii(*word))
2252 break;
2253 if(islower(*word))
2254 *word = toupper(*word);
2255 if(*word == '1')
2256 *word = 'L';
2257 if(*word == '0')
2258 *word = 'O';
2259 if(*word == '5')
2260 *word = 'S';
2261 word++;
2262 }
2263}
2264
2265/* Extract 'length' bits from the char array 's' starting with bit 'start' */
2266static unsigned long
2267extract(s, start, length)
2268char *s;
2269int start, length;
2270{
2271 unsigned char cl;
2272 unsigned char cc;
2273 unsigned char cr;
2274 unsigned long x;
2275
2276 assert(length <= 11);
2277 assert(start >= 0);
2278 assert(length >= 0);
2279 assert(start +length <= 66);
2280
2281 cl = s[start/8];
2282 cc = s[start/8 +1];
2283 cr = s[start/8 +2];
2284 x = ((long)(cl<<8 | cc) <<8 | cr) ;
2285 x = x >> (24 - (length + (start %8)));
2286 x =( x & (0xffff >> (16-length) ) );
2287 return(x);
2288}
2289