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