--- /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 */
