mirror of
https://github.com/pragma-/pbot.git
synced 2024-11-30 07:59:42 +01:00
compiler_vm: Improve handling of \n in quoted literals
This commit is contained in:
parent
ccf1d35a54
commit
a4cf4136ee
@ -13,8 +13,8 @@ use warnings;
|
|||||||
# These are set automatically by the build/commit script
|
# These are set automatically by the build/commit script
|
||||||
use constant {
|
use constant {
|
||||||
BUILD_NAME => "PBot",
|
BUILD_NAME => "PBot",
|
||||||
BUILD_REVISION => 379,
|
BUILD_REVISION => 380,
|
||||||
BUILD_DATE => "2012-08-23",
|
BUILD_DATE => "2012-08-31",
|
||||||
};
|
};
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
# use warnings;
|
# use warnings;
|
||||||
use strict;
|
use strict;
|
||||||
use feature qw(switch);
|
use feature "switch";
|
||||||
|
|
||||||
use IPC::Open2;
|
use IPC::Open2;
|
||||||
use Text::Balanced qw(extract_bracketed extract_delimited);
|
use Text::Balanced qw(extract_bracketed extract_delimited);
|
||||||
@ -37,7 +37,7 @@ sub pretty {
|
|||||||
print $fh $code;
|
print $fh $code;
|
||||||
close $fh;
|
close $fh;
|
||||||
|
|
||||||
system("astyle", "-Ujpfnq", "prog.c");
|
system("astyle", "-UHjfnq", "prog.c");
|
||||||
|
|
||||||
open $fh, "<prog.c" or die "Couldn't read prog.c: $!";
|
open $fh, "<prog.c" or die "Couldn't read prog.c: $!";
|
||||||
$result = join '', <$fh>;
|
$result = join '', <$fh>;
|
||||||
@ -591,8 +591,63 @@ if(not $found) {
|
|||||||
print "code before: [$code]\n" if $debug;
|
print "code before: [$code]\n" if $debug;
|
||||||
|
|
||||||
$code =~ s/#include <([^>]+)>/#include <$1>\n/g;
|
$code =~ s/#include <([^>]+)>/#include <$1>\n/g;
|
||||||
$code =~ s/#([^ ]+) (.*?)\\n/#$1 $2\n/g;
|
|
||||||
$code =~ s/#([\w\d_]+)\\n/#$1\n/g;
|
# replace \n outside of quotes with literal newline
|
||||||
|
my $new_code = "";
|
||||||
|
|
||||||
|
use constant {
|
||||||
|
NORMAL => 0,
|
||||||
|
DOUBLE_QUOTED => 1,
|
||||||
|
SINGLE_QUOTED => 2,
|
||||||
|
};
|
||||||
|
|
||||||
|
my $state = NORMAL;
|
||||||
|
my $escaped = 0;
|
||||||
|
|
||||||
|
while($code =~ m/(.)/g) {
|
||||||
|
my $ch = $1;
|
||||||
|
|
||||||
|
given ($ch) {
|
||||||
|
when ('\\') {
|
||||||
|
if($escaped == 0) {
|
||||||
|
$escaped = 1;
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($state == NORMAL) {
|
||||||
|
when ($_ eq '"' and not $escaped) {
|
||||||
|
$state = DOUBLE_QUOTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
when ($_ eq "'" and not $escaped) {
|
||||||
|
$state = SINGLE_QUOTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
when ($_ eq 'n' and $escaped == 1) {
|
||||||
|
$ch = "\n";
|
||||||
|
$escaped = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($state == DOUBLE_QUOTED) {
|
||||||
|
when ($_ eq '"' and not $escaped) {
|
||||||
|
$state = NORMAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($state == SINGLE_QUOTED) {
|
||||||
|
when ($_ eq "'" and not $escaped) {
|
||||||
|
$state = NORMAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$new_code .= '\\' and $escaped = 0 if $escaped;
|
||||||
|
$new_code .= $ch;
|
||||||
|
}
|
||||||
|
|
||||||
|
$code = $new_code;
|
||||||
|
|
||||||
print "code after: [$code]\n" if $debug;
|
print "code after: [$code]\n" if $debug;
|
||||||
|
|
||||||
@ -703,8 +758,7 @@ print "after func extract, code: [$code]\n" if $debug;
|
|||||||
$code =~ s/\|n/\n/g;
|
$code =~ s/\|n/\n/g;
|
||||||
$code =~ s/^\s+//;
|
$code =~ s/^\s+//;
|
||||||
$code =~ s/\s+$//;
|
$code =~ s/\s+$//;
|
||||||
$code =~ s/;\n;\n/;\n/g;
|
$code =~ s/;\s+;\n/;\n/gs;
|
||||||
$code =~ s/^\s*;\s*$//gms;
|
|
||||||
|
|
||||||
my $single_quote = 0;
|
my $single_quote = 0;
|
||||||
my $double_quote = 0;
|
my $double_quote = 0;
|
||||||
@ -828,9 +882,11 @@ if($output =~ m/^\s*$/) {
|
|||||||
$output =~ s/compilation terminated.//;
|
$output =~ s/compilation terminated.//;
|
||||||
$output =~ s/<'(.)' = char>/<'$1' = int>/g;
|
$output =~ s/<'(.)' = char>/<'$1' = int>/g;
|
||||||
$output =~ s/, <incomplete sequence >//g;
|
$output =~ s/, <incomplete sequence >//g;
|
||||||
|
$output =~ s/\s*warning: shadowed declaration is here \[-Wshadow\]//g;
|
||||||
|
$output =~ s/preprocessor macro>\s+<at\s+>/preprocessor macro>/g;
|
||||||
|
|
||||||
# remove duplicate warnings/infos
|
# remove duplicate warnings/infos
|
||||||
$output =~ s/(warning: .*?\s)\1/$1/g;
|
$output =~ s/(\[*.*warning:.*?\s*)\1/$1/g;
|
||||||
$output =~ s/(info: .*?\s)\1/$1/g;
|
$output =~ s/(info: .*?\s)\1/$1/g;
|
||||||
$output =~ s/^\[\s+(warning:|info:)/[$1/; # remove leading spaces in first warning/info
|
$output =~ s/^\[\s+(warning:|info:)/[$1/; # remove leading spaces in first warning/info
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user