chiark / gitweb /
commitid: Move a comma (nfc)
[reprap-play.git] / commitid.scad.pl
index 35bc341ff4e2043fd64c4228d70548943211ae65..f07bdeb12fb9e33030e4b495043d4a830c21d0cb 100755 (executable)
 # starts abcdeffedbcaabcdef...  In the examples `_' shows where a
 # space would be printed.
 #
-#   Small2 Small3 ... Small10
+#   Small2 Small3 ... Small9 Small10 Small12 Small14 Small16
 #       A single line containing as much of the count will fit, eg:
 #            Small5    3456*
 #            Small8    _*123456
 #       will fit without makign the output ambiguous:
 #            Small9    ab*123456
 #
-#   Small2S Small4S ... Small10S
-#   Small3T Small9T
+#   Small2S Small4S ... Small16S
+#   Small3T Small9T Small12T
 #       Same as Small but split into two lines (S)
 #       or three lines (T).  Eg:
 #            Small4S    *4       Small6T   _*
 #                       56                 34
 #                                          56
-#   Git2 Git3 ... Git10
-#   Git4S Git6S ... Git10S
-#   Git6T Git9T
+#   Git2 Git3 ... Git9 Git10 Git12 Git14 Git16
+#   Git4S Git6S ... Git16S
+#   Git6T Git9T Git12T
 #       Just the commit object hash, in one, two (S) or three (T)
 #       lines.  E.g.:
 #            Git5    abcd*
 #   Full4 Full6 ... Full20:
 #       The commit object hash plus the commit count, on
 #       separate lines, eg:
-#            Full6    abcdef     Full8     abcdeffe
+#            Full12   abcdef     Full16    abcdeffe
 #                     *23456               _*123456
 #
 #   Full6T Full9T ... Full30T
@@ -261,8 +261,17 @@ use strict;
 
 $SIG{__WARN__} = sub { die @_; };
 
+our $debug=0;
+
+if (@ARGV && $ARGV[0] =~ m/^-(D+)$/) {
+    $debug = length $1;
+    shift @ARGV;
+}
+
 sub p { print @_ or die $!; }
 
+sub p_debug { print STDERR @_ if $debug; }
+
 p <<'END';
 // *** AUTOGENERATED - DO NOT EDIT *** //
 function Commitid_pixelsz() =
@@ -351,6 +360,19 @@ END
 
 our @demo;
 
