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