unit onig; interface uses Windows, SysUtils, oniguruma; function fn_onig_new(pat, encode: PChar): INTEGER; cdecl; function fn_onig_search(var regex: INTEGER; str: PChar): integer; cdecl; function fn_onig_free(var regex: INTEGER): integer; cdecl; function fn_mregexp(str, pat, encode: PChar): integer; cdecl; implementation function fn_onig_new(pat, encode: PChar): INTEGER; cdecl; const MAX_BUFFER = 64; var reg: Pregex_t; pat_end: PChar; r: integer; enc: OnigEncoding; einfo: OnigErrorInfo; begin if encode = 'UTF8' then enc := ONIG_ENCODING_UTF8 else if encode = 'EUC-JP' then enc := ONIG_ENCODING_EUC_JP else if encode = 'SJIS' then enc := ONIG_ENCODING_SJIS else enc := ONIG_ENCODING_ASCII ; pat_end := StrEnd(pat); r := onig_new(reg, PUChar(pat), PUChar(pat_end), ONIG_OPTION_DEFAULT, enc, ONIG_SYNTAX_DEFAULT, einfo); if r <> ONIG_NORMAL then begin // error(r); result := 0; exit; end; result := INTEGER(reg); end; function fn_onig_search(var regex: INTEGER; str: PChar): integer; cdecl; const MAX_BUFFER = 64; var reg: Pregex_t; str_end: PChar; r: integer; begin reg := Pregex_t(regex); str_end := StrEnd(str); r := onig_search(reg, PUChar(str), PUChar(str_end), PUChar(str), PUChar(str_end), nil, ONIG_OPTION_NONE); if r < ONIG_MISMATCH then begin // error(r); result := -1 end else if r = ONIG_MISMATCH then result := 0 else result := 1 ; end; function fn_onig_free(var regex: INTEGER): integer; cdecl; var reg: Pregex_t; begin reg := Pregex_t(regex); onig_free(reg); // onig_end; result := 1; end; function fn_mregexp(str, pat, encode: PChar): integer; cdecl; var reg: Pregex_t; str_end, pat_end: PChar; r: integer; // region: POnigRegion; enc: OnigEncoding; einfo: OnigErrorInfo; procedure error(r: integer); var S: TErrorMessage; begin onig_error_code_to_str(S, r); //writeln(Format('mregexp ERROR: %s', [S])); end; begin //region := onig_region_new; if encode = 'UTF8' then enc := ONIG_ENCODING_UTF8 else if encode = 'EUC-JP' then enc := ONIG_ENCODING_EUC_JP else if encode = 'SJIS' then enc := ONIG_ENCODING_SJIS else enc := ONIG_ENCODING_ASCII ; pat_end := StrEnd(pat); r := onig_new(reg, PUChar(pat), PUChar(pat_end), ONIG_OPTION_DEFAULT, enc, ONIG_SYNTAX_DEFAULT, einfo); if r <> ONIG_NORMAL then begin error(r); result := 1; exit; end; str_end := StrEnd(str); r := onig_search(reg, PUChar(str), PUChar(str_end), PUChar(str), PUChar(str_end), (*region*)nil, ONIG_OPTION_NONE); if r < ONIG_MISMATCH then begin error(r); result := -1 end else if r = ONIG_MISMATCH then result := 0 else result := 1 ; onig_free(reg); //onig_region_free(region, 1); end; end.