|
Packit |
b89d10 |
/*
|
|
Packit |
b89d10 |
* callout.c
|
|
Packit |
b89d10 |
*/
|
|
Packit |
b89d10 |
#include <stdlib.h>
|
|
Packit |
b89d10 |
#include <stdio.h>
|
|
Packit |
b89d10 |
#include <string.h>
|
|
Packit |
b89d10 |
#include "oniguruma.h"
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
static int
|
|
Packit |
b89d10 |
callout_body(OnigCalloutArgs* args, void* user_data)
|
|
Packit |
b89d10 |
{
|
|
Packit |
b89d10 |
int r;
|
|
Packit |
b89d10 |
int i;
|
|
Packit |
b89d10 |
int n;
|
|
Packit |
b89d10 |
int begin, end;
|
|
Packit |
b89d10 |
int used_num;
|
|
Packit |
b89d10 |
int used_bytes;
|
|
Packit |
b89d10 |
OnigCalloutIn in;
|
|
Packit |
b89d10 |
int name_id;
|
|
Packit |
b89d10 |
const UChar* contents;
|
|
Packit |
b89d10 |
const UChar* start;
|
|
Packit |
b89d10 |
const UChar* current;
|
|
Packit |
b89d10 |
regex_t* regex;
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
in = onig_get_callout_in_by_callout_args(args);
|
|
Packit |
b89d10 |
name_id = onig_get_name_id_by_callout_args(args);
|
|
Packit |
b89d10 |
start = onig_get_start_by_callout_args(args);
|
|
Packit |
b89d10 |
current = onig_get_current_by_callout_args(args);
|
|
Packit |
b89d10 |
regex = onig_get_regex_by_callout_args(args);
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
contents = onig_get_contents_by_callout_args(args);
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
if (name_id != ONIG_NON_NAME_ID) {
|
|
Packit |
b89d10 |
UChar* name = onig_get_callout_name_by_name_id(name_id);
|
|
Packit |
b89d10 |
fprintf(stdout, "name: %s\n", name);
|
|
Packit |
b89d10 |
}
|
|
Packit |
b89d10 |
fprintf(stdout,
|
|
Packit |
b89d10 |
"%s %s: contents: \"%s\", start: \"%s\", current: \"%s\"\n",
|
|
Packit |
b89d10 |
contents != 0 ? "CONTENTS" : "NAME",
|
|
Packit |
b89d10 |
in == ONIG_CALLOUT_IN_PROGRESS ? "PROGRESS" : "RETRACTION",
|
|
Packit |
b89d10 |
contents, start, current);
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
fprintf(stdout, "user_data: %s\n", (char* )user_data);
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
(void )onig_get_used_stack_size_in_callout(args, &used_num, &used_bytes);
|
|
Packit |
b89d10 |
fprintf(stdout, "stack: used_num: %d, used_bytes: %d\n", used_num, used_bytes);
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
n = onig_number_of_captures(regex);
|
|
Packit |
b89d10 |
for (i = 1; i <= n; i++) {
|
|
Packit |
b89d10 |
r = onig_get_capture_range_in_callout(args, i, &begin, &end;;
|
|
Packit |
b89d10 |
if (r != ONIG_NORMAL) return r;
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
fprintf(stdout, "capture %d: (%d-%d)\n", i, begin, end);
|
|
Packit |
b89d10 |
}
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
fflush(stdout);
|
|
Packit |
b89d10 |
return ONIG_CALLOUT_SUCCESS;
|
|
Packit |
b89d10 |
}
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
static int
|
|
Packit |
b89d10 |
progress_callout_func(OnigCalloutArgs* args, void* user_data)
|
|
Packit |
b89d10 |
{
|
|
Packit |
b89d10 |
return callout_body(args, user_data);
|
|
Packit |
b89d10 |
}
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
static int
|
|
Packit |
b89d10 |
retraction_callout_func(OnigCalloutArgs* args, void* user_data)
|
|
Packit |
b89d10 |
{
|
|
Packit |
b89d10 |
return callout_body(args, user_data);
|
|
Packit |
b89d10 |
}
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
static int
|
|
Packit |
b89d10 |
foo(OnigCalloutArgs* args, void* user_data)
|
|
Packit |
b89d10 |
{
|
|
Packit |
b89d10 |
return callout_body(args, user_data);
|
|
Packit |
b89d10 |
}
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
static int
|
|
Packit |
b89d10 |
bar(OnigCalloutArgs* args, void* user_data)
|
|
Packit |
b89d10 |
{
|
|
Packit |
b89d10 |
int r;
|
|
Packit |
b89d10 |
int i;
|
|
Packit |
b89d10 |
int n;
|
|
Packit |
b89d10 |
OnigType type;
|
|
Packit |
b89d10 |
OnigValue val;
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
fprintf(stdout, "bar called.\n");
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
n = onig_get_args_num_by_callout_args(args);
|
|
Packit |
b89d10 |
if (n < 0) {
|
|
Packit |
b89d10 |
fprintf(stderr, "FAIL: onig_get_args_num_by_callout_args(): %d\n", n);
|
|
Packit |
b89d10 |
return n;
|
|
Packit |
b89d10 |
}
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
for (i = 0; i < n; i++) {
|
|
Packit |
b89d10 |
r = onig_get_arg_by_callout_args(args, i, &type, &val;;
|
|
Packit |
b89d10 |
if (r != 0) {
|
|
Packit |
b89d10 |
fprintf(stderr, "FAIL: onig_get_arg_by_callout_args(): %d\n", r);
|
|
Packit |
b89d10 |
return r;
|
|
Packit |
b89d10 |
}
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
fprintf(stdout, "arg[%d]: ", i);
|
|
Packit |
b89d10 |
switch (type) {
|
|
Packit |
b89d10 |
case ONIG_TYPE_LONG:
|
|
Packit |
b89d10 |
fprintf(stdout, "%ld\n", val.l);
|
|
Packit |
b89d10 |
break;
|
|
Packit |
b89d10 |
case ONIG_TYPE_CHAR:
|
|
Packit |
b89d10 |
fprintf(stdout, "0x%06x\n", val.c);
|
|
Packit |
b89d10 |
break;
|
|
Packit |
b89d10 |
case ONIG_TYPE_STRING:
|
|
Packit |
b89d10 |
fprintf(stdout, "'%s'\n", val.s.start);
|
|
Packit |
b89d10 |
break;
|
|
Packit |
b89d10 |
default:
|
|
Packit |
b89d10 |
/* Never come here. But escape warning. */
|
|
Packit |
b89d10 |
break;
|
|
Packit |
b89d10 |
};
|
|
Packit |
b89d10 |
}
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
return ONIG_CALLOUT_SUCCESS;
|
|
Packit |
b89d10 |
}
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
static int
|
|
Packit |
b89d10 |
test(OnigEncoding enc, OnigMatchParam* mp, char* in_pattern, char* in_str)
|
|
Packit |
b89d10 |
{
|
|
Packit |
b89d10 |
int r;
|
|
Packit |
b89d10 |
unsigned char *start, *range, *end;
|
|
Packit |
b89d10 |
regex_t* reg;
|
|
Packit |
b89d10 |
OnigErrorInfo einfo;
|
|
Packit |
b89d10 |
OnigRegion *region;
|
|
Packit |
b89d10 |
UChar* pattern;
|
|
Packit |
b89d10 |
UChar* str;
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
pattern = (UChar* )in_pattern;
|
|
Packit |
b89d10 |
str = (UChar* )in_str;
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
r = onig_new(®, pattern, pattern + strlen((char* )pattern),
|
|
Packit |
b89d10 |
ONIG_OPTION_DEFAULT, enc, ONIG_SYNTAX_DEFAULT, &einfo);
|
|
Packit |
b89d10 |
if (r != ONIG_NORMAL) {
|
|
Packit |
b89d10 |
char s[ONIG_MAX_ERROR_MESSAGE_LEN];
|
|
Packit |
b89d10 |
onig_error_code_to_str((UChar* )s, r, &einfo);
|
|
Packit |
b89d10 |
fprintf(stderr, "COMPILE ERROR: %d: %s\n", r, s);
|
|
Packit |
b89d10 |
return -1;
|
|
Packit |
b89d10 |
}
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
region = onig_region_new();
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
end = str + strlen((char* )str);
|
|
Packit |
b89d10 |
start = str;
|
|
Packit |
b89d10 |
range = end;
|
|
Packit |
b89d10 |
r = onig_search_with_param(reg, str, end, start, range, region,
|
|
Packit |
b89d10 |
ONIG_OPTION_NONE, mp);
|
|
Packit |
b89d10 |
if (r >= 0) {
|
|
Packit |
b89d10 |
int i;
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
fprintf(stderr, "match at %d\n", r);
|
|
Packit |
b89d10 |
for (i = 0; i < region->num_regs; i++) {
|
|
Packit |
b89d10 |
fprintf(stderr, "%d: (%d-%d)\n", i, region->beg[i], region->end[i]);
|
|
Packit |
b89d10 |
}
|
|
Packit |
b89d10 |
}
|
|
Packit |
b89d10 |
else if (r == ONIG_MISMATCH) {
|
|
Packit |
b89d10 |
fprintf(stderr, "search fail\n");
|
|
Packit |
b89d10 |
}
|
|
Packit |
b89d10 |
else { /* error */
|
|
Packit |
b89d10 |
char s[ONIG_MAX_ERROR_MESSAGE_LEN];
|
|
Packit |
b89d10 |
onig_error_code_to_str((UChar* )s, r);
|
|
Packit |
b89d10 |
fprintf(stderr, "SEARCH ERROR: %d: %s\n", r, s);
|
|
Packit |
b89d10 |
}
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
onig_region_free(region, 1 /* 1:free self, 0:free contents only */);
|
|
Packit |
b89d10 |
onig_free(reg);
|
|
Packit |
b89d10 |
return r;
|
|
Packit |
b89d10 |
}
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
extern int main(int argc, char* argv[])
|
|
Packit |
b89d10 |
{
|
|
Packit |
b89d10 |
int r;
|
|
Packit |
b89d10 |
int id;
|
|
Packit |
b89d10 |
void* user_data;
|
|
Packit |
b89d10 |
UChar* name;
|
|
Packit |
b89d10 |
OnigEncoding use_encs[1];
|
|
Packit |
b89d10 |
unsigned int arg_types[4];
|
|
Packit |
b89d10 |
OnigValue opt_defaults[4];
|
|
Packit |
b89d10 |
OnigEncoding enc;
|
|
Packit |
b89d10 |
OnigMatchParam* mp;
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
enc = ONIG_ENCODING_UTF8;
|
|
Packit |
b89d10 |
use_encs[0] = enc;
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
r = onig_initialize(use_encs, sizeof(use_encs)/sizeof(use_encs[0]));
|
|
Packit |
b89d10 |
if (r != ONIG_NORMAL) return -1;
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
/* monitor on */
|
|
Packit |
b89d10 |
r = onig_setup_builtin_monitors_by_ascii_encoded_name(stdout);
|
|
Packit |
b89d10 |
if (r != ONIG_NORMAL) return -1;
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
name = (UChar* )"foo";
|
|
Packit |
b89d10 |
id = onig_set_callout_of_name(enc, ONIG_CALLOUT_TYPE_SINGLE,
|
|
Packit |
b89d10 |
name, name + strlen((char* )name),
|
|
Packit |
b89d10 |
ONIG_CALLOUT_IN_BOTH, foo, 0, 0, 0, 0, 0);
|
|
Packit |
b89d10 |
if (id < 0) {
|
|
Packit |
b89d10 |
fprintf(stderr, "ERROR: fail to set callout of name: %s\n", name);
|
|
Packit |
b89d10 |
//return -1;
|
|
Packit |
b89d10 |
}
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
name = (UChar* )"bar";
|
|
Packit |
b89d10 |
arg_types[0] = ONIG_TYPE_LONG;
|
|
Packit |
b89d10 |
arg_types[1] = ONIG_TYPE_STRING;
|
|
Packit |
b89d10 |
arg_types[2] = ONIG_TYPE_CHAR;
|
|
Packit |
b89d10 |
opt_defaults[0].s.start = (UChar* )"I am a option argument's default value.";
|
|
Packit |
b89d10 |
opt_defaults[0].s.end = opt_defaults[0].s.start +
|
|
Packit |
b89d10 |
strlen((char* )opt_defaults[0].s.start);
|
|
Packit |
b89d10 |
opt_defaults[1].c = 0x4422;
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
id = onig_set_callout_of_name(enc, ONIG_CALLOUT_TYPE_SINGLE,
|
|
Packit |
b89d10 |
name, name + strlen((char* )name),
|
|
Packit |
b89d10 |
ONIG_CALLOUT_IN_PROGRESS, bar, 0,
|
|
Packit |
b89d10 |
3, arg_types, 2, opt_defaults);
|
|
Packit |
b89d10 |
if (id < 0) {
|
|
Packit |
b89d10 |
fprintf(stderr, "ERROR: fail to set callout of name: %s\n", name);
|
|
Packit |
b89d10 |
//return -1;
|
|
Packit |
b89d10 |
}
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
(void)onig_set_progress_callout(progress_callout_func);
|
|
Packit |
b89d10 |
(void)onig_set_retraction_callout(retraction_callout_func);
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
mp = onig_new_match_param();
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
user_data = (void* )"something data";
|
|
Packit |
b89d10 |
r = onig_set_callout_user_data_of_match_param(mp, user_data);
|
|
Packit |
b89d10 |
if (r != ONIG_NORMAL) {
|
|
Packit |
b89d10 |
fprintf(stderr, "ERROR: fail onig_set_callout_user_data_of_match_param(): %d\n", r);
|
|
Packit |
b89d10 |
}
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
/* callout of contents */
|
|
Packit |
b89d10 |
test(enc, mp, "a+(?{foo bar baz...}X)$", "aaab");
|
|
Packit |
b89d10 |
test(enc, mp, "(?{{!{}#$%&'()=-~^|[_]`@*:+;<>?/.\\,}}[symbols])c", "abc");
|
|
Packit |
b89d10 |
test(enc, mp, "\\A(...)(?{{{booooooooooooo{{ooo}}ooooooooooz}}}<)", "aaab");
|
|
Packit |
b89d10 |
test(enc, mp, "\\A(?!a(?{in prec-read-not}[xxx]X)b)", "ac");
|
|
Packit |
b89d10 |
test(enc, mp, "(?
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
// callout of name
|
|
Packit |
b89d10 |
test(enc, mp, "\\A(*foo)abc", "abc");
|
|
Packit |
b89d10 |
test(enc, mp, "abc(?:(*FAIL)|$)", "abcabc");
|
|
Packit |
b89d10 |
test(enc, mp, "abc(?:$|(*MISMATCH)|abc$)", "abcabc");
|
|
Packit |
b89d10 |
test(enc, mp, "abc(?:(*ERROR)|$)", "abcabc");
|
|
Packit |
b89d10 |
test(enc, mp, "ab(*foo{})(*FAIL)", "abc");
|
|
Packit |
b89d10 |
test(enc, mp, "abc(d|(*ERROR{-999}))", "abc");
|
|
Packit |
b89d10 |
test(enc, mp, "ab(*bar{372,I am a bar's argument,あ})c(*FAIL)", "abc");
|
|
Packit |
b89d10 |
test(enc, mp, "ab(*bar{1234567890})", "abc");
|
|
Packit |
b89d10 |
test(enc, mp, "(?:a(*MAX{2})|b)*", "abbabbabbabb");
|
|
Packit |
b89d10 |
test(enc, mp, "(?:(*MAX{2})a|b)*", "abbabbabbabb");
|
|
Packit |
b89d10 |
test(enc, mp, "(?:(*MAX{1})a|b)*", "bbbbbabbbbbabbbbb");
|
|
Packit |
b89d10 |
test(enc, mp, "(?:(*MAX{3})a|(*MAX{4})b)*", "bbbaabbab");
|
|
Packit |
b89d10 |
test(enc, mp, "(?:(*MAX[A]{3})a|(*MAX[B]{5})b)*(*CMP{A,<,B})", "abababc");
|
|
Packit |
b89d10 |
test(enc, mp, "(?:(*MAX[A]{7})a|(*MAX[B]{5})b)*(*CMP{A,>=,4})", "abababcabababaa");
|
|
Packit |
b89d10 |
test(enc, mp, "(?:(*MAX[T]{3})a)*(?:(*MAX{T})c)*", "aaccc");
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
/* callouts in condition */
|
|
Packit |
b89d10 |
test(enc, mp, "\\A(?(?{in condition})then|else)\\z", "then");
|
|
Packit |
b89d10 |
test(enc, mp, "\\A(?(*FAIL)then|else)\\z", "else");
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
/* monitor test */
|
|
Packit |
b89d10 |
test(enc, mp, "(?:(*MON{X})(*FAIL)|.{,3}(*MON[FOO])k)", "abcdefghijk");
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
onig_free_match_param(mp);
|
|
Packit |
b89d10 |
onig_end();
|
|
Packit |
b89d10 |
return 0;
|
|
Packit |
b89d10 |
}
|