#ifdef USE_CALLOUT
-/* (?{...}[+-]) (?{{...}}[+-]) */
+/* (?{...}[tag][+-]) (?{{...}}[tag][+-]) */
static int
parse_callout_of_contents(Node** np, int cterm, UChar** src, UChar* end, ScanEnv* env)
{
OnigCodePoint c;
UChar* code_start;
UChar* code_end;
+ UChar* tag_start;
+ UChar* tag_end;
int brace_nest;
CalloutListEntry* e;
RegexExt* ext;
}
if (PEND) return ONIGERR_END_PATTERN_IN_GROUP;
+
PFETCH_S(c);
+ if (c == '[') {
+ if (PEND) return ONIGERR_END_PATTERN_IN_GROUP;
+ tag_start = p;
+ while (! PEND) {
+ if (PEND) return ONIGERR_END_PATTERN_IN_GROUP;
+ tag_end = p;
+ PFETCH_S(c);
+ if (c == ']') break;
+ }
+ if (! is_allowed_callout_tag_name(enc, tag_start, tag_end))
+ return ONIGERR_INVALID_CALLOUT_TAG_NAME;
+
+ if (PEND) return ONIGERR_END_PATTERN_IN_GROUP;
+ PFETCH_S(c);
+ }
+ else {
+ tag_start = tag_end = 0;
+ }
+
if (c == '+') {
in |= ONIG_CALLOUT_IN_RETRACTION;
if (PEND) return ONIGERR_END_PATTERN_IN_GROUP;
if (r != ONIG_NORMAL) return r;
}
+ if (tag_start != tag_end) {
+ r = callout_tag_entry(env->reg, tag_start, tag_end, num);
+ if (r != ONIG_NORMAL) return r;
+ }
+
r = node_new_callout(np, ONIG_CALLOUT_OF_CONTENTS, num, ONIG_NON_NAME_ID, env);
if (r != 0) return r;