home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 11 Util / 11-Util.zip / pwgenera.zip / btoe.c next >
C/C++ Source or Header  |  1996-06-25  |  27KB  |  2,264 lines

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