6

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

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

4

4 回答 4

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 的一部分,但不是全部。也许你可以用你公司最喜欢的脚本语言重写它。

于 2013-06-02T17:21:16.933 回答
2

你不能将所有非开放的 C 函数重构到一个单独的文件/库中吗?这是可行的,但比为每个公开版本更改源代码更干净,而且从长远来看可能更容易维护。

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

于 2013-06-02T16:46:27.407 回答
0

Emacs。它已经知道如何选择包含函数定义的文本区域,并且与许多其他方法相比,它将更少地依赖特定的编码风格。这使得错过某些东西的可能性降低。使用一点 emacs lisp 脚本,您可以让它以非交互方式搜索整个源代码树。

于 2013-06-03T05:23:34.000 回答
0

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

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

然后从函数定义中删除到锚定在行首的匹配'}'。如果您已经使用适当的缩进,那应该很容易。我已经看到出于这个原因需要将函数名称放在返回类型下方的编码规则,如

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

这使得这更容易。

于 2013-06-02T16:51:45.950 回答