]> granicus.if.org Git - onig/commitdiff
builtin MAX allows tag argument as max value (*MAX{LONG/TAG})
authorK.Kosako <kosako@sofnec.co.jp>
Thu, 22 Mar 2018 01:45:47 +0000 (10:45 +0900)
committerK.Kosako <kosako@sofnec.co.jp>
Thu, 22 Mar 2018 01:45:47 +0000 (10:45 +0900)
src/ascii.c
src/regexec.c
src/utf16_be.c
src/utf16_le.c

index 7efaa2666731afc2aadc7c600046727178538aaa..97ea57b94b09ac68356c2294ec6add01216d565a 100644 (file)
@@ -37,16 +37,17 @@ init(void)
     int id;
     OnigEncoding enc;
     char* name;
-    unsigned int t_long;
     unsigned int args[4];
     OnigValue    opts[4];
 
     enc = ONIG_ENCODING_ASCII;
-    t_long = ONIG_TYPE_LONG;
 
     name = "FAIL";        BC0_P(name, fail);
     name = "MISMATCH";    BC0_P(name, mismatch);
-    name = "MAX";         BC_B(name, max, 1, &t_long);
+
+    name = "MAX";
+    args[0] = ONIG_TYPE_TAG | ONIG_TYPE_LONG;
+    BC_B(name, max, 1, args);
 
     name = "ERROR";
     args[0] = ONIG_TYPE_LONG; opts[0].l = ONIG_ABORT;
index 35e36986d5f1130e161f9803be3b50121b02a5e2..d9e3df84e17391cf15e9bcfee685b605d1e50e01 100644 (file)
@@ -5393,6 +5393,7 @@ onig_builtin_max(OnigCalloutArgs* args, void* user_data ARG_UNUSED)
 {
   int r;
   int slot;
+  long max_val;
   OnigType  type;
   OnigValue val;
   OnigValue aval;
@@ -5411,12 +5412,23 @@ onig_builtin_max(OnigCalloutArgs* args, void* user_data ARG_UNUSED)
 
   r = onig_get_arg_by_callout_args(args, 0, &type, &aval);
   if (r != ONIG_NORMAL) return r;
+  if (type == ONIG_TYPE_TAG) {
+    r = onig_get_callout_data_by_callout_args(args, aval.tag, 0, &type, &aval);
+    if (r < ONIG_NORMAL) return r;
+    else if (r > ONIG_NORMAL)
+      max_val = 0L;
+    else
+      max_val = aval.l;
+  }
+  else { /* LONG */
+    max_val = aval.l;
+  }
 
   if (args->in == ONIG_CALLOUT_IN_RETRACTION) {
     val.l--;
   }
   else {
-    if (val.l >= aval.l) return ONIG_CALLOUT_FAIL;
+    if (val.l >= max_val) return ONIG_CALLOUT_FAIL;
     val.l++;
   }
 
index 079986bec4c5e524073090e46994548fbecf93f0..1ddead7f8bcd8d8ad7892fd9061b1ab0056020ac 100644 (file)
@@ -38,16 +38,16 @@ init(void)
     int id;
     OnigEncoding enc;
     char* name;
-    unsigned int t_long;
     unsigned int args[4];
     OnigValue opts[4];
 
     enc = ONIG_ENCODING_UTF16_BE;
-    t_long = ONIG_TYPE_LONG;
 
     name = "\000F\000A\000I\000L\000\000";            BC0_P(name, fail);
     name = "\000M\000I\000S\000M\000A\000T\000C\000H\000\000"; BC0_P(name, mismatch);
-    name = "\000M\000A\000X\000\000";                 BC_B(name, max, 1, &t_long);
+    name = "\000M\000A\000X\000\000";
+    args[0] = ONIG_TYPE_TAG | ONIG_TYPE_LONG;
+    BC_B(name, max, 1, args);
 
     name = "\000E\000R\000R\000O\000R\000\000";
     args[0] = ONIG_TYPE_LONG; opts[0].l = ONIG_ABORT;
index e2581855ecb9fff5b88d6dfd7e25edb4120eeb33..82ba383f3f00103a209ea9ea473be6ae0260d97c 100644 (file)
@@ -36,16 +36,17 @@ init(void)
     int id;
     OnigEncoding enc;
     char* name;
-    unsigned int t_long;
     unsigned int args[4];
     OnigValue    opts[4];
 
     enc = ONIG_ENCODING_UTF16_LE;
-    t_long = ONIG_TYPE_LONG;
 
     name = "F\000A\000I\000L\000\000\000";            BC0_P(name, fail);
     name = "M\000I\000S\000M\000A\000T\000C\000H\000\000\000"; BC0_P(name, mismatch);
-    name = "M\000A\000X\000\000\000";                 BC_B(name, max,   1, &t_long);
+
+    name = "M\000A\000X\000\000\000";
+    args[0] = ONIG_TYPE_TAG | ONIG_TYPE_LONG;
+    BC_B(name, max, 1, args);
 
     name = "E\000R\000R\000O\000R\000\000\000";
     args[0] = ONIG_TYPE_LONG; opts[0].l = ONIG_ABORT;