OnigEncoding enc;
char* name;
OnigType t_long;
- OnigType args[4];
- OnigValue opts[4];
+ unsigned int args[4];
+ OnigValue opts[4];
enc = ONIG_ENCODING_ASCII;
t_long = ONIG_TYPE_LONG;
BC_B_O(name, total_count, 1, args, 1, opts);
name = "CMP";
- args[0] = ONIG_TYPE_TAG;
+ args[0] = ONIG_TYPE_TAG | ONIG_TYPE_LONG;
args[1] = ONIG_TYPE_STRING;
- args[2] = ONIG_TYPE_TAG;
+ args[2] = ONIG_TYPE_TAG | ONIG_TYPE_LONG;
BC_P(name, cmp, 3, args);
#endif /* USE_CALLOUT */
ONIG_EXTERN
int onig_set_retraction_callout_of_contents P_((OnigCalloutFunc f));
ONIG_EXTERN
-int onig_set_callout_of_name P_((OnigEncoding enc, OnigCalloutType type, OnigUChar* name, OnigUChar* name_end, int callout_in, OnigCalloutFunc callout, OnigCalloutFunc end_callout, int arg_num, OnigType arg_types[], int optional_arg_num, OnigValue opt_defaults[])); /* name: single-byte string */
+int onig_set_callout_of_name P_((OnigEncoding enc, OnigCalloutType type, OnigUChar* name, OnigUChar* name_end, int callout_in, OnigCalloutFunc callout, OnigCalloutFunc end_callout, int arg_num, unsigned int arg_types[], int optional_arg_num, OnigValue opt_defaults[])); /* name: single-byte string */
ONIG_EXTERN
OnigUChar* onig_get_callout_name_by_name_id P_((int id));
ONIG_EXTERN
OnigCalloutFunc end_func;
int arg_num;
int opt_arg_num;
- OnigType arg_types[ONIG_CALLOUT_MAX_ARGS_NUM];
+ unsigned int arg_types[ONIG_CALLOUT_MAX_ARGS_NUM];
OnigValue opt_defaults[ONIG_CALLOUT_MAX_ARGS_NUM];
UChar* name; /* reference to GlobalCalloutNameTable entry: e->name */
} CalloutNameListEntry;
UChar* name, UChar* name_end, int in,
OnigCalloutFunc start_func,
OnigCalloutFunc end_func,
- int arg_num, OnigType arg_types[],
+ int arg_num, unsigned int arg_types[],
int opt_arg_num, OnigValue opt_defaults[])
{
int r;
return ONIGERR_INVALID_CALLOUT_ARG;
for (i = 0; i < arg_num; i++) {
- if (arg_types[i] == ONIG_TYPE_VOID || arg_types[i] == ONIG_TYPE_POINTER)
+ unsigned int t = arg_types[i];
+ if (t == ONIG_TYPE_VOID)
return ONIGERR_INVALID_CALLOUT_ARG;
+ else {
+ if (i >= arg_num - opt_arg_num) {
+ if (t != ONIG_TYPE_LONG && t != ONIG_TYPE_CHAR && t != ONIG_TYPE_STRING &&
+ t != ONIG_TYPE_TAG)
+ return ONIGERR_INVALID_CALLOUT_ARG;
+ }
+ else {
+ if (t != ONIG_TYPE_LONG) {
+ t = t & ~ONIG_TYPE_LONG;
+ if (t != ONIG_TYPE_CHAR && t != ONIG_TYPE_STRING && t != ONIG_TYPE_TAG)
+ return ONIGERR_INVALID_CALLOUT_ARG;
+ }
+ }
+ }
}
if (! is_allowed_callout_name(enc, name, name_end)) {
return GlobalCalloutNameList->v[name_id].opt_arg_num;
}
-static OnigType
+static unsigned int
get_callout_arg_type_by_name_id(int name_id, int index)
{
return GlobalCalloutNameList->v[name_id].arg_types[index];
if (cn != 0) {
if (skip_mode == 0) {
- long rl;
+ if ((types[n] & ONIG_TYPE_LONG) != 0) {
+ int fixed = 0;
+ if (cn > 0) {
+ long rl;
+ r = parse_long(enc, buf, bufend, 1, LONG_MAX, &rl);
+ if (r == ONIG_NORMAL) {
+ vals[n].l = rl;
+ fixed = 1;
+ types[n] = ONIG_TYPE_LONG;
+ }
+ }
+
+ if (fixed == 0) {
+ types[n] = (types[n] & ~ONIG_TYPE_LONG);
+ if (types[n] == ONIG_TYPE_VOID)
+ return ONIGERR_INVALID_CALLOUT_ARG;
+ }
+ }
switch (types[n]) {
case ONIG_TYPE_LONG:
- if (cn == 0) return ONIGERR_INVALID_CALLOUT_ARG;
- r = parse_long(enc, buf, bufend, 1, LONG_MAX, &rl);
- if (r != ONIG_NORMAL) return r;
- vals[n].l = rl;
break;
case ONIG_TYPE_CHAR:
Node* node;
CalloutListEntry* e;
RegexExt* ext;
- OnigType types[ONIG_CALLOUT_MAX_ARGS_NUM];
- OnigValue vals[ONIG_CALLOUT_MAX_ARGS_NUM];
+ unsigned int types[ONIG_CALLOUT_MAX_ARGS_NUM];
+ OnigValue vals[ONIG_CALLOUT_MAX_ARGS_NUM];
OnigEncoding enc = env->enc;
UChar* p = *src;
OnigEncoding enc;
char* name;
OnigType t_long;
- OnigType args[4];
+ unsigned int args[4];
OnigValue opts[4];
enc = ONIG_ENCODING_UTF16_BE;
BC_B_O(name, total_count, 1, args, 1, opts);
name = "\000C\000M\000P\000\000";
- args[0] = ONIG_TYPE_TAG;
+ args[0] = ONIG_TYPE_TAG | ONIG_TYPE_LONG;
args[1] = ONIG_TYPE_STRING;
- args[2] = ONIG_TYPE_TAG;
+ args[2] = ONIG_TYPE_TAG | ONIG_TYPE_LONG;
BC_P(name, cmp, 3, args);
#endif /* USE_CALLOUT */
OnigEncoding enc;
char* name;
OnigType t_long;
- OnigType args[4];
- OnigValue opts[4];
+ unsigned int args[4];
+ OnigValue opts[4];
enc = ONIG_ENCODING_UTF16_LE;
t_long = ONIG_TYPE_LONG;
BC_B_O(name, total_count, 1, args, 1, opts);
name = "C\000M\000P\000\000\000";
- args[0] = ONIG_TYPE_TAG;
+ args[0] = ONIG_TYPE_TAG | ONIG_TYPE_LONG;
args[1] = ONIG_TYPE_STRING;
- args[2] = ONIG_TYPE_TAG;
+ args[2] = ONIG_TYPE_TAG | ONIG_TYPE_LONG;
BC_P(name, cmp, 3, args);
#endif /* USE_CALLOUT */