1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** This module uses code from the NIST implementation of  FIPS-181,
3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** but the algorythm is CHANGED and I think that I CAN
4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** copyright it. See copiright notes below.
5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)*/
6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** Copyright (c) 1999, 2000, 2001, 2002, 2003
9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** Adel I. Mirzazhanov. All rights reserved
10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)**
11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** Redistribution and use in source and binary forms, with or without
12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** modification, are permitted provided that the following conditions
13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** are met:
14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)**
15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)**     1.Redistributions of source code must retain the above copyright notice,
16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)**       this list of conditions and the following disclaimer.
17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)**     2.Redistributions in binary form must reproduce the above copyright
18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)**       notice, this list of conditions and the following disclaimer in the
19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)**       documentation and/or other materials provided with the distribution.
20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)**     3.The name of the author may not be used to endorse or promote products
21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)**       derived from this software without specific prior written permission.
22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)**
23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** THIS SOFTWARE IS PROVIDED BY THE AUTHOR  ``AS IS'' AND ANY EXPRESS
24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** OR IMPLIED WARRANTIES, INCLUDING,  BUT NOT LIMITED TO, THE IMPLIED
25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** ARE DISCLAIMED.  IN  NO  EVENT  SHALL THE AUTHOR BE LIABLE FOR ANY
27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** DAMAGES (INCLUDING, BUT NOT LIMITED TO,  PROCUREMENT OF SUBSTITUTE
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** GOODS OR SERVICES;  LOSS OF USE,  DATA,  OR  PROFITS;  OR BUSINESS
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** INTERRUPTION)  HOWEVER  CAUSED  AND  ON  ANY  THEORY OF LIABILITY,
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** WHETHER  IN  CONTRACT,   STRICT   LIABILITY,  OR  TORT  (INCLUDING
32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)*/
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <stdio.h>
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <stdlib.h>
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <string.h>
40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if !defined(WIN32) && !defined(_WIN32) && !defined(__WIN32) && !defined(__WIN32__)
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <strings.h>
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <time.h>
44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <sys/types.h>
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/rand_util.h"
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "fips181.h"
47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "randpass.h"
48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "convert.h"
49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)struct unit
51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles){
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    char    unit_code[5];
53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    USHORT  flags;
54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static struct unit  rules[] =
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles){   {"a", VOWEL},
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"b", NO_SPECIAL_RULE},
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"c", NO_SPECIAL_RULE},
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"d", NO_SPECIAL_RULE},
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"e", NO_FINAL_SPLIT | VOWEL},
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"f", NO_SPECIAL_RULE},
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"g", NO_SPECIAL_RULE},
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"h", NO_SPECIAL_RULE},
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"i", VOWEL},
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"j", NO_SPECIAL_RULE},
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"k", NO_SPECIAL_RULE},
68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"l", NO_SPECIAL_RULE},
69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"m", NO_SPECIAL_RULE},
70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"n", NO_SPECIAL_RULE},
71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"o", VOWEL},
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"p", NO_SPECIAL_RULE},
73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"r", NO_SPECIAL_RULE},
74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"s", NO_SPECIAL_RULE},
75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"t", NO_SPECIAL_RULE},
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"u", VOWEL},
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"v", NO_SPECIAL_RULE},
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"w", NO_SPECIAL_RULE},
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"x", NOT_BEGIN_SYLLABLE},
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"y", ALTERNATE_VOWEL | VOWEL},
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"z", NO_SPECIAL_RULE},
82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"ch", NO_SPECIAL_RULE},
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"gh", NO_SPECIAL_RULE},
84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"ph", NO_SPECIAL_RULE},
85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"rh", NO_SPECIAL_RULE},
86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"sh", NO_SPECIAL_RULE},
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"th", NO_SPECIAL_RULE},
88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"wh", NO_SPECIAL_RULE},
89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"qu", NO_SPECIAL_RULE},
90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"ck", NOT_BEGIN_SYLLABLE}
91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static int  digram[][RULE_SIZE] =
94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles){
95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* aa */ ILLEGAL_PAIR,
96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ab */ ANY_COMBINATION,
97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ac */ ANY_COMBINATION,
98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ad */ ANY_COMBINATION,
99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ae */ ILLEGAL_PAIR,
100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* af */ ANY_COMBINATION,
101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ag */ ANY_COMBINATION,
102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ah */ NOT_BEGIN | BREAK | NOT_END,
103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ai */ ANY_COMBINATION,
104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* aj */ ANY_COMBINATION,
105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ak */ ANY_COMBINATION,
106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* al */ ANY_COMBINATION,
107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* am */ ANY_COMBINATION,
108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* an */ ANY_COMBINATION,
109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ao */ ILLEGAL_PAIR,
110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ap */ ANY_COMBINATION,
111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ar */ ANY_COMBINATION,
112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* as */ ANY_COMBINATION,
113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* at */ ANY_COMBINATION,
114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* au */ ANY_COMBINATION,
115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* av */ ANY_COMBINATION,
116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* aw */ ANY_COMBINATION,
117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ax */ ANY_COMBINATION,
118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ay */ ANY_COMBINATION,
119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* az */ ANY_COMBINATION,
120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ach */ ANY_COMBINATION,
121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* agh */ ILLEGAL_PAIR,
122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* aph */ ANY_COMBINATION,
123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* arh */ ILLEGAL_PAIR,
124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ash */ ANY_COMBINATION,
125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ath */ ANY_COMBINATION,
126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* awh */ ILLEGAL_PAIR,
127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* aqu */ BREAK | NOT_END,
128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ack */ ANY_COMBINATION},
129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* ba */ ANY_COMBINATION,
130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bb */ NOT_BEGIN | BREAK | NOT_END,
131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bc */ NOT_BEGIN | BREAK | NOT_END,
132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bd */ NOT_BEGIN | BREAK | NOT_END,
133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* be */ ANY_COMBINATION,
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bf */ NOT_BEGIN | BREAK | NOT_END,
135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bg */ NOT_BEGIN | BREAK | NOT_END,
136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bh */ NOT_BEGIN | BREAK | NOT_END,
137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bi */ ANY_COMBINATION,
138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bj */ NOT_BEGIN | BREAK | NOT_END,
139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bk */ NOT_BEGIN | BREAK | NOT_END,
140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bl */ BEGIN | SUFFIX | NOT_END,
141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bm */ NOT_BEGIN | BREAK | NOT_END,
142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bn */ NOT_BEGIN | BREAK | NOT_END,
143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bo */ ANY_COMBINATION,
144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bp */ NOT_BEGIN | BREAK | NOT_END,
145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* br */ BEGIN | END,
146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bs */ NOT_BEGIN,
147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bt */ NOT_BEGIN | BREAK | NOT_END,
148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bu */ ANY_COMBINATION,
149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bv */ NOT_BEGIN | BREAK | NOT_END,
150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bw */ NOT_BEGIN | BREAK | NOT_END,
151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bx */ ILLEGAL_PAIR,
152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* by */ ANY_COMBINATION,
153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bz */ NOT_BEGIN | BREAK | NOT_END,
154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bch */ NOT_BEGIN | BREAK | NOT_END,
155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bgh */ ILLEGAL_PAIR,
156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bph */ NOT_BEGIN | BREAK | NOT_END,
157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* brh */ ILLEGAL_PAIR,
158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bsh */ NOT_BEGIN | BREAK | NOT_END,
159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bth */ NOT_BEGIN | BREAK | NOT_END,
160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bwh */ ILLEGAL_PAIR,
161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bqu */ NOT_BEGIN | BREAK | NOT_END,
162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* bck */ ILLEGAL_PAIR },
163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* ca */ ANY_COMBINATION,
164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cb */ NOT_BEGIN | BREAK | NOT_END,
165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cc */ NOT_BEGIN | BREAK | NOT_END,
166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cd */ NOT_BEGIN | BREAK | NOT_END,
167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ce */ ANY_COMBINATION,
168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cf */ NOT_BEGIN | BREAK | NOT_END,
169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cg */ NOT_BEGIN | BREAK | NOT_END,
170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ch */ NOT_BEGIN | BREAK | NOT_END,
171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ci */ ANY_COMBINATION,
172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cj */ NOT_BEGIN | BREAK | NOT_END,
173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ck */ NOT_BEGIN | BREAK | NOT_END,
174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cl */ SUFFIX | NOT_END,
175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cm */ NOT_BEGIN | BREAK | NOT_END,
176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cn */ NOT_BEGIN | BREAK | NOT_END,
177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* co */ ANY_COMBINATION,
178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cp */ NOT_BEGIN | BREAK | NOT_END,
179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cr */ NOT_END,
180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cs */ NOT_BEGIN | END,
181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ct */ NOT_BEGIN | PREFIX,
182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cu */ ANY_COMBINATION,
183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cv */ NOT_BEGIN | BREAK | NOT_END,
184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cw */ NOT_BEGIN | BREAK | NOT_END,
185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cx */ ILLEGAL_PAIR,
186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cy */ ANY_COMBINATION,
187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cz */ NOT_BEGIN | BREAK | NOT_END,
188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cch */ ILLEGAL_PAIR,
189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cgh */ ILLEGAL_PAIR,
190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cph */ NOT_BEGIN | BREAK | NOT_END,
191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* crh */ ILLEGAL_PAIR,
192010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* csh */ NOT_BEGIN | BREAK | NOT_END,
193010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cth */ NOT_BEGIN | BREAK | NOT_END,
194010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cwh */ ILLEGAL_PAIR,
195010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cqu */ NOT_BEGIN | SUFFIX | NOT_END,
196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cck */ ILLEGAL_PAIR},
197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* da */ ANY_COMBINATION,
198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* db */ NOT_BEGIN | BREAK | NOT_END,
199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* dc */ NOT_BEGIN | BREAK | NOT_END,
200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* dd */ NOT_BEGIN,
201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* de */ ANY_COMBINATION,
202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* df */ NOT_BEGIN | BREAK | NOT_END,
203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* dg */ NOT_BEGIN | BREAK | NOT_END,
204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* dh */ NOT_BEGIN | BREAK | NOT_END,
205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* di */ ANY_COMBINATION,
206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* dj */ NOT_BEGIN | BREAK | NOT_END,
207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* dk */ NOT_BEGIN | BREAK | NOT_END,
208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* dl */ NOT_BEGIN | BREAK | NOT_END,
209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* dm */ NOT_BEGIN | BREAK | NOT_END,
210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* dn */ NOT_BEGIN | BREAK | NOT_END,
211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* do */ ANY_COMBINATION,
212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* dp */ NOT_BEGIN | BREAK | NOT_END,
213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* dr */ BEGIN | NOT_END,
214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ds */ NOT_BEGIN | END,
215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* dt */ NOT_BEGIN | BREAK | NOT_END,
216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* du */ ANY_COMBINATION,
217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* dv */ NOT_BEGIN | BREAK | NOT_END,
218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* dw */ NOT_BEGIN | BREAK | NOT_END,
219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* dx */ ILLEGAL_PAIR,
220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* dy */ ANY_COMBINATION,
221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* dz */ NOT_BEGIN | BREAK | NOT_END,
222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* dch */ NOT_BEGIN | BREAK | NOT_END,
223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* dgh */ NOT_BEGIN | BREAK | NOT_END,
224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* dph */ NOT_BEGIN | BREAK | NOT_END,
225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* drh */ ILLEGAL_PAIR,
226010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* dsh */ NOT_BEGIN | NOT_END,
227010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* dth */ NOT_BEGIN | PREFIX,
228010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* dwh */ ILLEGAL_PAIR,
229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* dqu */ NOT_BEGIN | BREAK | NOT_END,
230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* dck */ ILLEGAL_PAIR },
231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* ea */ ANY_COMBINATION,
232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* eb */ ANY_COMBINATION,
233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ec */ ANY_COMBINATION,
234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ed */ ANY_COMBINATION,
235010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ee */ ANY_COMBINATION,
236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ef */ ANY_COMBINATION,
237010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* eg */ ANY_COMBINATION,
238010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* eh */ NOT_BEGIN | BREAK | NOT_END,
239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ei */ NOT_END,
240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ej */ ANY_COMBINATION,
241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ek */ ANY_COMBINATION,
242010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* el */ ANY_COMBINATION,
243010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* em */ ANY_COMBINATION,
244010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* en */ ANY_COMBINATION,
245010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* eo */ BREAK,
246010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ep */ ANY_COMBINATION,
247010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* er */ ANY_COMBINATION,
248010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* es */ ANY_COMBINATION,
249010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* et */ ANY_COMBINATION,
250010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* eu */ ANY_COMBINATION,
251010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ev */ ANY_COMBINATION,
252010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ew */ ANY_COMBINATION,
253010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ex */ ANY_COMBINATION,
254010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ey */ ANY_COMBINATION,
255010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ez */ ANY_COMBINATION,
256010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ech */ ANY_COMBINATION,
257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* egh */ NOT_BEGIN | BREAK | NOT_END,
258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* eph */ ANY_COMBINATION,
259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* erh */ ILLEGAL_PAIR,
260010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* esh */ ANY_COMBINATION,
261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* eth */ ANY_COMBINATION,
262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ewh */ ILLEGAL_PAIR,
263010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* equ */ BREAK | NOT_END,
264010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* eck */ ANY_COMBINATION },
265010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* fa */ ANY_COMBINATION,
266010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fb */ NOT_BEGIN | BREAK | NOT_END,
267010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fc */ NOT_BEGIN | BREAK | NOT_END,
268010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fd */ NOT_BEGIN | BREAK | NOT_END,
269010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fe */ ANY_COMBINATION,
270010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ff */ NOT_BEGIN,
271010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fg */ NOT_BEGIN | BREAK | NOT_END,
272010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fh */ NOT_BEGIN | BREAK | NOT_END,
273010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fi */ ANY_COMBINATION,
274010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fj */ NOT_BEGIN | BREAK | NOT_END,
275010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fk */ NOT_BEGIN | BREAK | NOT_END,
276010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fl */ BEGIN | SUFFIX | NOT_END,
277010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fm */ NOT_BEGIN | BREAK | NOT_END,
278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fn */ NOT_BEGIN | BREAK | NOT_END,
279010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fo */ ANY_COMBINATION,
280010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fp */ NOT_BEGIN | BREAK | NOT_END,
281010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fr */ BEGIN | NOT_END,
282010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fs */ NOT_BEGIN,
283010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ft */ NOT_BEGIN,
284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fu */ ANY_COMBINATION,
285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fv */ NOT_BEGIN | BREAK | NOT_END,
286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fw */ NOT_BEGIN | BREAK | NOT_END,
287010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fx */ ILLEGAL_PAIR,
288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fy */ NOT_BEGIN,
289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fz */ NOT_BEGIN | BREAK | NOT_END,
290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fch */ NOT_BEGIN | BREAK | NOT_END,
291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fgh */ NOT_BEGIN | BREAK | NOT_END,
292010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fph */ NOT_BEGIN | BREAK | NOT_END,
293010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* frh */ ILLEGAL_PAIR,
294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fsh */ NOT_BEGIN | BREAK | NOT_END,
295010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fth */ NOT_BEGIN | BREAK | NOT_END,
296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fwh */ ILLEGAL_PAIR,
297010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fqu */ NOT_BEGIN | BREAK | NOT_END,
298010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* fck */ ILLEGAL_PAIR },
299010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* ga */ ANY_COMBINATION,
300010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gb */ NOT_BEGIN | BREAK | NOT_END,
301010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gc */ NOT_BEGIN | BREAK | NOT_END,
302010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gd */ NOT_BEGIN | BREAK | NOT_END,
303010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ge */ ANY_COMBINATION,
304010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gf */ NOT_BEGIN | BREAK | NOT_END,
305010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gg */ NOT_BEGIN,
306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gh */ NOT_BEGIN | BREAK | NOT_END,
307010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gi */ ANY_COMBINATION,
308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gj */ NOT_BEGIN | BREAK | NOT_END,
309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gk */ ILLEGAL_PAIR,
310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gl */ BEGIN | SUFFIX | NOT_END,
311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gm */ NOT_BEGIN | BREAK | NOT_END,
312010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gn */ NOT_BEGIN | BREAK | NOT_END,
313010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* go */ ANY_COMBINATION,
314010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gp */ NOT_BEGIN | BREAK | NOT_END,
315010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gr */ BEGIN | NOT_END,
316010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gs */ NOT_BEGIN | END,
317010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gt */ NOT_BEGIN | BREAK | NOT_END,
318010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gu */ ANY_COMBINATION,
319010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gv */ NOT_BEGIN | BREAK | NOT_END,
320010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gw */ NOT_BEGIN | BREAK | NOT_END,
321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gx */ ILLEGAL_PAIR,
322010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gy */ NOT_BEGIN,
323010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gz */ NOT_BEGIN | BREAK | NOT_END,
324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gch */ NOT_BEGIN | BREAK | NOT_END,
325010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ggh */ ILLEGAL_PAIR,
326010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gph */ NOT_BEGIN | BREAK | NOT_END,
327010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* grh */ ILLEGAL_PAIR,
328010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gsh */ NOT_BEGIN,
329010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gth */ NOT_BEGIN,
330010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gwh */ ILLEGAL_PAIR,
331010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gqu */ NOT_BEGIN | BREAK | NOT_END,
332010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gck */ ILLEGAL_PAIR },
333010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* ha */ ANY_COMBINATION,
334010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hb */ NOT_BEGIN | BREAK | NOT_END,
335010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hc */ NOT_BEGIN | BREAK | NOT_END,
336010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hd */ NOT_BEGIN | BREAK | NOT_END,
337010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* he */ ANY_COMBINATION,
338010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hf */ NOT_BEGIN | BREAK | NOT_END,
339010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hg */ NOT_BEGIN | BREAK | NOT_END,
340010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hh */ ILLEGAL_PAIR,
341010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hi */ ANY_COMBINATION,
342010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hj */ NOT_BEGIN | BREAK | NOT_END,
343010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hk */ NOT_BEGIN | BREAK | NOT_END,
344010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hl */ NOT_BEGIN | BREAK | NOT_END,
345010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hm */ NOT_BEGIN | BREAK | NOT_END,
346010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hn */ NOT_BEGIN | BREAK | NOT_END,
347010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ho */ ANY_COMBINATION,
348010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hp */ NOT_BEGIN | BREAK | NOT_END,
349010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hr */ NOT_BEGIN | BREAK | NOT_END,
350010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hs */ NOT_BEGIN | BREAK | NOT_END,
351010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ht */ NOT_BEGIN | BREAK | NOT_END,
352010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hu */ ANY_COMBINATION,
353010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hv */ NOT_BEGIN | BREAK | NOT_END,
354010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hw */ NOT_BEGIN | BREAK | NOT_END,
355010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hx */ ILLEGAL_PAIR,
356010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hy */ ANY_COMBINATION,
357010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hz */ NOT_BEGIN | BREAK | NOT_END,
358010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hch */ NOT_BEGIN | BREAK | NOT_END,
359010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hgh */ NOT_BEGIN | BREAK | NOT_END,
360010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hph */ NOT_BEGIN | BREAK | NOT_END,
361010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hrh */ ILLEGAL_PAIR,
362010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hsh */ NOT_BEGIN | BREAK | NOT_END,
363010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hth */ NOT_BEGIN | BREAK | NOT_END,
364010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hwh */ ILLEGAL_PAIR,
365010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hqu */ NOT_BEGIN | BREAK | NOT_END,
366010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* hck */ ILLEGAL_PAIR },
367010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* ia */ ANY_COMBINATION,
368010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ib */ ANY_COMBINATION,
369010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ic */ ANY_COMBINATION,
370010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* id */ ANY_COMBINATION,
371010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ie */ NOT_BEGIN,
372010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* if */ ANY_COMBINATION,
373010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ig */ ANY_COMBINATION,
374010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ih */ NOT_BEGIN | BREAK | NOT_END,
375010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ii */ ILLEGAL_PAIR,
376010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ij */ ANY_COMBINATION,
377010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ik */ ANY_COMBINATION,
378010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* il */ ANY_COMBINATION,
379010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* im */ ANY_COMBINATION,
380010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* in */ ANY_COMBINATION,
381010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* io */ BREAK,
382010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ip */ ANY_COMBINATION,
383010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ir */ ANY_COMBINATION,
384010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* is */ ANY_COMBINATION,
385010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* it */ ANY_COMBINATION,
386010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* iu */ NOT_BEGIN | BREAK | NOT_END,
387010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* iv */ ANY_COMBINATION,
388010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* iw */ NOT_BEGIN | BREAK | NOT_END,
389010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ix */ ANY_COMBINATION,
390010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* iy */ NOT_BEGIN | BREAK | NOT_END,
391010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* iz */ ANY_COMBINATION,
392010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ich */ ANY_COMBINATION,
393010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* igh */ NOT_BEGIN,
394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* iph */ ANY_COMBINATION,
395010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* irh */ ILLEGAL_PAIR,
396010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ish */ ANY_COMBINATION,
397010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ith */ ANY_COMBINATION,
398010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* iwh */ ILLEGAL_PAIR,
399010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* iqu */ BREAK | NOT_END,
400010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ick */ ANY_COMBINATION },
401010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* ja */ ANY_COMBINATION,
402010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jb */ NOT_BEGIN | BREAK | NOT_END,
403010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jc */ NOT_BEGIN | BREAK | NOT_END,
404010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jd */ NOT_BEGIN | BREAK | NOT_END,
405010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* je */ ANY_COMBINATION,
406010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jf */ NOT_BEGIN | BREAK | NOT_END,
407010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jg */ ILLEGAL_PAIR,
408010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jh */ NOT_BEGIN | BREAK | NOT_END,
409010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ji */ ANY_COMBINATION,
410010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jj */ ILLEGAL_PAIR,
411010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jk */ NOT_BEGIN | BREAK | NOT_END,
412010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jl */ NOT_BEGIN | BREAK | NOT_END,
413010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jm */ NOT_BEGIN | BREAK | NOT_END,
414010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jn */ NOT_BEGIN | BREAK | NOT_END,
415010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jo */ ANY_COMBINATION,
416010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jp */ NOT_BEGIN | BREAK | NOT_END,
417010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jr */ NOT_BEGIN | BREAK | NOT_END,
418010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* js */ NOT_BEGIN | BREAK | NOT_END,
419010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jt */ NOT_BEGIN | BREAK | NOT_END,
420010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ju */ ANY_COMBINATION,
421010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jv */ NOT_BEGIN | BREAK | NOT_END,
422010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jw */ NOT_BEGIN | BREAK | NOT_END,
423010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jx */ ILLEGAL_PAIR,
424010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jy */ NOT_BEGIN,
425010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jz */ NOT_BEGIN | BREAK | NOT_END,
426010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jch */ NOT_BEGIN | BREAK | NOT_END,
427010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jgh */ NOT_BEGIN | BREAK | NOT_END,
428010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jph */ NOT_BEGIN | BREAK | NOT_END,
429010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jrh */ ILLEGAL_PAIR,
430010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jsh */ NOT_BEGIN | BREAK | NOT_END,
431010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jth */ NOT_BEGIN | BREAK | NOT_END,
432010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jwh */ ILLEGAL_PAIR,
433010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jqu */ NOT_BEGIN | BREAK | NOT_END,
434010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* jck */ ILLEGAL_PAIR },
435010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* ka */ ANY_COMBINATION,
436010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* kb */ NOT_BEGIN | BREAK | NOT_END,
437010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* kc */ NOT_BEGIN | BREAK | NOT_END,
438010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* kd */ NOT_BEGIN | BREAK | NOT_END,
439010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ke */ ANY_COMBINATION,
440010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* kf */ NOT_BEGIN | BREAK | NOT_END,
441010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* kg */ NOT_BEGIN | BREAK | NOT_END,
442010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* kh */ NOT_BEGIN | BREAK | NOT_END,
443010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ki */ ANY_COMBINATION,
444010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* kj */ NOT_BEGIN | BREAK | NOT_END,
445010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* kk */ NOT_BEGIN | BREAK | NOT_END,
446010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* kl */ SUFFIX | NOT_END,
447010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* km */ NOT_BEGIN | BREAK | NOT_END,
448010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* kn */ BEGIN | SUFFIX | NOT_END,
449010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ko */ ANY_COMBINATION,
450010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* kp */ NOT_BEGIN | BREAK | NOT_END,
451010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* kr */ SUFFIX | NOT_END,
452010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ks */ NOT_BEGIN | END,
453010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* kt */ NOT_BEGIN | BREAK | NOT_END,
454010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ku */ ANY_COMBINATION,
455010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* kv */ NOT_BEGIN | BREAK | NOT_END,
456010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* kw */ NOT_BEGIN | BREAK | NOT_END,
457010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* kx */ ILLEGAL_PAIR,
458010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ky */ NOT_BEGIN,
459010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* kz */ NOT_BEGIN | BREAK | NOT_END,
460010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* kch */ NOT_BEGIN | BREAK | NOT_END,
461010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* kgh */ NOT_BEGIN | BREAK | NOT_END,
462010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* kph */ NOT_BEGIN | PREFIX,
463010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* krh */ ILLEGAL_PAIR,
464010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ksh */ NOT_BEGIN,
465010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* kth */ NOT_BEGIN | BREAK | NOT_END,
466010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* kwh */ ILLEGAL_PAIR,
467010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* kqu */ NOT_BEGIN | BREAK | NOT_END,
468010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* kck */ ILLEGAL_PAIR },
469010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* la */ ANY_COMBINATION,
470010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* lb */ NOT_BEGIN | PREFIX,
471010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* lc */ NOT_BEGIN | BREAK | NOT_END,
472010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ld */ NOT_BEGIN | PREFIX,
473010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* le */ ANY_COMBINATION,
474010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* lf */ NOT_BEGIN | PREFIX,
475010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* lg */ NOT_BEGIN | PREFIX,
476010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* lh */ NOT_BEGIN | BREAK | NOT_END,
477010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* li */ ANY_COMBINATION,
478010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* lj */ NOT_BEGIN | PREFIX,
479010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* lk */ NOT_BEGIN | PREFIX,
480010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ll */ NOT_BEGIN | PREFIX,
481010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* lm */ NOT_BEGIN | PREFIX,
482010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ln */ NOT_BEGIN | BREAK | NOT_END,
483010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* lo */ ANY_COMBINATION,
484010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* lp */ NOT_BEGIN | PREFIX,
485010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* lr */ NOT_BEGIN | BREAK | NOT_END,
486010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ls */ NOT_BEGIN,
487010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* lt */ NOT_BEGIN | PREFIX,
488010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* lu */ ANY_COMBINATION,
489010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* lv */ NOT_BEGIN | PREFIX,
490010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* lw */ NOT_BEGIN | BREAK | NOT_END,
491010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* lx */ ILLEGAL_PAIR,
492010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ly */ ANY_COMBINATION,
493010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* lz */ NOT_BEGIN | BREAK | NOT_END,
494010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* lch */ NOT_BEGIN | PREFIX,
495010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* lgh */ NOT_BEGIN | BREAK | NOT_END,
496010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* lph */ NOT_BEGIN | PREFIX,
497010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* lrh */ ILLEGAL_PAIR,
498010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* lsh */ NOT_BEGIN | PREFIX,
499010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* lth */ NOT_BEGIN | PREFIX,
500010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* lwh */ ILLEGAL_PAIR,
501010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* lqu */ NOT_BEGIN | BREAK | NOT_END,
502010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* lck */ ILLEGAL_PAIR },
503010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* ma */ ANY_COMBINATION,
504010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* mb */ NOT_BEGIN | BREAK | NOT_END,
505010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* mc */ NOT_BEGIN | BREAK | NOT_END,
506010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* md */ NOT_BEGIN | BREAK | NOT_END,
507010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* me */ ANY_COMBINATION,
508010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* mf */ NOT_BEGIN | BREAK | NOT_END,
509010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* mg */ NOT_BEGIN | BREAK | NOT_END,
510010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* mh */ NOT_BEGIN | BREAK | NOT_END,
511010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* mi */ ANY_COMBINATION,
512010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* mj */ NOT_BEGIN | BREAK | NOT_END,
513010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* mk */ NOT_BEGIN | BREAK | NOT_END,
514010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ml */ NOT_BEGIN | BREAK | NOT_END,
515010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* mm */ NOT_BEGIN,
516010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* mn */ NOT_BEGIN | BREAK | NOT_END,
517010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* mo */ ANY_COMBINATION,
518010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* mp */ NOT_BEGIN,
519010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* mr */ NOT_BEGIN | BREAK | NOT_END,
520010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ms */ NOT_BEGIN,
521010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* mt */ NOT_BEGIN,
522010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* mu */ ANY_COMBINATION,
523010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* mv */ NOT_BEGIN | BREAK | NOT_END,
524010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* mw */ NOT_BEGIN | BREAK | NOT_END,
525010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* mx */ ILLEGAL_PAIR,
526010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* my */ ANY_COMBINATION,
527010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* mz */ NOT_BEGIN | BREAK | NOT_END,
528010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* mch */ NOT_BEGIN | PREFIX,
529010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* mgh */ NOT_BEGIN | BREAK | NOT_END,
530010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* mph */ NOT_BEGIN,
531010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* mrh */ ILLEGAL_PAIR,
532010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* msh */ NOT_BEGIN,
533010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* mth */ NOT_BEGIN,
534010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* mwh */ ILLEGAL_PAIR,
535010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* mqu */ NOT_BEGIN | BREAK | NOT_END,
536010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* mck */ ILLEGAL_PAIR },
537010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* na */ ANY_COMBINATION,
538010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* nb */ NOT_BEGIN | BREAK | NOT_END,
539010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* nc */ NOT_BEGIN | BREAK | NOT_END,
540010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* nd */ NOT_BEGIN,
541010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ne */ ANY_COMBINATION,
542010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* nf */ NOT_BEGIN | BREAK | NOT_END,
543010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ng */ NOT_BEGIN | PREFIX,
544010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* nh */ NOT_BEGIN | BREAK | NOT_END,
545010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ni */ ANY_COMBINATION,
546010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* nj */ NOT_BEGIN | BREAK | NOT_END,
547010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* nk */ NOT_BEGIN | PREFIX,
548010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* nl */ NOT_BEGIN | BREAK | NOT_END,
549010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* nm */ NOT_BEGIN | BREAK | NOT_END,
550010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* nn */ NOT_BEGIN,
551010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* no */ ANY_COMBINATION,
552010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* np */ NOT_BEGIN | BREAK | NOT_END,
553010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* nr */ NOT_BEGIN | BREAK | NOT_END,
554010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ns */ NOT_BEGIN,
555010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* nt */ NOT_BEGIN,
556010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* nu */ ANY_COMBINATION,
557010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* nv */ NOT_BEGIN | BREAK | NOT_END,
558010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* nw */ NOT_BEGIN | BREAK | NOT_END,
559010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* nx */ ILLEGAL_PAIR,
560010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ny */ NOT_BEGIN,
561010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* nz */ NOT_BEGIN | BREAK | NOT_END,
562010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* nch */ NOT_BEGIN | PREFIX,
563010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ngh */ NOT_BEGIN | BREAK | NOT_END,
564010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* nph */ NOT_BEGIN | PREFIX,
565010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* nrh */ ILLEGAL_PAIR,
566010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* nsh */ NOT_BEGIN,
567010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* nth */ NOT_BEGIN,
568010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* nwh */ ILLEGAL_PAIR,
569010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* nqu */ NOT_BEGIN | BREAK | NOT_END,
570010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* nck */ NOT_BEGIN | PREFIX },
571010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* oa */ ANY_COMBINATION,
572010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ob */ ANY_COMBINATION,
573010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* oc */ ANY_COMBINATION,
574010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* od */ ANY_COMBINATION,
575010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* oe */ ILLEGAL_PAIR,
576010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* of */ ANY_COMBINATION,
577010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* og */ ANY_COMBINATION,
578010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* oh */ NOT_BEGIN | BREAK | NOT_END,
579010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* oi */ ANY_COMBINATION,
580010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* oj */ ANY_COMBINATION,
581010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ok */ ANY_COMBINATION,
582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ol */ ANY_COMBINATION,
583010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* om */ ANY_COMBINATION,
584010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* on */ ANY_COMBINATION,
585010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* oo */ ANY_COMBINATION,
586010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* op */ ANY_COMBINATION,
587010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* or */ ANY_COMBINATION,
588010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* os */ ANY_COMBINATION,
589010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ot */ ANY_COMBINATION,
590010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ou */ ANY_COMBINATION,
591010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ov */ ANY_COMBINATION,
592010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ow */ ANY_COMBINATION,
593010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ox */ ANY_COMBINATION,
594010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* oy */ ANY_COMBINATION,
595010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* oz */ ANY_COMBINATION,
596010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* och */ ANY_COMBINATION,
597010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ogh */ NOT_BEGIN,
598010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* oph */ ANY_COMBINATION,
599010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* orh */ ILLEGAL_PAIR,
600010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* osh */ ANY_COMBINATION,
601010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* oth */ ANY_COMBINATION,
602010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* owh */ ILLEGAL_PAIR,
603010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* oqu */ BREAK | NOT_END,
604010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ock */ ANY_COMBINATION },
605010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* pa */ ANY_COMBINATION,
606010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* pb */ NOT_BEGIN | BREAK | NOT_END,
607010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* pc */ NOT_BEGIN | BREAK | NOT_END,
608010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* pd */ NOT_BEGIN | BREAK | NOT_END,
609010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* pe */ ANY_COMBINATION,
610010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* pf */ NOT_BEGIN | BREAK | NOT_END,
611010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* pg */ NOT_BEGIN | BREAK | NOT_END,
612010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ph */ NOT_BEGIN | BREAK | NOT_END,
613010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* pi */ ANY_COMBINATION,
614010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* pj */ NOT_BEGIN | BREAK | NOT_END,
615010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* pk */ NOT_BEGIN | BREAK | NOT_END,
616010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* pl */ SUFFIX | NOT_END,
617010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* pm */ NOT_BEGIN | BREAK | NOT_END,
618010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* pn */ NOT_BEGIN | BREAK | NOT_END,
619010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* po */ ANY_COMBINATION,
620010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* pp */ NOT_BEGIN | PREFIX,
621010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* pr */ NOT_END,
622010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ps */ NOT_BEGIN | END,
623010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* pt */ NOT_BEGIN | END,
624010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* pu */ NOT_BEGIN | END,
625010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* pv */ NOT_BEGIN | BREAK | NOT_END,
626010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* pw */ NOT_BEGIN | BREAK | NOT_END,
627010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* px */ ILLEGAL_PAIR,
628010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* py */ ANY_COMBINATION,
629010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* pz */ NOT_BEGIN | BREAK | NOT_END,
630010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* pch */ NOT_BEGIN | BREAK | NOT_END,
631010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* pgh */ NOT_BEGIN | BREAK | NOT_END,
632010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* pph */ NOT_BEGIN | BREAK | NOT_END,
633010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* prh */ ILLEGAL_PAIR,
634010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* psh */ NOT_BEGIN | BREAK | NOT_END,
635010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* pth */ NOT_BEGIN | BREAK | NOT_END,
636010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* pwh */ ILLEGAL_PAIR,
637010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* pqu */ NOT_BEGIN | BREAK | NOT_END,
638010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* pck */ ILLEGAL_PAIR },
639010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* ra */ ANY_COMBINATION,
640010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rb */ NOT_BEGIN | PREFIX,
641010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rc */ NOT_BEGIN | PREFIX,
642010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rd */ NOT_BEGIN | PREFIX,
643010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* re */ ANY_COMBINATION,
644010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rf */ NOT_BEGIN | PREFIX,
645010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rg */ NOT_BEGIN | PREFIX,
646010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rh */ NOT_BEGIN | BREAK | NOT_END,
647010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ri */ ANY_COMBINATION,
648010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rj */ NOT_BEGIN | PREFIX,
649010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rk */ NOT_BEGIN | PREFIX,
650010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rl */ NOT_BEGIN | PREFIX,
651010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rm */ NOT_BEGIN | PREFIX,
652010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rn */ NOT_BEGIN | PREFIX,
653010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ro */ ANY_COMBINATION,
654010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rp */ NOT_BEGIN | PREFIX,
655010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rr */ NOT_BEGIN | PREFIX,
656010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rs */ NOT_BEGIN | PREFIX,
657010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rt */ NOT_BEGIN | PREFIX,
658010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ru */ ANY_COMBINATION,
659010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rv */ NOT_BEGIN | PREFIX,
660010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rw */ NOT_BEGIN | BREAK | NOT_END,
661010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rx */ ILLEGAL_PAIR,
662010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ry */ ANY_COMBINATION,
663010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rz */ NOT_BEGIN | PREFIX,
664010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rch */ NOT_BEGIN | PREFIX,
665010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rgh */ NOT_BEGIN | BREAK | NOT_END,
666010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rph */ NOT_BEGIN | PREFIX,
667010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rrh */ ILLEGAL_PAIR,
668010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rsh */ NOT_BEGIN | PREFIX,
669010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rth */ NOT_BEGIN | PREFIX,
670010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rwh */ ILLEGAL_PAIR,
671010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rqu */ NOT_BEGIN | PREFIX | NOT_END,
672010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rck */ NOT_BEGIN | PREFIX },
673010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* sa */ ANY_COMBINATION,
674010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* sb */ NOT_BEGIN | BREAK | NOT_END,
675010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* sc */ NOT_END,
676010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* sd */ NOT_BEGIN | BREAK | NOT_END,
677010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* se */ ANY_COMBINATION,
678010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* sf */ NOT_BEGIN | BREAK | NOT_END,
679010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* sg */ NOT_BEGIN | BREAK | NOT_END,
680010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* sh */ NOT_BEGIN | BREAK | NOT_END,
681010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* si */ ANY_COMBINATION,
682010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* sj */ NOT_BEGIN | BREAK | NOT_END,
683010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* sk */ ANY_COMBINATION,
684010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* sl */ BEGIN | SUFFIX | NOT_END,
685010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* sm */ SUFFIX | NOT_END,
686010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* sn */ PREFIX | SUFFIX | NOT_END,
687010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* so */ ANY_COMBINATION,
688010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* sp */ ANY_COMBINATION,
689010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* sr */ NOT_BEGIN | NOT_END,
690010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ss */ NOT_BEGIN | PREFIX,
691010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* st */ ANY_COMBINATION,
692010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* su */ ANY_COMBINATION,
693010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* sv */ NOT_BEGIN | BREAK | NOT_END,
694010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* sw */ BEGIN | SUFFIX | NOT_END,
695010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* sx */ ILLEGAL_PAIR,
696010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* sy */ ANY_COMBINATION,
697010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* sz */ NOT_BEGIN | BREAK | NOT_END,
698010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* sch */ BEGIN | SUFFIX | NOT_END,
699010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* sgh */ NOT_BEGIN | BREAK | NOT_END,
700010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* sph */ NOT_BEGIN | BREAK | NOT_END,
701010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* srh */ ILLEGAL_PAIR,
702010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ssh */ NOT_BEGIN | BREAK | NOT_END,
703010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* sth */ NOT_BEGIN | BREAK | NOT_END,
704010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* swh */ ILLEGAL_PAIR,
705010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* squ */ SUFFIX | NOT_END,
706010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* sck */ NOT_BEGIN },
707010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* ta */ ANY_COMBINATION,
708010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* tb */ NOT_BEGIN | BREAK | NOT_END,
709010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* tc */ NOT_BEGIN | BREAK | NOT_END,
710010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* td */ NOT_BEGIN | BREAK | NOT_END,
711010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* te */ ANY_COMBINATION,
712010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* tf */ NOT_BEGIN | BREAK | NOT_END,
713010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* tg */ NOT_BEGIN | BREAK | NOT_END,
714010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* th */ NOT_BEGIN | BREAK | NOT_END,
715010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ti */ ANY_COMBINATION,
716010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* tj */ NOT_BEGIN | BREAK | NOT_END,
717010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* tk */ NOT_BEGIN | BREAK | NOT_END,
718010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* tl */ NOT_BEGIN | BREAK | NOT_END,
719010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* tm */ NOT_BEGIN | BREAK | NOT_END,
720010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* tn */ NOT_BEGIN | BREAK | NOT_END,
721010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* to */ ANY_COMBINATION,
722010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* tp */ NOT_BEGIN | BREAK | NOT_END,
723010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* tr */ NOT_END,
724010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ts */ NOT_BEGIN | END,
725010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* tt */ NOT_BEGIN | PREFIX,
726010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* tu */ ANY_COMBINATION,
727010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* tv */ NOT_BEGIN | BREAK | NOT_END,
728010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* tw */ BEGIN | SUFFIX | NOT_END,
729010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* tx */ ILLEGAL_PAIR,
730010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ty */ ANY_COMBINATION,
731010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* tz */ NOT_BEGIN | BREAK | NOT_END,
732010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* tch */ NOT_BEGIN,
733010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* tgh */ NOT_BEGIN | BREAK | NOT_END,
734010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* tph */ NOT_BEGIN | END,
735010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* trh */ ILLEGAL_PAIR,
736010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* tsh */ NOT_BEGIN | END,
737010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* tth */ NOT_BEGIN | BREAK | NOT_END,
738010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* twh */ ILLEGAL_PAIR,
739010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* tqu */ NOT_BEGIN | BREAK | NOT_END,
740010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* tck */ ILLEGAL_PAIR },
741010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* ua */ NOT_BEGIN | BREAK | NOT_END,
742010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ub */ ANY_COMBINATION,
743010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* uc */ ANY_COMBINATION,
744010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ud */ ANY_COMBINATION,
745010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ue */ NOT_BEGIN,
746010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* uf */ ANY_COMBINATION,
747010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ug */ ANY_COMBINATION,
748010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* uh */ NOT_BEGIN | BREAK | NOT_END,
749010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ui */ NOT_BEGIN | BREAK | NOT_END,
750010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* uj */ ANY_COMBINATION,
751010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* uk */ ANY_COMBINATION,
752010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ul */ ANY_COMBINATION,
753010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* um */ ANY_COMBINATION,
754010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* un */ ANY_COMBINATION,
755010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* uo */ NOT_BEGIN | BREAK,
756010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* up */ ANY_COMBINATION,
757010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ur */ ANY_COMBINATION,
758010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* us */ ANY_COMBINATION,
759010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ut */ ANY_COMBINATION,
760010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* uu */ ILLEGAL_PAIR,
761010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* uv */ ANY_COMBINATION,
762010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* uw */ NOT_BEGIN | BREAK | NOT_END,
763010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ux */ ANY_COMBINATION,
764010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* uy */ NOT_BEGIN | BREAK | NOT_END,
765010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* uz */ ANY_COMBINATION,
766010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* uch */ ANY_COMBINATION,
767010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ugh */ NOT_BEGIN | PREFIX,
768010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* uph */ ANY_COMBINATION,
769010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* urh */ ILLEGAL_PAIR,
770010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ush */ ANY_COMBINATION,
771010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* uth */ ANY_COMBINATION,
772010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* uwh */ ILLEGAL_PAIR,
773010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* uqu */ BREAK | NOT_END,
774010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* uck */ ANY_COMBINATION },
775010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* va */ ANY_COMBINATION,
776010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vb */ NOT_BEGIN | BREAK | NOT_END,
777010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vc */ NOT_BEGIN | BREAK | NOT_END,
778010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vd */ NOT_BEGIN | BREAK | NOT_END,
779010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ve */ ANY_COMBINATION,
780010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vf */ NOT_BEGIN | BREAK | NOT_END,
781010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vg */ NOT_BEGIN | BREAK | NOT_END,
782010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vh */ NOT_BEGIN | BREAK | NOT_END,
783010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vi */ ANY_COMBINATION,
784010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vj */ NOT_BEGIN | BREAK | NOT_END,
785010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vk */ NOT_BEGIN | BREAK | NOT_END,
786010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vl */ NOT_BEGIN | BREAK | NOT_END,
787010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vm */ NOT_BEGIN | BREAK | NOT_END,
788010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vn */ NOT_BEGIN | BREAK | NOT_END,
789010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vo */ ANY_COMBINATION,
790010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vp */ NOT_BEGIN | BREAK | NOT_END,
791010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vr */ NOT_BEGIN | BREAK | NOT_END,
792010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vs */ NOT_BEGIN | BREAK | NOT_END,
793010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vt */ NOT_BEGIN | BREAK | NOT_END,
794010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vu */ ANY_COMBINATION,
795010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vv */ NOT_BEGIN | BREAK | NOT_END,
796010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vw */ NOT_BEGIN | BREAK | NOT_END,
797010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vx */ ILLEGAL_PAIR,
798010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vy */ NOT_BEGIN,
799010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vz */ NOT_BEGIN | BREAK | NOT_END,
800010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vch */ NOT_BEGIN | BREAK | NOT_END,
801010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vgh */ NOT_BEGIN | BREAK | NOT_END,
802010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vph */ NOT_BEGIN | BREAK | NOT_END,
803010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vrh */ ILLEGAL_PAIR,
804010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vsh */ NOT_BEGIN | BREAK | NOT_END,
805010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vth */ NOT_BEGIN | BREAK | NOT_END,
806010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vwh */ ILLEGAL_PAIR,
807010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vqu */ NOT_BEGIN | BREAK | NOT_END,
808010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* vck */ ILLEGAL_PAIR },
809010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* wa */ ANY_COMBINATION,
810010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wb */ NOT_BEGIN | PREFIX,
811010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wc */ NOT_BEGIN | BREAK | NOT_END,
812010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wd */ NOT_BEGIN | PREFIX | END,
813010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* we */ ANY_COMBINATION,
814010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wf */ NOT_BEGIN | PREFIX,
815010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wg */ NOT_BEGIN | PREFIX | END,
816010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wh */ NOT_BEGIN | BREAK | NOT_END,
817010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wi */ ANY_COMBINATION,
818010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wj */ NOT_BEGIN | BREAK | NOT_END,
819010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wk */ NOT_BEGIN | PREFIX,
820010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wl */ NOT_BEGIN | PREFIX | SUFFIX,
821010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wm */ NOT_BEGIN | PREFIX,
822010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wn */ NOT_BEGIN | PREFIX,
823010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wo */ ANY_COMBINATION,
824010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wp */ NOT_BEGIN | PREFIX,
825010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wr */ BEGIN | SUFFIX | NOT_END,
826010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ws */ NOT_BEGIN | PREFIX,
827010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wt */ NOT_BEGIN | PREFIX,
828010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wu */ ANY_COMBINATION,
829010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wv */ NOT_BEGIN | PREFIX,
830010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ww */ NOT_BEGIN | BREAK | NOT_END,
831010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wx */ NOT_BEGIN | PREFIX,
832010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wy */ ANY_COMBINATION,
833010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wz */ NOT_BEGIN | PREFIX,
834010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wch */ NOT_BEGIN,
835010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wgh */ NOT_BEGIN | BREAK | NOT_END,
836010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wph */ NOT_BEGIN,
837010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wrh */ ILLEGAL_PAIR,
838010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wsh */ NOT_BEGIN,
839010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wth */ NOT_BEGIN,
840010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wwh */ ILLEGAL_PAIR,
841010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wqu */ NOT_BEGIN | BREAK | NOT_END,
842010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wck */ NOT_BEGIN },
843010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* xa */ NOT_BEGIN,
844010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xb */ NOT_BEGIN | BREAK | NOT_END,
845010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xc */ NOT_BEGIN | BREAK | NOT_END,
846010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xd */ NOT_BEGIN | BREAK | NOT_END,
847010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xe */ NOT_BEGIN,
848010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xf */ NOT_BEGIN | BREAK | NOT_END,
849010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xg */ NOT_BEGIN | BREAK | NOT_END,
850010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xh */ NOT_BEGIN | BREAK | NOT_END,
851010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xi */ NOT_BEGIN,
852010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xj */ NOT_BEGIN | BREAK | NOT_END,
853010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xk */ NOT_BEGIN | BREAK | NOT_END,
854010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xl */ NOT_BEGIN | BREAK | NOT_END,
855010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xm */ NOT_BEGIN | BREAK | NOT_END,
856010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xn */ NOT_BEGIN | BREAK | NOT_END,
857010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xo */ NOT_BEGIN,
858010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xp */ NOT_BEGIN | BREAK | NOT_END,
859010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xr */ NOT_BEGIN | BREAK | NOT_END,
860010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xs */ NOT_BEGIN | BREAK | NOT_END,
861010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xt */ NOT_BEGIN | BREAK | NOT_END,
862010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xu */ NOT_BEGIN,
863010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xv */ NOT_BEGIN | BREAK | NOT_END,
864010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xw */ NOT_BEGIN | BREAK | NOT_END,
865010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xx */ ILLEGAL_PAIR,
866010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xy */ NOT_BEGIN,
867010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xz */ NOT_BEGIN | BREAK | NOT_END,
868010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xch */ NOT_BEGIN | BREAK | NOT_END,
869010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xgh */ NOT_BEGIN | BREAK | NOT_END,
870010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xph */ NOT_BEGIN | BREAK | NOT_END,
871010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xrh */ ILLEGAL_PAIR,
872010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xsh */ NOT_BEGIN | BREAK | NOT_END,
873010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xth */ NOT_BEGIN | BREAK | NOT_END,
874010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xwh */ ILLEGAL_PAIR,
875010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xqu */ NOT_BEGIN | BREAK | NOT_END,
876010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* xck */ ILLEGAL_PAIR },
877010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* ya */ ANY_COMBINATION,
878010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* yb */ NOT_BEGIN,
879010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* yc */ NOT_BEGIN | NOT_END,
880010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* yd */ NOT_BEGIN,
881010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ye */ ANY_COMBINATION,
882010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* yf */ NOT_BEGIN | NOT_END,
883010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* yg */ NOT_BEGIN,
884010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* yh */ NOT_BEGIN | BREAK | NOT_END,
885010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* yi */ BEGIN | NOT_END,
886010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* yj */ NOT_BEGIN | NOT_END,
887010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* yk */ NOT_BEGIN,
888010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* yl */ NOT_BEGIN | NOT_END,
889010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ym */ NOT_BEGIN,
890010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* yn */ NOT_BEGIN,
891010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* yo */ ANY_COMBINATION,
892010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* yp */ NOT_BEGIN,
893010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* yr */ NOT_BEGIN | BREAK | NOT_END,
894010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ys */ NOT_BEGIN,
895010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* yt */ NOT_BEGIN,
896010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* yu */ ANY_COMBINATION,
897010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* yv */ NOT_BEGIN | NOT_END,
898010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* yw */ NOT_BEGIN | BREAK | NOT_END,
899010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* yx */ NOT_BEGIN,
900010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* yy */ ILLEGAL_PAIR,
901010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* yz */ NOT_BEGIN,
902010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ych */ NOT_BEGIN | BREAK | NOT_END,
903010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ygh */ NOT_BEGIN | BREAK | NOT_END,
904010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* yph */ NOT_BEGIN | BREAK | NOT_END,
905010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* yrh */ ILLEGAL_PAIR,
906010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ysh */ NOT_BEGIN | BREAK | NOT_END,
907010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* yth */ NOT_BEGIN | BREAK | NOT_END,
908010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ywh */ ILLEGAL_PAIR,
909010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* yqu */ NOT_BEGIN | BREAK | NOT_END,
910010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* yck */ ILLEGAL_PAIR },
911010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* za */ ANY_COMBINATION,
912010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zb */ NOT_BEGIN | BREAK | NOT_END,
913010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zc */ NOT_BEGIN | BREAK | NOT_END,
914010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zd */ NOT_BEGIN | BREAK | NOT_END,
915010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ze */ ANY_COMBINATION,
916010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zf */ NOT_BEGIN | BREAK | NOT_END,
917010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zg */ NOT_BEGIN | BREAK | NOT_END,
918010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zh */ NOT_BEGIN | BREAK | NOT_END,
919010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zi */ ANY_COMBINATION,
920010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zj */ NOT_BEGIN | BREAK | NOT_END,
921010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zk */ NOT_BEGIN | BREAK | NOT_END,
922010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zl */ NOT_BEGIN | BREAK | NOT_END,
923010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zm */ NOT_BEGIN | BREAK | NOT_END,
924010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zn */ NOT_BEGIN | BREAK | NOT_END,
925010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zo */ ANY_COMBINATION,
926010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zp */ NOT_BEGIN | BREAK | NOT_END,
927010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zr */ NOT_BEGIN | NOT_END,
928010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zs */ NOT_BEGIN | BREAK | NOT_END,
929010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zt */ NOT_BEGIN,
930010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zu */ ANY_COMBINATION,
931010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zv */ NOT_BEGIN | BREAK | NOT_END,
932010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zw */ SUFFIX | NOT_END,
933010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zx */ ILLEGAL_PAIR,
934010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zy */ ANY_COMBINATION,
935010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zz */ NOT_BEGIN,
936010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zch */ NOT_BEGIN | BREAK | NOT_END,
937010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zgh */ NOT_BEGIN | BREAK | NOT_END,
938010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zph */ NOT_BEGIN | BREAK | NOT_END,
939010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zrh */ ILLEGAL_PAIR,
940010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zsh */ NOT_BEGIN | BREAK | NOT_END,
941010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zth */ NOT_BEGIN | BREAK | NOT_END,
942010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zwh */ ILLEGAL_PAIR,
943010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zqu */ NOT_BEGIN | BREAK | NOT_END,
944010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* zck */ ILLEGAL_PAIR },
945010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* cha */ ANY_COMBINATION,
946010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chb */ NOT_BEGIN | BREAK | NOT_END,
947010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chc */ NOT_BEGIN | BREAK | NOT_END,
948010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chd */ NOT_BEGIN | BREAK | NOT_END,
949010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* che */ ANY_COMBINATION,
950010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chf */ NOT_BEGIN | BREAK | NOT_END,
951010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chg */ NOT_BEGIN | BREAK | NOT_END,
952010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chh */ NOT_BEGIN | BREAK | NOT_END,
953010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chi */ ANY_COMBINATION,
954010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chj */ NOT_BEGIN | BREAK | NOT_END,
955010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chk */ NOT_BEGIN | BREAK | NOT_END,
956010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chl */ NOT_BEGIN | BREAK | NOT_END,
957010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chm */ NOT_BEGIN | BREAK | NOT_END,
958010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chn */ NOT_BEGIN | BREAK | NOT_END,
959010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cho */ ANY_COMBINATION,
960010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chp */ NOT_BEGIN | BREAK | NOT_END,
961010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chr */ NOT_END,
962010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chs */ NOT_BEGIN | BREAK | NOT_END,
963010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cht */ NOT_BEGIN | BREAK | NOT_END,
964010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chu */ ANY_COMBINATION,
965010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chv */ NOT_BEGIN | BREAK | NOT_END,
966010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chw */ NOT_BEGIN | NOT_END,
967010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chx */ ILLEGAL_PAIR,
968010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chy */ ANY_COMBINATION,
969010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chz */ NOT_BEGIN | BREAK | NOT_END,
970010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chch */ ILLEGAL_PAIR,
971010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chgh */ NOT_BEGIN | BREAK | NOT_END,
972010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chph */ NOT_BEGIN | BREAK | NOT_END,
973010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chrh */ ILLEGAL_PAIR,
974010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chsh */ NOT_BEGIN | BREAK | NOT_END,
975010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chth */ NOT_BEGIN | BREAK | NOT_END,
976010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chwh */ ILLEGAL_PAIR,
977010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chqu */ NOT_BEGIN | BREAK | NOT_END,
978010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* chck */ ILLEGAL_PAIR },
979010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* gha */ ANY_COMBINATION,
980010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghb */ NOT_BEGIN | BREAK | PREFIX | NOT_END,
981010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghc */ NOT_BEGIN | BREAK | PREFIX | NOT_END,
982010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghd */ NOT_BEGIN | BREAK | PREFIX | NOT_END,
983010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghe */ ANY_COMBINATION,
984010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghf */ NOT_BEGIN | BREAK | PREFIX | NOT_END,
985010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghg */ NOT_BEGIN | BREAK | PREFIX | NOT_END,
986010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghh */ NOT_BEGIN | BREAK | PREFIX | NOT_END,
987010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghi */ BEGIN | NOT_END,
988010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghj */ NOT_BEGIN | BREAK | PREFIX | NOT_END,
989010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghk */ NOT_BEGIN | BREAK | PREFIX | NOT_END,
990010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghl */ NOT_BEGIN | BREAK | PREFIX | NOT_END,
991010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghm */ NOT_BEGIN | BREAK | PREFIX | NOT_END,
992010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghn */ NOT_BEGIN | BREAK | PREFIX | NOT_END,
993010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* gho */ BEGIN | NOT_END,
994010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghp */ NOT_BEGIN | BREAK | NOT_END,
995010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghr */ NOT_BEGIN | BREAK | PREFIX | NOT_END,
996010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghs */ NOT_BEGIN | PREFIX,
997010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ght */ NOT_BEGIN | PREFIX,
998010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghu */ NOT_BEGIN | BREAK | PREFIX | NOT_END,
999010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghv */ NOT_BEGIN | BREAK | PREFIX | NOT_END,
1000010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghw */ NOT_BEGIN | BREAK | PREFIX | NOT_END,
1001010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghx */ ILLEGAL_PAIR,
1002010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghy */ NOT_BEGIN | BREAK | PREFIX | NOT_END,
1003010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghz */ NOT_BEGIN | BREAK | PREFIX | NOT_END,
1004010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghch */ NOT_BEGIN | BREAK | PREFIX | NOT_END,
1005010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghgh */ ILLEGAL_PAIR,
1006010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghph */ NOT_BEGIN | BREAK | PREFIX | NOT_END,
1007010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghrh */ ILLEGAL_PAIR,
1008010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghsh */ NOT_BEGIN | BREAK | PREFIX | NOT_END,
1009010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghth */ NOT_BEGIN | BREAK | PREFIX | NOT_END,
1010010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghwh */ ILLEGAL_PAIR,
1011010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghqu */ NOT_BEGIN | BREAK | PREFIX | NOT_END,
1012010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ghck */ ILLEGAL_PAIR },
1013010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* pha */ ANY_COMBINATION,
1014010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phb */ NOT_BEGIN | BREAK | NOT_END,
1015010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phc */ NOT_BEGIN | BREAK | NOT_END,
1016010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phd */ NOT_BEGIN | BREAK | NOT_END,
1017010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phe */ ANY_COMBINATION,
1018010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phf */ NOT_BEGIN | BREAK | NOT_END,
1019010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phg */ NOT_BEGIN | BREAK | NOT_END,
1020010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phh */ NOT_BEGIN | BREAK | NOT_END,
1021010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phi */ ANY_COMBINATION,
1022010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phj */ NOT_BEGIN | BREAK | NOT_END,
1023010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phk */ NOT_BEGIN | BREAK | NOT_END,
1024010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phl */ BEGIN | SUFFIX | NOT_END,
1025010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phm */ NOT_BEGIN | BREAK | NOT_END,
1026010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phn */ NOT_BEGIN | BREAK | NOT_END,
1027010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* pho */ ANY_COMBINATION,
1028010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* php */ NOT_BEGIN | BREAK | NOT_END,
1029010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phr */ NOT_END,
1030010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phs */ NOT_BEGIN,
1031010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* pht */ NOT_BEGIN,
1032010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phu */ ANY_COMBINATION,
1033010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phv */ NOT_BEGIN | NOT_END,
1034010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phw */ NOT_BEGIN | NOT_END,
1035010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phx */ ILLEGAL_PAIR,
1036010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phy */ NOT_BEGIN,
1037010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phz */ NOT_BEGIN | BREAK | NOT_END,
1038010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phch */ NOT_BEGIN | BREAK | NOT_END,
1039010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phgh */ NOT_BEGIN | BREAK | NOT_END,
1040010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phph */ ILLEGAL_PAIR,
1041010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phrh */ ILLEGAL_PAIR,
1042010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phsh */ NOT_BEGIN | BREAK | NOT_END,
1043010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phth */ NOT_BEGIN | BREAK | NOT_END,
1044010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phwh */ ILLEGAL_PAIR,
1045010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phqu */ NOT_BEGIN | BREAK | NOT_END,
1046010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* phck */ ILLEGAL_PAIR },
1047010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* rha */ BEGIN | NOT_END,
1048010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhb */ ILLEGAL_PAIR,
1049010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhc */ ILLEGAL_PAIR,
1050010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhd */ ILLEGAL_PAIR,
1051010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhe */ BEGIN | NOT_END,
1052010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhf */ ILLEGAL_PAIR,
1053010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhg */ ILLEGAL_PAIR,
1054010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhh */ ILLEGAL_PAIR,
1055010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhi */ BEGIN | NOT_END,
1056010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhj */ ILLEGAL_PAIR,
1057010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhk */ ILLEGAL_PAIR,
1058010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhl */ ILLEGAL_PAIR,
1059010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhm */ ILLEGAL_PAIR,
1060010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhn */ ILLEGAL_PAIR,
1061010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rho */ BEGIN | NOT_END,
1062010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhp */ ILLEGAL_PAIR,
1063010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhr */ ILLEGAL_PAIR,
1064010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhs */ ILLEGAL_PAIR,
1065010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rht */ ILLEGAL_PAIR,
1066010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhu */ BEGIN | NOT_END,
1067010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhv */ ILLEGAL_PAIR,
1068010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhw */ ILLEGAL_PAIR,
1069010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhx */ ILLEGAL_PAIR,
1070010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhy */ BEGIN | NOT_END,
1071010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhz */ ILLEGAL_PAIR,
1072010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhch */ ILLEGAL_PAIR,
1073010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhgh */ ILLEGAL_PAIR,
1074010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhph */ ILLEGAL_PAIR,
1075010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhrh */ ILLEGAL_PAIR,
1076010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhsh */ ILLEGAL_PAIR,
1077010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhth */ ILLEGAL_PAIR,
1078010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhwh */ ILLEGAL_PAIR,
1079010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhqu */ ILLEGAL_PAIR,
1080010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* rhck */ ILLEGAL_PAIR },
1081010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* sha */ ANY_COMBINATION,
1082010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shb */ NOT_BEGIN | BREAK | NOT_END,
1083010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shc */ NOT_BEGIN | BREAK | NOT_END,
1084010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shd */ NOT_BEGIN | BREAK | NOT_END,
1085010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* she */ ANY_COMBINATION,
1086010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shf */ NOT_BEGIN | BREAK | NOT_END,
1087010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shg */ NOT_BEGIN | BREAK | NOT_END,
1088010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shh */ ILLEGAL_PAIR,
1089010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shi */ ANY_COMBINATION,
1090010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shj */ NOT_BEGIN | BREAK | NOT_END,
1091010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shk */ NOT_BEGIN,
1092010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shl */ BEGIN | SUFFIX | NOT_END,
1093010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shm */ BEGIN | SUFFIX | NOT_END,
1094010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shn */ BEGIN | SUFFIX | NOT_END,
1095010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* sho */ ANY_COMBINATION,
1096010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shp */ NOT_BEGIN,
1097010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shr */ BEGIN | SUFFIX | NOT_END,
1098010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shs */ NOT_BEGIN | BREAK | NOT_END,
1099010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* sht */ SUFFIX,
1100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shu */ ANY_COMBINATION,
1101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shv */ NOT_BEGIN | BREAK | NOT_END,
1102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shw */ SUFFIX | NOT_END,
1103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shx */ ILLEGAL_PAIR,
1104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shy */ ANY_COMBINATION,
1105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shz */ NOT_BEGIN | BREAK | NOT_END,
1106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shch */ NOT_BEGIN | BREAK | NOT_END,
1107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shgh */ NOT_BEGIN | BREAK | NOT_END,
1108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shph */ NOT_BEGIN | BREAK | NOT_END,
1109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shrh */ ILLEGAL_PAIR,
1110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shsh */ ILLEGAL_PAIR,
1111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shth */ NOT_BEGIN | BREAK | NOT_END,
1112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shwh */ ILLEGAL_PAIR,
1113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shqu */ NOT_BEGIN | BREAK | NOT_END,
1114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* shck */ ILLEGAL_PAIR },
1115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* tha */ ANY_COMBINATION,
1116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thb */ NOT_BEGIN | BREAK | NOT_END,
1117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thc */ NOT_BEGIN | BREAK | NOT_END,
1118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thd */ NOT_BEGIN | BREAK | NOT_END,
1119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* the */ ANY_COMBINATION,
1120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thf */ NOT_BEGIN | BREAK | NOT_END,
1121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thg */ NOT_BEGIN | BREAK | NOT_END,
1122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thh */ NOT_BEGIN | BREAK | NOT_END,
1123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thi */ ANY_COMBINATION,
1124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thj */ NOT_BEGIN | BREAK | NOT_END,
1125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thk */ NOT_BEGIN | BREAK | NOT_END,
1126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thl */ NOT_BEGIN | BREAK | NOT_END,
1127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thm */ NOT_BEGIN | BREAK | NOT_END,
1128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thn */ NOT_BEGIN | BREAK | NOT_END,
1129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* tho */ ANY_COMBINATION,
1130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thp */ NOT_BEGIN | BREAK | NOT_END,
1131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thr */ NOT_END,
1132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ths */ NOT_BEGIN | END,
1133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* tht */ NOT_BEGIN | BREAK | NOT_END,
1134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thu */ ANY_COMBINATION,
1135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thv */ NOT_BEGIN | BREAK | NOT_END,
1136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thw */ SUFFIX | NOT_END,
1137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thx */ ILLEGAL_PAIR,
1138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thy */ ANY_COMBINATION,
1139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thz */ NOT_BEGIN | BREAK | NOT_END,
1140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thch */ NOT_BEGIN | BREAK | NOT_END,
1141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thgh */ NOT_BEGIN | BREAK | NOT_END,
1142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thph */ NOT_BEGIN | BREAK | NOT_END,
1143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thrh */ ILLEGAL_PAIR,
1144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thsh */ NOT_BEGIN | BREAK | NOT_END,
1145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thth */ ILLEGAL_PAIR,
1146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thwh */ ILLEGAL_PAIR,
1147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thqu */ NOT_BEGIN | BREAK | NOT_END,
1148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* thck */ ILLEGAL_PAIR },
1149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* wha */ BEGIN | NOT_END,
1150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whb */ ILLEGAL_PAIR,
1151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whc */ ILLEGAL_PAIR,
1152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whd */ ILLEGAL_PAIR,
1153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whe */ BEGIN | NOT_END,
1154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whf */ ILLEGAL_PAIR,
1155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whg */ ILLEGAL_PAIR,
1156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whh */ ILLEGAL_PAIR,
1157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whi */ BEGIN | NOT_END,
1158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whj */ ILLEGAL_PAIR,
1159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whk */ ILLEGAL_PAIR,
1160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whl */ ILLEGAL_PAIR,
1161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whm */ ILLEGAL_PAIR,
1162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whn */ ILLEGAL_PAIR,
1163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* who */ BEGIN | NOT_END,
1164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whp */ ILLEGAL_PAIR,
1165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whr */ ILLEGAL_PAIR,
1166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whs */ ILLEGAL_PAIR,
1167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* wht */ ILLEGAL_PAIR,
1168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whu */ ILLEGAL_PAIR,
1169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whv */ ILLEGAL_PAIR,
1170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whw */ ILLEGAL_PAIR,
1171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whx */ ILLEGAL_PAIR,
1172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* why */ BEGIN | NOT_END,
1173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whz */ ILLEGAL_PAIR,
1174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whch */ ILLEGAL_PAIR,
1175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whgh */ ILLEGAL_PAIR,
1176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whph */ ILLEGAL_PAIR,
1177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whrh */ ILLEGAL_PAIR,
1178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whsh */ ILLEGAL_PAIR,
1179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whth */ ILLEGAL_PAIR,
1180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whwh */ ILLEGAL_PAIR,
1181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whqu */ ILLEGAL_PAIR,
1182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* whck */ ILLEGAL_PAIR },
1183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* qua */ ANY_COMBINATION,
1184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* qub */ ILLEGAL_PAIR,
1185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* quc */ ILLEGAL_PAIR,
1186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* qud */ ILLEGAL_PAIR,
1187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* que */ ANY_COMBINATION,
1188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* quf */ ILLEGAL_PAIR,
1189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* qug */ ILLEGAL_PAIR,
1190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* quh */ ILLEGAL_PAIR,
1191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* qui */ ANY_COMBINATION,
1192010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* quj */ ILLEGAL_PAIR,
1193010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* quk */ ILLEGAL_PAIR,
1194010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* qul */ ILLEGAL_PAIR,
1195010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* qum */ ILLEGAL_PAIR,
1196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* qun */ ILLEGAL_PAIR,
1197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* quo */ ANY_COMBINATION,
1198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* qup */ ILLEGAL_PAIR,
1199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* qur */ ILLEGAL_PAIR,
1200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* qus */ ILLEGAL_PAIR,
1201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* qut */ ILLEGAL_PAIR,
1202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* quu */ ILLEGAL_PAIR,
1203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* quv */ ILLEGAL_PAIR,
1204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* quw */ ILLEGAL_PAIR,
1205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* qux */ ILLEGAL_PAIR,
1206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* quy */ ILLEGAL_PAIR,
1207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* quz */ ILLEGAL_PAIR,
1208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* quch */ ILLEGAL_PAIR,
1209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* qugh */ ILLEGAL_PAIR,
1210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* quph */ ILLEGAL_PAIR,
1211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* qurh */ ILLEGAL_PAIR,
1212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* qush */ ILLEGAL_PAIR,
1213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* quth */ ILLEGAL_PAIR,
1214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* quwh */ ILLEGAL_PAIR,
1215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ququ */ ILLEGAL_PAIR,
1216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* quck */ ILLEGAL_PAIR },
1217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {/* cka */ NOT_BEGIN | BREAK | NOT_END,
1218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ckb */ NOT_BEGIN | BREAK | NOT_END,
1219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ckc */ NOT_BEGIN | BREAK | NOT_END,
1220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ckd */ NOT_BEGIN | BREAK | NOT_END,
1221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cke */ NOT_BEGIN | BREAK | NOT_END,
1222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ckf */ NOT_BEGIN | BREAK | NOT_END,
1223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ckg */ NOT_BEGIN | BREAK | NOT_END,
1224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ckh */ NOT_BEGIN | BREAK | NOT_END,
1225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cki */ NOT_BEGIN | BREAK | NOT_END,
1226010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ckj */ NOT_BEGIN | BREAK | NOT_END,
1227010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ckk */ NOT_BEGIN | BREAK | NOT_END,
1228010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ckl */ NOT_BEGIN | BREAK | NOT_END,
1229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ckm */ NOT_BEGIN | BREAK | NOT_END,
1230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ckn */ NOT_BEGIN | BREAK | NOT_END,
1231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cko */ NOT_BEGIN | BREAK | NOT_END,
1232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ckp */ NOT_BEGIN | BREAK | NOT_END,
1233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ckr */ NOT_BEGIN | BREAK | NOT_END,
1234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cks */ NOT_BEGIN,
1235010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ckt */ NOT_BEGIN | BREAK | NOT_END,
1236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cku */ NOT_BEGIN | BREAK | NOT_END,
1237010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ckv */ NOT_BEGIN | BREAK | NOT_END,
1238010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ckw */ NOT_BEGIN | BREAK | NOT_END,
1239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ckx */ ILLEGAL_PAIR,
1240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cky */ NOT_BEGIN,
1241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ckz */ NOT_BEGIN | BREAK | NOT_END,
1242010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ckch */ NOT_BEGIN | BREAK | NOT_END,
1243010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ckgh */ NOT_BEGIN | BREAK | NOT_END,
1244010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ckph */ NOT_BEGIN | BREAK | NOT_END,
1245010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ckrh */ ILLEGAL_PAIR,
1246010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* cksh */ NOT_BEGIN | BREAK | NOT_END,
1247010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ckth */ NOT_BEGIN | BREAK | NOT_END,
1248010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ckwh */ ILLEGAL_PAIR,
1249010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ckqu */ NOT_BEGIN | BREAK | NOT_END,
1250010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /* ckck */ ILLEGAL_PAIR}
1251010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
1252010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1253010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
1254010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** gen_pron_pass will generate a Random word and place it in the
1255010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** buffer word.  Also, the hyphenated word will be placed into
1256010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** the buffer hyphenated_word.  Both word and hyphenated_word must
1257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** be pre-allocated.  The words generated will have sizes between
1258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** minlen and maxlen.  If restrict is TRUE, words will not be generated that
1259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** appear as login names or as entries in the on-line dictionary.
1260010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** This algorithm was initially worded out by Morrie Gasser in 1975.
1261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** Any changes here are minimal so that as many word combinations
1262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** can be produced as possible (and thus keep the words Random).
1263010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** The seed is used on first use of the routine.
1264010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** The length of the unhyphenated word is returned, or -1 if there
1265010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** were an error (length settings are wrong or dictionary checking
1266010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)** could not be done.
1267010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)*/
1268010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)int
1269010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gen_pron_pass (char *word, char *hyphenated_word, USHORT minlen,
1270010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               USHORT maxlen, unsigned int pass_mode)
1271010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles){
1272010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1273010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    int     pwlen;
1274010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1275010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) /*
1276010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  * Check for minlen>maxlen.  This is an error.
1277010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  * and a length of 0.
1278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  */
1279010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (minlen > maxlen || minlen > APG_MAX_PASSWORD_LENGTH ||
1280010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        maxlen > APG_MAX_PASSWORD_LENGTH)
1281010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return (-1);
1282010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) /*
1283010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  * Check for zero length words.  This is technically not an error,
1284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  * so we take the short cut and return a null word and a length of 0.
1285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  */
1286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (maxlen == 0)
1287010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {
1288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     word[0] = '\0';
1289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     hyphenated_word[0] = '\0';
1290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     return (0);
1291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
1292010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1293010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) /*
1294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  * Find password.
1295010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  */
1296f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    pwlen = gen_word (word, hyphenated_word, base::RandInt(minlen, maxlen),
1297f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                      pass_mode);
1298010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return (pwlen);
1299010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1300010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1301010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1302010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
1303010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * This is the routine that returns a Random word -- as
1304010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * yet unchecked against the passwd file or the dictionary.
1305010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * It collects Random syllables until a predetermined
1306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * word length is found.  If a retry threshold is reached,
1307010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * another word is tried.  Given that the Random number
1308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * generator is uniformly distributed, eventually a word
1309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * will be found if the retry limit is adequately large enough.
1310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
1311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)int
1312010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gen_word (char *word, char *hyphenated_word, USHORT pwlen, unsigned int pass_mode)
1313010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles){
1314010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    USHORT word_length;
1315010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    USHORT syllable_length;
1316010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    char   *new_syllable;
1317010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    char   *syllable_for_hyph;
1318010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    USHORT *syllable_units;
1319010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    USHORT word_size;
1320010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    USHORT word_place;
1321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    USHORT *word_units;
1322010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    USHORT syllable_size;
1323010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    UINT   tries;
1324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    int ch_flag = FALSE;
1325010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    int dsd = 0;
1326010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1327010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    /*
1328010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     * Keep count of retries.
1329010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     */
1330010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    tries = 0;
1331010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1332010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    /*
1333010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     * The length of the word in characters.
1334010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     */
1335010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    word_length = 0;
1336010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1337010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    /*
1338010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     * The length of the word in character units (each of which is one or
1339010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     * two characters long.
1340010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     */
1341010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    word_size = 0;
1342010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1343010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    /*
1344010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     * Initialize the array storing the word units.  Since we know the
1345010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     * length of the word, we only need one of that length.  This method is
1346010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     * preferable to a static array, since it allows us flexibility in
1347010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     * choosing arbitrarily long word lengths.  Since a word can contain one
1348010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     * syllable, we should make syllable_units, the array holding the
1349010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     * analogous units for an individual syllable, the same length. No
1350010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     * explicit rule limits the length of syllables, but digram rules and
1351010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     * heuristics do so indirectly.
1352010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     */
1353010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if ( (word_units     = (USHORT *) calloc (sizeof (USHORT), pwlen+1))==NULL ||
1354010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         (syllable_units = (USHORT *) calloc (sizeof (USHORT), pwlen+1))==NULL ||
1355010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         (new_syllable   = (char *) calloc (sizeof (USHORT), pwlen+1))  ==NULL ||
1356010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	 (syllable_for_hyph = (char *) calloc (sizeof(char), 20))==NULL)
1357010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	   return(-1);
1358010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1359010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    /*
1360010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     * Find syllables until the entire word is constructed.
1361010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     */
1362010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    while (word_length < pwlen)
1363010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {
1364010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /*
1365010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * Get the syllable and find its length.
1366010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      */
1367010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     (void) gen_syllable (new_syllable, pwlen - word_length, syllable_units, &syllable_size);
1368f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)     syllable_length = (USHORT) strlen (new_syllable);
1369010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1370010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /*
1371010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * Append the syllable units to the word units.
1372010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      */
1373010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     for (word_place = 0; word_place <= syllable_size; word_place++)
1374010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         word_units[word_size + word_place] = syllable_units[word_place];
1375010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     word_size += syllable_size + 1;
1376010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1377010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /*
1378010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * If the word has been improperly formed, throw out
1379010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * the syllable.  The checks performed here are those
1380010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * that must be formed on a word basis.  The other
1381010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * tests are performed entirely within the syllable.
1382010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * Otherwise, append the syllable to the word and
1383010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * append the syllable to the hyphenated version of
1384010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * the word.
1385010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      */
1386010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     if (improper_word (word_units, word_size) ||
1387010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        ((word_length == 0) && have_initial_y (syllable_units, syllable_size)) ||
1388010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        ((word_length + syllable_length == pwlen) && have_final_split (syllable_units, syllable_size)))
1389010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           word_size -= syllable_size + 1;
1390010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     else
1391010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     {
1392010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         if (word_length == 0)
1393010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         {
1394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          /*
1395010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          ** Modify syllable for numeric or capital symbols required
1396010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          ** Should be done after word quality check.
1397010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          */
1398f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          dsd = base::RandInt(0, 1);
1399010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          if ( ((pass_mode & S_NB) > 0) && (syllable_length == 1) && dsd == 0)
1400010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            {
1401010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)             numerize(new_syllable);
1402010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	     ch_flag = TRUE;
1403010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            }
1404010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          if ( ((pass_mode & S_SS) > 0) && (syllable_length == 1) && (dsd == 1))
1405010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            {
1406010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	      specialize(new_syllable);
1407010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	      ch_flag = TRUE;
1408010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	    }
1409010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          if ( ( (pass_mode & S_CL) > 0) && (ch_flag != TRUE))
1410010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)             capitalize(new_syllable);
1411010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          ch_flag = FALSE;
1412010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          /**/
1413010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          (void) strcpy (word, new_syllable);
1414010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	  if (syllable_length == 1)
1415010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	     {
1416010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	      symb2name(new_syllable, syllable_for_hyph);
1417010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              (void) strcpy (hyphenated_word, syllable_for_hyph);
1418010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	     }
1419010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	  else
1420010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	     {
1421010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              (void) strcpy (hyphenated_word, new_syllable);
1422010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	     }
1423010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	  (void)memset ( (void *)new_syllable, 0, (size_t)(pwlen * sizeof(USHORT)+1));
1424010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	  (void)memset ( (void *)syllable_for_hyph, 0, 20);
1425010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         }
1426010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         else
1427010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         {
1428010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          /*
1429010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          ** Modify syllable for numeric or capital symbols required
1430010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          ** Should be done after word quality check.
1431010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          */
1432f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          dsd = base::RandInt(0, 1);
1433010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          if ( ((pass_mode & S_NB) > 0) && (syllable_length == 1) && (dsd == 0))
1434010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            {
1435010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)             numerize(new_syllable);
1436010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	     ch_flag = TRUE;
1437010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            }
1438010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          if ( ( (pass_mode & S_SS) > 0) && (syllable_length == 1) && (dsd == 1))
1439010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            {
1440010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	     specialize(new_syllable);
1441010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	     ch_flag = TRUE;
1442010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	    }
1443010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          if ( ( (pass_mode & S_CL) > 0) && (ch_flag != TRUE))
1444010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)             capitalize(new_syllable);
1445010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          ch_flag = FALSE;
1446010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          /**/
1447010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          (void) strcat (word, new_syllable);
1448010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          (void) strcat (hyphenated_word, "-");
1449010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	  if (syllable_length == 1)
1450010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	     {
1451010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	      symb2name(new_syllable, syllable_for_hyph);
1452010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              (void) strcat (hyphenated_word, syllable_for_hyph);
1453010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	     }
1454010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	  else
1455010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	     {
1456010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              (void) strcat (hyphenated_word, new_syllable);
1457010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	     }
1458010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	  (void)memset ( (void *)new_syllable, 0, (size_t)(pwlen * sizeof(USHORT)+1));
1459010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	  (void)memset ( (void *)syllable_for_hyph, 0, 20);
1460010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         }
1461010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         word_length += syllable_length;
1462010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     }
1463010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1464010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       /*
1465010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        * Keep track of the times we have tried to get
1466010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        * syllables.  If we have exceeded the threshold,
1467010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        * reinitialize the pwlen and word_size variables, clear
1468010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        * out the word arrays, and start from scratch.
1469010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        */
1470010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     tries++;
1471010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     if (tries > MAX_RETRIES)
1472010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     {
1473010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         word_length = 0;
1474010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         word_size = 0;
1475010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         tries = 0;
1476010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         (void) strcpy (word, "");
1477010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         (void) strcpy (hyphenated_word, "");
1478010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     }
1479010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
1480010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1481010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    /*
1482010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     * The units arrays and syllable storage are internal to this
1483010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     * routine.  Since the caller has no need for them, we
1484010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     * release the space.
1485010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     */
1486010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    free ((char *) new_syllable);
1487010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    free ((char *) syllable_units);
1488010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    free ((char *) word_units);
1489010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    free ((char *) syllable_for_hyph);
1490010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1491010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return ((int) word_length);
1492010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1493010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1494010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1495010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1496010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
1497010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Check that the word does not contain illegal combinations
1498010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * that may span syllables.  Specifically, these are:
1499010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *   1. An illegal pair of units between syllables.
1500010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *   2. Three consecutive vowel units.
1501010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *   3. Three consecutive consonant units.
1502010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * The checks are made against units (1 or 2 letters), not against
1503010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * the individual letters, so three consecutive units can have
1504010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * the length of 6 at most.
1505010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
1506010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)boolean
1507010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)improper_word (USHORT *units, USHORT word_size)
1508010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles){
1509010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    USHORT unit_count;
1510010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    boolean failure;
1511010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1512010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    failure = FALSE;
1513010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1514010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    for (unit_count = 0; !failure && (unit_count < word_size);
1515010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         unit_count++)
1516010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {
1517010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /*
1518010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * Check for ILLEGAL_PAIR.  This should have been caught
1519010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * for units within a syllable, but in some cases it
1520010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * would have gone unnoticed for units between syllables
1521010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * (e.g., when saved_unit's in gen_syllable() were not
1522010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * used).
1523010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      */
1524010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     if ((unit_count != 0) &&
1525010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          (digram[units[unit_count - 1]][units[unit_count]] &
1526010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              ILLEGAL_PAIR))
1527010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         failure = TRUE;
1528010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1529010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /*
1530010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * Check for consecutive vowels or consonants.  Because
1531010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * the initial y of a syllable is treated as a consonant
1532010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * rather than as a vowel, we exclude y from the first
1533010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * vowel in the vowel test.  The only problem comes when
1534010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * y ends a syllable and two other vowels start the next,
1535010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * like fly-oint.  Since such words are still
1536010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * pronounceable, we accept this.
1537010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      */
1538010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     if (!failure && (unit_count >= 2))
1539010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     {
1540010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         /*
1541010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          * Vowel check.
1542010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          */
1543010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         if ((((rules[units[unit_count - 2]].flags & VOWEL) &&
1544010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   !(rules[units[unit_count - 2]].flags &
1545010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    ALTERNATE_VOWEL)) &&
1546010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               (rules[units[unit_count - 1]].flags & VOWEL) &&
1547010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               (rules[units[unit_count]].flags & VOWEL)) ||
1548010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         /*
1549010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          * Consonant check.
1550010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          */
1551010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              (!(rules[units[unit_count - 2]].flags & VOWEL) &&
1552010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               !(rules[units[unit_count - 1]].flags & VOWEL) &&
1553010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               !(rules[units[unit_count]].flags & VOWEL)))
1554010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          failure = TRUE;
1555010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     }
1556010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
1557010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1558010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return (failure);
1559010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1560010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1561010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1562010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
1563010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Treating y as a vowel is sometimes a problem.  Some words
1564010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * get formed that look irregular.  One special group is when
1565010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * y starts a word and is the only vowel in the first syllable.
1566010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * The word ycl is one example.  We discard words like these.
1567010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
1568010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)boolean
1569010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)have_initial_y (USHORT *units, USHORT unit_size)
1570010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles){
1571010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    USHORT unit_count;
1572010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    USHORT vowel_count;
1573010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    USHORT normal_vowel_count;
1574010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1575010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    vowel_count = 0;
1576010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    normal_vowel_count = 0;
1577010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1578010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    for (unit_count = 0; unit_count <= unit_size; unit_count++)
1579010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /*
1580010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * Count vowels.
1581010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      */
1582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     if (rules[units[unit_count]].flags & VOWEL)
1583010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     {
1584010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         vowel_count++;
1585010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1586010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         /*
1587010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          * Count the vowels that are not: 1. y, 2. at the start of
1588010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          * the word.
1589010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          */
1590010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         if (!(rules[units[unit_count]].flags & ALTERNATE_VOWEL) ||
1591010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              (unit_count != 0))
1592010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          normal_vowel_count++;
1593010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     }
1594010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1595010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return ((vowel_count <= 1) && (normal_vowel_count == 0));
1596010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1597010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1598010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1599010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
1600010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Besides the problem with the letter y, there is one with
1601010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * a silent e at the end of words, like face or nice.  We
1602010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * allow this silent e, but we do not allow it as the only
1603010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * vowel at the end of the word or syllables like ble will
1604010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * be generated.
1605010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
1606010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)boolean
1607010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)have_final_split (USHORT *units, USHORT unit_size)
1608010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles){
1609010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    USHORT unit_count;
1610010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    USHORT vowel_count;
1611010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1612010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    vowel_count = 0;
1613010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1614010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    /*
1615010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     *    Count all the vowels in the word.
1616010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     */
1617010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    for (unit_count = 0; unit_count <= unit_size; unit_count++)
1618010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     if (rules[units[unit_count]].flags & VOWEL)
1619010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         vowel_count++;
1620010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1621010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    /*
1622010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     * Return TRUE iff the only vowel was e, found at the end if the
1623010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     * word.
1624010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     */
1625010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return ((vowel_count == 1) &&
1626010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         (rules[units[unit_size]].flags & NO_FINAL_SPLIT));
1627010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1628010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1629010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1630010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
1631010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Generate next unit to password, making sure that it follows
1632010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * these rules:
1633010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *   1. Each syllable must contain exactly 1 or 2 consecutive
1634010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *      vowels, where y is considered a vowel.
1635010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *   2. Syllable end is determined as follows:
1636010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *        a. Vowel is generated and previous unit is a
1637010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *           consonant and syllable already has a vowel.  In
1638010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *           this case, new syllable is started and already
1639010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *           contains a vowel.
1640010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *        b. A pair determined to be a "break" pair is encountered.
1641010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *           In this case new syllable is started with second unit
1642010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *           of this pair.
1643010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *        c. End of password is encountered.
1644010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *        d. "begin" pair is encountered legally.  New syllable is
1645010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *           started with this pair.
1646010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *        e. "end" pair is legally encountered.  New syllable has
1647010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *           nothing yet.
1648010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *   3. Try generating another unit if:
1649010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *        a. third consecutive vowel and not y.
1650010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *        b. "break" pair generated but no vowel yet in current
1651010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *           or previous 2 units are "not_end".
1652010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *        c. "begin" pair generated but no vowel in syllable
1653010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *           preceding begin pair, or both previous 2 pairs are
1654010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *          designated "not_end".
1655010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *        d. "end" pair generated but no vowel in current syllable
1656010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *           or in "end" pair.
1657010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *        e. "not_begin" pair generated but new syllable must
1658010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *           begin (because previous syllable ended as defined in
1659010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *           2 above).
1660010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *        f. vowel is generated and 2a is satisfied, but no syllable
1661010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *           break is possible in previous 3 pairs.
1662010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *        g. Second and third units of syllable must begin, and
1663010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *           first unit is "alternate_vowel".
1664010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
1665010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)char *
1666010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gen_syllable (char *syllable, USHORT pwlen, USHORT *units_in_syllable,
1667010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              USHORT *syllable_length)
1668010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles){
1669010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    USHORT  unit = 0;
1670010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    SHORT   current_unit = 0;
1671010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    USHORT  vowel_count = 0;
1672010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    boolean rule_broken;
1673010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    boolean want_vowel;
1674010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    boolean want_another_unit;
1675010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    UINT    tries = 0;
1676010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    USHORT  last_unit = 0;
1677010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    SHORT   length_left = 0;
1678010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    USHORT  hold_saved_unit = 0;
1679010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    static  USHORT saved_unit;
1680010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    static  USHORT saved_pair[2];
1681010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1682010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    /*
1683010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     * This is needed if the saved_unit is tries and the syllable then
1684010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     * discarded because of the retry limit. Since the saved_unit is OK and
1685010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     * fits in nicely with the preceding syllable, we will always use it.
1686010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     */
1687010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    hold_saved_unit = saved_unit;
1688010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1689010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    /*
1690010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     * Loop until valid syllable is found.
1691010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     */
1692010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    do
1693010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {
1694010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /*
1695010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * Try for a new syllable.  Initialize all pertinent
1696010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * syllable variables.
1697010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      */
1698010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     tries = 0;
1699010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     saved_unit = hold_saved_unit;
1700010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     (void) strcpy (syllable, "");
1701010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     vowel_count = 0;
1702010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     current_unit = 0;
1703010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     length_left = (short int) pwlen;
1704010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     want_another_unit = TRUE;
1705010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1706010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /*
1707010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * This loop finds all the units for the syllable.
1708010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      */
1709010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     do
1710010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     {
1711010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         want_vowel = FALSE;
1712010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1713010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         /*
1714010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          * This loop continues until a valid unit is found for the
1715010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          * current position within the syllable.
1716010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          */
1717010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         do
1718010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         {
1719010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          /*
1720010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           * If there are saved_unit's from the previous
1721010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           * syllable, use them up first.
1722010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           */
1723010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          if (saved_unit != 0)
1724010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          {
1725010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              /*
1726010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               * If there were two saved units, the first is
1727010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               * guaranteed (by checks performed in the previous
1728010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               * syllable) to be valid.  We ignore the checks
1729010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               * and place it in this syllable manually.
1730010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               */
1731010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              if (saved_unit == 2)
1732010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              {
1733010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               units_in_syllable[0] = saved_pair[1];
1734010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               if (rules[saved_pair[1]].flags & VOWEL)
1735010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   vowel_count++;
1736010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               current_unit++;
1737010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               (void) strcpy (syllable, rules[saved_pair[1]].unit_code);
1738f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)               length_left -= (short) strlen (syllable);
1739010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              }
1740010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1741010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              /*
1742010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               * The unit becomes the last unit checked in the
1743010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               * previous syllable.
1744010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               */
1745010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              unit = saved_pair[0];
1746010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1747010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              /*
1748010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               * The saved units have been used.  Do not try to
1749010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               * reuse them in this syllable (unless this particular
1750010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               * syllable is rejected at which point we start to rebuild
1751010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               * it with these same saved units.
1752010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               */
1753010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              saved_unit = 0;
1754010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          }
1755010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          else
1756010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              /*
1757010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               * If we don't have to scoff the saved units,
1758010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               * we generate a Random one.  If we know it has
1759010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               * to be a vowel, we get one rather than looping
1760010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               * through until one shows up.
1761010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               */
1762010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              if (want_vowel)
1763010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               unit = random_unit (VOWEL);
1764010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              else
1765010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               unit = random_unit (NO_SPECIAL_RULE);
1766010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          length_left -= (short int) strlen (rules[unit].unit_code);
1767010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1768010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          /*
1769010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           * Prevent having a word longer than expected.
1770010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           */
1771010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          if (length_left < 0)
1772010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              rule_broken = TRUE;
1773010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          else
1774010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              rule_broken = FALSE;
1775010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1776010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          /*
1777010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           * First unit of syllable.  This is special because the
1778010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           * digram tests require 2 units and we don't have that yet.
1779010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           * Nevertheless, we can perform some checks.
1780010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           */
1781010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          if (current_unit == 0)
1782010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          {
1783010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              /*
1784010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               * If the shouldn't begin a syllable, don't
1785010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               * use it.
1786010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               */
1787010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              if (rules[unit].flags & NOT_BEGIN_SYLLABLE)
1788010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               rule_broken = TRUE;
1789010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              else
1790010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               /*
1791010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                * If this is the last unit of a word,
1792010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                * we have a one unit syllable.  Since each
1793010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                * syllable must have a vowel, we make sure
1794010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                * the unit is a vowel.  Otherwise, we
1795010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                * discard it.
1796010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                */
1797010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               if (length_left == 0)
1798010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	          {
1799010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   if (rules[unit].flags & VOWEL)
1800010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    want_another_unit = FALSE;
1801010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   else
1802010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    rule_broken = TRUE;
1803010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)		  }
1804010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          }
1805010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          else
1806010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          {
1807010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              /*
1808010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               * There are some digram tests that are
1809010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               * universally true.  We test them out.
1810010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               */
1811010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1812010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              /*
1813010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               * Reject ILLEGAL_PAIRS of units.
1814010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               */
1815010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              if ((ALLOWED (ILLEGAL_PAIR)) ||
1816010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1817010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              /*
1818010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               * Reject units that will be split between syllables
1819010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               * when the syllable has no vowels in it.
1820010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               */
1821010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   (ALLOWED (BREAK) && (vowel_count == 0)) ||
1822010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1823010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              /*
1824010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               * Reject a unit that will end a syllable when no
1825010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               * previous unit was a vowel and neither is this one.
1826010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               */
1827010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   (ALLOWED (END) && (vowel_count == 0) &&
1828010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    !(rules[unit].flags & VOWEL)))
1829010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               rule_broken = TRUE;
1830010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1831010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              if (current_unit == 1)
1832010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              {
1833010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               /*
1834010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                * Reject the unit if we are at te starting digram of
1835010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                * a syllable and it does not fit.
1836010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                */
1837010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               if (ALLOWED (NOT_BEGIN))
1838010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   rule_broken = TRUE;
1839010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              }
1840010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              else
1841010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              {
1842010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               /*
1843010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                * We are not at the start of a syllable.
1844010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                * Save the previous unit for later tests.
1845010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                */
1846010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               last_unit = units_in_syllable[current_unit - 1];
1847010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1848010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               /*
1849010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                * Do not allow syllables where the first letter is y
1850010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                * and the next pair can begin a syllable.  This may
1851010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                * lead to splits where y is left alone in a syllable.
1852010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                * Also, the combination does not sound to good even
1853010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                * if not split.
1854010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                */
1855010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               if (((current_unit == 2) &&
1856010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        (ALLOWED (BEGIN)) &&
1857010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        (rules[units_in_syllable[0]].flags &
1858010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         ALTERNATE_VOWEL)) ||
1859010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1860010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    /*
1861010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     * If this is the last unit of a word, we should
1862010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     * reject any digram that cannot end a syllable.
1863010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     */
1864010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    (ALLOWED (NOT_END) &&
1865010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        (length_left == 0)) ||
1866010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1867010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    /*
1868010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     * Reject the unit if the digram it forms wants
1869010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     * to break the syllable, but the resulting
1870010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     * digram that would end the syllable is not
1871010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     * allowed to end a syllable.
1872010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     */
1873010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    (ALLOWED (BREAK) &&
1874010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        (digram[units_in_syllable
1875010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                             [current_unit - 2]]
1876010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         [last_unit] &
1877010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         NOT_END)) ||
1878010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1879010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    /*
1880010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     * Reject the unit if the digram it forms
1881010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     * expects a vowel preceding it and there is
1882010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     * none.
1883010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     */
1884010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    (ALLOWED (PREFIX) &&
1885010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        !(rules[units_in_syllable
1886010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                             [current_unit - 2]].flags &
1887010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         VOWEL)))
1888010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   rule_broken = TRUE;
1889010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1890010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               /*
1891010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                * The following checks occur when the current unit
1892010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                * is a vowel and we are not looking at a word ending
1893010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                * with an e.
1894010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                */
1895010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               if (!rule_broken &&
1896010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    (rules[unit].flags & VOWEL) &&
1897010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    ((length_left > 0) ||
1898010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        !(rules[last_unit].flags &
1899010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         NO_FINAL_SPLIT)))
1900010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  {
1901010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   /*
1902010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    * Don't allow 3 consecutive vowels in a
1903010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    * syllable.  Although some words formed like this
1904010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    * are OK, like beau, most are not.
1905010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    */
1906010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   if ((vowel_count > 1) &&
1907010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        (rules[last_unit].flags & VOWEL))
1908010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    rule_broken = TRUE;
1909010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   else
1910010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    /*
1911010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     * Check for the case of
1912010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     * vowels-consonants-vowel, which is only
1913010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     * legal if the last vowel is an e and we are
1914010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     * the end of the word (wich is not
1915010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     * happening here due to a previous check.
1916010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     */
1917010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    if ((vowel_count != 0) &&
1918010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         !(rules[last_unit].flags & VOWEL))
1919010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    {
1920010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        /*
1921010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         * Try to save the vowel for the next
1922010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         * syllable, but if the syllable left here
1923010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         * is not proper (i.e., the resulting last
1924010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         * digram cannot legally end it), just
1925010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         * discard it and try for another.
1926010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         */
1927010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        if (digram[units_in_syllable
1928010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                              [current_unit - 2]]
1929010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                             [last_unit] &
1930010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                             NOT_END)
1931010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         rule_broken = TRUE;
1932010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        else
1933010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        {
1934010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         saved_unit = 1;
1935010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         saved_pair[0] = unit;
1936010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         want_another_unit = FALSE;
1937010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        }
1938010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    }
1939010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)		  }
1940010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              }
1941010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1942010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              /*
1943010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               * The unit picked and the digram formed are legal.
1944010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               * We now determine if we can end the syllable.  It may,
1945010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               * in some cases, mean the last unit(s) may be deferred to
1946010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               * the next syllable.  We also check here to see if the
1947010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               * digram formed expects a vowel to follow.
1948010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               */
1949010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              if (!rule_broken && want_another_unit)
1950010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              {
1951010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               /*
1952010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                * This word ends in a silent e.
1953010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                */
1954010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/******/        if (((vowel_count != 0) &&
1955010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     (rules[unit].flags & NO_FINAL_SPLIT) &&
1956010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     (length_left == 0) &&
1957010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    !(rules[last_unit].flags & VOWEL)) ||
1958010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1959010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    /*
1960010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     * This syllable ends either because the digram
1961010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     * is an END pair or we would otherwise exceed
1962010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     * the length of the word.
1963010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     */
1964010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    (ALLOWED (END) || (length_left == 0)))
1965010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)		   {
1966010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   want_another_unit = FALSE;
1967010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)		   }
1968010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)	       else
1969010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   /*
1970010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    * Since we have a vowel in the syllable
1971010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    * already, if the digram calls for the end of the
1972010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    * syllable, we can legally split it off. We also
1973010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    * make sure that we are not at the end of the
1974010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    * dangerous because that syllable may not have
1975010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    * vowels, or it may not be a legal syllable end,
1976010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    * and the retrying mechanism will loop infinitely
1977010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    * with the same digram.
1978010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    */
1979010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   if ((vowel_count != 0) && (length_left > 0))
1980010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   {
1981010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    /*
1982010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     * If we must begin a syllable, we do so if
1983010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     * the only vowel in THIS syllable is not part
1984010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     * of the digram we are pushing to the next
1985010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     * syllable.
1986010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     */
1987010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    if (ALLOWED (BEGIN) &&
1988010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         (current_unit > 1) &&
1989010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         !((vowel_count == 1) &&
1990010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         (rules[last_unit].flags & VOWEL)))
1991010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    {
1992010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        saved_unit = 2;
1993010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        saved_pair[0] = unit;
1994010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        saved_pair[1] = last_unit;
1995010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        want_another_unit = FALSE;
1996010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    }
1997010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    else
1998010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        if (ALLOWED (BREAK))
1999010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        {
2000010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         saved_unit = 1;
2001010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         saved_pair[0] = unit;
2002010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         want_another_unit = FALSE;
2003010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        }
2004010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   }
2005010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   else
2006010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    if (ALLOWED (SUFFIX))
2007010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)		     {
2008010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        want_vowel = TRUE;
2009010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)		     }
2010010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              }
2011010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          }
2012010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/********/
2013010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          tries++;
2014010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2015010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          /*
2016010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           * If this unit was illegal, redetermine the amount of
2017010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           * letters left to go in the word.
2018010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           */
2019010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          if (rule_broken)
2020010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              length_left += (short int) strlen (rules[unit].unit_code);
2021010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         }
2022010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         while (rule_broken && (tries <= MAX_RETRIES));
2023010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2024010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         /*
2025010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          * The unit fit OK.
2026010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          */
2027010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         if (tries <= MAX_RETRIES)
2028010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         {
2029010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          /*
2030010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           * If the unit were a vowel, count it in.
2031010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           * However, if the unit were a y and appear
2032010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           * at the start of the syllable, treat it
2033010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           * like a constant (so that words like year can
2034010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           * appear and not conflict with the 3 consecutive
2035010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           * vowel rule.
2036010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           */
2037010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          if ((rules[unit].flags & VOWEL) &&
2038010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               ((current_unit > 0) ||
2039010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   !(rules[unit].flags & ALTERNATE_VOWEL)))
2040010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              vowel_count++;
2041010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2042010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          /*
2043010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           * If a unit or units were to be saved, we must
2044010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           * adjust the syllable formed.  Otherwise, we
2045010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           * append the current unit to the syllable.
2046010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           */
2047010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          switch (saved_unit)
2048010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          {
2049010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              case 0:
2050010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               units_in_syllable[current_unit] = unit;
2051010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               (void) strcat (syllable, rules[unit].unit_code);
2052010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               break;
2053010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              case 1:
2054010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               current_unit--;
2055010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               break;
2056010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              case 2:
2057010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               (void) strcpy (&syllable[strlen (syllable) -
2058010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        strlen (rules[last_unit].unit_code)],"");
2059010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               length_left += (short int) strlen (rules[last_unit].unit_code);
2060010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               current_unit -= 2;
2061010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               break;
2062010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          }
2063010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         }
2064010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         else
2065010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         /*
2066010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          * Whoops!  Too many tries.  We set rule_broken so we can
2067010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          * loop in the outer loop and try another syllable.
2068010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          */
2069010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          rule_broken = TRUE;
2070010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2071010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         /*
2072010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          * ...and the syllable length grows.
2073010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          */
2074010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         *syllable_length = current_unit;
2075010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2076010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         current_unit++;
2077010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     }
2078010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     while ((tries <= MAX_RETRIES) && want_another_unit);
2079010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
2080010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    while (rule_broken ||
2081010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           illegal_placement (units_in_syllable, *syllable_length));
2082010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2083010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return (syllable);
2084010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2085010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2086010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2087010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
2088010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * This routine goes through an individual syllable and checks
2089010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * for illegal combinations of letters that go beyond looking
2090010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * at digrams.  We look at things like 3 consecutive vowels or
2091010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * consonants, or syllables with consonants between vowels (unless
2092010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * one of them is the final silent e).
2093010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
2094010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)boolean
2095010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)illegal_placement (USHORT *units, USHORT pwlen)
2096010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles){
2097010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    USHORT vowel_count;
2098010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    USHORT unit_count;
2099010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    boolean failure;
2100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    vowel_count = 0;
2102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    failure = FALSE;
2103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    for (unit_count = 0; !failure && (unit_count <= pwlen);
2105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         unit_count++)
2106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {
2107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     if (unit_count >= 1)
2108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     {
2109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         /*
2110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          * Don't allow vowels to be split with consonants in
2111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          * a single syllable.  If we find such a combination
2112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          * (except for the silent e) we have to discard the
2113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          * syllable).
2114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          */
2115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         if ((!(rules[units[unit_count - 1]].flags & VOWEL) &&
2116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               (rules[units[unit_count]].flags & VOWEL) &&
2117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               !((rules[units[unit_count]].flags & NO_FINAL_SPLIT) &&
2118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   (unit_count == pwlen)) && (vowel_count != 0)) ||
2119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         /*
2120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          * Perform these checks when we have at least 3 units.
2121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          */
2122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              ((unit_count >= 2) &&
2123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  /*
2125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   * Disallow 3 consecutive consonants.
2126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   */
2127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               ((!(rules[units[unit_count - 2]].flags & VOWEL) &&
2128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    !(rules[units[unit_count - 1]].flags &
2129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        VOWEL) &&
2130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    !(rules[units[unit_count]].flags &
2131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        VOWEL)) ||
2132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   /*
2134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    * Disallow 3 consecutive vowels, where the first is
2135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    * not a y.
2136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    */
2137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   (((rules[units[unit_count - 2]].flags &
2138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         VOWEL) &&
2139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        !((rules[units[0]].flags &
2140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                             ALTERNATE_VOWEL) &&
2141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         (unit_count == 2))) &&
2142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    (rules[units[unit_count - 1]].flags &
2143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        VOWEL) &&
2144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    (rules[units[unit_count]].flags &
2145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        VOWEL)))))
2146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          failure = TRUE;
2147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     }
2148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     /*
2150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * Count the vowels in the syllable.  As mentioned somewhere
2151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * above, exclude the initial y of a syllable.  Instead,
2152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * treat it as a consonant.
2153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      */
2154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     if ((rules[units[unit_count]].flags & VOWEL) &&
2155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          !((rules[units[0]].flags & ALTERNATE_VOWEL) &&
2156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              (unit_count == 0) && (pwlen != 0)))
2157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         vowel_count++;
2158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
2159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return (failure);
2161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
2166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * This is the standard Random unit generating routine for
2167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * gen_syllable().  It does not reference the digrams, but
2168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * assumes that it contains 34 units in a particular order.
2169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * This routine attempts to return unit indexes with a distribution
2170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * approaching that of the distribution of the 34 units in
2171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * English.  In order to do this, a Random number (supposedly
2172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * uniformly distributed) is used to do a table lookup into an
2173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * array containing unit indices.  There are 211 entries in
2174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * the array for the random_unit entry point.  The probability
2175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * of a particular unit being generated is equal to the
2176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * fraction of those 211 entries that contain that unit index.
2177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * For example, the letter `a' is unit number 1.  Since unit
2178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * index 1 appears 10 times in the array, the probability of
2179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * selecting an `a' is 10/211.
2180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *
2181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Changes may be made to the digram table without affect to this
2182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * procedure providing the letter-to-number correspondence of
2183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * the units does not change.  Likewise, the distribution of the
2184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * 34 units may be altered (and the array size may be changed)
2185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * in this procedure without affecting the digram table or any other
2186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * programs using the Random_word subroutine.
2187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
2188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static USHORT numbers[] =
2189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles){
2190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    1, 1, 1, 1, 1, 1, 1, 1,
2192010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2193010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
2194010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
2195010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    5, 5, 5, 5, 5, 5, 5, 5,
2196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    6, 6, 6, 6, 6, 6, 6, 6,
2197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    7, 7, 7, 7, 7, 7,
2198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
2199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    9, 9, 9, 9, 9, 9, 9, 9,
2200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    10, 10, 10, 10, 10, 10, 10, 10,
2201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    11, 11, 11, 11, 11, 11,
2202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    12, 12, 12, 12, 12, 12,
2203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
2204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
2205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    15, 15, 15, 15, 15, 15,
2206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
2207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    17, 17, 17, 17, 17, 17, 17, 17,
2208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
2209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    19, 19, 19, 19, 19, 19,
2210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    20, 20, 20, 20, 20, 20, 20, 20,
2211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    21, 21, 21, 21, 21, 21, 21, 21,
2212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    22,
2213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    23, 23, 23, 23, 23, 23, 23, 23,
2214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    24,
2215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    25,
2216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    26,
2217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    27,
2218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    28,
2219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    29, 29,
2220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    30,
2221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    31,
2222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    32,
2223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    33
2224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
2225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2226010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2227010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
2228010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * This structure has a typical English frequency of vowels.
2229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * The value of an entry is the vowel position (a=0, e=4, i=8,
2230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * o=14, u=19, y=23) in the rules array.  The number of times
2231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * the value appears is the frequency.  Thus, the letter "a"
2232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * is assumed to appear 2/12 = 1/6 of the time.  This array
2233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * may be altered if better data is obtained.  The routines that
2234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * use vowel_numbers will adjust to the size difference
2235010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)automatically.
2236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
2237010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static USHORT vowel_numbers[] =
2238010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles){
2239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    0, 0, 4, 4, 4, 8, 8, 14, 14, 19, 19, 23
2240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
2241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2242010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2243010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
2244010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Select a unit (a letter or a consonant group).  If a vowel is
2245010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * expected, use the vowel_numbers array rather than looping through
2246010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * the numbers array until a vowel is found.
2247010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
2248010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)USHORT
2249010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)random_unit (USHORT type)
2250010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles){
2251010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     USHORT number;
2252010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2253f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    /*
2254010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     * Sometimes, we are asked to explicitly get a vowel (i.e., if
2255010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     * a digram pair expects one following it).  This is a shortcut
2256010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     * to do that and avoid looping with rejected consonants.
2257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     */
2258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (type & VOWEL)
2259f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      number = vowel_numbers[
2260f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          base::RandInt(0, (sizeof (vowel_numbers) / sizeof (USHORT))-1)];
2261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    else
2262f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)     /*
2263010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      * Get any letter according to the English distribution.
2264010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      */
2265f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      number = numbers[
2266f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          base::RandInt(0, (sizeof (numbers) / sizeof (USHORT))-1)];
2267010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return (number);
2268010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2269