postgresql/src/backend/utils/Gen_dummy_probes.pl

260 lines
5.3 KiB
Perl

#! /usr/bin/perl -w
#-------------------------------------------------------------------------
#
# Gen_dummy_probes.pl
# Perl script that generates probes.h file when dtrace is not available
#
# Portions Copyright (c) 2008-2023, PostgreSQL Global Development Group
#
#
# IDENTIFICATION
# src/backend/utils/Gen_dummy_probes.pl
#
# This program was generated by running perl's s2p over Gen_dummy_probes.sed
#
#-------------------------------------------------------------------------
# turn off perlcritic for autogenerated code
## no critic
$0 =~ s/^.*?(\w+)[\.\w+]*$/$1/;
use strict;
use Symbol;
use vars qw{ $isEOF $Hold %wFiles @Q $CondReg
$doAutoPrint $doOpenWrite $doPrint };
$doAutoPrint = 1;
$doOpenWrite = 1;
# prototypes
sub openARGV();
sub getsARGV(;\$);
sub eofARGV();
sub printQ();
# Run: the sed loop reading input and applying the script
#
sub Run()
{
my ($h, $icnt, $s, $n);
# hack (not unbreakable :-/) to avoid // matching an empty string
my $z = "\000";
$z =~ /$z/;
# Initialize.
openARGV();
$Hold = '';
$CondReg = 0;
$doPrint = $doAutoPrint;
CYCLE:
while (getsARGV())
{
chomp();
$CondReg = 0; # cleared on t
BOS:;
# /^[ ]*probe /!d
unless (m /^[ \t]*probe /s)
{
$doPrint = 0;
goto EOS;
}
# s/^[ ]*probe \([^(]*\)\(.*\);/\1\2/
{
$s = s /^[ \t]*probe ([^(]*)(.*);/${1}${2}/s;
$CondReg ||= $s;
}
# s/__/_/g
{
$s = s /__/_/sg;
$CondReg ||= $s;
}
# y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
{ y{abcdefghijklmnopqrstuvwxyz}{ABCDEFGHIJKLMNOPQRSTUVWXYZ}; }
# s/^/#define TRACE_POSTGRESQL_/
{
$s = s /^/#define TRACE_POSTGRESQL_/s;
$CondReg ||= $s;
}
# s/([^,)]\{1,\})/(INT1)/
{
$s = s /\([^,)]+\)/(INT1)/s;
$CondReg ||= $s;
}
# s/([^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2)/
{
$s = s /\([^,)]+, [^,)]+\)/(INT1, INT2)/s;
$CondReg ||= $s;
}
# s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3)/
{
$s = s /\([^,)]+, [^,)]+, [^,)]+\)/(INT1, INT2, INT3)/s;
$CondReg ||= $s;
}
# s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3, INT4)/
{
$s =
s /\([^,)]+, [^,)]+, [^,)]+, [^,)]+\)/(INT1, INT2, INT3, INT4)/s;
$CondReg ||= $s;
}
# s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3, INT4, INT5)/
{
$s =
s /\([^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+\)/(INT1, INT2, INT3, INT4, INT5)/s;
$CondReg ||= $s;
}
# s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3, INT4, INT5, INT6)/
{
$s =
s /\([^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+\)/(INT1, INT2, INT3, INT4, INT5, INT6)/s;
$CondReg ||= $s;
}
# s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3, INT4, INT5, INT6, INT7)/
{
$s =
s /\([^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+\)/(INT1, INT2, INT3, INT4, INT5, INT6, INT7)/s;
$CondReg ||= $s;
}
# s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3, INT4, INT5, INT6, INT7, INT8)/
{
$s =
s /\([^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+\)/(INT1, INT2, INT3, INT4, INT5, INT6, INT7, INT8)/s;
$CondReg ||= $s;
}
# s/$/ do {} while (0)/
{
$s = s /$/ do {} while (0)/s;
$CondReg ||= $s;
}
# P
{
if (/^(.*)/) { print $1, "\n"; }
}
# s/(.*$/_ENABLED() (0)/
{
$s = s /\(.*$/_ENABLED() (0)/s;
$CondReg ||= $s;
}
EOS: if ($doPrint)
{
print $_, "\n";
}
else
{
$doPrint = $doAutoPrint;
}
printQ() if @Q;
}
exit(0);
}
Run();
# openARGV: open 1st input file
#
sub openARGV()
{
unshift(@ARGV, '-') unless @ARGV;
my $file = shift(@ARGV);
open(ARG, "<$file")
|| die("$0: can't open $file for reading ($!)\n");
$isEOF = 0;
}
# getsARGV: Read another input line into argument (default: $_).
# Move on to next input file, and reset EOF flag $isEOF.
sub getsARGV(;\$)
{
my $argref = @_ ? shift() : \$_;
while ($isEOF || !defined($$argref = <ARG>))
{
close(ARG);
return 0 unless @ARGV;
my $file = shift(@ARGV);
open(ARG, "<$file")
|| die("$0: can't open $file for reading ($!)\n");
$isEOF = 0;
}
1;
}
# eofARGV: end-of-file test
#
sub eofARGV()
{
return @ARGV == 0 && ($isEOF = eof(ARG));
}
# makeHandle: Generates another file handle for some file (given by its path)
# to be written due to a w command or an s command's w flag.
sub makeHandle($)
{
my ($path) = @_;
my $handle;
if (!exists($wFiles{$path}) || $wFiles{$path} eq '')
{
$handle = $wFiles{$path} = gensym();
if ($doOpenWrite)
{
if (!open($handle, ">$path"))
{
die("$0: can't open $path for writing: ($!)\n");
}
}
}
else
{
$handle = $wFiles{$path};
}
return $handle;
}
# printQ: Print queued output which is either a string or a reference
# to a pathname.
sub printQ()
{
for my $q (@Q)
{
if (ref($q))
{
# flush open w files so that reading this file gets it all
if (exists($wFiles{$$q}) && $wFiles{$$q} ne '')
{
open($wFiles{$$q}, ">>$$q");
}
# copy file to stdout: slow, but safe
if (open(RF, "<$$q"))
{
while (defined(my $line = <RF>))
{
print $line;
}
close(RF);
}
}
else
{
print $q;
}
}
undef(@Q);
}