|
|
1.1 root 1: <?php
2: //
3: // nono
4: // Copyright (C) 2024 nono project
5: // Licensed under nono-license.txt
6: //
7:
8: // usage: merge_ops.php ops.cpp.new dst_ops.cpp
9:
10: $deffile = preg_split("/\n/", file_get_contents($argv[1]));
11: $cppfile = preg_split("/\n/", file_get_contents($argv[2]));
12: // 末尾に空行が出てしまうので削っておく。
13: if ($cppfile[count($cppfile) - 1] == "") {
14: array_pop($cppfile);
15: }
16:
17: // deffile から 関数名 => array(直前のコメント, ...) の連想配列を作る。
18: // $def = array(
19: // "nop" => array("// ... NOP"),
20: // :
21: // );
22: $def = array();
23: for ($n = 0; $n < count($deffile); $n++) {
24: if (preg_match('/^OP_DEF\((\w+)\)/', $deffile[$n], $m)) {
25: $name = $m[1];
26: $comms = array();
27: for ($i = 1; $n - $i >= 0 ; $i++) {
28: $buf = $deffile[$n - $i];
29: if (preg_match("|^// |", $buf)) {
30: array_unshift($comms, $buf);
31: } else {
32: break;
33: }
34: }
35: $def[$name] = $comms;
36: }
37: }
38:
39: // 見つかった回数
40: $founds = array();
41:
42: // cppfile を辿る。
43: for ($c = 0; $c < count($cppfile); $c++) {
44: if (preg_match('/^OP_DEF\((\w+)\)/', $cppfile[$c], $m)) {
45: $name = $m[1];
46: if (isset($def[$name])) {
47: // すでに処理したやつがもう一度来た?
48: if (isset($founds[$name])) {
49: error("{$def[$name]} appeared again!\n");
50: }
51: $founds[$name] = true;
52:
53: // この直前のコメントの行数を数える。
54: $i = 0;
55: while (isset($cppfile[$c - 1 - $i]) &&
56: preg_match("|^// |", $cppfile[$c - 1 - $i])) {
57: $i++;
58: }
59: array_splice($cppfile, $c - $i, $i, $def[$name]);
60: $c = $c - $i + count($def[$name]);
61: } else {
62: array_splice($cppfile, $c, 0, "// # removed (merge.sh)");
63: $c++;
64: }
65: }
66: }
67:
68: foreach ($cppfile as $buf) {
69: print "{$buf}\n";
70: }
71:
72: // 処理したやつを def[] から削除して、残りが出たら新規追加分。
73: // 本当はそれっぽい位置に入れたい。
74: foreach ($founds as $name => $dummy) {
75: unset($def[$name]);
76: }
77: if (count($def) > 0) {
78: foreach ($def as $name => $comms) {
79: print "\n";
80: print "// # added (merge.sh)\n";
81: foreach ($comms as $line) {
82: print "{$line}\n";
83: }
84: print "OP_DEF({$name})\n";
85: print "{\n";
86: print "\tOP_FUNC(unimpl);\n";
87: print "}\n";
88: }
89: }
90: ?>
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.