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