settings-get.pl revision b9f564d00b7a115f465ffd6840341c7b8f9bfc8a
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta#!/usr/bin/env perl
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholastause strict;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholastaprint '#include "lib.h"'."\n";
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholastaprint '#include "array.h"'."\n";
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholastaprint '#include "var-expand.h"'."\n";
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholastaprint '#include "file-lock.h"'."\n";
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholastaprint '#include "fsync-mode.h"'."\n";
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholastaprint '#include "hash-format.h"'."\n";
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholastaprint '#include "settings-parser.h"'."\n";
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholastaprint '#include "all-settings.h"'."\n";
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholastaprint '#include <stddef.h>'."\n";
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholastaprint '#include <unistd.h>'."\n";
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholastaprint '#define CONFIG_BINARY'."\n";
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholastaprint 'extern buffer_t config_all_services_buf;';
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholastamy @services = ();
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholastamy @service_ifdefs = ();
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholastamy %parsers = {};
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholastaforeach my $file (@ARGV) {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta my $f;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta open($f, $file) || die "Can't open $file: $@";
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta my $state = 0;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta my $file_contents = "";
e880949305cee3aca79441fe6113a9d79e7c98f2Jakub Hrozek my $externs = "";
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta my $code = "";
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta my %funcs;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta my $cur_name = "";
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta my $ifdef = "";
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta my $state_ifdef = 0;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta while (<$f>) {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta my $write = 0;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta if ($state == 0) {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta if (/struct .*_settings {/ ||
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta /struct setting_define.*{/ ||
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta /struct .*_default_settings = {/) {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta $state++;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta } elsif (/^struct service_settings (.*) = {/) {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta $state++;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta if ($ifdef eq "") {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta $state_ifdef = 0;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta } else {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta $_ = $ifdef."\n".$_;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta $state_ifdef = 1;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta }
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta push @services, $1;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta push @service_ifdefs, $ifdef;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta } elsif (/^(static )?const struct setting_parser_info (.*) = {/) {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta $cur_name = $2;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta $state++ if ($cur_name !~ /^\*default_/);
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta } elsif (/^extern const struct setting_parser_info (.*);/) {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta $externs .= "extern const struct setting_parser_info $1;\n";
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta } elsif (/\/\* <settings checks> \*\//) {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta $state = 4;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta $code .= $_;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta }
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta if (/(^#ifdef .*)$/ || /^(#if .*)$/) {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta $ifdef = $1;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta } else {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta $ifdef = "";
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta }
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta if (/#define.*DEF/ || /^#undef.*DEF/ || /ARRAY_DEFINE_TYPE.*_settings/) {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta $write = 1;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta $state = 2 if (/\\$/);
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta }
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta } elsif ($state == 2) {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta $write = 1;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta $state = 0 if (!/\\$/);
65976ea5e9767bfaced81dfb97dc87d59f50b57eSimo Sorce } elsif ($state == 4) {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta $code .= $_;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta $state = 0 if (/\/\* <\/settings checks> \*\//);
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta }
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta if ($state == 1 || $state == 3) {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta if ($state == 1) {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta if (/\.module_name = "(.*)"/) {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta $parsers{$cur_name} = $1;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta }
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta if (/DEFLIST.*".*",(.*)$/) {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta my $value = $1;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta if ($value =~ /.*&(.*)\)/) {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta $parsers{$1} = 0;
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březina $externs .= "extern const struct setting_parser_info $1;\n";
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta } else {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta $state = 3;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta }
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta }
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta } elsif ($state == 3) {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta if (/.*&(.*)\)/) {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta $parsers{$1} = 0;
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březina }
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta }
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta s/^static const (struct master_settings master_default_settings)/$1/;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta $write = 1;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta if (/};/) {
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta $state = 0;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta if ($state_ifdef) {
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březina $_ .= "#endif\n";
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta $state_ifdef = 0;
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březina }
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březina }
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březina }
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březina
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březina $file_contents .= $_ if ($write);
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březina }
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březina
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březina print "/* $file */\n";
6f8ae17869f4f8a1496e3f171ae6b5c11af1845cPavel Březina print $externs;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta print $code;
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březina print $file_contents;
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březina
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta close $f;
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta}
728b10c81204929be5669c1e67bd086e09c47c00Jan Cholasta
728b10c81204929be5669c1e67bd086e09c47c00Jan Cholastaprint "static struct service_settings *config_all_services[] = {\n";
728b10c81204929be5669c1e67bd086e09c47c00Jan Cholasta
728b10c81204929be5669c1e67bd086e09c47c00Jan Cholastafor (my $i = 0; $i < scalar(@services); $i++) {
728b10c81204929be5669c1e67bd086e09c47c00Jan Cholasta my $ifdef = $service_ifdefs[$i];
728b10c81204929be5669c1e67bd086e09c47c00Jan Cholasta print "$ifdef\n" if ($ifdef ne "");
728b10c81204929be5669c1e67bd086e09c47c00Jan Cholasta print "\t&".$services[$i].",\n";
728b10c81204929be5669c1e67bd086e09c47c00Jan Cholasta print "#endif\n" if ($ifdef ne "");
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta}
3bea01f01d76e1e95a8239c0d3f67073992136a1Jan Zelenyprint "};\n";
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholastaprint "buffer_t config_all_services_buf = {\n";
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholastaprint "\tconfig_all_services, sizeof(config_all_services), { 0, }\n";
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholastaprint "};\n";
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholastaprint "const struct setting_parser_info *all_default_roots[] = {\n";
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholastaforeach my $name (keys %parsers) {
6f8ae17869f4f8a1496e3f171ae6b5c11af1845cPavel Březina my $module = $parsers{$name};
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta next if (!$module);
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta print "\t&".$name.", \n";
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta}
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholastaprint "\tNULL\n";
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholastaprint "};\n";
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholastaprint "const struct setting_parser_info *const *all_roots = all_default_roots;\n";
4fa3ef8d8a8a3cddf8025d306c3b90b37dd431bcJan Cholastaprint "ARRAY_TYPE(service_settings) *default_services = &master_default_settings.services;\n";
4fa3ef8d8a8a3cddf8025d306c3b90b37dd431bcJan Cholasta