name = "MAX";
args[0] = ONIG_TYPE_TAG | ONIG_TYPE_LONG;
- BC_B(name, max, 1, args);
+ args[1] = ONIG_TYPE_CHAR;
+ opts[0].c = 'X';
+ BC_B_O(name, max, 2, args, 1, opts);
name = "ERROR";
args[0] = ONIG_TYPE_LONG; opts[0].l = ONIG_ABORT;
int r;
int slot;
long max_val;
+ OnigCodePoint count_type;
OnigType type;
OnigValue val;
OnigValue aval;
max_val = aval.l;
}
+ r = onig_get_arg_by_callout_args(args, 1, &type, &aval);
+ if (r != ONIG_NORMAL) return r;
+
+ count_type = aval.c;
+ if (count_type != '>' && count_type != 'X' && count_type != '<')
+ return ONIGERR_INVALID_CALLOUT_ARG;
+
if (args->in == ONIG_CALLOUT_IN_RETRACTION) {
- val.l--;
+ if (count_type == '<') {
+ if (val.l >= max_val) return ONIG_CALLOUT_FAIL;
+ val.l++;
+ }
+ else if (count_type == 'X')
+ val.l--;
}
else {
- if (val.l >= max_val) return ONIG_CALLOUT_FAIL;
- val.l++;
+ if (count_type != '<') {
+ if (val.l >= max_val) return ONIG_CALLOUT_FAIL;
+ val.l++;
+ }
}
r = onig_set_callout_data_by_callout_args_self(args, slot, ONIG_TYPE_LONG, &val);
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";
args[0] = ONIG_TYPE_TAG | ONIG_TYPE_LONG;
- BC_B(name, max, 1, args);
+ args[1] = ONIG_TYPE_CHAR;
+ opts[0].c = 'X';
+ BC_B_O(name, max, 2, args, 1, opts);
name = "\000E\000R\000R\000O\000R\000\000";
args[0] = ONIG_TYPE_LONG; opts[0].l = ONIG_ABORT;
name = "M\000A\000X\000\000\000";
args[0] = ONIG_TYPE_TAG | ONIG_TYPE_LONG;
- BC_B(name, max, 1, args);
+ args[1] = ONIG_TYPE_CHAR;
+ opts[0].c = 'X';
+ BC_B_O(name, max, 2, args, 1, opts);
name = "E\000R\000R\000O\000R\000\000\000";
args[0] = ONIG_TYPE_LONG; opts[0].l = ONIG_ABORT;