Home | History | Annotate | Line # | Download | only in libskey
      1 /*	$NetBSD: put.c,v 1.15 2021/04/12 09:17:10 mrg Exp $	*/
      2 
      3 /* S/KEY v1.1b (put.c)
      4  *
      5  * Authors:
      6  *          Neil M. Haller <nmh (at) thumper.bellcore.com>
      7  *          Philip R. Karn <karn (at) chicago.qualcomm.com>
      8  *          John S. Walden <jsw (at) thumper.bellcore.com>
      9  *          Scott Chasin <chasin (at) crimelab.com>
     10  *
     11  * Dictionary lookup and extraction.
     12  */
     13 
     14 #include <sys/cdefs.h>
     15 __RCSID("$NetBSD: put.c,v 1.15 2021/04/12 09:17:10 mrg 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 
     24 static unsigned int extract(char *s, int start, int length);
     25 static void standard(char *word);
     26 static void insert(char *s, int x, int start, int length);
     27 static int wsrch(const char *w, int low, int high);
     28 
     29 /* Dictionary for integer-word translations */
     30 char 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  */
   2084 char *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  */
   2121 int etob(char *out, const char *e)
   2122 {
   2123   char *word;
   2124   int i, p, v, l, low, high;
   2125   char b[11];
   2126   char input[36];
   2127   char *last;
   2128 
   2129   if (e == NULL)
   2130     return -1;
   2131 
   2132   strlcpy (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 */
   2174 char *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  */
   2187 char *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 */
   2207 static 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 
   2233 static 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 
   2268 static 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' */
   2287 static 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