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