Annotation of nono/lib/object_id.pl, revision 1.1.1.3

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.