Initial import from FreeBSD RELENG_4:
[dragonfly.git] / contrib / opie / libopie / btoe.c
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
6 Portions of this software are Copyright 1996-1999 by Craig Metz, All Rights
7 Reserved. The Inner Net License Version 2 applies to these portions of
8 the software.
9 You should have received a copy of the license with this software. If
10 you didn't get a copy, you may request one from <license@inner.net>.
11
12 Portions of this software are Copyright 1995 by Randall Atkinson and Dan
13 McDonald, All Rights Reserved. All Rights under this copyright are assigned
14 to the U.S. Naval Research Laboratory (NRL). The NRL Copyright Notice and
15 License 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
34 static UINT4 extract __P((char *s, int start, int length));
35 static VOIDRET insert __P((char *s, int x, int start, int length));
36 static int wsrch __P((char *w, int low, int high));
37
38 /* Dictionary for integer-word translations */
39 static 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. */
2092 char *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  */
2124 int 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
2195 opiebtoeret:
2196   free(input);
2197   return rval;
2198 }
2199
2200 /* Internal subroutines for word encoding/decoding */
2201
2202 /* Dictionary binary search */
2203 static 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
2227 static 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
2253 static 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 }