|
|
1.1 root 1: #
2: # nono
3: # Copyright (C) 2021 nono project
4: # Licensed under nono-license.txt
5: #
6:
7: # object_id.txt から object_id.h, object_id.cpp を作る。
8: #
9: # usage: perl object_id.pl object_id.txt
10:
11: {
12: # ファイル名
13: $infile = $ARGV[0];
14: $hdrfile = $infile;
15: $srcfile = $infile;
16: $hdrfile =~ s/txt$/h/;
17: $srcfile =~ s/txt$/cpp/;
18:
19: open(IN, $infile) || die "Cannot open infile: ${infile}\n";
20: while (<IN>) {
21: # Remove comments.
22: chomp;
1.1.1.3 ! root 23: s/^#.*$//;
1.1 root 24: next if /^$/;
25:
26: @names = split(/\s+/);
27:
28: if (@names == 1) {
29: $names[1] = $names[0];
30: }
1.1.1.2 root 31: $names[1] =~ s/^\"(.*)\"$/$1/;
1.1 root 32:
33: # %n があれば 0..(n-1) に展開する
34: if ($names[0] =~ /%(\d+)/) {
35: $atnum = $1 + 0;
36: for ($i = 0; $i < $atnum; $i++) {
37: @rep_names = ();
38: $r = $names[0];
39: $r =~ s/%${atnum}/${i}/g;
40: push(@rep_names, $r);
41: $r = $names[1];
42: $r =~ s/%/${i}/g;
43: push(@rep_names, $r);
44:
45: parse_line(@rep_names);
46: }
47: } else {
48: parse_line(@names);
49: }
50: }
51:
52: # 文字列として出力
53: $hdrnew = "";
54: $srcnew = "";
55:
56: $hdrnew .= "// Generated from ${0}\n";
57: $hdrnew .= "\n";
58: $hdrnew .= "#pragma once\n";
59: $hdrnew .= "\n";
60: $hdrnew .= "enum {\n";
61: $hdrnew .= $defs;
62: $hdrnew .= "};\n";
63:
64: $srcnew .= "// Generated from ${0}\n";
65: $srcnew .= "\n";
66: $srcnew .= "#include \"object.h\"\n";
67: $srcnew .= "\n";
68: $srcnew .= "/*static*/ const std::vector<const char *>\n";
69: $srcnew .= "Object::idname {\n";
70: $srcnew .= $msgs;
71: $srcnew .= "};\n";
72: $srcnew .= "\n";
73: $srcnew .= "/*static*/ const std::vector<const char *>\n";
74: $srcnew .= "Object::idtext {\n";
75: $srcnew .= $text;
76: $srcnew .= "};\n";
77:
78: # 更新があれば書き出す
79: do_update($hdrfile, $hdrnew);
80: do_update($srcfile, $srcnew);
81:
82: exit 0;
83: }
84:
85: sub parse_line()
86: {
87: local @names = @_;
88:
89: $defs .= "\tOBJ_${names[0]},\n";
90: $msgs .= "\t\"${names[1]}\",\n";
91: $text .= "\t\"OBJ_${names[0]}\",\n";
92: }
93:
94: sub do_update()
95: {
96: local $filename = $_[0];
97: local $filebody = $_[1];
98: local $old;
99: local @contents;
100:
101: # まず出力先ファイルを文字列として読み込む
102: $old = "";
103: if (open(IN, $filename)) {
104: @contents = <IN>;
105: $old = join("", @contents);
106: close(IN);
107: }
108:
109: # 全文を比較して変更があれば出力
110: if ($filebody ne $old) {
111: open(OUT, ">${filename}") || die "Cannot open ${filename}\n";
112: print OUT $filebody;
113: close(OUT);
114: print "Updated ${filename}\n";
115: }
116: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.