otter 1.2.1

Otter game system; main data structures Rust crate.
Documentation
#!/usr/bin/perl -w

use strict;

die unless @ARGV == 4;
our ($out, $in, $lic, $usvg) = @ARGV;

open STDOUT, '>', "$out.tmp" or die $!;
open L, '<', $lic or die $!;
open STDIN, "<", $in or die $!;

$!=0; my $git = `git rev-parse HEAD`;       die "$? $!" if $! || $?;
$!=0; my $plus = `git status --porcelain`;  die "$? $!" if $! || $?;
chomp $git; chomp $plus;
$git .= "+" if length $plus;

sub add_lic () {
  while (<L>) {
    next unless m{^\s*SPDX-License-Identifier:\s+(\S.*?)\s*$};
    print "<!-- otter.git#$git $out $1, see $lic -->\n" or die $!;
    return;
  }
  die "no spdx in $lic ?";
}

add_lic();

flush STDOUT or die $!;
my $cmd = "$usvg";

open OPTS, "src/USVG_DEFAULT_ARGS.txt" or die $!;
while (<OPTS>) {
  s/^\s*$//; s/\s*$//;
  next unless m/^[^#]/;
  $cmd .= " '$_'";
}

$cmd .= " - -c";

my $cmd_m = "$cmd <$in >$out.tmp";
print STDERR "+ $cmd_m\n";

$!=0; $?=0; system qw(sh -ec), "exec $cmd" and die "exec usvg: $cmd_m: $? $!";
rename "$out.tmp", $out or die "'$cmd_m': $!";