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