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