@@@ mess!
[sod] / doc / check-docs
index c721da2..e7bc9de 100755 (executable)
@@ -22,7 +22,7 @@ sub scansyms (\%$) {
     elsif ($st eq LIST) {
       my @F = split;
       (my $sym = shift @F) =~ s/^(.+)://;
-      $labels->{"sym:$sym"} = 1 unless @F;
+      $labels->{"sym:$sym"} = $file;
       for my $t (@F) {
        if ($t eq 'constant') { $labels->{"const:$sym"} = $file; }
        elsif ($t eq 'variable') { $labels->{"var:$sym"} = $file; }
@@ -34,6 +34,8 @@ sub scansyms (\%$) {
        elsif ($t eq 'class') { $labels->{"cls:$sym"} = $file; }
        elsif ($t eq 'c-type-spec') { $labels->{"cty:$sym"} = $file; }
        elsif ($t eq 'c-type-form') { $labels->{"cty:$sym"} = $file; }
+       elsif ($t eq 'c-storage-spec') { $labels->{"cstg:$sym"} = $file; }
+       elsif ($t eq 'c-storage-form') { $labels->{"cstg:$sym"} = $file; }
        elsif ($t eq 'parser-spec') { $labels->{"parse:$sym"} = $file; }
        elsif ($t eq 'parser-form') { $labels->{"parseform:$sym"} = $file; }
        elsif ($t eq 'opthandler') { $labels->{"opt:$sym"} = $file; }
@@ -45,7 +47,7 @@ sub scansyms (\%$) {
   close $fh;
 }
 
-my %DEF = map { $_ => 1 }
+my %DEF = map { $_ => "<magic>" }
   "cls:array", "cls:class", "cls:error", "cls:float", "cls:function",
   "cls:list", "cls:string",
   "const:nil",
@@ -58,9 +60,15 @@ my %CAT = map { $_ => 1 }
   'sym', 'const', 'var', 'mac', 'fun', 'gf', 'cls', 'modvar', 'const',
   'meth', 'ar-meth', 'be-meth', 'af-meth',
   'msg', 'feat',
-  'rst', 'ty', 'lmac', 'parse', 'parseform', 'opt', 'optmac', 'plug';
+  'rst', 'ty', 'lmac', 'parse', 'parseform', 'opt', 'optmac', 'plug',
+  'cty', 'cstg';
 
-my $AUXDIR = "build/doc/";
+sub die_usage () { die "usage: $0 AUXFILE SYMFILE\n"; }
+die_usage unless @ARGV; my $auxfile = shift @ARGV;
+die_usage unless @ARGV; my $symfile = shift @ARGV;
+die_usage if @ARGV;
+(my $AUXDIR = $auxfile) =~ s![^/]*$!!;
+$auxfile =~ s!^.*/!!;
 
 sub scanaux (\%$) {
   my ($def, $f) = @_;
@@ -68,15 +76,23 @@ sub scanaux (\%$) {
   open my $fh, "<", "$AUXDIR$f";
   while (<$fh>) {
     chomp;
-    if (/^\\\@input\{([^}]*\.aux)\}$/) { scanaux($def, $1); }
-    elsif (/^\\newlabel\{([^:]+):([^}]+)\}/ && $CAT{$1})
-      { $def->{"$1:$2"} = $s; }
+    if (/^\\\@input\{([^}]*\.aux)\}$/)
+      { scanaux($def, $1); }
+    elsif (/^\\newlabel\{([^:]+):([^}]+)\}/ && $CAT{$1}) {
+      my ($cat, $sym) = ($1, $2);
+      $def->{"$cat:$sym"} = $s;
+      $def->{"sym:$sym"} //= $s unless $sym =~ m!^setf/|\(.*\)$!;
+    }
   }
   close $fh;
 }
 
-scansyms %LABEL, "doc/SYMBOLS";
-scanaux %DEF, "sod.aux";
+scansyms %LABEL, $symfile;
+scanaux %DEF, $auxfile;
+
+##use Data::Dumper;
+##print "LABELS = " . Dumper(\%LABEL) . "\n";
+##print "DEF = " . Dumper(\%DEF) . "\n";
 
 my $BAD = 0;
 
@@ -89,26 +105,25 @@ sub bad ($) {
 SYM: for my $sym (sort keys %LABEL) {
   if ($DEF{$sym}) { next SYM; }
   my ($tag, $name) = $sym =~ /^([^:]+):(.*)$/;
-  if ($tag eq "cls" && $DEF{"ty:$name"}) { }
+  if ($name eq "nil" && $DEF{"$tag:()"}) { }
+  elsif ($tag eq "cls" && $DEF{"ty:$name"}) { }
   elsif ($tag eq "gf" && $DEF{"fun:$name"}) { }
   elsif ($tag eq "var" && $DEF{"const:$name"}) { }
   elsif ($tag eq "sym" && $DEF{"plug:$name"}) { }
-  elsif ($tag eq "sym" && $DEF{"lmac:$name"}) { }
-  elsif ($sym eq "sym:alignas" && $DEF{"cls:alignas-storage-specifier"}) { }
-  elsif ($sym eq "fun:main" && $DEF{"fun:sod-frontend:main"}) { }
-  elsif ($sym eq "fun:augment-options" &&
-        $DEF{"fun:sod-frontend:augment-options"}) { }
+  elsif ($sym =~ /^(fun|sym):(main|augment-options)$/ &&
+        $DEF{"$tag:sod-frontend:$name"}) { }
   elsif ($sym eq "gf:setf/generic-function-methods") { }
-  elsif ($tag eq "cty") { }
   else { bad "missing $tag:$name (defined in $LABEL{$sym})"; }
 }
 
 SYM: for my $sym (sort keys %DEF) {
   if ($LABEL{$sym}) { next SYM; }
   my ($tag, $name) = $sym =~ /^([^:]+):(.*)$/;
-  if ($tag eq "ty" && $LABEL{"cls:$name"}) { }
+  if ($name eq "()" && $LABEL{"$tag:nil"}) { }
+  elsif ($tag eq "ty" && $LABEL{"cls:$name"}) { }
   elsif ($tag eq "const" && $LABEL{"var:$name"}) { }
   elsif ($tag eq "fun" && $LABEL{"gf:$name"}) { }
+  elsif ($tag eq "sym" && $name =~ /^:/) { }
   elsif ($DEF{$sym} eq "runtime.tex") { }
   elsif ($DEF{$sym} eq "structures.tex") { }
   elsif ($sym eq "lmac:parse") { }
@@ -121,7 +136,8 @@ SYM: for my $sym (sort keys %DEF) {
         $sym eq "parse:t" || $sym eq "parseform:t" ||
         $sym eq "parseform:when") { }
   elsif ($sym eq "plug:class-item" || $sym eq "plug:module") { }
-  elsif ($sym eq "sym:int") { }
+  elsif ($sym eq "sym:int" || $sym eq "sym:atom" || $sym eq "sym:t" ||
+        $sym eq "sym:when") { }
   elsif ($name =~ /^sod-frontend:(.*)$/ && $LABEL{"$tag:$1"}) { }
   else { bad "unexpected $tag:$name (described in $DEF{$sym})"; }
 }