# reads in a whole file
sub slurp {
my ($filename) = @_;
- open(my $fh, '<', $filename) or die "$!";
+ my $fh;
+ if (!open($fh, '<', $filename)) {
+ warn "Could not open $filename: $!";
+ return undef;
+ }
local $/;
my $result;
eval {
}
$choices{$name} = $app;
+ next;
}
if ((scalar grep { $_ eq 'command' } @entry_types) > 0) {
- my ($command) = split(' ', $apps{$app}->{Exec});
+ my $command = $apps{$app}->{Exec};
+
+ # Handle escape sequences (should be done for all string values, but does
+ # matter here).
+ my %escapes = (
+ '\\s' => ' ',
+ '\\n' => '\n',
+ '\\t' => '\t',
+ '\\r' => '\r',
+ '\\\\' => '\\',
+ );
+ $command =~ s/(\\[sntr\\])/$escapes{$1}/go;
+
+ # Extract executable
+ if ($command =~ m/^\s*([^\s\"]+)(?:\s|$)/) {
+ # No quotes
+ $command = $1;
+ } elsif ($command =~ m/^\s*\"([^\"\\]*(?:\\.[^\"\\]*)*)\"(?:\s|$)/) {
+ # Quoted, remove quotes and fix escaped characters
+ $command = $1;
+ $command =~ s/\\([\"\`\$\\])/$1/g;
+ } else {
+ # Invalid quotes, fallback to whitespace
+ ($command) = split(' ', $command);
+ }
# Don’t add “geany” if “Geany” is already present.
my @keys = map { lc } keys %choices;
- next if (scalar grep { $_ eq lc(basename($command)) } @keys) > 0;
-
- $choices{basename($command)} = $app;
+ if (!(scalar grep { $_ eq lc(basename($command)) } @keys) > 0) {
+ $choices{basename($command)} = $app;
+ }
+ next;
}
if ((scalar grep { $_ eq 'filename' } @entry_types) > 0) {