Ezt gondolom még ki kell egészíteni valamivel, ami kigyűjti az összes függvény implementációt, hogy melyik fájlban mettől meddig tart sorokban.
Egyszer kellett nekem egy olyan valami ami felsorloja a függvény implemetácót: neten találtam is egy perl scripet: function_grep.pl.
Olyan is kellett nekem ami kiírja egy adott függvény implemetációját, írtam egy ki C progit :)
gyakorlatilag csak végig követi a {} párokat és a stdin-ről olvassa a sorokat addig amíg az utolsó }-t is be nem olvassa, tehát a megfelelő sortól kezdve kell a fájlt át csövezni neki:
/* fun_body.c
* stdin-t masolja stdout-ra az elso fv torzs vegeig
*/
#include <stdio.h>
#define TRUE 1
#define FALSE 0
typedef int boolean;
enum States { NORMAL, PER, CppCOMMENT, CCOMMENT, ASTERISK };
int b_count;
boolean is_exit = FALSE;
void check_body(char c)
{
if(c=='{')
b_count++;
else if(c=='}')
if((--b_count)==0)
is_exit=TRUE;
}
int main()
{
int state = NORMAL;
int i;
char c;
b_count = 0;
while(((i = getchar()) != EOF) && (!is_exit))
{
c=(char)i;
switch(state)
{
case NORMAL:
if(c=='/')
state=PER;
else
{
//putchar(c);
check_body(c);
}
break;
case PER:
if(c=='*')
state=CCOMMENT;
else if(c=='/')
state=CppCOMMENT;
else
{
state=NORMAL;
//putchar('/');
//putchar(c);
check_body(c);
}
break;
case CppCOMMENT:
if(c=='\n')
{
state=NORMAL;
//putchar('\n');
}
break;
case CCOMMENT:
if(c=='*')
state=ASTERISK;
break;
case ASTERISK:
if(c=='/')
state=NORMAL;
else if(c!='*')
state=CCOMMENT;
break;
default:
fprintf(stderr,"Unhandled switch case");
return -1;
break;
}
putchar(c);
}
putchar('\n');
return 0;
}
Aztán találtam még egy bash scriptet is ami ezt a C progit hívja meg de a fájl nevét és a sor számát kell neki átadni ahol a függvény kezdődik:
#!/bin/bash
# Return values
# 0: Success
# 1: argumentum error
DEBUG= #set for debugging
FUN_BODY_FINDER="fun_body" # sajat fv torzset kiiro program
PROGNAME=`basename $0`
usage()
{
cat << USAGE_END
Function implementation shower
Usage:
$PROGNAME <source_file> <line_num>
where line_num is the line number where the function implementation begins
USAGE_END
}
if [ $# -ne 2 ] ; then
echo "need 2 arguments instead of $#" 1>&2
usage
exit 1
fi
# ARG HANDLING
FILENAME="$1"
LINENUM="$2"
if [ $DEBUG ] ; then
echo "FILENAME: |$FILENAME| ; LINENUM: |$LINENUM|"
fi
if [ ! -r "$FILENAME" ] ; then
echo "$FILENAME can not read" 1>&2
usage
exit 1
fi
if echo $LINENUM | grep -q '[^0-9]' ; then
echo "$LINENUM is not a number" 1>&2
usage
exit 1
fi
# LINES
T_NUM=`wc -l "$FILENAME"|awk '{print $1}'`
B_NUM=`expr $T_NUM - $LINENUM + 1`
if [ $DEBUG ] ; then
echo "T_NUM: |$T_NUM| ; B_NUM: |$B_NUM|"
fi
tail -n $B_NUM "$FILENAME" | $FUN_BODY_FINDER