Inline::Filters::Ragel - Run ragel when compiling your Inline modules
use Inline::Filters::Ragel; use Inline C => <<'END', filters => [ ragel ]; // ragel/C code goes here END
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.
ragel
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.
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:
is_valid_utf8
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
Inline and Inline::Filters
Ragel State Machine Compiler
Inline-Filters-Ragel github repo
Doug Hoyte, <doug@hcsw.org>
<doug@hcsw.org>
Copyright 2014 Doug Hoyte.
This module is licensed under the same terms as perl itself.
To install Inline::Filters::Ragel, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Inline::Filters::Ragel
CPAN shell
perl -MCPAN -e shell install Inline::Filters::Ragel
For more information on module installation, please visit the detailed CPAN module installation guide.