103 lines
4.7 KiB
Perl
103 lines
4.7 KiB
Perl
#!/usr/bin/perl
|
|
#-------------------------------------------------------------------------
|
|
#
|
|
# mtlocal.pl--
|
|
# perl script which converts files generated by YACC(BISON) and LEX(FLEX) to
|
|
# be used in MT version.
|
|
#
|
|
# NOTES
|
|
# Add THR_LOCAL for generated global and static variables. There are four
|
|
# parts need to be converted:
|
|
# 1. replication parser: (src/backend/replication/)
|
|
# repl_gram.c repl_scanner.c
|
|
# 2. bootstrap parser: (src/backend/bootstrap/)
|
|
# bootparse.c bootscanner.c
|
|
# 3. plsql parser: (src/pl/plpgsql/src/) pl_gram.c pl_gram.h
|
|
#
|
|
# sql parser: (src/backend/parser) gram.y scan.l is a reentrant (thread-safe) parser already
|
|
#
|
|
# USAGE NOTICE
|
|
# 1. This script only convert variables generated by YACC and LEX (with
|
|
# prefix "yy"). Global or static variables added in .y and .l files
|
|
# should be converted manully.
|
|
# 2. "THR_LOCAL"s are added to declaration and definition of global or static
|
|
# variables.
|
|
# 3. Self-defined global or static variables should be added to .y and .l
|
|
# files, but not generated .c and .h files. "THR_LOCAL" should be added to
|
|
# declaration and definition.
|
|
# For example:
|
|
# "static int xcdepth = 0;" ==> "static THR_LOCAL int xcdepth = 0;"
|
|
# "extern char *buf;" ==> "extern THR_LOCAL char *buf;"
|
|
#
|
|
# IDENTIFICATION
|
|
# $PostgreSQL: pgsql/src/mtlocal.pl,v 1.1 2006/11/29 19:49:31 tgl Exp $
|
|
#
|
|
#-------------------------------------------------------------------------
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
my $fname = shift;
|
|
my $tmpfname = $fname . ".tmp";
|
|
my $F;
|
|
my $OF;
|
|
|
|
open($F, $fname) || die "Could not open file $fname\n";
|
|
open($OF, ">$tmpfname") || die "Could not open file $tmpfname\n";
|
|
|
|
while (my $indata = <$F>)
|
|
{
|
|
$indata =~ s/(char \*yy_c_buf_p = \(char \*\) 0;)/THR_LOCAL $1/;
|
|
$indata =~ s/(char \*yy_c_buf_p = NULL;)/THR_LOCAL $1/;
|
|
$indata =~ s/(char \*yy_last_accepting_cpos;)/THR_LOCAL $1/;
|
|
$indata =~ s/(char \*yytext;)/THR_LOCAL $1/;
|
|
$indata =~ s/(char \*base_yytext;)/THR_LOCAL $1/;
|
|
$indata =~ s/(char \*plpgsql_base_yytext;)/THR_LOCAL $1/;
|
|
$indata =~ s/(char yy_hold_char;)/THR_LOCAL $1/;
|
|
$indata =~ s/(FILE \*yyin = \(FILE \*\) 0, \*yyout = \(FILE \*\) 0;)/THR_LOCAL $1/;
|
|
$indata =~ s/(FILE \*yyin, \*yyout;)/THR_LOCAL $1/;
|
|
$indata =~ s/(int \*yy_start_stack = 0;)/THR_LOCAL $1/;
|
|
$indata =~ s/(int yy_did_buffer_switch_on_eof;)/THR_LOCAL $1/;
|
|
$indata =~ s/(int yy_init = 1;)/THR_LOCAL $1/;
|
|
$indata =~ s/(int yy_start = 0;)/THR_LOCAL $1/;
|
|
$indata =~ s/(int yy_start_stack_depth = 0;)/THR_LOCAL $1/;
|
|
$indata =~ s/(int yy_start_stack_ptr = 0;)/THR_LOCAL $1/;
|
|
$indata =~ s/(int yychar;)/THR_LOCAL $1/;
|
|
$indata =~ s/(int yydebug;)/THR_LOCAL $1/;
|
|
$indata =~ s/(int yyleng;)/THR_LOCAL $1/;
|
|
$indata =~ s/(int yynerrs;)/THR_LOCAL $1/;
|
|
$indata =~ s/(YY_BUFFER_STATE yy_current_buffer = 0;)/THR_LOCAL $1/;
|
|
$indata =~ s/(yy_state_type yy_last_accepting_state;)/THR_LOCAL $1/;
|
|
$indata =~ s/(YYLTYPE base_yylloc;)/THR_LOCAL $1/;
|
|
$indata =~ s/(YYLTYPE yylloc;)/THR_LOCAL $1/;
|
|
$indata =~ s/(YYSTYPE base_yylval;)/THR_LOCAL $1/;
|
|
$indata =~ s/(YYSTYPE boot_yylval;)/THR_LOCAL $1/;
|
|
$indata =~ s/(YYSTYPE plpgsql_yylval;)/THR_LOCAL $1/;
|
|
$indata =~ s/(YYLTYPE plpgsql_yylloc;)/THR_LOCAL $1/;
|
|
$indata =~ s/(YYSTYPE yylval;)/THR_LOCAL $1/;
|
|
$indata =~ s/(static )(int yy_n_chars;)/$1THR_LOCAL $2/;
|
|
$indata =~ s/(static )(yy_size_t yy_n_chars;)/$1THR_LOCAL $2/;
|
|
$indata =~ s/(extern )(FILE \*replication_yyin, \*replication_yyout;)/$1THR_LOCAL $2/;
|
|
$indata =~ s/(extern )(int replication_yy_flex_debug;)/$1THR_LOCAL $2/;
|
|
$indata =~ s/(int replication_yyleng;)/THR_LOCAL $1/;
|
|
$indata =~ s/(static )(size_t yy_buffer_stack_top = 0;)/$1THR_LOCAL $2/;
|
|
$indata =~ s/(static )(size_t yy_buffer_stack_max = 0;)/$1THR_LOCAL $2/;
|
|
$indata =~ s/(static )(YY_BUFFER_STATE \* yy_buffer_stack = 0;)/$1THR_LOCAL $2/;
|
|
$indata =~ s/(static )(YY_BUFFER_STATE \* yy_buffer_stack = NULL;)/$1THR_LOCAL $2/;
|
|
$indata =~ s/(static )(int yy_init = 0;)/$1THR_LOCAL $2/;
|
|
$indata =~ s/(FILE \*replication_yyin = \(FILE \*\) 0, \*replication_yyout = \(FILE \*\) 0;)/THR_LOCAL $1/;
|
|
$indata =~ s/(int replication_yy_flex_debug = 0;)/THR_LOCAL $1/;
|
|
$indata =~ s/(char \*replication_yytext;)/THR_LOCAL $1/;
|
|
$indata =~ s/(FILE \*yyin = NULL, \*yyout = NULL;)/THR_LOCAL $1/;
|
|
$indata =~ s/(YYLTYPE yylloc)/THR_LOCAL $1/;
|
|
$indata =~ s/(extern )(YYSTYPE replication_yylval;)/$1THR_LOCAL $2/;
|
|
$indata =~ s/(YYSTYPE yylval YY_INITIAL_VALUE\(yyval_default\);)/THR_LOCAL $1/;
|
|
$indata =~ s/THR_LOCAL THR_LOCAL/THR_LOCAL/;
|
|
print $OF $indata;
|
|
}
|
|
close($F);
|
|
close($OF);
|
|
|
|
unlink($fname);
|
|
rename($tmpfname, $fname);
|