NAME Inline::Filters::Ragel - Run ragel when compiling your Inline modules SYNOPSIS use Inline::Filters::Ragel; use Inline C => <<'END', filters => [ ragel ]; // ragel/C code goes here END DESCRIPTION This module exports one "factory" function, "ragel". This function returns an anonymous function that accepts a string input, pre-processes it with the "ragel" binary, and returns the output. The "ragel" "factory" function can optionally take a string or multiple strings which will be passed along to the ragel binary. You will need to do this if you are compiling a language other than the default (C/C++), or if you wish to change the ragel state-machine compilation type. Note that you will need to download and install Ragel before this module will work. It is my hope that modules will not require ragel at distribution time since we now have Inline::Module (but I haven't tested that yet). This module itself does not actually depend on any Inline stuff so it may be useful as a stand-alone "ragel" invoker module. FULL EXAMPLE As an example, here is the definition of an "is_valid_utf8" function which uses ragel. When passed a string, this function will determine whether the string in question contains a valid UTF-8 sequence or not: use Inline::Filters::Ragel; use Inline C => <<'END', FILTERS => [ ragel('-G2') ]; %%{ machine utf8_checker; ## Adapted from: http://www.w3.org/International/questions/qa-forms-utf-8 utf8_codepoint = (0x09 | 0x0A | 0x0D | 0x20..0x7E) | # ASCII (0xC2..0xDF 0x80..0xBF) | # non-overlong 2-byte (0xE0 0xA0..0xBF 0x80..0xBF) | # excluding overlongs ((0xE1..0xEC | 0xEE | 0xEF) (0x80..0xBF){2}) | # straight 3-byte (0xED 0x80..0x9F 0x80..0xBF) | # excluding surrogates (0xF0 0x90..0xBF (0x80..0xBF){2}) | # planes 1-3 (0xF1..0xF3 (0x80..0xBF){3}) | # planes 4-15 (0xF4 0x80..0x8F (0x80..0xBF){2}); # plane 16 main := utf8_codepoint*; write data; }%% int is_valid_utf8(SV* string) { size_t len; char *p, *pe; int cs; SvUPGRADE(string, SVt_PV); if (!SvPOK(string)) croak("non-string object passed to is_valid_utf8"); len = SvCUR(string); p = SvPV(string, len); pe = p + len; %% write init; %% write exec; if (cs < utf8_checker_first_final) return 0; return 1; } END SEE ALSO Inline and Inline::Filters Ragel State Machine Compiler Inline-Filters-Ragel github repo AUTHOR Doug Hoyte, "" COPYRIGHT & LICENSE Copyright 2014 Doug Hoyte. This module is licensed under the same terms as perl itself.