--- nono/lib/monitor_id.pl 2026/04/29 17:04:54 1.1 +++ nono/lib/monitor_id.pl 2026/04/29 17:05:19 1.1.1.4 @@ -13,6 +13,7 @@ $body = ""; $first_mon_id = ""; $first_sub_id = ""; + @maxes = (); # $#ARGV は引数の数-1。ここでいう引数は monitor_id.pl の後ろから。 if ($#ARGV != 0) { @@ -35,19 +36,19 @@ @names = split(/\s+/); - # MEMDUMP の最大数はここが一次情報なので、これから定数を作る - if ($names[0] =~ /^MEMDUMP%(\d+)/) { - $max_memdump = $1 + 0; - } + if ($names[0] =~ /([^%]+)%(\d+)/) { + # %n なら 0..(n-1) に展開 + $basename = $1; + $atnum = $2 + 0; - if ($names[0] =~ /%(\d+)/) { - # %n なら 0..n に展開 - $atnum = $1 + 0; + # モニタの最大数はここが一次情報なので、これから定数を作る + push(@maxes, "MAX_${basename}_MONITOR = ${atnum}"); for ($i = 0; $i < $atnum; $i++) { @rep_names = (); foreach $n (@names) { $r = $n; $r =~ s/%${atnum}/${i}/g; + $r =~ s/%/${i}/g; push(@rep_names, $r); } parse_line(@rep_names); @@ -77,7 +78,9 @@ $hdrnew .= "\tID_SUBWIN_MAX = ID_SUBWIN_END + 1,\n"; $hdrnew .= "\n"; $hdrnew .= "\t// これは enum じゃないけど自動生成の都合でここに置く\n"; - $hdrnew .= "\tMAX_MEMDUMP_MONITOR = ${max_memdump},\n"; + foreach $str (@maxes) { + $hdrnew .= "\t${str},\n"; + } $srcnew .= "// Generated from ${0}\n"; $srcnew .= "\n"; @@ -89,6 +92,11 @@ $srcnew .= "\n"; $srcnew .= $sub_body; $srcnew .= "};\n"; + $srcnew .= "\n"; + $srcnew .= "/*static*/ const std::vector>\n"; + $srcnew .= "Monitor::idtext {\n"; + $srcnew .= $label_body; + $srcnew .= "};\n"; # 更新があれば書き出す do_update($hdrfile, $hdrnew); @@ -127,8 +135,17 @@ sub parse_line() $last_sub_id = $id; } + if ($flag eq ".") { + # フラグ省略時(モニタの場合)は vmcap を参照することはないはず + $flag = "NONE"; + } + # フラグは '|' で並べることが出来る。 + @flags = split(/\|/, $flag); + @caps = map { "VMCap::".$_ } @flags; + $cap = join('|', @caps); + $defs = "\t${id},\n"; - $body = "\t{ ${id},\tVMF_${flag},\t{ \"${first}\""; + $body = "\t{ ${id},\t${cap},\t{ \"${first}\""; foreach $name (@names) { $body .= ", \"${name}\""; } @@ -141,6 +158,9 @@ sub parse_line() $sub_defs .= $defs; $sub_body .= $body; } + + # デバッグ用の ID と文字列の対応表 + $label_body .= "\t{ ${id}, \"${id}\" },\n"; } sub do_update()