NAME

Const::Introspect::C - Find and evaluate C/C++ constants for use in Perl

VERSION

version 0.01

SYNOPSIS

 use Const::Introspect::C;
 
 my $c = Const::Introspect::C->new(
   headers => ['foo.h'],
 );
 
 foreach my $const ($c->get_macro_constants)
 {
   # const isa Const::Introspect::C::Constant
   say "name  = ", $const->name;
   # type is one of: int, long, pointer, string,
   #                 float, double or "other"
   say "type  = ", $const->type;
   say "value = ", $const->value;
 }

DESCRIPTION

Note: This is an early release, expect some interface changes in the near future.

This module provides an interface for finding C/C++ constant style macros, and can compute their types and values. It can also be used to compute the values of enumerated type constants, although this module doesn't have a way of finding the names (For that try something like Clang::CastXML).

PROPERTIES

headers

List of C/C++ header files.

lang

The programming language. Should be one of c or c++. The default is c.

cc

The C compiler. The default is the C compiler used by Perl itself, automatically split on the appropriate whitespace. This should be a array reference, so ['clang'] and not 'clang'. This allows for cc with spaces in it.

ppflags

The C pre-processor flags. This may change in the future, or on some platforms, but as of this writing this is -dM -E -x c for C and -dM -E -x c++ for C++. This must be an array reference.

cflags

C compiler flags. This is what Perl uses by default. This must be an array reference.

extra_cflags

Extra Compiler flags. This is an empty array by default. This allows the caller to provide additional library specific flags, like -I.

source

C source file. This is an instance of Path::Tiny and it is created on-the-fly. You shouldn't need to specify this explicitly.

filter

Filter regular expression that all macro names must match. This is ^[^_] by default, which means all macros starting with an underscore are skipped.

diag

List of diagnostic failures.

METHODS

get_macro_constants

 my @const = $c->get_macro_constants;

This generates the source file, runs the pre-processor, parses the macros as well as possible and returns the result as a list of Const::Introspect::C::Constant instances.

get_single

 my $const = $c->get_single($name);

Get a single constant by the name of $name. Returns an instance of Const::Introspect::C. This is most useful for getting the integer values for named enumerated values.

compute_expression_type

 my $type = $c->compute_expression_type($expression);

This attempts to compute the type of the C $expression. It should return one of int, long, string, float, double, or other. If the type cannot be determined then other will be returned, and often indicates a code macro that doesn't have a corresponding constant.

compute_expression_value

 my $value = $c->compute_expression_value($type, $expression);

This method attempts to compute the value of the given C $expression of the given $type. $type should be one of int, long, string, float, or double.

If you do not know the expression type, you can try to compute the type using compute_expression_type above.

CAVEATS

This modules requires the C pre-processor for macro constants, and for many constants requires a compiler to compute the type and value. The techniques used by this module work with clang and gcc, but they probably don't work with other compilers. Patches welcome to support other compilers.

This module can tell you the value of pointer constants, but there is not much utility to the value of non NULL values.

AUTHOR

Graham Ollis <plicease@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2020 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.