diff options
Diffstat (limited to 'src/tools/msvc/pgflex.pl')
-rw-r--r-- | src/tools/msvc/pgflex.pl | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/tools/msvc/pgflex.pl b/src/tools/msvc/pgflex.pl new file mode 100644 index 00000000000..332d422f649 --- /dev/null +++ b/src/tools/msvc/pgflex.pl @@ -0,0 +1,76 @@ +# -*-perl-*- hey - emacs - this is a perl file + +# src/tools/msvc/pgflex.pl + +# silence flex bleatings about file path style +$ENV{CYGWIN} = 'nodosfilewarning'; + +use strict; +use File::Basename; + +# assume we are in the postgres source root + +require 'src/tools/msvc/buildenv.pl' if -e 'src/tools/msvc/buildenv.pl'; + +system('flex -V > NUL'); +if ($? != 0) +{ + print "WARNING! flex install not found, attempting to build without\n"; + exit 0; +} + +my $input = shift; +if ($input !~ /\.l$/) +{ + print "Input must be a .l file\n"; + exit 1; +} +elsif (!-e $input) +{ + print "Input file $input not found\n"; + exit 1; +} + +(my $output = $input) =~ s/\.l$/.c/; + +# get flex flags from make file +my $makefile = dirname($input) . "/Makefile"; +my ($mf, $make); +open($mf,$makefile); +local $/ = undef; +$make=<$mf>; +close($mf); +my $flexflags = ($make =~ /^\s*FLEXFLAGS\s*=\s*(\S.*)/m ? $1 : ''); + +system("flex $flexflags -o$output $input"); +if ($? == 0) +{ + + # For non-reentrant scanners we need to fix up the yywrap macro definition + # to keep the MS compiler happy. + # For reentrant scanners (like the core scanner) we do not + # need to (and must not) change the yywrap definition. + my $lfile; + open($lfile,$input) || die "opening $input for reading: $!"; + my $lcode = <$lfile>; + close($lfile); + if ($lcode !~ /\%option\sreentrant/) + { + my $cfile; + open($cfile,$output) || die "opening $output for reading: $!"; + my $ccode = <$cfile>; + close($cfile); + $ccode =~ s/yywrap\(n\)/yywrap()/; + open($cfile,">$output") || die "opening $output for reading: $!"; + print $cfile $ccode; + close($cfile); + } + + exit 0; + +} +else +{ + exit $? >> 8; +} + |