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