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