Graham Ollis 🔥🐉
and 3 contributors

NAME

FFI::TinyCC::Inline - Embed Tiny C code in your Perl program

VERSION

version 0.28

SYNOPSIS

 use FFI::TinyCC::Inline qw( tcc_inline );
 
 tcc_inline q{
   int square(int num)
   {
     return num*num;
   }
 };
 
 print square(4), "\n"; # prints 16

 use FFI::TinyCC::Inline qw( tcc_eval );
 
 # sets value to 6:
 my $value = tcc_eval q{
   int main(int a, int b, int c)
   {
     return a + b + c;
   }
 }, 1, 2, 3;

DESCRIPTION

This module provides a simplified interface to FFI::TinyCC, that allows you to write Perl subs in C. It is inspired by XS::TCC, but it uses FFI::Platypus to create bindings instead of XS.

OPTIONS

You can specify Tiny C options using the scoped pragmata, like so:

 use FFI::TinyCC::Inline options => "-I/foo/include -L/foo/lib -DFOO=1";
 
 # prints 1
 print tcc_eval q{
 #include <foo.h> /* will search /foo/include
 int main()
 {
   return FOO; /* defined and set to 1 */
 }
 };

FUNCTIONS

tcc_inline

 tcc_inline $c_code;

Compile the given C code using Tiny C and inject any functions found into the current package. An exception will be thrown if the code fails to compile, or if FFI::TinyCC::Inline does not recognize one of the argument or return types.

 tcc_inline q{
   int foo(int a, int b, int c)
   {
     return a + b + c;
   }
 };
 
 print foo(1,2,3), "\n"; # prints 6

The special argument type of (int argc, char **argv) is recognized and will be translated from the list of arguments passed in. Example:

 tcc_inline q{
   void foo(int argc, const char **argv)
   {
     int i;
     for(i=0; i<argc; i++)
     {
       puts(argv[i]);
     } 
   }
 };
 
 foo("one", "two", "three"); # prints "one\ntwo\nthree\n"

tcc_eval

 tcc_eval $c_code, @arguments;

This compiles the C code and executes the main function, passing in the given arguments. Returns the result.

SEE ALSO

FFI::TinyCC
C::Blocks

BUNDLED SOFTWARE

This package also comes with a parser that was shamelessly stolen from XS::TCC, which I strongly suspect was itself shamelessly "borrowed" from Inline::C::Parser::RegExp

The license details for the parser are:

Copyright 2002 Brian Ingerson Copyright 2008, 2010-2012 Sisyphus Copyright 2013 Steffen Muellero

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

AUTHOR

Author: Graham Ollis <plicease@cpan.org>

Contributors:

aero

Dylan Cali (calid)

pipcet

COPYRIGHT AND LICENSE

This software is copyright (c) 2015-2018 by Graham Ollis.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.