是否有一个程序(或sed脚本)将从C文件中删除一个函数?

时间:2013-06-02 16:29:21

标签: c git

我需要一个脚本,我传递一个C文件和一个函数名称,它将从文件中删除该C函数。有没有可以做到这一点的实用程序?

基本上,我正在寻找开源内部开发的库,并希望保留其历史。但是有些功能我无法开源。我一直在使用git filter-branch删除无法开源的整个文件,但现在我已经达到了我需要从文件中删除某些功能的地步,其中文件的某些部分可能是开源的,但其他人则不能。由于git filter-branch在每次提交时运行一个命令,我需要一些自动化的东西,它将从每次提交存储库中删除此函数。

4 个答案:

答案 0 :(得分:3)

与lreeder一样,我建议重构代码,以便开源和私有内容在不同的文件/库中。

但是,如果这对您不起作用,那么我认为您应该使用C代码的完整解析。相反,您可以执行一些简单的操作,例如将文件的私有部分放在//PRIVATE//END-PRIVATE等注释之间。然后,您可以使用此ruby脚本删除私有部分:

#!/usr/bin/ruby

# remove_private.rb: Removes all lines between "PRIVATE" and "END-PRIVATE"
#
# Usage 1, output to STDIO:  cat filename.c | ruby remove_private.rb
# Usage 2, output to STDIO:  ruby remove_private.rb filename.c
# Usage 3, in-place editing of file (and creating a backup): ruby -i.bak remove_private.rb filename.c

while line = ARGF.gets
  unless (line =~ /PRIVATE/)..(line =~ /END-PRIVATE/)
    puts line
  end
end

这使用ruby的一些神奇和方便的功能来缩短代码,但我认为调试和维护比完整的C解析器更容易。此外,开发人员可以在处理代码时轻松查看哪些功能是私有的。对于我正在处理的项目,我做了一些非常类似的事情,我们想要发布Makefile的一部分而不是整个事情。也许你可以用公司最喜欢的脚本语言重写它。

答案 1 :(得分:2)

您不能将所有非打开的C函数重构为单独的文件/库吗?这是有效的,但比更改每个公开发布的源代码更简洁,并且可能更容易维护。

如果重构不是一个选项,我在http://search.cpan.org/~jtbraun/Parse-RecDescent-1.967009/demo/demo_another_Cgrammar.pl找到了一个基于perl的C源代码解析器。看起来像一些黑客,它可以过滤掉不需要的功能。

答案 2 :(得分:0)

没有实际解析C代码的方法是将函数定义规范化为awk可以轻松删除的形式,比如说

sometype_t *function (type_t arg, ...)
{
    ...
}

然后从函数定义中删除锚定在行开头的匹配'}'。如果你使用适当的缩进应该很容易。我见过编码规则,因为这个原因需要将函数名放在返回类型下面,如

sometype_t *
function (type_t arg, ...)
{
    ...
}

这使得这更容易。

答案 3 :(得分:0)

Emacs的。它已经知道如何选择包含函数定义的文本区域,并且它将比许多其他方法更少地依赖于特定的编码样式。这样就不太可能遗漏某些东西。使用一些emacs lisp脚本,您可以让它以非交互方式搜索整个源树。