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