+
+sub p_edgelist ($$$) {
+    my ($points,$vecs,$p) = @_;
+    my @vec;
+    foreach my $pt (@$p) {
+       $pt =~ s{\d{5}}{$&,};
+       $pt =~ s{\b\d}{$&.}g;
+       push @$points, "[$pt]";
+       push @vec, $#$points;
+    }
+    push @$vecs, \@vec;
+}
+
 sub parsefont () {
     my %cellmap;
     for (;;) {
@@ -362,6 +384,8 @@ sub parsefont () {
        $cellmap{$1} = $_;
     }
     my %chrpolys;
+    # $chrs{$chr}[$poly] = $poly
+    # $poly->{E} = [ "012345012345", ... ]
     while (<DATA>) {
        next unless m/\S/;
        chomp;
@@ -388,7 +412,7 @@ sub parsefont () {
                        die unless $f;
                        $f =~ s/\b\d/ sprintf '%05d', $col*2000 + $&*1025 /ge;
                        $f =~ s/\d\b/ sprintf '%05d', $row*2000 + $&*1025 /ge;
-                       push @{ $chrpolys{$chr} }, [ split / /, $f ];
+                       push @{ $chrpolys{$chr} }, { E => [ split / /, $f ] };
                    } else {
                        die "$_ ?";
                    }
@@ -401,19 +425,15 @@ sub parsefont () {
     my $demo = '';
     my $democols = 6;
     foreach my $chr (sort keys %chrpolys) {
+       my $polys = $chrpolys{$chr};
        my $mod = chrmodname $chr;
        p "module $mod () {\n";
-       foreach my $poly (@{ $chrpolys{$chr} }) {
-           p " polygon([";
-           my $delim = "";
-           foreach my $pt (@$poly) {
-               p $delim;
-               $pt =~ s{\d{5}}{$&,};
-               $pt =~ s{\b\d}{$&.}g;
-               p "[$pt]";
-               $delim = ',';
-           }
-           p "]);\n";
+       foreach my $poly (@$polys) {
+           p " polygon(";
+           my (@points, @vecs);
+           p_edgelist(\@points, \@vecs, $poly->{E});
+           p "points=[".(join ",",@points)."],";
+           p "convexity=4);\n";
        }
        p "}\n";
        $demo .= $chr;
@@ -428,26 +448,35 @@ our $do_git_untracked = 1;
 our $argcounter;
 
 our @forms;
+our %included; # 0 = not at all; 1 = truncated; 2 = full
 
-sub rjustt ($$;$) { # right justify and truncate (ie, pad and truncate at left)
-                    # always includes prefix
-    my ($sz, $whole, $prefix) = @_;
+sub rjustt ($$$;$) {
+    # right justify and truncate (ie, pad and truncate at left)
+    # always includes prefix
+    # sets $included{$what}
+    my ($sz, $what, $whole, $prefix) = @_;
     $prefix //= '';
     my $lw = length $whole;
     my $spare = $sz - $lw - (length $prefix);
+    $included{$what}= 1 + ($spare > 0);
     return
        ($spare > 0 ? (' ' x $spare) : '').
        $prefix.
        substr($whole, ($spare < 0 ? -$spare : 0));
 }
 
-sub ljustt ($$;$) {
-    my ($sz, $whole, $suffix) = @_;
+sub ljustt ($$$;$) {
+    my ($sz, $what, $whole, $suffix) = @_;
     $suffix //= '';
     $sz -= length $suffix;
+    $included{$what} = 1 + ($sz >= length $whole);
     return sprintf "%-${sz}.${sz}s%s", $whole, $suffix;
 }
 
+sub genform_prep() {
+    $included{$_}=0 foreach qw(Objid Count);
+}
+
 sub genform ($@) {
     my ($form, @lines) = @_;
     gentextmodule($form, @lines);
@@ -456,6 +485,7 @@ sub genform ($@) {
        Chars => (length join '', @lines),
        Lines => (scalar @lines),
        Ambiguous => ($form =~ m/Full/ && !grep { m/\W/ } @lines),
+       Included => { %included },
     };
     push @forms, $f;
 }
@@ -533,39 +563,44 @@ sub do_git () {
     print STDERR join ' ', map { $_ // '?' }
        "-- commitid", $git_object, $git_dirty, $git_count, "--\n";
 
-    foreach my $sz (2..10) {
+    foreach my $sz (2..10, qw(12 14 16)) {
        gentextmodule_demo_start_batch();
 
        if (defined($git_count)) {
-           my $smallstr = rjustt($sz, $git_count, $git_dirty);
+           genform_prep();
+           my $smallstr = rjustt($sz, 'Count', $git_count, $git_dirty);
            my $forgitobj = $sz - length($git_count) - 1;
            if (defined($git_object) && $forgitobj >= 2) {
-               $smallstr = rjustt($forgitobj, $git_object).
+               $smallstr = ljustt($forgitobj, 'Objid', $git_object).
                    ($git_dirty || ' ').
                    $git_count;
            }
            genform_plusq("Small$sz", $smallstr);
        }
 
-       genform_plusq("Git$sz", ljustt($sz, $git_object, $git_dirty))
+       genform_prep();
+       genform_plusq("Git$sz", ljustt($sz, 'Objid', $git_object, $git_dirty))
            if defined $git_object;
 
-       if (defined $git_count && defined $git_object) {
+       if (defined $git_count && defined $git_object && $sz<=10) {
+           genform_prep();
            genform("Full".($sz*2),
-                   ljustt($sz, $git_object),
-                   rjustt($sz, $git_count, $git_dirty));
+                   ljustt($sz, 'Objid', $git_object),
+                   rjustt($sz, 'Count', $git_count, $git_dirty));
 
+           genform_prep();
            my $e = $sz;
            genform("Full".($e*3)."T",
-                   ljustt($e*2, $git_object, $git_dirty)
+                   ljustt($e*2, 'Objid', $git_object, $git_dirty)
                    =~ m/.{$e}/g,
-                   rjustt($e, $git_count));
+                   rjustt($e, 'Count', $git_count));
        }
     }
 }
 
 sub do_some_best ($$) {
-    my ($modname, $formre) = @_;
+    my ($bestwhat, $formre) = @_;
+    my $modname = "Best$bestwhat";
     my $fullmodname = "Commitid_${modname}_2D";
     my @argl = qw(max_sz margin=Commitid_pixelsz());
     p "module $fullmodname(".argl_formal(@argl).") {\n";
@@ -575,6 +610,7 @@ sub do_some_best ($$) {
     my @do;
     foreach my $f (
         sort {
+           $b->{Included}{$bestwhat} <=> $a->{Included}{$bestwhat} or
            $b->{Chars} <=> $a->{Chars} or
            $a->{Lines} <=> $b->{Chars}
         }
@@ -628,8 +664,8 @@ sub do_git_best () {
     # (decreasing), and then by number of lines (increasing) and
     # try each one both ways round.
 
-    do_some_best('BestCount', 'Small|Full') if $do_git =~ m/c/;
-    do_some_best('BestObjid', 'Git|Full') if $do_git =~ m/o/;
+    do_some_best('Count', 'Small|Full') if $do_git =~ m/c/;
+    do_some_best('Objid', 'Git|Full') if $do_git =~ m/o/;
 }
 
 while (@ARGV) {