¿Hay algún progtwig (o script sed) que elimine una function de un file C?

Necesito un script donde paso un file C y un nombre de function y eliminará esa function C del file. ¿Hay alguna utilidad que haga esto?

Básicamente, estoy buscando abrir una biblioteca desarrollada internamente y me gustaría mantener su historia. Pero hay ciertas funciones que no puedo abrir. He estado usando git filter-branch para eliminar files completos que no pueden abrirse, pero ahora he llegado al punto en que necesito eliminar ciertas funciones de los files donde partes del file pueden estar abiertas, pero otras no. Como git filter-branch ejecuta un command en cada commit, necesito algo automatizado que elimine esta function de cada commit del repository.

Como lreeder, recomendaría refactorizar el código para que el material de código abierto y privado estén en diferentes files / bibliotecas.

Sin embargo, si eso no funciona para usted, entonces creo que no debe recurrir a un análisis completo del código C. En su lugar, podría hacer algo simple como colocar las partes privadas del file entre comentarios como //PRIVATE y //END-PRIVATE . Luego puede usar este script de ruby para eliminar las secciones privadas:

 #!/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 

Esto utiliza algunas características mágicas y convenientes de ruby ​​para hacer que el código sea corto, pero creo que será mucho más fácil de depurar y mantener que un analizador de C completo. Además, los desarrolladores pueden ver fácilmente qué funciones son privadas mientras trabajan en el código. Hice algo muy similar a esto para un proyecto en el que estaba trabajando donde queríamos lanzar parte de un Makefile pero no todo. Tal vez podrías reescribirlo en el lenguaje de scripting favorito de tu compañía.

¿No puedes refactorizar todas las funciones C no abiertas en un file / biblioteca separado? Esto es trabajo, pero sería más limpio que cambiar su código fuente para cada versión pública, y probablemente más fácil de mantener a largo ploop.

Si la refactorización no es una opción, encontré un analizador de código fuente C basado en Perl en http://search.cpan.org/~jtbraun/Parse-RecDescent-1.967009/demo/demo_another_Cgrammar.pl . Parece que con algunos pirateo, podría filtrar las funciones no deseadas.

El path a seguir sin analizar realmente el código C sería canonicalizar las definiciones de su function en una forma que awk puede eliminar fácilmente, dicen

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

y luego borre de la definición de la function a la coincidencia '}' anclada al comienzo de una línea. Si usa la sangría adecuada, ya debería ser fácil. He visto reglas de encoding que por este motivo requieren colocar el nombre de la function debajo del tipo de retorno, como en

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

lo que hace que esto sea aún más fácil.

Emacs. Ya sabe cómo seleccionar la región de text que contiene una definición de function, y va a depender less de un coding style particular que muchos otros methods. Eso hace que sea less probable que algo se pierda. Con un pequeño scripting de emacs lisp, puede hacer que busque un tree fuente completo de forma no interactiva.