gen_guc_tables.pl
text/x-perl-script
Filename: gen_guc_tables.pl
Type: text/x-perl-script
Part: 0
#!/usr/bin/perl -w
#----------------------------------------------------------------------
#
# Generate guc_tables.c from guc_parameters.dat.
#
# Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
# Portions Copyright (c) 1994, Regents of the University of California
#
# src/backend/utils/misc/gen_guc_tables.pl
#
#----------------------------------------------------------------------
use strict;
use warnings FATAL => 'all';
use v5.14;
use FindBin;
use lib "$FindBin::RealBin/../../catalog";
use Catalog;
die "Usage: $0 INPUT_FILE OUTPUT_FILE\n" unless @ARGV == 2;
my ($input_fname, $output_fname) = @ARGV;
my $parse = Catalog::ParseData($input_fname);
open my $ofh, '>', $output_fname or die "Cannot open $output_fname: $!\n";
print_boilerplate($ofh, $output_fname, 'GUC tables');
print_one_table($ofh, $_) for (qw(bool int real string enum));
close $ofh;
# Adds double quotes and escapes as necessary for C strings.
sub dquote($) { '"' . $_[0] =~ s/"/\\"/gr . '"' }
# Print GUC table for one type.
sub print_one_table
{
my ($ofh, $type) = @_;
my $Type = ucfirst $type;
print {$ofh}
"\n\n",
"struct config_${type} ConfigureNames${Type}[] =\n",
"{\n";
for my $entry (@{$parse})
{
next if $entry->{type} ne $type;
my $is_num = $entry->{type} eq 'int' || $entry->{type} eq 'real';
say {$ofh} "#ifdef $entry->{ifdef}" if $entry->{ifdef};
print {$ofh} "\t{",
sprintf(
"\t\t{%s, %s, %s,\n",
dquote $entry->{name},
$entry->{context}, $entry->{group},),
sprintf("\t\t\tgettext_noop(%s),\n", dquote $entry->{short_desc}),
( $entry->{long_desc}
? sprintf("\t\t\tgettext_noop(%s)", dquote $entry->{long_desc})
: ("\t\t\tNULL")),
($entry->{flags} ? (",\n\t\t\t$entry->{flags}\n") : "\n"),
"\t\t},\n",
"\t\t&$entry->{variable},\n",
"\t\t$entry->{boot_val},",
($is_num ? (" $entry->{min}, $entry->{max},") : ()),
($entry->{type} eq 'enum' ? (" $entry->{options},") : ()), "\n",
sprintf(
"\t\t%s, %s, %s\n",
$entry->{check_hook} || 'NULL',
$entry->{assign_hook} || 'NULL',
$entry->{show_hook} || 'NULL',),
"\t},\n",
($entry->{ifdef} ? ("#endif") : ()),
"\n",
;
}
print {$ofh}
"\t/* End-of-list marker */\n",
"\t{{0}}\n",
"};\n";
return;
}
sub print_boilerplate
{
my ($fh, $fname, $descr) = @_;
printf {$fh} <<EOM, $fname, $descr;
/*-------------------------------------------------------------------------
*
* %s
* %s
*
* Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* NOTES
* ******************************
* *** DO NOT EDIT THIS FILE! ***
* ******************************
*
* It has been GENERATED by src/backend/utils/misc/gen_guc_tables.pl
*
*-------------------------------------------------------------------------
*/
EOM
return;
}