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