]> bicyclesonthemoon.info Git - botm/config/commitdiff
Replacement functionality now works.
authorb <rowerynaksiezycu@gmail.com>
Sat, 10 Sep 2022 16:14:58 +0000 (16:14 +0000)
committerb <rowerynaksiezycu@gmail.com>
Sat, 10 Sep 2022 16:14:58 +0000 (16:14 +0000)
configure.pl
settings_template.txt

index ce2ac6dc2ba09d540a5619e4b44232d26605a884..1caa8133fc915c50ae618210fa1155a77a9d7cf2 100755 (executable)
@@ -1,11 +1,10 @@
 #!/usr/bin/perl
 
 # configure.pl
-#
-# This script is called from the makefile. It reads the settings file and
-# inserts the information in the source files.
-#
-#    Copyright (C) 2015-2017, 2022  Balthasar Szczepański
+
+# The new BOTM configuration tool
+
+#    Copyright (C) 2022  Balthasar Szczepański
 #
 #    This program is free software: you can redistribute it and/or modify
 #    it under the terms of the GNU Affero General Public License as
@@ -36,6 +35,8 @@ use constant ESCAPE     => '_ESCAPE';
 use constant URL_ENCODE => '_URL_ENCODE';
 use constant PATH       => '_PATH';
 use constant SPRINTF    => '_SPRINTF';
+use constant DEBUG      => '_DEBUG';
+use constant DEBUG_ALL  => '_DEBUG_ALL';
 
 # TODO more special functions
 
@@ -48,14 +49,72 @@ foreach my $arg (@ARGV) {
        %cfg = parse_file($arg, 0, %cfg);
 }
 
+my %replace_line;
+my %replace_keyword;
+my $debug = '';
+my $debug_all = '';
+my $match_line;
+my $match_keyword;
+
 foreach my $key (keys %cfg) {
-       print $key.': >'.$cfg{$key}."<\n";
+       if ($debug_all ne ''){
+               $debug_all .= "\n";
+       }
+       $debug_all .= "$key: $cfg{$key}";
+       unless((substr($key,0,1) eq '_') or ($key =~ /^[0-9]+$/)){
+               if ($debug ne ''){
+                       $debug .= "\n";
+               }
+               $debug .= "$key: $cfg{$key}";
+               $match_line = parse_pattern(REPLACE_LINE(), "($key)", 0, %cfg);
+               $match_keyword = parse_pattern(REPLACE_KEYWORD(), "($key)", 0, %cfg);
+               $replace_line{$match_line} = $cfg{$key};
+               $replace_keyword{$match_keyword} = $cfg{$key};
+       }
+}
+$match_line = parse_pattern(REPLACE_LINE(), '('.DEBUG().')', 0, %cfg);
+$match_keyword = parse_pattern(REPLACE_KEYWORD(), '('.DEBUG().')', 0, %cfg);
+$replace_line{$match_line} = $debug;
+$replace_keyword{$match_keyword} = $debug;
+$match_line = parse_pattern(REPLACE_LINE(), '('.DEBUG_ALL().')', 0, %cfg);
+$match_keyword = parse_pattern(REPLACE_KEYWORD(), '('.DEBUG_ALL().')', 0, %cfg);
+$replace_line{$match_line} = $debug_all;
+$replace_keyword{$match_keyword} = $debug_all;
+my $status;
+LINE: while (defined(my $line = <STDIN>)) {
+       $line =~ s/[\r\n]//g;
+       foreach my $key (keys %replace_line) {
+               if (index($line, $key) >= 0) {
+                       print "$replace_line{$key}\n";
+                       next LINE;
+               }
+       }
+       foreach my $key (keys %replace_keyword) {
+               do {
+                       ($status, $line) = replace($line, $key, $replace_keyword{$key});
+               } while ($status);
+       }
+       print "$line\n";
 }
 
-# TODO: OK we have settings parsing done.
-#       Now parse the actual files, do the replacements
+# replace WITHOUT REGEXP
+sub replace {
+       (my $text, my $to_replace, my $replacement) = @_;
+       
+       my $ind = index($text, $to_replace);
+       if ($ind <0) {
+               return (0, $text);
+       }
+       my $len = length($to_replace);
+       
+       my $before = substr($text, 0, $ind);
+       my $after = substr($text, $ind+$len);
+       
+       return (1, $before.$replacement.$after);
+}
 
-sub unescape {
+
+sub unescape1ch {
        (my $to_escape) = @_;
        
        if    ($to_escape eq 'a') { return "\a";}
@@ -68,6 +127,31 @@ sub unescape {
        else                      { return $to_escape;}
 }
 
+sub escape {
+       (my $text, my $match) = @_;
+       unless (defined $match) {
+               $match = '[\\\\\\\'\\\"]';
+       }
+       
+       my $outcome = '';
+       foreach my $ch (split('', $text)) {
+               if ($ch =~ $match) {
+                       if    ($ch eq "\a") { $outcome .= '\\a';}
+                       elsif ($ch eq "\b") { $outcome .= '\\b';}
+                       elsif ($ch eq "\e") { $outcome .= '\\e';}
+                       elsif ($ch eq "\f") { $outcome .= '\\f';}
+                       elsif ($ch eq "\n") { $outcome .= '\\n';}
+                       elsif ($ch eq "\r") { $outcome .= '\\r';}
+                       elsif ($ch eq "\t") { $outcome .= '\\t';}
+                       else                { $outcome .= '\\'.$ch;}
+               }
+               else {
+                       $outcome .= $ch;
+               }
+       }
+       return $outcome;
+}
+
 sub urlencode {
        (my $text, my $match) = @_;
        unless (defined $match) {
@@ -238,7 +322,7 @@ sub parse_pattern {
        
                while ($to_parse ne '') {
                        if ($to_parse =~ /^\\(.)(.*)$/) {
-                               $parsed .= unescape($1);
+                               $parsed .= unescape1ch($1);
                                $to_parse = $2;
                        }
                        elsif ($to_parse =~ /^\$([A-Za-z0-9_\-\.]+)(.*)$/) {
@@ -260,7 +344,7 @@ sub parse_pattern {
                return $parsed;
        }
        elsif ($name eq ESCAPE) {
-               return '+'; #TODO
+               return escape(@parameter_list);
        }
        elsif ($name eq URL_ENCODE) {
                return urlencode(@parameter_list);
@@ -296,7 +380,7 @@ sub parse_value {
        while ($to_parse ne '') {
                # escape
                if ($to_parse =~ /^\\(.)(.*)$/) {
-                       $parsed .= unescape($1);
+                       $parsed .= unescape1ch($1);
                        $to_parse = $2;
                }
                elsif ($to_parse =~ /^\$([A-Za-z0-9_\-\.]+)(.*)$/) {
index 7ea3146826ce234883c43d934976b2ec1ea3594e..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1 +0,0 @@
-p0 = $_SPRINTF(%02x %02x,44,22)