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