Commit | Line | Data |
---|---|---|
d8875586 MBT |
1 | #!/usr/bin/perl |
2 | eval 'exec perl -S $0 "$@"' | |
3 | if $runnning_under_some_shell; | |
4 | ||
5 | # $Id: bindex.SH 1 2006-08-24 12:32:52Z rmanfredi $ | |
6 | # | |
7 | # Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi | |
8 | # | |
9 | # You may redistribute only under the terms of the Artistic Licence, | |
10 | # as specified in the README file that comes with the distribution. | |
11 | # You may reuse parts of this distribution only within the terms of | |
12 | # that same Artistic Licence; a copy of which may be found at the root | |
13 | # of the source tree for dist 4.0. | |
14 | # | |
15 | # $Log: bindex.SH,v $ | |
16 | # Revision 3.0.1.1 1993/08/19 06:42:12 ram | |
17 | # patch1: leading config.sh searching was not aborting properly | |
18 | # | |
19 | # Revision 3.0 1993/08/18 12:04:13 ram | |
20 | # Baseline for dist 3.0 netwide release. | |
21 | # | |
22 | ||
23 | $file = "files/Jmake.rules"; | |
24 | ||
25 | open(INDEX, ">Index") || die "Cannot create Index.\n"; | |
26 | open(RULES, "$file") || die "Cannot open $file.\n"; | |
27 | ||
28 | print INDEX | |
29 | "[This Index is automatically generated from Jmake.rules file. Do not | |
30 | edit this file or your changes will be lost. Edit Jmake.rules instead.] | |
31 | ||
32 | This file contains a listing of all the macros that can be used in a | |
33 | Jmakefile. Only a few of these should be used in the Jmakefile (they | |
34 | are the top-level macros). However, some low-level ones may be useful, | |
35 | but it is up to you to make that decision. This explains why this file | |
36 | holds all the available macros for jmake. | |
37 | ||
38 | In the following listing, the macros are separated by a line of dashes. | |
39 | The signature of the macro is given, then a small comment of what it | |
40 | does precedes the actual definition. | |
41 | ||
42 | Lines preceded by '->' show the set of symbols defined when the macro is | |
43 | used. Initialization lines are shown as-is, i.e. have the form SYM = val | |
44 | while concatenation is shown by SYM += val (which means val is added to | |
45 | the value of SYM). | |
46 | ||
47 | Conditional lines are preceded by tests like (if SYM). This means the line | |
48 | is to be kept if and only if the symbol SYM is defined. Other internal | |
49 | requests are not formatted yet. | |
50 | ||
51 | "; | |
52 | $inrule = 0; # Not inside a rule at the beginning | |
53 | $incomment = 0; # Not inside a comment | |
54 | $last_was_text = 0; # Last line was not a rule text | |
55 | while (<RULES>) { | |
56 | $inrule || next unless /^\s\*\s(\w+)\s*:/; | |
57 | if ($inrule) { # We are already in a rule | |
58 | if ($incomment) { | |
59 | if (m|^\s*\*/|) { # End of comment | |
60 | $incomment = 0; | |
61 | $Comment{$current} .= "\n"; | |
62 | } else { | |
63 | s/^\s*\*\s*//; # Remove leading comment sign | |
64 | $Comment{$current} .= " $_"; | |
65 | } | |
66 | next; # Anyway, go to next line | |
67 | } | |
68 | if (/^\s*$/) { # Empty line = end of rule | |
69 | $inrule = 0; | |
70 | next; | |
71 | } | |
72 | # Here, we have to print the body of the rule, after some cleaning | |
73 | s/(@#|@@|@!)\\$//; # Remove final continuations | |
74 | s/^(#define.*)\\/$1/; # Remove single '\' on first rule line | |
75 | s/\|rule:\s*$/\n/; | |
76 | s/\|rule:\s+/ /; # Remove rule markers | |
77 | s/\|rule://; | |
78 | s/%(\w+):\|skip/#ifdef $1/; # Deal with ugly skip syntax | |
79 | s/\?(\w+):\|skip/#ifndef $1/; # Deal with ugly skip syntax | |
80 | s/\-skip/#endif/; | |
81 | s/\?(\w+):/(if $1) /; # Simple '?' test | |
82 | s/%(\w+):/(not $1) /; # Simple '%' test | |
83 | s/\|suffix/.SUFFIXES:/; # Make suffix command explicit | |
84 | s/\t/ /g; # Expand all tabs to 4 chars | |
85 | s/\s*$/\n/; # Remove any trailing space | |
86 | s|\^\^\^|/***/|; # Change ^^^ to the more visual /***/ | |
87 | s|\^\^|/**/|; # Restore ^^ to the more visual /**/ | |
88 | if (/^$/) { # If empty line | |
89 | $Index{$current} .= "\n" if $last_was_text; | |
90 | $last_was_text = 0; | |
91 | next; | |
92 | } | |
93 | if (/^[>+]/) { # Special commands | |
94 | if (s/^>\s*//) { # Wanted symbol | |
95 | chop; | |
96 | $Wants{$current} .= " $_"; | |
97 | } elsif (/^\+\+\s*(\S+)\s*(.*)/) { # Added symbol | |
98 | $Added{$current} .= "\t$1 += $2\n"; | |
99 | } else { | |
100 | s/^\+\s*(.*)//; | |
101 | $Init{$current} .= "\t$1\n"; | |
102 | } | |
103 | next; | |
104 | } | |
105 | if (s/^#define\s+//) { # Definition of the rule | |
106 | chop; | |
107 | $Sig{$current} = $_; # Signature of rule | |
108 | } else { | |
109 | $Index{$current} .= " $_"; # Rule's body | |
110 | $last_was_text = 1; | |
111 | } | |
112 | } else { # We've just entered a rule | |
113 | $current = $1; | |
114 | next if $current =~ /patch\d/; # Skip RCS log messages | |
115 | $inrule = 1; | |
116 | $incomment = 1; # We're still in the leading comment | |
117 | $Seen{$current} = 1; | |
118 | $last_was_text = 0; | |
119 | } | |
120 | } | |
121 | close RULES; | |
122 | ||
123 | # Now sort the rules in alphabetical order | |
124 | ||
125 | print INDEX '-' x 72, "\n"; | |
126 | foreach $rule (sort(keys %Seen)) { | |
127 | print INDEX "$Sig{$rule}:\n"; | |
128 | print INDEX $Comment{$rule}; | |
129 | $line = $Wants{$rule}; | |
130 | if (length($line)) { | |
131 | $line = "->$line."; | |
132 | $line = &format($line); | |
133 | print INDEX "$line\n"; | |
134 | } | |
135 | $line = $Init{$rule}; | |
136 | print INDEX "$line\n" if length($line); | |
137 | $line = $Added{$rule}; | |
138 | print INDEX "$line\n" if length($line); | |
139 | $line = $Index{$rule}; | |
140 | print INDEX $line; | |
141 | print INDEX "\n" if (length($line)); | |
142 | print INDEX '-' x 72, "\n"; | |
143 | } | |
144 | ||
145 | close INDEX; | |
146 | ||
147 | # Format $_ to fit in 80 columns (70 + size of tabs) | |
148 | # Long lines are split, and the all but the first are indented | |
149 | # by two leading spaces. The whole thing is then indented by | |
150 | # one tab. | |
151 | sub format { | |
152 | local($tmp); | |
153 | local($head) = ''; | |
154 | local($_) = shift(@_); | |
155 | while (length($_) > 70) { | |
156 | $tmp = substr($_,0,70); | |
157 | $tmp =~ s/^(.*) .*/$1/; | |
158 | $head .= "\t$tmp\n"; | |
159 | $_ = ' ' . substr($_,length($tmp),9999); | |
160 | } | |
161 | $head .= "\t$_\n"; | |
162 | } |