aboutsummaryrefslogtreecommitdiffstats
path: root/lua_preprocess.pl
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2016-05-28 12:26:49 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2016-05-28 12:26:49 +0100
commit8a1e8bbfdf47102bb9f25cf58d4f171b54124b2c (patch)
tree0a8742e6e0fa727cece4ae667e0b31132a3ca856 /lua_preprocess.pl
parent081b07dd25700f826cd779b0cb808c07030be890 (diff)
downloadrspamd-8a1e8bbfdf47102bb9f25cf58d4f171b54124b2c.tar.gz
rspamd-8a1e8bbfdf47102bb9f25cf58d4f171b54124b2c.zip
[Feature] Allow static lua files in any parts of rspamd sources
Diffstat (limited to 'lua_preprocess.pl')
-rw-r--r--lua_preprocess.pl86
1 files changed, 86 insertions, 0 deletions
diff --git a/lua_preprocess.pl b/lua_preprocess.pl
new file mode 100644
index 000000000..d1e8f4689
--- /dev/null
+++ b/lua_preprocess.pl
@@ -0,0 +1,86 @@
+#!/usr/bin/env perl
+
+use warnings FATAL => 'all';
+use strict;
+use Digest::MD5;
+
+my ( $in_dir, $out_dir ) = @ARGV;
+my @files = <$in_dir/*.lua>;
+
+sub quote_file {
+ my ( $in, $out ) = @_;
+
+ while (<$in>) {
+ if (/^--.USE\s*"(\S+)"$/) {
+ open( my $inc, '<', "$in_dir/$1.lua.in" )
+ or die "missing include $1";
+ quote_file( $inc, $out );
+ }
+ else {
+ s/^\s*//; # remove unnecessary spaces at the beginning
+ next if /^--/; # skip comments
+ next if /^\s*$/; # skip empty lines
+ s/(.)/'$1',/g; # split as 'c',
+ s/\'\\\'/\'\\\\'/g; # escape backslashes
+ s/\'\'\'/\'\\\'\'/g; # escape single quotes
+ print $out "$_'\\n',";
+ }
+ }
+}
+
+sub digest_for_file {
+ my ($file) = @_;
+
+ open( my $in, '<', $file ) or die "file missing";
+ my $digest = Digest::MD5->new->addfile($in)->hexdigest;
+
+ return $digest;
+}
+
+sub changed {
+ my ( $file, $outfile ) = @_;
+
+ open( my $out, '<', $outfile ) or return 1;
+
+ my $in_checksum = digest_for_file($file);
+ my $ln = <$out>;
+
+ if ( $ln =~ /^.*id:(\S+)\s.*$/ ) {
+ if ( $in_checksum ne $1 ) {
+ return 1;
+ }
+ else {
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+foreach my $file (@files) {
+ if ( $file =~ /([^\/.]+)(.lua)$/ ) {
+ my $fname = "$1$2";
+ my $varname = "rspamadm_script_$1";
+ my $definename = uc $varname;
+ my $outfile = "$out_dir/$fname.h";
+
+ if ( changed( $file, $outfile ) ) {
+ open( my $in, '<', $file ) or die "input missing";
+ open( my $out, '>', $outfile ) or die "output missing";
+ my $checksum = digest_for_file($file);
+ print $out <<EOD;
+/* id:$checksum */
+#ifndef ${definename}_GUARD_H
+#define ${definename}_GUARD_H
+
+static const char ${varname}\[\] = {
+EOD
+ quote_file( $in, $out );
+
+ print $out <<EOD;
+'\\0'};
+#endif
+EOD
+ }
+ }
+}