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