私はそれがおそらく一般的には最良のアイデアだと思うので、私は "答え"としてeaの提案をマークします。私は、ライブラリの開発は、テストの失敗によって駆動されたtddのアプローチで非常にうまく動作するだろうと私は思うが、私はそれを試みることがあります。今のところ、私は対話的な方法で動作するより早く+汚れたアプローチが必要です(問題のライブラリは、別のインタラクティブなプログラム用の動的に読み込まれたプラグインです、私はAPIコールのシーケンスをリバースエンジニアリングしようとしています...)
私がやったことは、pycparseを呼び出すpythonスクリプトを書くことでした。私は他の人に役立つ場合に備えてここに含めますが、一般的ではありません(例えば、すべての関数がintを返すと仮定し、typedef内のfunc defを避けるためのハックを持っています)。
from pycparser import parse_file
from pycparser.c_ast import NodeVisitor
class AncestorVisitor(NodeVisitor):
def __init__(self):
self.current = None
self.ancestors = []
def visit(self, node):
if self.current:
self.ancestors.append(self.current)
self.current = node
try:
return super(AncestorVisitor, self).visit(node)
finally:
if self.ancestors:
self.ancestors.pop(-1)
class FunctionVisitor(AncestorVisitor):
def visit_FuncDecl(self, node):
if len(self.ancestors) < 3: # avoid typedefs
print node.type.type.names[0], node.type.declname, '(',
first = True
for param in node.args.params:
if first: first = False
else: print ',',
print param.type.type.names[0], param.type.declname,
print ')'
print '{fprintf(stderr, "%s\\n"); return 0;}' % node.type.declname
print '#include "myheader.h"'
print '#include <stdio.h>'
ast = parse_file('myheader.h', use_cpp=True)
FunctionVisitor().visit(ast)
これまでのところ、実際に質問はされていませんが、これを行うための既存のツールをお探しですか?残念ながら、私はどのツールも知らないのですが、それを解決するための素早いPython(または他の高水準言語)実装を行うのに十分な基本と聞こえますか? – Jite
私は質問を明確にしました。はい、私はこれを行うためのプログラムを書くことができます。しかし、それは自明ではありません - 例えば、まともなパーサーが必要です。ヘッダーは十分に大きく、複雑なので、アドホックな正規表現ベースのkludgeは時間のかかる混乱になります。 –
こんにちは、プロセスは簡単に繰り返す必要がありますか?たとえば、新しいバージョンのAPIがリリースされたときにスタブ実装を更新できるようにしたいとしますか? – OlduwanSteve