diff --git a/modules/c2english.pl b/modules/c2english.pl index 7278c39d..64c8e589 100755 --- a/modules/c2english.pl +++ b/modules/c2english.pl @@ -377,6 +377,7 @@ if(not $force and $ret != 0) { $output =~ s/\s*note: use option -std=c99 or -std=gnu99 to compile your code//g; $output =~ s/\s*\(declared at .*?\)//g; $output =~ s/, note: declared here//g; + $output =~ s#/usr/include/.*?.h:\d+:\d+:/##g; # don't error about undeclared objects $output =~ s/error: '[^']+' undeclared\s*//g; diff --git a/modules/c2english/CGrammar.pm b/modules/c2english/CGrammar.pm index a478b189..e08de595 100644 --- a/modules/c2english/CGrammar.pm +++ b/modules/c2english/CGrammar.pm @@ -1881,30 +1881,37 @@ constant: $return .= "long " while $item[-1] =~ s/[Ll]//; $return .= $item[-1]; } - | /(?:\'((?:\\\'|(?!\').)*)\')/ # character constant + | /[LuU]?(?:\'(?:\\\'|(?!\').)*\')/ # character constant { my $constant = $item[1]; + my $modifier = ""; + + $modifier = 'wide character ' if $constant =~ s/^L//; + $modifier = '16-bit character ' if $constant =~ s/^u//; + $modifier = '32-bit character ' if $constant =~ s/^U//; if ($constant eq q('\n')) { - $return = 'a newline'; + $return = "a $modifier" . 'newline'; } elsif ($constant eq q('\f')) { - $return = 'a form-feed character'; + $return = "a $modifier" . 'form-feed character'; } elsif ($constant eq q('\t')) { - $return = 'a tab'; + $return = "a $modifier" . 'tab'; } elsif ($constant eq q('\v')) { - $return = 'a vertical tab'; + $return = "a $modifier" . 'vertical tab'; } elsif ($constant eq q('\b')) { - $return = 'an alert character'; + $return = 'an alert character' if not length $modifier; + $return = "a $modifier" . 'alert character' if length $modifier; } elsif ($constant eq q('\r')) { - $return = 'a carriage-return'; + $return = "a $modifier" . 'carriage-return'; } elsif ($constant eq q('\b')) { - $return = 'a backspace character'; + $return = "a $modifier" . 'backspace character'; } elsif ($constant eq q('\'')) { - $return = 'a single-quote'; + $return = "a $modifier" . 'single-quote'; } elsif ($constant eq q(' ')) { - $return = 'a space'; + $return = "a $modifier" . 'space'; } else { - $return = $constant; + $return = $constant if not length $modifier; + $return = "a $modifier$constant" if length $modifier; } } @@ -1913,19 +1920,26 @@ identifier_word: { $return = "`$item[-1]`"; } string: - (/(?:\"(?:\\\"|(?!\").)*\")/)(s) + (/(u8|u|U|L)?(?:\"(?:\\\"|(?!\").)*\")/)(s) { - if (@{$item[-1]} == 1) { - $return = @{$item[-1]}[0]; - } else { - $return = '"'; - foreach my $string (@{$item[-1]}) { - $string =~ s/^"//; - $string =~ s/"$//; - $return .= $string; + my $final_string = ""; + foreach my $string (@{$item[-1]}) { + if (not length $final_string) { + my $modifier = ""; + $modifier = 'an UTF-8 string ' if $string =~ s/^u8//; + $modifier = 'a wide character string ' if $string =~ s/^L//; + $modifier = 'a 16-bit character string ' if $string =~ s/^u//; + $modifier = 'a 32-bit character string ' if $string =~ s/^U//; + $final_string = $modifier; + $final_string .= '"'; } - $return .= '"'; + + $string =~ s/^"//; + $string =~ s/"$//; + $final_string .= $string; } + $final_string .= '"'; + $return = $final_string; } reserved: