]> ruderich.org/simon Gitweb - fcscs/fcscs.git/blobdiff - bin/fcscs
add missing path handler config
[fcscs/fcscs.git] / bin / fcscs
index c4a9b05969ea907a7a69e00cc4ade1f14883a700..80c89bfde6f082ecca6ff674f7ee32d87388377c 100755 (executable)
--- a/bin/fcscs
+++ b/bin/fcscs
@@ -64,6 +64,7 @@ Short overview of the general usage, details below:
         - f: file paths
         - i: IPs
         - u: URLs
+        - c: checksums (e.g. MD5, SHA1, ..)
         - ...
         - /: search mode
     - for `normal' modes:
@@ -741,11 +742,13 @@ The following normal modes are available:
 
 =over 4
 
-=item B<path mode> select relative/absolute paths
+=item B<path mode>     select relative/absolute paths
 
-=item B<url mode>  select URLs
+=item B<url mode>      select URLs
 
-=item B<ip mode>   select IPv4 and IPv6 addresses
+=item B<ip mode>       select IPv4 and IPv6 addresses
+
+=item B<checksum mode> select checksums (MD5, SHA1, SHA256, SHA512)
 
 =back
 
@@ -759,7 +762,7 @@ sub mapping_mode_path {
     return {
         select  => 'path select',
         matches => \@matches,
-        handler => $config->{handler}{yank},
+        handler => $config->{handler}{path},
     };
 }
 sub mapping_mode_url {
@@ -787,6 +790,18 @@ sub mapping_mode_ip {
         handler => $config->{handler}{ip},
     };
 }
+sub mapping_mode_checksum {
+    my ($key, $screen, $config, $input) = @_;
+
+    $screen->debug('mapping_mode_checksum', 'started');
+
+    my @matches = get_regex_matches($input, $config->{regex}{checksum});
+    return {
+        select  => 'checksum select',
+        matches => \@matches,
+        handler => $config->{handler}{checksum},
+    };
+}
 
 =head2 SEARCH MODE (AND EXTEND MODE)
 
@@ -1078,6 +1093,8 @@ them in parentheses):
 
 =item B<i> select IPv4 and IPv6 addresses (C<\&mapping_mode_ip>)
 
+=item B<c> select checksums (e.g. MD5, SHA) (C<\&mapping_mode_checksum>)
+
 =item B</> search for regex to get selection (C<\&mapping_mode_search>)
 
 =item B<q> quit fcscs (C<\&mapping_quit>)
@@ -1131,6 +1148,7 @@ my %mapping_mode = (
     f   => \&mapping_mode_path,
     u   => \&mapping_mode_url,
     i   => \&mapping_mode_ip,
+    c   => \&mapping_mode_checksum,
     '/' => \&mapping_mode_search,
     q   => \&mapping_quit,
 );
@@ -1256,6 +1274,8 @@ my %regex = (
     # enough.
     ipv4 => qr!\b(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?:/\d{1,2})?)\b!,
     ipv6 => qr!\b((?:[0-9a-fA-F]{1,4})?(?::+[0-9a-fA-F]{1,4})+(?:/\d{1,3})?)\b!,
+    # MD5, SHA1, SHA256, SHA512
+    checksum => qr!\b([0-9a-fA-F]{32}|[0-9a-fA-F]{40}|[0-9a-fA-F]{64}|[0-9a-fA-F]{128})\b!,
 );
 
 =head2 HANDLERS
@@ -1266,13 +1286,17 @@ The following handlers are available, defaults in parentheses.
 
 =over
 
-=item B<yank>  used to yank (copy) selection to paste buffer (C<\&handler_yank>)
+=item B<yank>     used to yank (copy) selection to paste buffer (C<\&handler_yank>)
+
+=item B<paste>    used to paste selection into window (C<\&handler_paste>)
 
-=item B<paste> used to paste selection into window (C<\&handler_paste>)
+=item B<path>     used to handle paths (C<\&handler_yank>)
 
-=item B<url>   used to open URLs (e.g. in a browser) (C<\&handler_url>)
+=item B<url>      used to open URLs (e.g. in a browser) (C<\&handler_url>)
 
-=item B<ip>    used to handle IPs (C<\&handler_yank>)
+=item B<ip>       used to handle IPs (C<\&handler_yank>)
+
+=item B<checksum> used to handle checksums (C<\&handler_yank>)
 
 =back
 
@@ -1293,10 +1317,12 @@ Example:
 
 =cut
 my %handler = (
-    yank  => \&handler_yank,
-    paste => \&handler_paste,
-    url   => \&handler_url,
-    ip    => \&handler_yank,
+    yank     => \&handler_yank,
+    paste    => \&handler_paste,
+    path     => \&handler_yank,
+    url      => \&handler_url,
+    ip       => \&handler_yank,
+    checksum => \&handler_yank,
 );
 
 my %state = (
@@ -1319,6 +1345,7 @@ Create a new Curses attribute with the given fore- and background color.
     mapping_mode_path()
     mapping_mode_url()
     mapping_mode_ip()
+    mapping_mode_checksum()
     mapping_mode_search()
 
     mapping_paste()
@@ -1370,7 +1397,7 @@ Example:
         }
 
         return $result;
-    }
+    };
     # Also update initial mode to use our new "URL mode".
     $config{setting}{initial_mode} = $config{mapping}{mode}{u};
 
@@ -1398,6 +1425,7 @@ package Fcscs {
     sub mapping_mode_path { return main::mapping_mode_path(@_); }
     sub mapping_mode_url { return main::mapping_mode_url(@_); }
     sub mapping_mode_ip { return main::mapping_mode_ip(@_); }
+    sub mapping_mode_checksum { return main::mapping_mode_checksum(@_); }
     sub mapping_mode_search { return main::mapping_mode_search(@_); }
 
     sub mapping_paste { return main::mapping_paste(@_); }
@@ -1449,10 +1477,10 @@ package Fcscs {
         }
         # Make sure the file is not writable by other users. Doesn't handle
         # ACLs and see comment above about race conditions.
-        my @stat = stat $path or die $!;
+        my @stat = stat $path or $screen->die("Config '$decoded': $!");
         my $mode = $stat[2];
         if (($mode & Fcntl::S_IWGRP) or ($mode & Fcntl::S_IWOTH)) {
-            die "Config '$decoded' must not be writable by other users.";
+            $screen->die("Config '$decoded' must not be writable by other users.");
         }
 
         my $result = do $path;