]> jfr.im git - irc/quakenet/newserv.git/blame_incremental - chanserv/mkcommandlist.pl
Merge.
[irc/quakenet/newserv.git] / chanserv / mkcommandlist.pl
... / ...
CommitLineData
1#!/usr/bin/perl -w
2
3use strict;
4
5my @cmdnames;
6my @cmdlevels;
7my @cmdargs;
8my @cmddesc;
9my @cmdfunc;
10my @protos;
11my @files;
12my @help;
13my @cmdaliases;
14
15my @filelist = <*.c>;
16
17my $modname;
18
19my %cmdhash;
20
21unless (@ARGV) {
22 print "Usage: $0 <module name>\n";
23 exit(0);
24} else {
25 $modname=$ARGV[0];
26}
27
28my $smallname;
29$smallname=$modname;
30$smallname=~s/\.so$//;
31
32my $cname;
33$cname=$smallname . ".c";
34$smallname=~s/^chanserv_//;
35
36
37for (@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
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
120print CL "void ".$smallname."_init(void);\n";
121print CL "void ".$smallname."_fini(void);\n\n";
122
123print CL "\nvoid _init() {\n";
124print CL " ".$smallname."_init();\n";
125
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 }
163}
164
165print CL "}\n\nvoid _fini() {\n";
166print CL " ".$smallname."_fini();\n";
167
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 }
179}
180
181print CL "}\n";
182
183close CL;
184
185open MF,">autobuild.mk";
186
187print MF "# Automatically generated Makefile, do not edit.\n";
188
189print MF "\n$modname: ";
190
191push @files,"commandlist.c";
192
193push @files,$cname;
194
195foreach (@files) {
196 s/.c$/.o/;
197 print MF "$_ ";
198}
199
200print MF "\n";
201
202close MF;