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