xref: /netbsd-src/lib/libskey/put.c (revision 43e80ef7a64d8a5ba552b68c2e2c1bcd98696ea7)
1 /*	$NetBSD: put.c,v 1.15 2021/04/12 09:17:10 mrg 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.15 2021/04/12 09:17:10 mrg 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 
24 static unsigned int extract(char *s, int start, int length);
25 static void standard(char *word);
26 static void insert(char *s, int x, int start, int length);
27 static int wsrch(const char *w, int low, int high);
28 
29 /* Dictionary for integer-word translations */
30 char 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  */
btoe(char * engout,const char * c)2084 char *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  */
etob(char * out,const char * e)2121 int etob(char *out, const char *e)
2122 {
2123   char *word;
2124   int i, p, v, l, low, high;
2125   char b[11];
2126   char input[36];
2127   char *last;
2128 
2129   if (e == NULL)
2130     return -1;
2131 
2132   strlcpy (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 */
put8(char * out,const char * s)2174 char *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  */
btoc(char * cp)2187 char *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 */
wsrch(const char * w,int low,int high)2207 static 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 
insert(char * s,int x,int start,int length)2233 static 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 
standard(char * word)2268 static 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' */
extract(char * s,int start,int length)2287 static 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