mirror of
https://github.com/RubyMetric/chsrc
synced 2025-07-21 23:59:33 +08:00
Fix multiple output kinds
This commit is contained in:
parent
b1a45fb4d7
commit
85d8ee940c
@ -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<kind> {
|
||||
when 'global-variable' {
|
||||
if $output-mode eq 'global-variable-only-header' {
|
||||
when 'global-variable-only-header' {
|
||||
$header ~= "char {$var<name>}[] = \"{$var<value>}\";\n\n";
|
||||
} else {
|
||||
$header ~= "extern char {$var<name>}[];\n";
|
||||
}
|
||||
when 'global-variable' {
|
||||
$header ~= "extern char {$var<name>}[];\n";
|
||||
}
|
||||
when 'macro' {
|
||||
$header ~= "#define {$var<name>.uc} \"{$var<value>}\"\n\n";
|
||||
}
|
||||
default {
|
||||
die "Unknown variable kind: {$var<kind>}";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $header;
|
||||
}
|
||||
|
||||
#| 生成 C 源文件的内容
|
||||
method generate-c-source-file() {
|
||||
my $source = qq:to/EOF/;
|
||||
/**
|
||||
@ -181,21 +185,21 @@ my class CVariableGenerator {
|
||||
$source ~= "char {$var<name>}[] = \"{$var<value>}\";\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({ $_<kind> eq 'global-variable' }).elems > 0;
|
||||
if $has-globals {
|
||||
# 检查是否有 "头、源并存的变量",如果有就使用并存的头文件和源文件模式
|
||||
my $need-gen-c-source-file = @.variables.grep({ $_<kind> 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());
|
||||
@ -203,7 +207,6 @@ my class CVariableGenerator {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class Generator {
|
||||
@ -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({ $_<kind> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user