123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- #!/usr/bin/perl
- # Processes language_xx.h files into language.cpp and language.h
- use strict;
- use warnings;
- my @langs = ("en","cz","it","es","pl");
- sub parselang
- {
- my ($filename) = @_;
- open(my $fh, '<:encoding(UTF-8)', $filename)
- or die "Could not open file '$filename' $!";
- # Create a new hash reference.
- my $out = {};
- while (my $line = <$fh>) {
- chomp $line;
- next if (index($line, 'MSG') == -1);
- $line =~ /(?is)\#define\s*(\S*)\s*(.*)/;
- my $symbol = $1;
- my $v = $2;
- next if (! defined $symbol or length($symbol) == 0);
- # Trim whitespaces from both sides
- $v =~ s/^\s+|\s+$//g;
- #$string =~ s/" MACHINE_NAME "/Prusa i3/;
- $v =~ s/" FIRMWARE_URL "/https:\/\/github.com\/prusa3d\/Prusa-i3-Plus\//;
- $v =~ s/" PROTOCOL_VERSION "/1.0/;
- $v =~ s/" STRINGIFY\(EXTRUDERS\) "/1/;
- $v =~ s/" MACHINE_UUID "/00000000-0000-0000-0000-000000000000/;
- ${$out}{$symbol} = $v;
- }
- return $out;
- }
- my %texts;
- my $num_languages = 0;
- foreach my $lang (@langs) {
- my $symbols = parselang("language_$lang.h");
- foreach my $key (keys %{$symbols}) {
- if (! (exists $texts{$key})) {
- $texts{$key} = [];
- }
- my $strings = $texts{$key};
- die "Symbol $key defined first in $lang, undefined in the preceding language files."
- if (scalar(@$strings) != $num_languages);
- push @$strings, ${$symbols}{$key};
- }
- $num_languages += 1;
- foreach my $key (keys %texts) {
- my $strings = $texts{$key};
- if (scalar(@$strings) != $num_languages) {
- # die "Symbol $key undefined in $lang."
- print "Symbol $key undefined in $lang. Using the english variant.\n";
- push @$strings, ${$strings}[0];
- }
- }
- }
- my $filename = 'language_all.h';
- open(my $fh, '>', $filename) or die "Could not open file '$filename' $!";
- # For the programmatic access to the program memory, read
- # http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html
- print $fh <<END
- #ifndef LANGUAGE_ALL_H
- #define LANGUAGE_ALL_H
- #define LANG_NUM (${num_languages})
- extern unsigned char lang_selected;
- #define LANG_TABLE_SELECT_EXPLICIT(TABLE, LANG) ((const char*)(pgm_read_ptr(TABLE + (LANG))))
- #define LANG_TABLE_SELECT(TABLE) LANG_TABLE_SELECT_EXPLICIT(TABLE, lang_selected)
- END
- ;
- foreach my $key (sort(keys %texts)) {
- print $fh "extern const char* const ${key}_LANG_TABLE[LANG_NUM];\n";
- print $fh "#define $key LANG_TABLE_SELECT(${key}_LANG_TABLE)\n";
- print $fh "#define ${key}_EXPLICIT(LANG) LANG_TABLE_SELECT_EXPLICIT(${key}_LANG_TABLE, LANG)\n"
- if ($key eq "MSG_LANGUAGE_NAME" || $key eq "MSG_LANGUAGE_SELECT");
- }
- print $fh <<END
- extern char* CAT2(const char *s1,const char *s2);
- extern char* CAT4(const char *s1,const char *s2,const char *s3,const char *s4);
- #endif //LANGUAGE_ALL.H
- END
- ;
- close $fh;
- print ".h created\n";
- $filename = 'language_all.cpp';
- open($fh, '>', $filename) or die "Could not open file '$filename' $!";
- print $fh <<'END'
- #include <avr/pgmspace.h>
- #include "configuration_prusa.h"
- #include "language_all.h"
- #define LCD_WIDTH 20
- extern unsigned char lang_selected;
- END
- ;
- foreach my $key (sort(keys %texts)) {
- my $strings = $texts{$key};
- for (my $i = 0; $i <= $#{$strings}; $i ++) {
- my $suffix = uc($langs[$i]);
- print $fh "const char ${key}_${suffix}[] PROGMEM = ${$strings}[$i];\n";
- }
- print $fh "const char * const ${key}_LANG_TABLE[LANG_NUM] PROGMEM = {\n";
- for (my $i = 0; $i <= $#{$strings}; $i ++) {
- my $suffix = uc($langs[$i]);
- print $fh "\t${key}_${suffix}";
- print $fh ',' if $i < $#{$strings};
- print $fh "\n";
- }
- print $fh "};\n\n";
- }
- print $fh <<'END'
- char langbuffer[LCD_WIDTH+1];
- char* CAT2(const char *s1,const char *s2) {
- unsigned char len=0;
- strncpy_P(langbuffer+len,s1,LCD_WIDTH-len);
- len+=strlen_P(s1);
- strncpy_P(langbuffer+len,s2,LCD_WIDTH-len);
- return langbuffer;
- }
- char* CAT4(const char *s1,const char *s2,const char *s3,const char *s4) {
- unsigned char len=0;
- strncpy_P(langbuffer+len,s1,LCD_WIDTH-len);
- len+=strlen_P(s1);
- strncpy_P(langbuffer+len,s2,LCD_WIDTH-len);
- len+=strlen_P(s2);
- strncpy_P(langbuffer+len,s3,LCD_WIDTH-len);
- len+=strlen_P(s3);
- strncpy_P(langbuffer+len,s4,LCD_WIDTH-len);
- return langbuffer;
- }
- END
- ;
- print ".cpp created.\nDone!\n";
|