MFC:
[dragonfly.git] / lib / libskey / put.c
blobd3b245c57cbbe1535951b838ca5263b5390a9180
1 /*
2 * $DragonFly: src/lib/libskey/put.c,v 1.4 2004/10/25 19:38:45 drhodus Exp $
3 */
5 #include <stdio.h>
6 #include <string.h>
7 #include <assert.h>
8 #include <ctype.h>
9 #include "skey.h"
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);
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"
2068 /* Encode 8 bytes in 'c' as a string of English words.
2069 * Returns a pointer to a static buffer
2071 char *
2072 btoe(engout,c)
2073 char *c, *engout;
2075 char cp[9]; /* add in room for the parity 2 bits*/
2076 int p,i ;
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);
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);
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
2109 etob(out, e)
2110 char *out;
2111 char *e;
2113 char *word, *cp;
2114 int i, v,l, low,high;
2115 unsigned int p;
2116 char b[9];
2117 char input[36];
2119 if(e == NULL)
2120 return -1;
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')
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;
2141 standard(word);
2142 if( (v = wsrch(word,low,high)) < 0 )
2143 return 0;
2144 insert(b,v,(int)p,11);
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);
2151 if( (p & 3) != extract(b, 64,2) )
2152 return -2;
2154 memcpy(out,b,8);
2156 return 1;
2158 /* Display 8 bytes as a series of 16-bit hex digits */
2159 char *
2160 put8(out,s)
2161 char *out;
2162 char *s;
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;
2170 #ifdef notdef
2171 /* Encode 8 bytes in 'cp' as stream of ascii letters.
2172 * Provided as a possible alternative to btoe()
2174 char *
2175 btoc(cp)
2176 char *cp;
2178 int i;
2179 static char out[31];
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);
2186 out[i] = '\0';
2187 return(out);
2189 #endif
2191 /* Internal subroutines for word encoding/decoding */
2193 /* Dictionary binary search */
2194 static int
2195 wsrch(w,low,high)
2196 char *w;
2197 int low, high;
2199 int i,j;
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;
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 */
2220 static void
2221 insert(s, x, start, length)
2222 char *s;
2223 int x;
2224 int start, length;
2226 unsigned char cl;
2227 unsigned char cc;
2228 unsigned char cr;
2229 unsigned long y;
2230 int shift;
2232 assert(length <= 11);
2233 assert(start >= 0);
2234 assert(length >= 0);
2235 assert(start +length <= 66);
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;
2254 static void
2255 standard(word)
2256 char *word;
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++;
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;
2279 unsigned char cl;
2280 unsigned char cc;
2281 unsigned char cr;
2282 unsigned long x;
2284 assert(length <= 11);
2285 assert(start >= 0);
2286 assert(length >= 0);
2287 assert(start +length <= 66);
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);