]>
Commit | Line | Data |
---|---|---|
1dd6d55d | 1 | #!/usr/bin/perl -w |
2 | ||
3 | use strict; | |
4 | ||
5 | my @cmdnames; | |
6 | my @cmdlevels; | |
7 | my @cmdargs; | |
8 | my @cmddesc; | |
9 | my @cmdfunc; | |
10 | my @protos; | |
11 | my @files; | |
35227ed4 | 12 | my @help; |
a39401aa | 13 | my @cmdaliases; |
1dd6d55d | 14 | |
15 | my @filelist = <*.c>; | |
16 | ||
17 | my $modname; | |
18 | ||
a39401aa CP |
19 | my %cmdhash; |
20 | ||
1dd6d55d | 21 | unless (@ARGV) { |
22 | print "Usage: $0 <module name>\n"; | |
23 | exit(0); | |
24 | } else { | |
25 | $modname=$ARGV[0]; | |
26 | } | |
27 | ||
08c7d6df CP |
28 | my $rootpath; |
29 | if($#ARGV >= 1) { | |
30 | $rootpath=$ARGV[1]; | |
31 | } else { | |
32 | $rootpath=".."; | |
33 | } | |
34 | ||
b3565978 CP |
35 | my $smallname; |
36 | $smallname=$modname; | |
b3565978 CP |
37 | $smallname=~s/\.so$//; |
38 | ||
4bad6412 CP |
39 | my $cname; |
40 | $cname=$smallname . ".c"; | |
41 | $smallname=~s/^chanserv_//; | |
42 | ||
43 | ||
1dd6d55d | 44 | for (@filelist) { |
45 | next if (/commandlist.c/); | |
4bad6412 | 46 | next if ($_ eq $cname); |
1dd6d55d | 47 | |
48 | my $fname = $_; | |
a39401aa | 49 | my ($cn, $cl, $ca, $cd, $cf, $cp, $ch, $cal); |
35227ed4 | 50 | $ch=""; |
a39401aa | 51 | $cal=""; |
1dd6d55d | 52 | |
53 | open INFILE,"<$fname"; | |
54 | ||
55 | while(<INFILE>) { | |
56 | chomp; | |
57 | ||
58 | if (/CMDNAME: (.*)/) { | |
59 | $cn=$1; | |
60 | } | |
61 | ||
62 | if (/CMDLEVEL: (.*)/) { | |
63 | $cl=$1; | |
64 | } | |
65 | ||
66 | if (/CMDARGS: (.*)/) { | |
67 | $ca=$1; | |
68 | } | |
69 | ||
70 | if (/CMDDESC: (.*)/) { | |
71 | $cd=$1; | |
72 | } | |
73 | ||
74 | if (/CMDFUNC: (.*)/) { | |
75 | $cf=$1; | |
76 | } | |
77 | ||
78 | if (/CMDPROTO: (.*)/) { | |
79 | $cp=$1; | |
80 | } | |
35227ed4 | 81 | |
82 | if (/CMDHELP: (.*)/) { | |
83 | $ch.=$1."\\n"; | |
84 | } | |
a39401aa CP |
85 | |
86 | if (/CMDALIASES: (.*)/) { | |
87 | $cal=$1; | |
88 | } | |
1dd6d55d | 89 | } |
90 | ||
91 | if (defined $cn and defined $cl and defined $ca and defined $cd and defined $cf and defined $cp) { | |
92 | # valid command found | |
a39401aa CP |
93 | $cmdhash{$cn} = scalar @cmdnames; |
94 | ||
1dd6d55d | 95 | push @files, $fname; |
96 | push @cmdnames, $cn; | |
97 | push @cmdlevels, $cl; | |
98 | push @cmdargs, $ca; | |
99 | push @cmddesc, $cd; | |
100 | push @cmdfunc, $cf; | |
101 | push @protos, $cp; | |
35227ed4 | 102 | push @help, $ch; |
a39401aa | 103 | push @cmdaliases, $cal; |
1dd6d55d | 104 | } else { |
105 | print "Warning: found source file $fname without complete tags, skipping...\n"; | |
106 | } | |
107 | } | |
108 | ||
109 | if (@files < 1) { | |
110 | print "No commands found - are you in the right directory?\n"; | |
111 | print "Exiting before I destroy something important.\n"; | |
112 | exit(0); | |
113 | } | |
114 | ||
115 | ||
116 | open CL, ">commandlist.c"; | |
117 | ||
118 | print CL "/* Automatically generated by mkcommandlist.pl, do not edit. */\n\n"; | |
08c7d6df | 119 | print CL "#include \"".$rootpath."/chanserv.h\"\n\n"; |
1dd6d55d | 120 | |
121 | # Print prototypes | |
122 | print CL "/* Prototypes */\n"; | |
123 | foreach (@protos) { | |
124 | print CL "$_\n"; | |
125 | } | |
126 | ||
b3565978 CP |
127 | print CL "void ".$smallname."_init(void);\n"; |
128 | print CL "void ".$smallname."_fini(void);\n\n"; | |
129 | ||
1dd6d55d | 130 | print CL "\nvoid _init() {\n"; |
b3565978 | 131 | print CL " ".$smallname."_init();\n"; |
1dd6d55d | 132 | |
a39401aa CP |
133 | sub generate_help_text { |
134 | my ($cn, $ch) = @_; | |
135 | ||
136 | my %SUBS; | |
137 | ||
138 | $SUBS{"COMMAND"} = $cn; | |
139 | $SUBS{"UCOMMAND"} = uc($cn); | |
140 | ||
141 | my %realsubs; | |
142 | while(my ($key, $value) = each(%SUBS)) { | |
143 | $key = '@'.quotemeta($key).'@'; | |
144 | $value = quotemeta($value); | |
145 | $ch =~ s/$key/$value/g; | |
146 | } | |
147 | ||
148 | return $ch; | |
149 | } | |
150 | ||
151 | sub writecmd { | |
152 | my ($cn, $i, $isalias) = @_; | |
153 | ||
154 | my $cl = $cmdlevels[$i]; | |
155 | if ($isalias) { | |
156 | $cl .= " | " if ($cl ne ""); | |
157 | $cl .= "QCMD_ALIAS"; | |
158 | } | |
159 | ||
160 | print CL " chanservaddcommand(\"".$cn."\", ".($cl).", ".($cmdargs[$i]).", "; | |
161 | print CL ($cmdfunc[$i]).", \"".($cmddesc[$i])."\", \"".(generate_help_text($cn,$help[$i])),"\");\n"; | |
162 | } | |
163 | ||
164 | for (my $i=0;$i<scalar @cmdnames;$i++) { | |
165 | writecmd($cmdnames[$i], $i, 0); | |
166 | ||
167 | foreach (split / /, $cmdaliases[$i]) { | |
168 | writecmd($_, $i, 1); | |
169 | } | |
1dd6d55d | 170 | } |
171 | ||
172 | print CL "}\n\nvoid _fini() {\n"; | |
b3565978 | 173 | print CL " ".$smallname."_fini();\n"; |
1dd6d55d | 174 | |
a39401aa CP |
175 | sub writercmd { |
176 | my ($cn, $i) = @_; | |
177 | print CL " chanservremovecommand(\"".$cn."\", ".($cmdfunc[$i]).");\n"; | |
178 | } | |
179 | ||
180 | for (my $i=0;$i<scalar @cmdnames;$i++) { | |
181 | writercmd($cmdnames[$i], $i); | |
182 | ||
183 | foreach (split / /, $cmdaliases[$i]) { | |
184 | writercmd($_, $i); | |
185 | } | |
1dd6d55d | 186 | } |
187 | ||
188 | print CL "}\n"; | |
189 | ||
190 | close CL; | |
191 | ||
c5a04a43 | 192 | open MF,">.autobuild.mk"; |
1dd6d55d | 193 | |
4bad6412 | 194 | print MF "# Automatically generated Makefile, do not edit.\n"; |
1dd6d55d | 195 | |
196 | print MF "\n$modname: "; | |
197 | ||
198 | push @files,"commandlist.c"; | |
4bad6412 CP |
199 | |
200 | push @files,$cname; | |
1dd6d55d | 201 | |
202 | foreach (@files) { | |
203 | s/.c$/.o/; | |
204 | print MF "$_ "; | |
205 | } | |
206 | ||
207 | print MF "\n"; | |
1dd6d55d | 208 | |
209 | close MF; |