From 85d8ee940c843e63ae824640910cb81c881f1e18 Mon Sep 17 00:00:00 2001 From: Aoran Zeng Date: Wed, 16 Jul 2025 19:33:14 +0800 Subject: [PATCH] Fix multiple output kinds --- tool/rawstr4c/lib/Generator.rakumod | 49 +++++++++++++++-------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/tool/rawstr4c/lib/Generator.rakumod b/tool/rawstr4c/lib/Generator.rakumod index e199486..14fbbb4 100644 --- a/tool/rawstr4c/lib/Generator.rakumod +++ b/tool/rawstr4c/lib/Generator.rakumod @@ -134,7 +134,8 @@ my class CVariableGenerator { }; } - method generate-c-header-file($output-mode = 'global-variable') { + #| 生成 C 头文件的内容 + method generate-c-header-file() { my $header = qq:to/EOF/; #pragma once @@ -148,22 +149,25 @@ my class CVariableGenerator { for @.variables -> $var { given $var { + when 'global-variable-only-header' { + $header ~= "char {$var}[] = \"{$var}\";\n\n"; + } when 'global-variable' { - if $output-mode eq 'global-variable-only-header' { - $header ~= "char {$var}[] = \"{$var}\";\n\n"; - } else { - $header ~= "extern char {$var}[];\n"; - } + $header ~= "extern char {$var}[];\n"; } when 'macro' { $header ~= "#define {$var.uc} \"{$var}\"\n\n"; } + default { + die "Unknown variable kind: {$var}"; + } } } return $header; } + #| 生成 C 源文件的内容 method generate-c-source-file() { my $source = qq:to/EOF/; /** @@ -181,26 +185,25 @@ my class CVariableGenerator { $source ~= "char {$var}[] = \"{$var}\";\n"; } } - return $source; } - method save-files($output-mode, $dest-dir) { + method save-files($dest-dir) { my $c-header-file = $dest-dir.IO.child($.c-header-filename).Str; - $c-header-file.IO.spurt(self.generate-c-header-file($output-mode)); + $c-header-file.IO.spurt(self.generate-c-header-file()); say "Generated C header file: $c-header-file"; - if $output-mode eq 'global-variable' { - my $has-globals = @.variables.grep({ $_ eq 'global-variable' }).elems > 0; - if $has-globals { - my $c-source-filename = $.c-header-filename.subst(/'.h'$/, '.c'); - my $c-source-file = $dest-dir.IO.child($c-source-filename).Str; - $c-source-file.IO.spurt(self.generate-c-source-file()); - say "Generated C source file: $c-source-file"; - } + # 检查是否有 "头、源并存的变量",如果有就使用并存的头文件和源文件模式 + my $need-gen-c-source-file = @.variables.grep({ $_ eq 'global-variable' }).elems > 0; + + if $need-gen-c-source-file { + my $c-source-filename = $.c-header-filename.subst(/'.h'$/, '.c'); + my $c-source-file = $dest-dir.IO.child($c-source-filename).Str; + $c-source-file.IO.spurt(self.generate-c-source-file()); + say "Generated C source file: $c-source-file"; } } } @@ -258,9 +261,12 @@ class Generator { say 'char ' ~ $varname ~ '[] = "' ~ $c-string ~ '";'; say ""; } - when 'global-variable' | 'global-variable-only-header' { + when 'global-variable' { $.variable-generator.add-variable($varname, $c-string, 'global-variable'); } + when 'global-variable-only-header' { + $.variable-generator.add-variable($varname, $c-string, 'global-variable-only-header'); + } when 'macro' { $.variable-generator.add-variable($varname, $c-string, 'macro'); } @@ -286,12 +292,7 @@ class Generator { # 如果有任何变量被添加 (没有被输出到终端),就保存文件 if $.variable-generator.variables.elems > 0 { my $dest-dir = $.parser.input-file.IO.dirname.Str; - - # 检查是否有 "头、源并存的变量",如果有就使用并存的头文件和源文件模式 - my $has-global-vars = $.variable-generator.variables.grep({ $_ eq 'global-variable' }).elems > 0; - my $output-mode = $has-global-vars ?? 'global-variable' !! 'global-variable-only-header'; - - $.variable-generator.save-files($output-mode, $dest-dir); + $.variable-generator.save-files($dest-dir); } } }