1

我的输入包含使用 typedef 定义的结构。我稍后使用这些来初始化我的主函数中的变量。

例如:

typedef struct {
   int numer;
   int denom;
} Rational;

int main()
{
Rational half, *newf = malloc(sizeof(Rational));

half = (Rational){ 1, 2 };
*newf = (Rational){ 2, 3 };
}

这是我想要做的:我想将两个初始化行转换为函数调用。

例如:

half = (Rational){ 1, 2 };

应该变成:

init_Rational( &half,  1, 2  );

*newf = (Rational){ 2, 3 };

应该变成

init_Rational( newf,  2, 3  );

诀窍是要记住 Rational 早先被定义为结构,并用函数调用替换初始化。它不必称为 Rational,它可以是任何名称。

一旦它识别出声明是一个 struct typedef,它应该执行以下操作,如上所示。

转动:

something = (someStructName){ data1, data2, data3.. };

进入

init_someStructName( &something, data1, data2, data3.. );

或为指针...转:

*something = (someStructName){ data1, data2, data3.. };

进入

init_someStructName( something, data1, data2, data3.. );

有人可以帮我吗?谢谢!

4

2 回答 2

1

这是一个相当棘手的问题,因为需要动态检测结构名称意味着您不能提前编写整个正则表达式。

这是一种可能的解决方案,假设您的文件名为 foo.c:

sed -n '/^typedef struct/,/^}/{/^}/{s/.* \(.*\);/\1/p}}' foo.c | xargs -I {} sed -i -e 's/^\(\s*\)\*\(\w*\) = ('{}'){\(.*\)};/\1init_'{}'( \2,\3);/' -e 's/^\(\s*\)\(\w*\) = ('{}'){\(.*\)};/\1init_'{}'( \&\2,\3);/' foo.c

这会在一行中单独sed打印出每个结构名称,然后用于为每个结构xargs构造一个附加sed命令,以在文件上执行替换。

如果您的版本sed不支持\sor\w快捷方式,您可以使用[ \t]代替\s[_a-zA-Z0-9]代替\w.

于 2012-09-21T22:31:34.927 回答
0

几乎看不懂!

sed -e 's/\(\**[a-zA-Z_][a-zA-Z_0-9]*\) *= *( *\([a-zA-Z_][a-zA-Z_0-9]*\) *) *{\([^}]*\)} *;/init_\2(\&\1,\3);/'

注意:它是单行 注意2:我假设可能只有空格作为可能的分隔符(没有TAB) 注意3:形式“ *x”保持不变,因为它已转换为&*x,它是正确的。我假设“*”和标识符之间没有空格;

于 2012-09-21T22:37:59.157 回答