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