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