srclib/pcre/pcre.c:2936: error: UNINITIALIZED_VALUE
  The value read from bralenstack[_] was never initialized.

srclib/pcre/pcre.c:2936:9: 
2934.         {
2935.         duplength = length - brastack[--brastackptr];
2936.         branch_extra = bralenstack[brastackptr];
              ^
2937.         }
2938.       else duplength = 0;

pcre *
pcre_compile(const char *pattern, int options, const char **errorptr,
  int *erroroffset, const unsigned char *tables)
{
real_pcre *re;
int length = 3;
int runlength;
int c, reqchar, countlits;
int bracount = 0;
int top_backref = 0;
int branch_extra = 0;
int branch_newextra;
unsigned int brastackptr = 0;
size_t size;
uschar *code;
const uschar *ptr;
compile_data compile_block;
int brastack[BRASTACK_SIZE];
uschar bralenstack[BRASTACK_SIZE];
#ifdef DEBUG
uschar *code_base, *code_end;
#endif
#ifndef SUPPORT_UTF8
if ((options & PCRE_UTF8) != 0)
  {
  *errorptr = ERR32;
  return NULL;
  }
#endif
if (errorptr == NULL) return NULL;
*errorptr = NULL;
if (erroroffset == NULL)
  {
  *errorptr = ERR16;
  return NULL;
  }
*erroroffset = 0;
if ((options & ~PUBLIC_OPTIONS) != 0)
  {
  *errorptr = ERR17;
  return NULL;
  }
if (tables == NULL) tables = pcre_default_tables;
compile_block.lcc = tables + lcc_offset;
compile_block.fcc = tables + fcc_offset;
compile_block.cbits = tables + cbits_offset;
compile_block.ctypes = tables + ctypes_offset;
DPRINTF(("------------------------------------------------------------------\n"));
DPRINTF(("%s\n", pattern));
ptr = (const uschar *)(pattern - 1);
while ((c = *(++ptr)) != 0)
  {
  int min, max;
  int class_charcount;
  int bracket_length;
  if ((options & PCRE_EXTENDED) != 0)
    {
    if ((compile_block.ctypes[c] & ctype_space) != 0) continue;
    if (c == '#')
      {
      while ((c = *(++ptr)) != 0 && c != NEWLINE) ;
      continue;
      }
    }
  switch(c)
    {
    case '\\':
      {
      const uschar *save_ptr = ptr;
      c = check_escape(&ptr, errorptr, bracount, options, FALSE, &compile_block);
      if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
      if (c >= 0)
        {
        ptr = save_ptr;
        c = '\\';
        goto NORMAL_CHAR;
        }
      }
    length++;
    if (c <= -ESC_REF)
      {
      int refnum = -c - ESC_REF;
      if (refnum > top_backref) top_backref = refnum;
      length += 2;
      if (ptr[1] == '{' && is_counted_repeat(ptr+2, &compile_block))
        {
        ptr = read_repeat_counts(ptr+2, &min, &max, errorptr, &compile_block);
        if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
        if ((min == 0 && (max == 1 || max == -1)) ||
          (min == 1 && max == -1))
            length++;
        else length += 5;
        if (ptr[1] == '?') ptr++;
        }
      }
    continue;
    case '^':
    case '.':
    case '$':
    case '*':
    case '+':
    case '?':
    length++;
    continue;
    case '{':
    if (!is_counted_repeat(ptr+1, &compile_block)) goto NORMAL_CHAR;
    ptr = read_repeat_counts(ptr+1, &min, &max, errorptr, &compile_block);
    if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
    if ((min == 0 && (max == 1 || max == -1)) ||
      (min == 1 && max == -1))
        length++;
    else
      {
      length--;
      if (min == 1) length++; else if (min > 0) length += 4;
      if (max > 0) length += 4; else length += 2;
      }
    if (ptr[1] == '?') ptr++;
    continue;
    case '|':
    length += 3 + branch_extra;
    continue;
    case '[':
    class_charcount = 0;
    if (*(++ptr) == '^') ptr++;
    do
      {
      if (*ptr == '\\')
        {
        int ch = check_escape(&ptr, errorptr, bracount, options, TRUE,
          &compile_block);
        if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
        if (-ch == ESC_b) class_charcount++; else class_charcount = 10;
        }
      else class_charcount++;
      ptr++;
      }
    while (*ptr != 0 && *ptr != ']');
    if (class_charcount == 1) length += 3; else
      {
      length += 33;
      if (*ptr != 0 && ptr[1] == '{' && is_counted_repeat(ptr+2, &compile_block))
        {
        ptr = read_repeat_counts(ptr+2, &min, &max, errorptr, &compile_block);
        if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
        if ((min == 0 && (max == 1 || max == -1)) ||
          (min == 1 && max == -1))
            length++;
        else length += 5;
        if (ptr[1] == '?') ptr++;
        }
      }
    continue;
    case '(':
    branch_newextra = 0;
    bracket_length = 3;
    if (ptr[1] == '?')
      {
      int set, unset;
      int *optset;
      switch (c = ptr[2])
        {
        case '#':
        ptr += 3;
        while (*ptr != 0 && *ptr != ')') ptr++;
        if (*ptr == 0)
          {
          *errorptr = ERR18;
          goto PCRE_ERROR_RETURN;
          }
        continue;
        case ':':
        case '=':
        case '!':
        case '>':
        ptr += 2;
        break;
        case 'R':
        if (ptr[3] != ')')
          {
          *errorptr = ERR29;
          goto PCRE_ERROR_RETURN;
          }
        ptr += 3;
        length += 1;
        break;
        case '<':
        if (ptr[3] == '=' || ptr[3] == '!')
          {
          ptr += 3;
          branch_newextra = 3;
          length += 3;
          break;
          }
        *errorptr = ERR24;
        goto PCRE_ERROR_RETURN;
        case '(':
        if ((compile_block.ctypes[ptr[3]] & ctype_digit) != 0)
          {
          ptr += 4;
          length += 3;
          while ((compile_block.ctypes[*ptr] & ctype_digit) != 0) ptr++;
          if (*ptr != ')')
            {
            *errorptr = ERR26;
            goto PCRE_ERROR_RETURN;
            }
          }
        else
          {
          ptr++;
          if (ptr[2] != '?' ||
             (ptr[3] != '=' && ptr[3] != '!' && ptr[3] != '<') )
            {
            ptr += 2;
            *errorptr = ERR28;
            goto PCRE_ERROR_RETURN;
            }
          }
        break;
        default:
        set = unset = 0;
        optset = &set;
        ptr += 2;
        for (;; ptr++)
          {
          c = *ptr;
          switch (c)
            {
            case 'i':
            *optset |= PCRE_CASELESS;
            continue;
            case 'm':
            *optset |= PCRE_MULTILINE;
            continue;
            case 's':
            *optset |= PCRE_DOTALL;
            continue;
            case 'x':
            *optset |= PCRE_EXTENDED;
            continue;
            case 'X':
            *optset |= PCRE_EXTRA;
            continue;
            case 'U':
            *optset |= PCRE_UNGREEDY;
            continue;
            case '-':
            optset = &unset;
            continue;
            case ')':
            if (brastackptr == 0)
              {
              options = (options | set) & (~unset);
              set = unset = 0;
              }
            case ':':
            if (((set|unset) & PCRE_IMS) != 0)
              {
              length += 4;
              branch_newextra = 2;
              if (((set|unset) & PCRE_CASELESS) != 0) options |= PCRE_ICHANGED;
              }
            goto END_OPTIONS;
            default:
            *errorptr = ERR12;
            goto PCRE_ERROR_RETURN;
            }
          }
        END_OPTIONS:
        if (c == ')')
          {
          if (branch_newextra == 2 && (branch_extra == 0 || branch_extra == 3))
            branch_extra += branch_newextra;
          continue;
          }
        }
      }
    else
      {
      bracount++;
      if (bracount > EXTRACT_BASIC_MAX) bracket_length += 3;
      }
    if (brastackptr >= sizeof(brastack)/sizeof(int))
      {
      *errorptr = ERR19;
      goto PCRE_ERROR_RETURN;
      }
    bralenstack[brastackptr] = branch_extra;
    branch_extra = branch_newextra;
    brastack[brastackptr++] = length;
    length += bracket_length;
    continue;
    case ')':
    length += 3;
      {
      int minval = 1;
      int maxval = 1;
      int duplength;
      if (brastackptr > 0)
        {
        duplength = length - brastack[--brastackptr];
        branch_extra = bralenstack[brastackptr];
        }
      else duplength = 0;
      if ((c = ptr[1]) == '{' && is_counted_repeat(ptr+2, &compile_block))
        {
        ptr = read_repeat_counts(ptr+2, &minval, &maxval, errorptr,
          &compile_block);
        if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
        }
      else if (c == '*') { minval = 0; maxval = -1; ptr++; }
      else if (c == '+') { maxval = -1; ptr++; }
      else if (c == '?') { minval = 0; ptr++; }
      if (minval == 0)
        {
        length++;
        if (maxval > 0) length += (maxval - 1) * (duplength + 7);
        }
      else
        {
        length += (minval - 1) * duplength;
        if (maxval > minval)
          length += (maxval - minval) * (duplength + 7) - 6;
        }
      }
    continue;
    NORMAL_CHAR:
    default:
    length += 2;
    runlength = 0;
    do
      {
      if ((options & PCRE_EXTENDED) != 0)
        {
        if ((compile_block.ctypes[c] & ctype_space) != 0) continue;
        if (c == '#')
          {
          while ((c = *(++ptr)) != 0 && c != NEWLINE) ;
          continue;
          }
        }
      if (c == '\\')
        {
        const uschar *saveptr = ptr;
        c = check_escape(&ptr, errorptr, bracount, options, FALSE,
          &compile_block);
        if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
        if (c < 0) { ptr = saveptr; break; }
#ifdef SUPPORT_UTF8
        if (c > 127 && (options & PCRE_UTF8) != 0)
          {
          int i;
          for (i = 0; i < sizeof(utf8_table1)/sizeof(int); i++)
            if (c <= utf8_table1[i]) break;
          runlength += i;
          }
#endif
        }
      runlength++;
      }
    while (runlength < MAXLIT &&
      (compile_block.ctypes[c = *(++ptr)] & ctype_meta) == 0);
    ptr--;
    length += runlength;
    continue;
    }
  }
length += 4;
if (length > 65539)
  {
  *errorptr = ERR20;
  return NULL;
  }
size = length + offsetof(real_pcre, code[0]);
re = (real_pcre *)(pcre_malloc)(size);
if (re == NULL)
  {
  *errorptr = ERR21;
  return NULL;
  }
re->magic_number = MAGIC_NUMBER;
re->size = size;
re->options = options;
re->tables = tables;
ptr = (const uschar *)pattern;
code = re->code;
*code = OP_BRA;
bracount = 0;
(void)compile_regex(options, -1, &bracount, &code, &ptr, errorptr, FALSE, 0,
  &reqchar, &countlits, &compile_block);
re->top_bracket = bracount;
re->top_backref = top_backref;
if (*errorptr == NULL && *ptr != 0) *errorptr = ERR22;
*code++ = OP_END;
#ifndef DEBUG
if (code - re->code > length) *errorptr = ERR23;
#endif
if (top_backref > re->top_bracket) *errorptr = ERR15;
if (*errorptr != NULL)
  {
  (pcre_free)(re);
  PCRE_ERROR_RETURN:
  *erroroffset = ptr - (const uschar *)pattern;
  return NULL;
  }
if ((options & PCRE_ANCHORED) == 0)
  {
  int temp_options = options;
  if (is_anchored(re->code, &temp_options))
    re->options |= PCRE_ANCHORED;
  else
    {
    int ch = find_firstchar(re->code, &temp_options);
    if (ch >= 0)
      {
      re->first_char = ch;
      re->options |= PCRE_FIRSTSET;
      }
    else if (is_startline(re->code))
      re->options |= PCRE_STARTLINE;
    }
  }
if (reqchar >= 0 && (countlits > 1 || (re->options & PCRE_FIRSTSET) == 0))
  {
  re->req_char = reqchar;
  re->options |= PCRE_REQCHSET;
  }
#ifdef DEBUG
printf("Length = %d top_bracket = %d top_backref = %d\n",
  length, re->top_bracket, re->top_backref);
if (re->options != 0)
  {
  printf("%s%s%s%s%s%s%s%s%s\n",
    ((re->options & PCRE_ANCHORED) != 0)? "anchored " : "",
    ((re->options & PCRE_CASELESS) != 0)? "caseless " : "",
    ((re->options & PCRE_ICHANGED) != 0)? "case state changed " : "",
    ((re->options & PCRE_EXTENDED) != 0)? "extended " : "",
    ((re->options & PCRE_MULTILINE) != 0)? "multiline " : "",
    ((re->options & PCRE_DOTALL) != 0)? "dotall " : "",
    ((re->options & PCRE_DOLLAR_ENDONLY) != 0)? "endonly " : "",
    ((re->options & PCRE_EXTRA) != 0)? "extra " : "",
    ((re->options & PCRE_UNGREEDY) != 0)? "ungreedy " : "");
  }
if ((re->options & PCRE_FIRSTSET) != 0)
  {
  if (isprint(re->first_char)) printf("First char = %c\n", re->first_char);
    else printf("First char = \\x%02x\n", re->first_char);
  }
if ((re->options & PCRE_REQCHSET) != 0)
  {
  if (isprint(re->req_char)) printf("Req char = %c\n", re->req_char);
    else printf("Req char = \\x%02x\n", re->req_char);
  }
code_end = code;
code_base = code = re->code;
while (code < code_end)
  {
  int charlength;
  printf("%3d ", code - code_base);
  if (*code >= OP_BRA)
    {
    if (*code - OP_BRA > EXTRACT_BASIC_MAX)
      printf("%3d Bra extra", (code[1] << 8) + code[2]);
    else
      printf("%3d Bra %d", (code[1] << 8) + code[2], *code - OP_BRA);
    code += 2;
    }
  else switch(*code)
    {
    case OP_OPT:
    printf(" %.2x %s", code[1], OP_names[*code]);
    code++;
    break;
    case OP_CHARS:
    charlength = *(++code);
    printf("%3d ", charlength);
    while (charlength-- > 0)
      if (isprint(c = *(++code))) printf("%c", c); else printf("\\x%02x", c);
    break;
    case OP_KETRMAX:
    case OP_KETRMIN:
    case OP_ALT:
    case OP_KET:
    case OP_ASSERT:
    case OP_ASSERT_NOT:
    case OP_ASSERTBACK:
    case OP_ASSERTBACK_NOT:
    case OP_ONCE:
    case OP_REVERSE:
    case OP_BRANUMBER:
    case OP_COND:
    case OP_CREF:
    printf("%3d %s", (code[1] << 8) + code[2], OP_names[*code]);
    code += 2;
    break;
    case OP_STAR:
    case OP_MINSTAR:
    case OP_PLUS:
    case OP_MINPLUS:
    case OP_QUERY:
    case OP_MINQUERY:
    case OP_TYPESTAR:
    case OP_TYPEMINSTAR:
    case OP_TYPEPLUS:
    case OP_TYPEMINPLUS:
    case OP_TYPEQUERY:
    case OP_TYPEMINQUERY:
    if (*code >= OP_TYPESTAR)
      printf("    %s", OP_names[code[1]]);
    else if (isprint(c = code[1])) printf("    %c", c);
      else printf("    \\x%02x", c);
    printf("%s", OP_names[*code++]);
    break;
    case OP_EXACT:
    case OP_UPTO:
    case OP_MINUPTO:
    if (isprint(c = code[3])) printf("    %c{", c);
      else printf("    \\x%02x{", c);
    if (*code != OP_EXACT) printf("0,");
    printf("%d}", (code[1] << 8) + code[2]);
    if (*code == OP_MINUPTO) printf("?");
    code += 3;
    break;
    case OP_TYPEEXACT:
    case OP_TYPEUPTO:
    case OP_TYPEMINUPTO:
    printf("    %s{", OP_names[code[3]]);
    if (*code != OP_TYPEEXACT) printf(",");
    printf("%d}", (code[1] << 8) + code[2]);
    if (*code == OP_TYPEMINUPTO) printf("?");
    code += 3;
    break;
    case OP_NOT:
    if (isprint(c = *(++code))) printf("    [^%c]", c);
      else printf("    [^\\x%02x]", c);
    break;
    case OP_NOTSTAR:
    case OP_NOTMINSTAR:
    case OP_NOTPLUS:
    case OP_NOTMINPLUS:
    case OP_NOTQUERY:
    case OP_NOTMINQUERY:
    if (isprint(c = code[1])) printf("    [^%c]", c);
      else printf("    [^\\x%02x]", c);
    printf("%s", OP_names[*code++]);
    break;
    case OP_NOTEXACT:
    case OP_NOTUPTO:
    case OP_NOTMINUPTO:
    if (isprint(c = code[3])) printf("    [^%c]{", c);
      else printf("    [^\\x%02x]{", c);
    if (*code != OP_NOTEXACT) printf(",");
    printf("%d}", (code[1] << 8) + code[2]);
    if (*code == OP_NOTMINUPTO) printf("?");
    code += 3;
    break;
    case OP_REF:
    printf("    \\%d", (code[1] << 8) | code[2]);
    code += 3;
    goto CLASS_REF_REPEAT;
    case OP_CLASS:
      {
      int i, min, max;
      code++;
      printf("    [");
      for (i = 0; i < 256; i++)
        {
        if ((code[i/8] & (1 << (i&7))) != 0)
          {
          int j;
          for (j = i+1; j < 256; j++)
            if ((code[j/8] & (1 << (j&7))) == 0) break;
          if (i == '-' || i == ']') printf("\\");
          if (isprint(i)) printf("%c", i); else printf("\\x%02x", i);
          if (--j > i)
            {
            printf("-");
            if (j == '-' || j == ']') printf("\\");
            if (isprint(j)) printf("%c", j); else printf("\\x%02x", j);
            }
          i = j;
          }
        }
      printf("]");
      code += 32;
      CLASS_REF_REPEAT:
      switch(*code)
        {
        case OP_CRSTAR:
        case OP_CRMINSTAR:
        case OP_CRPLUS:
        case OP_CRMINPLUS:
        case OP_CRQUERY:
        case OP_CRMINQUERY:
        printf("%s", OP_names[*code]);
        break;
        case OP_CRRANGE:
        case OP_CRMINRANGE:
        min = (code[1] << 8) + code[2];
        max = (code[3] << 8) + code[4];
        if (max == 0) printf("{%d,}", min);
        else printf("{%d,%d}", min, max);
        if (*code == OP_CRMINRANGE) printf("?");
        code += 4;
        break;
        default:
        code--;
        }
      }
    break;
    default:
    printf("    %s", OP_names[*code]);
    break;
    }
  code++;
  printf("\n");
  }
printf("------------------------------------------------------------------\n");
if (code - re->code > length)
  {
  *errorptr = ERR23;
  (pcre_free)(re);
  *erroroffset = ptr - (uschar *)pattern;
  return NULL;
  }
#endif
return (pcre *)re;
}
['pcre *\npcre_compile(const char *pattern, int options, const char **errorptr,\n  int *erroroffset, const unsigned char *tables)\n{\nreal_pcre *re;\nint length = 3;\nint runlength;\nint c, reqchar, countlits;\nint bracount = 0;\nint top_backref = 0;\nint branch_extra = 0;\nint branch_newextra;\nunsigned int brastackptr = 0;\nsize_t size;\nuschar *code;\nconst uschar *ptr;\ncompile_data compile_block;\nint brastack[BRASTACK_SIZE];\nuschar bralenstack[BRASTACK_SIZE];\n#ifdef DEBUG\nuschar *code_base, *code_end;\n#endif\n#ifndef SUPPORT_UTF8\nif ((options & PCRE_UTF8) != 0)\n  {\n  *errorptr = ERR32;\n  return NULL;\n  }\n#endif\nif (errorptr == NULL) return NULL;\n*errorptr = NULL;\nif (erroroffset == NULL)\n  {\n  *errorptr = ERR16;\n  return NULL;\n  }\n*erroroffset = 0;\nif ((options & ~PUBLIC_OPTIONS) != 0)\n  {\n  *errorptr = ERR17;\n  return NULL;\n  }\nif (tables == NULL) tables = pcre_default_tables;\ncompile_block.lcc = tables + lcc_offset;\ncompile_block.fcc = tables + fcc_offset;\ncompile_block.cbits = tables + cbits_offset;\ncompile_block.ctypes = tables + ctypes_offset;\nDPRINTF(("------------------------------------------------------------------\\n"));\nDPRINTF(("%s\\n", pattern));\nptr = (const uschar *)(pattern - 1);\nwhile ((c = *(++ptr)) != 0)\n  {\n  int min, max;\n  int class_charcount;\n  int bracket_length;\n  if ((options & PCRE_EXTENDED) != 0)\n    {\n    if ((compile_block.ctypes[c] & ctype_space) != 0) continue;\n    if (c == \'#\')\n      {\n      while ((c = *(++ptr)) != 0 && c != NEWLINE) ;\n      continue;\n      }\n    }\n  switch(c)\n    {\n    case \'\\\\\':\n      {\n      const uschar *save_ptr = ptr;\n      c = check_escape(&ptr, errorptr, bracount, options, FALSE, &compile_block);\n      if (*errorptr != NULL) goto PCRE_ERROR_RETURN;\n      if (c >= 0)\n        {\n        ptr = save_ptr;\n        c = \'\\\\\';\n        goto NORMAL_CHAR;\n        }\n      }\n    length++;\n    if (c <= -ESC_REF)\n      {\n      int refnum = -c - ESC_REF;\n      if (refnum > top_backref) top_backref = refnum;\n      length += 2;\n      if (ptr[1] == \'{\' && is_counted_repeat(ptr+2, &compile_block))\n        {\n        ptr = read_repeat_counts(ptr+2, &min, &max, errorptr, &compile_block);\n        if (*errorptr != NULL) goto PCRE_ERROR_RETURN;\n        if ((min == 0 && (max == 1 || max == -1)) ||\n          (min == 1 && max == -1))\n            length++;\n        else length += 5;\n        if (ptr[1] == \'?\') ptr++;\n        }\n      }\n    continue;\n    case \'^\':\n    case \'.\':\n    case \'$\':\n    case \'*\':\n    case \'+\':\n    case \'?\':\n    length++;\n    continue;\n    case \'{\':\n    if (!is_counted_repeat(ptr+1, &compile_block)) goto NORMAL_CHAR;\n    ptr = read_repeat_counts(ptr+1, &min, &max, errorptr, &compile_block);\n    if (*errorptr != NULL) goto PCRE_ERROR_RETURN;\n    if ((min == 0 && (max == 1 || max == -1)) ||\n      (min == 1 && max == -1))\n        length++;\n    else\n      {\n      length--;\n      if (min == 1) length++; else if (min > 0) length += 4;\n      if (max > 0) length += 4; else length += 2;\n      }\n    if (ptr[1] == \'?\') ptr++;\n    continue;\n    case \'|\':\n    length += 3 + branch_extra;\n    continue;\n    case \'[\':\n    class_charcount = 0;\n    if (*(++ptr) == \'^\') ptr++;\n    do\n      {\n      if (*ptr == \'\\\\\')\n        {\n        int ch = check_escape(&ptr, errorptr, bracount, options, TRUE,\n          &compile_block);\n        if (*errorptr != NULL) goto PCRE_ERROR_RETURN;\n        if (-ch == ESC_b) class_charcount++; else class_charcount = 10;\n        }\n      else class_charcount++;\n      ptr++;\n      }\n    while (*ptr != 0 && *ptr != \']\');\n    if (class_charcount == 1) length += 3; else\n      {\n      length += 33;\n      if (*ptr != 0 && ptr[1] == \'{\' && is_counted_repeat(ptr+2, &compile_block))\n        {\n        ptr = read_repeat_counts(ptr+2, &min, &max, errorptr, &compile_block);\n        if (*errorptr != NULL) goto PCRE_ERROR_RETURN;\n        if ((min == 0 && (max == 1 || max == -1)) ||\n          (min == 1 && max == -1))\n            length++;\n        else length += 5;\n        if (ptr[1] == \'?\') ptr++;\n        }\n      }\n    continue;\n    case \'(\':\n    branch_newextra = 0;\n    bracket_length = 3;\n    if (ptr[1] == \'?\')\n      {\n      int set, unset;\n      int *optset;\n      switch (c = ptr[2])\n        {\n        case \'#\':\n        ptr += 3;\n        while (*ptr != 0 && *ptr != \')\') ptr++;\n        if (*ptr == 0)\n          {\n          *errorptr = ERR18;\n          goto PCRE_ERROR_RETURN;\n          }\n        continue;\n        case \':\':\n        case \'=\':\n        case \'!\':\n        case \'>\':\n        ptr += 2;\n        break;\n        case \'R\':\n        if (ptr[3] != \')\')\n          {\n          *errorptr = ERR29;\n          goto PCRE_ERROR_RETURN;\n          }\n        ptr += 3;\n        length += 1;\n        break;\n        case \'<\':\n        if (ptr[3] == \'=\' || ptr[3] == \'!\')\n          {\n          ptr += 3;\n          branch_newextra = 3;\n          length += 3;\n          break;\n          }\n        *errorptr = ERR24;\n        goto PCRE_ERROR_RETURN;\n        case \'(\':\n        if ((compile_block.ctypes[ptr[3]] & ctype_digit) != 0)\n          {\n          ptr += 4;\n          length += 3;\n          while ((compile_block.ctypes[*ptr] & ctype_digit) != 0) ptr++;\n          if (*ptr != \')\')\n            {\n            *errorptr = ERR26;\n            goto PCRE_ERROR_RETURN;\n            }\n          }\n        else\n          {\n          ptr++;\n          if (ptr[2] != \'?\' ||\n             (ptr[3] != \'=\' && ptr[3] != \'!\' && ptr[3] != \'<\') )\n            {\n            ptr += 2;\n            *errorptr = ERR28;\n            goto PCRE_ERROR_RETURN;\n            }\n          }\n        break;\n        default:\n        set = unset = 0;\n        optset = &set;\n        ptr += 2;\n        for (;; ptr++)\n          {\n          c = *ptr;\n          switch (c)\n            {\n            case \'i\':\n            *optset |= PCRE_CASELESS;\n            continue;\n            case \'m\':\n            *optset |= PCRE_MULTILINE;\n            continue;\n            case \'s\':\n            *optset |= PCRE_DOTALL;\n            continue;\n            case \'x\':\n            *optset |= PCRE_EXTENDED;\n            continue;\n            case \'X\':\n            *optset |= PCRE_EXTRA;\n            continue;\n            case \'U\':\n            *optset |= PCRE_UNGREEDY;\n            continue;\n            case \'-\':\n            optset = &unset;\n            continue;\n            case \')\':\n            if (brastackptr == 0)\n              {\n              options = (options | set) & (~unset);\n              set = unset = 0;\n              }\n            case \':\':\n            if (((set|unset) & PCRE_IMS) != 0)\n              {\n              length += 4;\n              branch_newextra = 2;\n              if (((set|unset) & PCRE_CASELESS) != 0) options |= PCRE_ICHANGED;\n              }\n            goto END_OPTIONS;\n            default:\n            *errorptr = ERR12;\n            goto PCRE_ERROR_RETURN;\n            }\n          }\n        END_OPTIONS:\n        if (c == \')\')\n          {\n          if (branch_newextra == 2 && (branch_extra == 0 || branch_extra == 3))\n            branch_extra += branch_newextra;\n          continue;\n          }\n        }\n      }\n    else\n      {\n      bracount++;\n      if (bracount > EXTRACT_BASIC_MAX) bracket_length += 3;\n      }\n    if (brastackptr >= sizeof(brastack)/sizeof(int))\n      {\n      *errorptr = ERR19;\n      goto PCRE_ERROR_RETURN;\n      }\n    bralenstack[brastackptr] = branch_extra;\n    branch_extra = branch_newextra;\n    brastack[brastackptr++] = length;\n    length += bracket_length;\n    continue;\n    case \')\':\n    length += 3;\n      {\n      int minval = 1;\n      int maxval = 1;\n      int duplength;\n      if (brastackptr > 0)\n        {\n        duplength = length - brastack[--brastackptr];\n        branch_extra = bralenstack[brastackptr];\n        }\n      else duplength = 0;\n      if ((c = ptr[1]) == \'{\' && is_counted_repeat(ptr+2, &compile_block))\n        {\n        ptr = read_repeat_counts(ptr+2, &minval, &maxval, errorptr,\n          &compile_block);\n        if (*errorptr != NULL) goto PCRE_ERROR_RETURN;\n        }\n      else if (c == \'*\') { minval = 0; maxval = -1; ptr++; }\n      else if (c == \'+\') { maxval = -1; ptr++; }\n      else if (c == \'?\') { minval = 0; ptr++; }\n      if (minval == 0)\n        {\n        length++;\n        if (maxval > 0) length += (maxval - 1) * (duplength + 7);\n        }\n      else\n        {\n        length += (minval - 1) * duplength;\n        if (maxval > minval)\n          length += (maxval - minval) * (duplength + 7) - 6;\n        }\n      }\n    continue;\n    NORMAL_CHAR:\n    default:\n    length += 2;\n    runlength = 0;\n    do\n      {\n      if ((options & PCRE_EXTENDED) != 0)\n        {\n        if ((compile_block.ctypes[c] & ctype_space) != 0) continue;\n        if (c == \'#\')\n          {\n          while ((c = *(++ptr)) != 0 && c != NEWLINE) ;\n          continue;\n          }\n        }\n      if (c == \'\\\\\')\n        {\n        const uschar *saveptr = ptr;\n        c = check_escape(&ptr, errorptr, bracount, options, FALSE,\n          &compile_block);\n        if (*errorptr != NULL) goto PCRE_ERROR_RETURN;\n        if (c < 0) { ptr = saveptr; break; }\n#ifdef SUPPORT_UTF8\n        if (c > 127 && (options & PCRE_UTF8) != 0)\n          {\n          int i;\n          for (i = 0; i < sizeof(utf8_table1)/sizeof(int); i++)\n            if (c <= utf8_table1[i]) break;\n          runlength += i;\n          }\n#endif\n        }\n      runlength++;\n      }\n    while (runlength < MAXLIT &&\n      (compile_block.ctypes[c = *(++ptr)] & ctype_meta) == 0);\n    ptr--;\n    length += runlength;\n    continue;\n    }\n  }\nlength += 4;\nif (length > 65539)\n  {\n  *errorptr = ERR20;\n  return NULL;\n  }\nsize = length + offsetof(real_pcre, code[0]);\nre = (real_pcre *)(pcre_malloc)(size);\nif (re == NULL)\n  {\n  *errorptr = ERR21;\n  return NULL;\n  }\nre->magic_number = MAGIC_NUMBER;\nre->size = size;\nre->options = options;\nre->tables = tables;\nptr = (const uschar *)pattern;\ncode = re->code;\n*code = OP_BRA;\nbracount = 0;\n(void)compile_regex(options, -1, &bracount, &code, &ptr, errorptr, FALSE, 0,\n  &reqchar, &countlits, &compile_block);\nre->top_bracket = bracount;\nre->top_backref = top_backref;\nif (*errorptr == NULL && *ptr != 0) *errorptr = ERR22;\n*code++ = OP_END;\n#ifndef DEBUG\nif (code - re->code > length) *errorptr = ERR23;\n#endif\nif (top_backref > re->top_bracket) *errorptr = ERR15;\nif (*errorptr != NULL)\n  {\n  (pcre_free)(re);\n  PCRE_ERROR_RETURN:\n  *erroroffset = ptr - (const uschar *)pattern;\n  return NULL;\n  }\nif ((options & PCRE_ANCHORED) == 0)\n  {\n  int temp_options = options;\n  if (is_anchored(re->code, &temp_options))\n    re->options |= PCRE_ANCHORED;\n  else\n    {\n    int ch = find_firstchar(re->code, &temp_options);\n    if (ch >= 0)\n      {\n      re->first_char = ch;\n      re->options |= PCRE_FIRSTSET;\n      }\n    else if (is_startline(re->code))\n      re->options |= PCRE_STARTLINE;\n    }\n  }\nif (reqchar >= 0 && (countlits > 1 || (re->options & PCRE_FIRSTSET) == 0))\n  {\n  re->req_char = reqchar;\n  re->options |= PCRE_REQCHSET;\n  }\n#ifdef DEBUG\nprintf("Length = %d top_bracket = %d top_backref = %d\\n",\n  length, re->top_bracket, re->top_backref);\nif (re->options != 0)\n  {\n  printf("%s%s%s%s%s%s%s%s%s\\n",\n    ((re->options & PCRE_ANCHORED) != 0)? "anchored " : "",\n    ((re->options & PCRE_CASELESS) != 0)? "caseless " : "",\n    ((re->options & PCRE_ICHANGED) != 0)? "case state changed " : "",\n    ((re->options & PCRE_EXTENDED) != 0)? "extended " : "",\n    ((re->options & PCRE_MULTILINE) != 0)? "multiline " : "",\n    ((re->options & PCRE_DOTALL) != 0)? "dotall " : "",\n    ((re->options & PCRE_DOLLAR_ENDONLY) != 0)? "endonly " : "",\n    ((re->options & PCRE_EXTRA) != 0)? "extra " : "",\n    ((re->options & PCRE_UNGREEDY) != 0)? "ungreedy " : "");\n  }\nif ((re->options & PCRE_FIRSTSET) != 0)\n  {\n  if (isprint(re->first_char)) printf("First char = %c\\n", re->first_char);\n    else printf("First char = \\\\x%02x\\n", re->first_char);\n  }\nif ((re->options & PCRE_REQCHSET) != 0)\n  {\n  if (isprint(re->req_char)) printf("Req char = %c\\n", re->req_char);\n    else printf("Req char = \\\\x%02x\\n", re->req_char);\n  }\ncode_end = code;\ncode_base = code = re->code;\nwhile (code < code_end)\n  {\n  int charlength;\n  printf("%3d ", code - code_base);\n  if (*code >= OP_BRA)\n    {\n    if (*code - OP_BRA > EXTRACT_BASIC_MAX)\n      printf("%3d Bra extra", (code[1] << 8) + code[2]);\n    else\n      printf("%3d Bra %d", (code[1] << 8) + code[2], *code - OP_BRA);\n    code += 2;\n    }\n  else switch(*code)\n    {\n    case OP_OPT:\n    printf(" %.2x %s", code[1], OP_names[*code]);\n    code++;\n    break;\n    case OP_CHARS:\n    charlength = *(++code);\n    printf("%3d ", charlength);\n    while (charlength-- > 0)\n      if (isprint(c = *(++code))) printf("%c", c); else printf("\\\\x%02x", c);\n    break;\n    case OP_KETRMAX:\n    case OP_KETRMIN:\n    case OP_ALT:\n    case OP_KET:\n    case OP_ASSERT:\n    case OP_ASSERT_NOT:\n    case OP_ASSERTBACK:\n    case OP_ASSERTBACK_NOT:\n    case OP_ONCE:\n    case OP_REVERSE:\n    case OP_BRANUMBER:\n    case OP_COND:\n    case OP_CREF:\n    printf("%3d %s", (code[1] << 8) + code[2], OP_names[*code]);\n    code += 2;\n    break;\n    case OP_STAR:\n    case OP_MINSTAR:\n    case OP_PLUS:\n    case OP_MINPLUS:\n    case OP_QUERY:\n    case OP_MINQUERY:\n    case OP_TYPESTAR:\n    case OP_TYPEMINSTAR:\n    case OP_TYPEPLUS:\n    case OP_TYPEMINPLUS:\n    case OP_TYPEQUERY:\n    case OP_TYPEMINQUERY:\n    if (*code >= OP_TYPESTAR)\n      printf("    %s", OP_names[code[1]]);\n    else if (isprint(c = code[1])) printf("    %c", c);\n      else printf("    \\\\x%02x", c);\n    printf("%s", OP_names[*code++]);\n    break;\n    case OP_EXACT:\n    case OP_UPTO:\n    case OP_MINUPTO:\n    if (isprint(c = code[3])) printf("    %c{", c);\n      else printf("    \\\\x%02x{", c);\n    if (*code != OP_EXACT) printf("0,");\n    printf("%d}", (code[1] << 8) + code[2]);\n    if (*code == OP_MINUPTO) printf("?");\n    code += 3;\n    break;\n    case OP_TYPEEXACT:\n    case OP_TYPEUPTO:\n    case OP_TYPEMINUPTO:\n    printf("    %s{", OP_names[code[3]]);\n    if (*code != OP_TYPEEXACT) printf(",");\n    printf("%d}", (code[1] << 8) + code[2]);\n    if (*code == OP_TYPEMINUPTO) printf("?");\n    code += 3;\n    break;\n    case OP_NOT:\n    if (isprint(c = *(++code))) printf("    [^%c]", c);\n      else printf("    [^\\\\x%02x]", c);\n    break;\n    case OP_NOTSTAR:\n    case OP_NOTMINSTAR:\n    case OP_NOTPLUS:\n    case OP_NOTMINPLUS:\n    case OP_NOTQUERY:\n    case OP_NOTMINQUERY:\n    if (isprint(c = code[1])) printf("    [^%c]", c);\n      else printf("    [^\\\\x%02x]", c);\n    printf("%s", OP_names[*code++]);\n    break;\n    case OP_NOTEXACT:\n    case OP_NOTUPTO:\n    case OP_NOTMINUPTO:\n    if (isprint(c = code[3])) printf("    [^%c]{", c);\n      else printf("    [^\\\\x%02x]{", c);\n    if (*code != OP_NOTEXACT) printf(",");\n    printf("%d}", (code[1] << 8) + code[2]);\n    if (*code == OP_NOTMINUPTO) printf("?");\n    code += 3;\n    break;\n    case OP_REF:\n    printf("    \\\\%d", (code[1] << 8) | code[2]);\n    code += 3;\n    goto CLASS_REF_REPEAT;\n    case OP_CLASS:\n      {\n      int i, min, max;\n      code++;\n      printf("    [");\n      for (i = 0; i < 256; i++)\n        {\n        if ((code[i/8] & (1 << (i&7))) != 0)\n          {\n          int j;\n          for (j = i+1; j < 256; j++)\n            if ((code[j/8] & (1 << (j&7))) == 0) break;\n          if (i == \'-\' || i == \']\') printf("\\\\");\n          if (isprint(i)) printf("%c", i); else printf("\\\\x%02x", i);\n          if (--j > i)\n            {\n            printf("-");\n            if (j == \'-\' || j == \']\') printf("\\\\");\n            if (isprint(j)) printf("%c", j); else printf("\\\\x%02x", j);\n            }\n          i = j;\n          }\n        }\n      printf("]");\n      code += 32;\n      CLASS_REF_REPEAT:\n      switch(*code)\n        {\n        case OP_CRSTAR:\n        case OP_CRMINSTAR:\n        case OP_CRPLUS:\n        case OP_CRMINPLUS:\n        case OP_CRQUERY:\n        case OP_CRMINQUERY:\n        printf("%s", OP_names[*code]);\n        break;\n        case OP_CRRANGE:\n        case OP_CRMINRANGE:\n        min = (code[1] << 8) + code[2];\n        max = (code[3] << 8) + code[4];\n        if (max == 0) printf("{%d,}", min);\n        else printf("{%d,%d}", min, max);\n        if (*code == OP_CRMINRANGE) printf("?");\n        code += 4;\n        break;\n        default:\n        code--;\n        }\n      }\n    break;\n    default:\n    printf("    %s", OP_names[*code]);\n    break;\n    }\n  code++;\n  printf("\\n");\n  }\nprintf("------------------------------------------------------------------\\n");\nif (code - re->code > length)\n  {\n  *errorptr = ERR23;\n  (pcre_free)(re);\n  *erroroffset = ptr - (uschar *)pattern;\n  return NULL;\n  }\n#endif\nreturn (pcre *)re;\n}']