mirror of
https://github.com/pgbackrest/pgbackrest.git
synced 2024-12-14 10:13:05 +02:00
8efcc38304
* Update C naming conventions. * Use int datatype wherever possible. * Better separation of C source from Perl interface.
192 lines
6.3 KiB
Perl
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;
|