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