--- /usr/ports/lang/ruby18/work/ruby-1.8.6/regparse.c Wed Nov 23 18:14:15 2005 +++ ruby-1.8.6/regparse.c Sat Aug 25 13:31:37 2007 @@ -960,6 +960,12 @@ if (NANCHOR(node).target) onig_node_free(NANCHOR(node).target); break; + + case N_CODE: + if (NCODE(node).code) + xfree(NCODE(node).code); + break; + } #ifdef USE_RECYCLE_NODE @@ -2019,7 +2025,8 @@ TK_CC_RANGE, TK_POSIX_BRACKET_OPEN, TK_CC_AND, /* && */ - TK_CC_CC_OPEN /* [ */ + TK_CC_CC_OPEN, /* [ */ + TK_CODE /* (?{ code }) */ }; typedef struct { @@ -2642,6 +2649,8 @@ OnigSyntaxType* syn = env->syntax; UChar* prev; UChar* p = *src; + + //fprintf(stderr, "fetch_token: %s\n", *src); start: if (PEND) { @@ -3971,6 +3980,8 @@ int list_capture; UChar* p = *src; + //fprintf(stderr, "parse_effect: %s\n", *src); + *np = NULL; if (PEND) return ONIGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS; @@ -3992,6 +4003,7 @@ return 1; /* group */ break; + case '=': *np = onig_node_new_anchor(ANCHOR_PREC_READ); break; @@ -4142,6 +4154,38 @@ } break; + case '{': + { + UChar *blockstart = p; + while (1) { + if (PEND) return ONIGERR_END_PATTERN_IN_GROUP; + PFETCH(c); + if (c == '}') { + PFETCH(c); + if (c == ')') { + UChar *newstr = NULL; + unsigned int newstr_len = (int)(p - blockstart) - 2; + newstr = malloc(newstr_len * sizeof(UChar) + 1); + memset(newstr, 0, newstr_len); + memcpy(newstr, blockstart, newstr_len); + newstr[newstr_len] = '\0'; + //fprintf(stderr, "block: %s\n", newstr); + *np = node_new(); + (*np)->type = N_CODE; + NCODE(*np).code = newstr; + break; + } + else { + fprintf(stderr, "Char: %c\n", c); + return ONIGERR_UNMATCHED_CLOSE_PARENTHESIS; + } + } + } + *src = p; + return 0; + } + break; + default: return ONIGERR_UNDEFINED_GROUP_OPTION; } @@ -4357,12 +4401,17 @@ case TK_ALT: case TK_EOT: end_of_token: - *np = node_new_empty(); - return tok->type; - break; + *np = node_new_empty(); + return tok->type; + break; + + case TK_CODE: + fprintf(stderr, "Code!\n"); + break; case TK_SUBEXP_OPEN: r = parse_effect(np, tok, TK_SUBEXP_CLOSE, src, end, env); + //fprintf(stderr, "Parse effect: %d\n", r); if (r < 0) return r; if (r == 1) group = 1; else if (r == 2) { /* option only */