1#! /usr/bin/perl
2
3# A script to scan PCRE's man pages to check for typos in the control
4# sequences. I use only a small set of the available repertoire, so it is 
5# straightforward to check that nothing else has slipped in by mistake. This
6# script should be called in the doc directory.
7
8$yield = 0;
9
10while (scalar(@ARGV) > 0)
11  {
12  $line = 0; 
13  $file = shift @ARGV;
14    
15  open (IN, $file) || die "Failed to open $file\n";
16  
17  while (<IN>)
18    {  
19    $line++; 
20    if (/^\s*$/)
21      {
22      printf "Empty line $line of $file\n";
23      $yield = 1;  
24      }   
25    elsif (/^\./)
26      {
27      if (!/^\.\s*$|
28            ^\.B\s+\S| 
29            ^\.TH\s\S|
30            ^\.SH\s\S|
31            ^\.SS\s\S|
32            ^\.TP(?:\s?\d+)?\s*$|
33            ^\.SM\s*$|
34            ^\.br\s*$| 
35            ^\.rs\s*$| 
36            ^\.sp\s*$| 
37            ^\.nf\s*$| 
38            ^\.fi\s*$| 
39            ^\.P\s*$| 
40            ^\.PP\s*$| 
41            ^\.\\"(?:\ HREF)?\s*$|
42            ^\.\\"\sHTML\s<a\shref="[^"]+?">\s*$|
43            ^\.\\"\sHTML\s<a\sname="[^"]+?"><\/a>\s*$|
44            ^\.\\"\s<\/a>\s*$|
45            ^\.\\"\sJOINSH\s*$|
46            ^\.\\"\sJOIN\s*$/x  
47         )
48        {
49        printf "Bad control line $line of $file\n";
50        $yield = 1;
51        }
52      }
53    else
54      {
55      if (/\\[^ef]|\\f[^IBP]/)
56        {
57        printf "Bad backslash in line $line of $file\n";  
58        $yield = 1; 
59        } 
60      }   
61    }
62     
63  close(IN);   
64  }
65  
66exit $yield;
67# End  
68