|
|
1.1 ! root 1: # ! 2: # nono ! 3: # Copyright (C) 2021 nono project ! 4: # Licensed under nono-license.txt ! 5: # ! 6: ! 7: # monitor_id.txt から monitor_id.h, monitor_id.cpp を作る。 ! 8: # ! 9: # usage: perl monitor_id.pl monitor_id.txt ! 10: ! 11: { ! 12: $defs = ""; ! 13: $body = ""; ! 14: $first_mon_id = ""; ! 15: $first_sub_id = ""; ! 16: ! 17: # $#ARGV は引数の数-1。ここでいう引数は monitor_id.pl の後ろから。 ! 18: if ($#ARGV != 0) { ! 19: die "usage: $0 <id.txt>\n"; ! 20: } ! 21: ! 22: # ファイル名 ! 23: $infile = $ARGV[0]; ! 24: $hdrfile = $infile; ! 25: $srcfile = $infile; ! 26: $hdrfile =~ s/txt$/h/; ! 27: $srcfile =~ s/txt$/cpp/; ! 28: ! 29: open(IN, $infile) || die "Cannot open infile: ${infile}\n"; ! 30: while (<IN>) { ! 31: # Remove comments. ! 32: chomp; ! 33: s/#.*$//; ! 34: next if /^$/; ! 35: ! 36: @names = split(/\s+/); ! 37: ! 38: # MEMDUMP の最大数はここが一次情報なので、これから定数を作る ! 39: if ($names[0] =~ /^MEMDUMP%(\d+)/) { ! 40: $max_memdump = $1 + 0; ! 41: } ! 42: ! 43: if ($names[0] =~ /%(\d+)/) { ! 44: # %n なら 0..n に展開 ! 45: $atnum = $1 + 0; ! 46: for ($i = 0; $i < $atnum; $i++) { ! 47: @rep_names = (); ! 48: foreach $n (@names) { ! 49: $r = $n; ! 50: $r =~ s/%${atnum}/${i}/g; ! 51: push(@rep_names, $r); ! 52: } ! 53: parse_line(@rep_names); ! 54: } ! 55: } else { ! 56: # default ! 57: parse_line(@names); ! 58: } ! 59: } ! 60: close(IN); ! 61: ! 62: # 文字列として出力 ! 63: $hdrnew = ""; ! 64: $srcnew = ""; ! 65: ! 66: $hdrnew .= "// Generated from ${0}\n"; ! 67: $hdrnew .= "\n"; ! 68: $hdrnew .= $mon_defs; ! 69: $hdrnew .= "\n"; ! 70: $hdrnew .= $sub_defs; ! 71: $hdrnew .= "\n"; ! 72: $hdrnew .= "\tID_MONITOR_START = ${first_mon_id},\n"; ! 73: $hdrnew .= "\tID_MONITOR_END = ${last_mon_id},\n"; ! 74: $hdrnew .= "\tID_MONITOR_MAX = ID_MONITOR_END + 1,\n"; ! 75: $hdrnew .= "\tID_SUBWIN_START = ${first_sub_id},\n"; ! 76: $hdrnew .= "\tID_SUBWIN_END = ${last_sub_id},\n"; ! 77: $hdrnew .= "\tID_SUBWIN_MAX = ID_SUBWIN_END + 1,\n"; ! 78: $hdrnew .= "\n"; ! 79: $hdrnew .= "\t// これは enum じゃないけど自動生成の都合でここに置く\n"; ! 80: $hdrnew .= "\tMAX_MEMDUMP_MONITOR = ${max_memdump},\n"; ! 81: ! 82: $srcnew .= "// Generated from ${0}\n"; ! 83: $srcnew .= "\n"; ! 84: $srcnew .= "#include \"monitor.h\"\n"; ! 85: $srcnew .= "\n"; ! 86: $srcnew .= "/*static*/ const std::vector<MonitorManager::MonitorInfo>\n"; ! 87: $srcnew .= "MonitorManager::info {\n"; ! 88: $srcnew .= $mon_body; ! 89: $srcnew .= "\n"; ! 90: $srcnew .= $sub_body; ! 91: $srcnew .= "};\n"; ! 92: ! 93: # 更新があれば書き出す ! 94: do_update($hdrfile, $hdrnew); ! 95: do_update($srcfile, $srcnew); ! 96: ! 97: exit 0; ! 98: } ! 99: ! 100: sub parse_line() ! 101: { ! 102: local @names = @_; ! 103: local $id = shift(@names); ! 104: local $type = shift(@names); ! 105: local $flag = shift(@names); ! 106: local $first; ! 107: ! 108: if ($#names == -1) { ! 109: # If <names...> are ommited, use ID instead. ! 110: $first = lc $id; ! 111: } else { ! 112: # If <names...> are specified, use it. ! 113: $first = shift(@names); ! 114: } ! 115: ! 116: if ($type eq "m") { ! 117: $id = "ID_MONITOR_${id}"; ! 118: if ($first_mon_id eq "") { ! 119: $first_mon_id = $id; ! 120: } ! 121: $last_mon_id = $id; ! 122: } else { ! 123: $id = "ID_SUBWIN_${id}"; ! 124: if ($first_sub_id eq "") { ! 125: $first_sub_id = $id; ! 126: } ! 127: $last_sub_id = $id; ! 128: } ! 129: ! 130: $defs = "\t${id},\n"; ! 131: $body = "\t{ ${id},\tVMF_${flag},\t{ \"${first}\""; ! 132: foreach $name (@names) { ! 133: $body .= ", \"${name}\""; ! 134: } ! 135: $body .= " } },\n"; ! 136: ! 137: if ($type eq "m") { ! 138: $mon_defs .= $defs; ! 139: $mon_body .= $body; ! 140: } else { ! 141: $sub_defs .= $defs; ! 142: $sub_body .= $body; ! 143: } ! 144: } ! 145: ! 146: sub do_update() ! 147: { ! 148: local $filename = $_[0]; ! 149: local $filebody = $_[1]; ! 150: local $old; ! 151: local @contents; ! 152: ! 153: # まず出力先ファイルを文字列として読み込む ! 154: $old = ""; ! 155: if (open(IN, $filename)) { ! 156: @contents = <IN>; ! 157: $old = join("", @contents); ! 158: close(IN); ! 159: } ! 160: ! 161: # 全文を比較して変更があれば出力 ! 162: if ($filebody ne $old) { ! 163: open(OUT, ">${filename}") || die "Cannot open ${filename}\n"; ! 164: print OUT $filebody; ! 165: close(OUT); ! 166: print "Updated ${filename}\n"; ! 167: } ! 168: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.