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