+ else {
+ /* In case have to backtrack to beginning, then match '.' */
+ char *starting = locinput;
+
+ /* In case have to backtrack the last prepend */
+ char *previous_prepend = 0;
+
+ LOAD_UTF8_CHARCLASS_GCB();
+
+ /* Match (prepend)* */
+ while (locinput < PL_regeol
+ && swash_fetch(PL_utf8_X_prepend,
+ (U8*)locinput, do_utf8))
+ {
+ previous_prepend = locinput;
+ locinput += UTF8SKIP(locinput);
+ }
+
+ /* As noted above, if we matched a prepend character, but
+ * the next thing won't match, back off the last prepend we
+ * matched, as it is guaranteed to match the begin */
+ if (previous_prepend
+ && (locinput >= PL_regeol
+ || ! swash_fetch(PL_utf8_X_begin,
+ (U8*)locinput, do_utf8)))
+ {
+ locinput = previous_prepend;
+ }
+
+ /* Note that here we know PL_regeol > locinput, as we
+ * tested that upon input to this switch case, and if we
+ * moved locinput forward, we tested the result just above
+ * and it either passed, or we backed off so that it will
+ * now pass */
+ if (! swash_fetch(PL_utf8_X_begin, (U8*)locinput, do_utf8)) {
+
+ /* Here did not match the required 'Begin' in the
+ * second term. So just match the very first
+ * character, the '.' of the final term of the regex */
+ locinput = starting + UTF8SKIP(starting);
+ } else {
+
+ /* Here is the beginning of a character that can have
+ * an extender. It is either a hangul syllable, or a
+ * non-control */
+ if (swash_fetch(PL_utf8_X_non_hangul,
+ (U8*)locinput, do_utf8))
+ {
+
+ /* Here not a Hangul syllable, must be a
+ * ('! * Control') */
+ locinput += UTF8SKIP(locinput);
+ } else {
+
+ /* Here is a Hangul syllable. It can be composed
+ * of several individual characters. One
+ * possibility is T+ */
+ if (swash_fetch(PL_utf8_X_T,
+ (U8*)locinput, do_utf8))
+ {
+ while (locinput < PL_regeol
+ && swash_fetch(PL_utf8_X_T,
+ (U8*)locinput, do_utf8))
+ {
+ locinput += UTF8SKIP(locinput);
+ }
+ } else {
+
+ /* Here, not T+, but is a Hangul. That means
+ * it is one of the others: L, LV, LVT or V,
+ * and matches:
+ * L* (L | LVT T* | V V* T* | LV V* T*) */
+
+ /* Match L* */
+ while (locinput < PL_regeol
+ && swash_fetch(PL_utf8_X_L,
+ (U8*)locinput, do_utf8))
+ {
+ locinput += UTF8SKIP(locinput);
+ }
+
+ /* Here, have exhausted L*. If the next
+ * character is not an LV, LVT nor V, it means
+ * we had to have at least one L, so matches L+
+ * in the original equation, we have a complete
+ * hangul syllable. Are done. */
+
+ if (locinput < PL_regeol
+ && swash_fetch(PL_utf8_X_LV_LVT_V,
+ (U8*)locinput, do_utf8))
+ {
+
+ /* Otherwise keep going. Must be LV, LVT
+ * or V. See if LVT */
+ if (swash_fetch(PL_utf8_X_LVT,
+ (U8*)locinput, do_utf8))
+ {
+ locinput += UTF8SKIP(locinput);
+ } else {
+
+ /* Must be V or LV. Take it, then
+ * match V* */
+ locinput += UTF8SKIP(locinput);
+ while (locinput < PL_regeol
+ && swash_fetch(PL_utf8_X_V,
+ (U8*)locinput, do_utf8))
+ {
+ locinput += UTF8SKIP(locinput);
+ }
+ }
+
+ /* And any of LV, LVT, or V can be followed
+ * by T* */
+ while (locinput < PL_regeol
+ && swash_fetch(PL_utf8_X_T,
+ (U8*)locinput,
+ do_utf8))
+ {
+ locinput += UTF8SKIP(locinput);
+ }
+ }
+ }
+ }
+
+ /* Match any extender */
+ while (locinput < PL_regeol
+ && swash_fetch(PL_utf8_X_extend,
+ (U8*)locinput, do_utf8))
+ {
+ locinput += UTF8SKIP(locinput);
+ }
+ }
+ }
+ if (locinput > PL_regeol) sayNO;