d3b245c57cbbe1535951b838ca5263b5390a9180
[dragonfly.git] / lib / libskey / put.c
1 /*
2  * $DragonFly: src/lib/libskey/put.c,v 1.4 2004/10/25 19:38:45 drhodus 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(engout,c)
2073 char *c, *engout;
2074 {
2075         char cp[9];     /* add in room for the parity 2 bits*/
2076         int p,i ;
2077
2078         engout[0] = '\0';
2079         memcpy(cp, c,8);
2080         /* compute parity */
2081         for(p = 0,i = 0; i < 64;i += 2)
2082                 p += extract(cp,i,2);
2083
2084         cp[8] = (char)p << 6;
2085         strncat(engout,&Wp[extract(cp, 0,11)][0],4);
2086         strcat(engout," ");
2087         strncat(engout,&Wp[extract(cp,11,11)][0],4);
2088         strcat(engout," ");
2089         strncat(engout,&Wp[extract(cp,22,11)][0],4);
2090         strcat(engout," ");
2091         strncat(engout,&Wp[extract(cp,33,11)][0],4);
2092         strcat(engout," ");
2093         strncat(engout,&Wp[extract(cp,44,11)][0],4);
2094         strcat(engout," ");
2095         strncat(engout,&Wp[extract(cp,55,11)][0],4);
2096 #ifdef  notdef
2097         printf("engout is %s\n\r",engout);
2098 #endif
2099         return(engout);
2100 }
2101
2102 /* convert English to binary
2103  * returns 1 OK - all good words and parity is OK
2104  *         0 word not in data base
2105  *        -1 badly formed in put ie > 4 char word
2106  *        -2 words OK but parity is wrong
2107  */
2108 int
2109 etob(out, e)
2110 char *out;
2111 char *e;
2112 {
2113         char *word, *cp;
2114         int i, v,l, low,high;
2115         unsigned int p;
2116         char b[9];
2117         char input[36];
2118
2119         if(e == NULL)
2120                 return -1;
2121
2122         strncpy(input,e,sizeof(input));
2123         cp = input;
2124         memset(b, 0, sizeof(b));
2125         memset(out, 0, 8);
2126         for(i=0,p=0;i<6;i++,p+=11){
2127                 while ((word = strsep(&cp, " ")) != NULL && *word == '\0')
2128                         ;
2129                 if (word == NULL)
2130                         return -1;
2131                 l = strlen(word);
2132                 if(l > 4 || l < 1){
2133                         return -1;
2134                 } else if(l < 4){
2135                         low = 0;
2136                         high = 570;
2137                 } else {
2138                         low = 571;
2139                         high = 2047;
2140                 }
2141                 standard(word);
2142                 if( (v = wsrch(word,low,high)) < 0 )
2143                         return 0;
2144                 insert(b,v,(int)p,11);
2145         }
2146
2147         /* now check the parity of what we got */
2148         for(p = 0, i = 0; i < 64; i +=2)
2149                 p += extract(b, i, 2);
2150
2151         if( (p & 3) != extract(b, 64,2) )
2152                 return -2;
2153
2154         memcpy(out,b,8);
2155
2156         return 1;
2157 }
2158 /* Display 8 bytes as a series of 16-bit hex digits */
2159 char *
2160 put8(out,s)
2161 char *out;
2162 char *s;
2163 {
2164         sprintf(out,"%02X%02X %02X%02X %02X%02X %02X%02X",
2165                 s[0] & 0xff,s[1] & 0xff,s[2] & 0xff,
2166                 s[3] & 0xff,s[4] & 0xff,s[5] & 0xff,
2167                 s[6] & 0xff,s[7] & 0xff);
2168         return out;
2169 }
2170 #ifdef  notdef
2171 /* Encode 8 bytes in 'cp' as stream of ascii letters.
2172  * Provided as a possible alternative to btoe()
2173  */
2174 char *
2175 btoc(cp)
2176 char *cp;
2177 {
2178         int i;
2179         static char out[31];
2180
2181         /* code out put by characters 6 bits each added to 0x21 (!)*/
2182         for(i=0;i <= 10;i++){
2183                 /* last one is only 4 bits not 6*/
2184                 out[i] = '!'+ extract(cp,6*i,i >= 10 ? 4:6);
2185         }
2186         out[i] = '\0';
2187         return(out);
2188 }
2189 #endif
2190
2191 /* Internal subroutines for word encoding/decoding */
2192
2193 /* Dictionary binary search */
2194 static int
2195 wsrch(w,low,high)
2196 char *w;
2197 int low, high;
2198 {
2199         int i,j;
2200
2201         for(;;){
2202                 i = (low + high)/2;
2203                 if((j = strncmp(w,Wp[i],4)) == 0)
2204                         return i;       /* Found it */
2205                 if(high == low+1){
2206                         /* Avoid effects of integer truncation in /2 */
2207                         if(strncmp(w,Wp[high],4) == 0)
2208                                 return high;
2209                         else
2210                                 return -1;
2211                 }
2212                 if(low >= high)
2213                         return -1;      /* I don't *think* this can happen...*/
2214                 if(j < 0)
2215                         high = i;       /* Search lower half */
2216                 else
2217                         low = i;        /* Search upper half */
2218         }
2219 }
2220 static void
2221 insert(s, x, start, length)
2222 char *s;
2223 int x;
2224 int  start, length;
2225 {
2226         unsigned char cl;
2227         unsigned char cc;
2228         unsigned char cr;
2229         unsigned long y;
2230         int shift;
2231
2232         assert(length <= 11);
2233         assert(start >= 0);
2234         assert(length >= 0);
2235         assert(start +length <= 66);
2236
2237         shift = ((8  -(( start + length) % 8))%8);
2238         y = (long) x << shift;
2239         cl = (y >> 16) & 0xff;
2240         cc = (y >> 8) & 0xff;
2241         cr = y & 0xff;
2242         if(shift + length > 16){
2243                 s[start /8] |= cl;
2244                 s[start/8 +1] |= cc;
2245                 s[start/8 +2] |= cr;
2246         } else if(shift +length > 8){
2247                 s[start/8] |= cc;
2248                 s[start/8 + 1] |= cr;
2249         } else {
2250                 s[start/8] |= cr;
2251         }
2252 }
2253
2254 static void
2255 standard(word)
2256 char *word;
2257 {
2258         while(*word){
2259                 if(!isascii(*word))
2260                         break;
2261                 if(islower(*word))
2262                         *word = toupper(*word);
2263                 if(*word == '1')
2264                         *word = 'L';
2265                 if(*word == '0')
2266                         *word = 'O';
2267                 if(*word == '5')
2268                         *word = 'S';
2269                 word++;
2270         }
2271 }
2272
2273 /* Extract 'length' bits from the char array 's' starting with bit 'start' */
2274 static unsigned long
2275 extract(s, start, length)
2276 char *s;
2277 int start, length;
2278 {
2279         unsigned char cl;
2280         unsigned char cc;
2281         unsigned char cr;
2282         unsigned long x;
2283
2284         assert(length <= 11);
2285         assert(start >= 0);
2286         assert(length >= 0);
2287         assert(start +length <= 66);
2288
2289         cl = s[start/8];
2290         cc = s[start/8 +1];
2291         cr = s[start/8 +2];
2292         x = ((long)(cl<<8 | cc) <<8  | cr) ;
2293         x = x >> (24 - (length + (start %8)));
2294         x =( x & (0xffff >> (16-length) )   );
2295         return(x);
2296 }
2297