]> jfr.im git - irc/quakenet/newserv.git/blame - chanserv/mkcommandlist.pl
A4STATS: remove E style escapes and switch to createtable for indices
[irc/quakenet/newserv.git] / chanserv / mkcommandlist.pl
CommitLineData
1dd6d55d 1#!/usr/bin/perl -w
2
3use strict;
4
5my @cmdnames;
6my @cmdlevels;
7my @cmdargs;
8my @cmddesc;
9my @cmdfunc;
10my @protos;
11my @files;
35227ed4 12my @help;
a39401aa 13my @cmdaliases;
1dd6d55d 14
15my @filelist = <*.c>;
16
17my $modname;
18
a39401aa
CP
19my %cmdhash;
20
1dd6d55d 21unless (@ARGV) {
22 print "Usage: $0 <module name>\n";
23 exit(0);
24} else {
25 $modname=$ARGV[0];
26}
27
08c7d6df
CP
28my $rootpath;
29if($#ARGV >= 1) {
30 $rootpath=$ARGV[1];
31} else {
32 $rootpath="..";
33}
34
b3565978
CP
35my $smallname;
36$smallname=$modname;
b3565978
CP
37$smallname=~s/\.so$//;
38
4bad6412
CP
39my $cname;
40$cname=$smallname . ".c";
41$smallname=~s/^chanserv_//;
42
43
1dd6d55d 44for (@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
109if (@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
116open CL, ">commandlist.c";
117
118print CL "/* Automatically generated by mkcommandlist.pl, do not edit. */\n\n";
08c7d6df 119print CL "#include \"".$rootpath."/chanserv.h\"\n\n";
1dd6d55d 120
121# Print prototypes
122print CL "/* Prototypes */\n";
123foreach (@protos) {
124 print CL "$_\n";
125}
126
b3565978
CP
127print CL "void ".$smallname."_init(void);\n";
128print CL "void ".$smallname."_fini(void);\n\n";
129
1dd6d55d 130print CL "\nvoid _init() {\n";
b3565978 131print CL " ".$smallname."_init();\n";
1dd6d55d 132
a39401aa
CP
133sub 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
151sub 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
164for (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
172print CL "}\n\nvoid _fini() {\n";
b3565978 173print CL " ".$smallname."_fini();\n";
1dd6d55d 174
a39401aa
CP
175sub writercmd {
176 my ($cn, $i) = @_;
177 print CL " chanservremovecommand(\"".$cn."\", ".($cmdfunc[$i]).");\n";
178}
179
180for (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
188print CL "}\n";
189
190close CL;
191
c5a04a43 192open MF,">.autobuild.mk";
1dd6d55d 193
4bad6412 194print MF "# Automatically generated Makefile, do not edit.\n";
1dd6d55d 195
196print MF "\n$modname: ";
197
198push @files,"commandlist.c";
4bad6412
CP
199
200push @files,$cname;
1dd6d55d 201
202foreach (@files) {
203 s/.c$/.o/;
204 print MF "$_ ";
205}
206
207print MF "\n";
1dd6d55d 208
209close MF;