]> jfr.im git - irc/quakenet/newserv.git/blob - chanserv/mkcommandlist.pl
NOPERSERV: clarify +h noticeflag help text.
[irc/quakenet/newserv.git] / chanserv / mkcommandlist.pl
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;
12 my @help;
13 my @cmdaliases;
14
15 my @filelist = <*.c>;
16
17 my $modname;
18
19 my %cmdhash;
20
21 unless (@ARGV) {
22 print "Usage: $0 <module name>\n";
23 exit(0);
24 } else {
25 $modname=$ARGV[0];
26 }
27
28 my $smallname;
29 $smallname=$modname;
30 $smallname=~s/\.so$//;
31
32 my $cname;
33 $cname=$smallname . ".c";
34 $smallname=~s/^chanserv_//;
35
36
37 for (@filelist) {
38 next if (/commandlist.c/);
39 next if ($_ eq $cname);
40
41 my $fname = $_;
42 my ($cn, $cl, $ca, $cd, $cf, $cp, $ch, $cal);
43 $ch="";
44 $cal="";
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 }
74
75 if (/CMDHELP: (.*)/) {
76 $ch.=$1."\\n";
77 }
78
79 if (/CMDALIASES: (.*)/) {
80 $cal=$1;
81 }
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
86 $cmdhash{$cn} = scalar @cmdnames;
87
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;
95 push @help, $ch;
96 push @cmdaliases, $cal;
97 } else {
98 print "Warning: found source file $fname without complete tags, skipping...\n";
99 }
100 }
101
102 if (@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
109 open CL, ">commandlist.c";
110
111 print CL "/* Automatically generated by mkcommandlist.pl, do not edit. */\n\n";
112 print CL "#include \"../chanserv.h\"\n\n";
113
114 # Print prototypes
115 print CL "/* Prototypes */\n";
116 foreach (@protos) {
117 print CL "$_\n";
118 }
119
120 print CL "void ".$smallname."_init(void);\n";
121 print CL "void ".$smallname."_fini(void);\n\n";
122
123 print CL "\nvoid _init() {\n";
124 print CL " ".$smallname."_init();\n";
125
126 sub 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
144 sub 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
157 for (my $i=0;$i<scalar @cmdnames;$i++) {
158 writecmd($cmdnames[$i], $i, 0);
159
160 foreach (split / /, $cmdaliases[$i]) {
161 writecmd($_, $i, 1);
162 }
163 }
164
165 print CL "}\n\nvoid _fini() {\n";
166 print CL " ".$smallname."_fini();\n";
167
168 sub writercmd {
169 my ($cn, $i) = @_;
170 print CL " chanservremovecommand(\"".$cn."\", ".($cmdfunc[$i]).");\n";
171 }
172
173 for (my $i=0;$i<scalar @cmdnames;$i++) {
174 writercmd($cmdnames[$i], $i);
175
176 foreach (split / /, $cmdaliases[$i]) {
177 writercmd($_, $i);
178 }
179 }
180
181 print CL "}\n";
182
183 close CL;
184
185 open MF,">autobuild.mk";
186
187 print MF "# Automatically generated Makefile, do not edit.\n";
188
189 print MF "\n$modname: ";
190
191 push @files,"commandlist.c";
192
193 push @files,$cname;
194
195 foreach (@files) {
196 s/.c$/.o/;
197 print MF "$_ ";
198 }
199
200 print MF "\n";
201
202 close MF;