1/* $NetBSD: put.c,v 1.12 2004/10/28 21:14:52 dsl 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 <sys/cdefs.h> 15__RCSID("$NetBSD: put.c,v 1.12 2004/10/28 21:14:52 dsl Exp $"); 16 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" 23 24static unsigned int extract(char *s, int start, int length); 25static void standard(char *word); 26static void insert(char *s, int x, int start, int length); 27static int wsrch(const char *w, int low, int high); 28 29/* Dictionary for integer-word translations */ 30char 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" 2079}; 2080 2081/* Encode 8 bytes in 'c' as a string of English words. 2082 * Returns a pointer to a static buffer 2083 */ 2084char *btoe(char *engout, const char *c) 2085{ 2086 char cp[9]; /* add in room for the parity 2 bits */ 2087 int p, i; 2088 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); 2094 2095 cp[8] = (char) p << 6; 2096 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); 2108 2109#ifdef notdef 2110 printf ("engout is %s\n\r", engout); 2111#endif 2112 return (engout); 2113} 2114 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 2120 */ 2121int etob(char *out, const char *e) 2122{ 2123 char *word; 2124 int i, p, v, l, low, high; 2125 char b[9]; 2126 char input[36]; 2127 char *last; 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_r(i == 0 ? input : NULL, " ", &last)) == 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 */ 2174char *put8(char *out, const char *s) 2175{ 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; 2181} 2182 2183#ifdef notdef 2184/* Encode 8 bytes in 'cp' as stream of ascii letters. 2185 * Provided as a possible alternative to btoe() 2186 */ 2187char *btoc(char *cp) 2188{ 2189 int i; 2190 static char out[31]; 2191 2192 /* code out put by characters 6 bits each added to 0x21 (!) */ 2193 for (i = 0; i <= 10; i++) 2194 { 2195 /* last one is only 4 bits not 6 */ 2196 out[i] = '!' + extract (cp, 6 * i, i >= 10 ? 4 : 6); 2197 } 2198 out[i] = '\0'; 2199 return (out); 2200} 2201 2202#endif 2203 2204/* Internal subroutines for word encoding/decoding */ 2205 2206/* Dictionary binary search */ 2207static int wsrch(const char *w, int low, int high) 2208{ 2209 int i, j; 2210 2211 for (;;) 2212 { 2213 i = (low + high) / 2; 2214 if ((j = strncmp (w, Wp[i], 4)) == 0) 2215 return i; /* Found it */ 2216 if (high == low + 1) 2217 { 2218 /* Avoid effects of integer truncation in /2 */ 2219 if (strncmp (w, Wp[high], 4) == 0) 2220 return high; 2221 else 2222 return -1; 2223 } 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 */ 2230 } 2231} 2232 2233static void insert (char *s, int x, int start, int length) 2234{ 2235 unsigned char cl; 2236 unsigned char cc; 2237 unsigned char cr; 2238 unsigned int y; 2239 int shift; 2240 2241 assert (length <= 11); 2242 assert (start >= 0); 2243 assert (length >= 0); 2244 assert (start + length <= 66); 2245 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) 2252 { 2253 s[start / 8] |= cl; 2254 s[start / 8 + 1] |= cc; 2255 s[start / 8 + 2] |= cr; 2256 } 2257 else if (shift + length > 8) 2258 { 2259 s[start / 8] |= cc; 2260 s[start / 8 + 1] |= cr; 2261 } 2262 else 2263 { 2264 s[start / 8] |= cr; 2265 } 2266} 2267 2268static void standard(char *word) 2269{ 2270 while (*word) 2271 { 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++; 2283 } 2284} 2285 2286/* Extract 'length' bits from the char array 's' starting with bit 'start' */ 2287static unsigned int extract(char *s, int start, int length) 2288{ 2289 unsigned char cl; 2290 unsigned char cc; 2291 unsigned char cr; 2292 unsigned int x; 2293 2294 assert (length <= 11); 2295 assert (start >= 0); 2296 assert (length >= 0); 2297 assert (start + length <= 66); 2298 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); 2306} 2307