1
0
mirror of https://github.com/pgbackrest/pgbackrest.git synced 2024-12-14 10:13:05 +02:00
pgbackrest/build/lib/pgBackRestBuild/CodeGen/Common.pm
David Steele 8efcc38304 Improvements in C codebase:
* Update C naming conventions.
* Use int datatype wherever possible.
* Better separation of C source from Perl interface.
2017-09-30 10:44:03 -04:00

192 lines
6.3 KiB
Perl

####################################################################################################################################
# C Code Generation Formatting Functions
####################################################################################################################################
package pgBackRestBuild::CodeGen::Common;
use strict;
use warnings FATAL => qw(all);
use Carp qw(confess);
use English '-no_match_vars';
use Exporter qw(import);
our @EXPORT = qw();
use pgBackRest::Common::Log;
use pgBackRest::Common::String;
####################################################################################################################################
# Generate functions that return config rule data
####################################################################################################################################
use constant CGEN_DATATYPE_BOOL => 'bool';
push @EXPORT, qw(CGEN_DATATYPE_BOOL);
use constant CGEN_DATATYPE_DOUBLE => 'double';
push @EXPORT, qw(CGEN_DATATYPE_DOUBLE);
use constant CGEN_DATATYPE_INT => 'int';
push @EXPORT, qw(CGEN_DATATYPE_INT);
use constant CGEN_DATATYPE_INT64 => 'int64';
push @EXPORT, qw(CGEN_DATATYPE_INT64);
use constant CGEN_DATATYPE_CONSTCHAR => 'const char *';
push @EXPORT, qw(CGEN_DATATYPE_CONSTCHAR);
use constant CGEN_DATAVAL_NULL => '^^{{[[NULL]]}}^^';
push @EXPORT, qw(CGEN_DATAVAL_NULL);
####################################################################################################################################
# cgenAutoWarning - warning not to modify automatically generated files directly
####################################################################################################################################
sub cgenAutoWarning
{
my $strGenerator = shift;
return "Automatically generated by ${strGenerator} -- do not modify directly.";
}
push @EXPORT, qw(cgenAutoWarning);
####################################################################################################################################
# cgenBanner - build general banner
####################################################################################################################################
sub cgenBanner
{
my $strContent = shift;
my $strGenerator = shift;
my $strBanner =
qw{/} . (qw{*} x 131) . "\n" .
trim($strContent) . "\n";
if (defined($strGenerator))
{
$strBanner .=
"# \n" .
'# ' . cgenAutoWarning($strGenerator) . "\n";
}
$strBanner .=
(qw{*} x 131) . qw{/} . "\n";
return $strBanner;
}
push @EXPORT, qw(cgenBanner);
####################################################################################################################################
# cgenFunction - format type names for C
####################################################################################################################################
sub cgenFunction
{
my $strName = shift;
my $strSummary = shift;
my $strDescription = shift;
my $strSource = shift;
# Summary should always be defined
if (!defined($strSummary))
{
confess &log(ASSERT, "${strName} must have a summary");
}
# Make sure summary will fit on a single line
my $iLenMax = 132 - 3 - length($strName);
if (length($strSummary) > $iLenMax)
{
&log(ASSERT, "summary for ${strName} must be <= ${iLenMax} characters");
}
my $strFunction =
cgenBanner($strName . (defined($strSummary) ? " - ${strSummary}" : '')) .
$strSource;
return $strFunction;
}
push @EXPORT, qw(cgenFunction);
####################################################################################################################################
# cgenTypeFormat - format types values for C
####################################################################################################################################
sub cgenTypeFormat
{
my $strType = shift;
my $strValue = shift;
if ($strType eq CGEN_DATATYPE_BOOL)
{
return ($strValue == 1 ? 'true' : 'false');
}
elsif ($strType eq CGEN_DATATYPE_INT || $strType eq CGEN_DATATYPE_INT64 || $strType eq CGEN_DATATYPE_DOUBLE)
{
return $strValue;
}
elsif ($strType eq CGEN_DATATYPE_CONSTCHAR)
{
return ($strValue eq CGEN_DATAVAL_NULL ? 'NULL' : "\"${strValue}\"");
}
confess "unknown type ${strType}";
}
push @EXPORT, qw(cgenTypeFormat);
####################################################################################################################################
# cgenTypeName - format type names for C
####################################################################################################################################
sub cgenTypeName
{
my $strType = shift;
if ($strType eq CGEN_DATATYPE_BOOL)
{
return 'bool';
}
elsif ($strType eq CGEN_DATATYPE_INT)
{
return 'int';
}
elsif ($strType eq CGEN_DATATYPE_INT64)
{
return 'int64';
}
elsif ($strType eq CGEN_DATATYPE_DOUBLE)
{
return 'double';
}
elsif ($strType eq CGEN_DATATYPE_CONSTCHAR)
{
return 'const char *';
}
confess "unknown type ${strType}";
}
push @EXPORT, qw(cgenTypeName);
####################################################################################################################################
# cgenPermute - return all permutations of an array
####################################################################################################################################
sub cgenPermute
{
my $rxyList = shift;
# If there are one or less elements then the existing array represents the only permutation
return map [$_], @$rxyList if @{$rxyList} <= 1;
# Calculate permutations
my @xyPermutation;
for my $iIndex (0 .. $#{$rxyList})
{
my @xyRemaining = @{$rxyList};
my $xValue = splice(@xyRemaining, $iIndex, 1);
push @xyPermutation, [$xValue, @$_] for cgenPermute(\@xyRemaining, @{$rxyList} - 1);
}
return @xyPermutation;
}
push @EXPORT, qw(cgenPermute);
1;