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