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