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