( vb | 2007. 08. 03., p – 10:34 )

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