I'm programming in C (Linux OS). I have to read a file, check for functions in that file and print the corresponding function name. So far, I have programmed to identify the functions using depth calculation of '{'. I know that __FUNCTION__
preprocessor directive is used for printing current file's function name. Similarly, is there any preprocessor directive for finding function names of the file we read? I'm not concerned about any specific tools. I want to get it programmed. Kindly guide me. Thanks in advance.
I have tried to implemented this code.This function takes the line (which is coming before {
) as argument.
void ffname(char line[100])
{
int i, j, m, n, f = 0;
char dt[10], fname[28];
char s[5][10] = { "int", "void", "struct", "char", "float" };
dt = strtok(line, " ");
for (i = 0; i < 5; i++)
{
m = strcmp(dt, s[i]);
if (m == 0)
{
f = 1;
n = strlen(dt);
}
}
if (f)
{
for (i = n + 2, j = 0; i < strlen(line); i++, j++)
{
if (line[i] == '*')
i++;
while (line[i] != '(')
{
fname[j] = line[i];
}
}
}
}
I don't know that this code is correct. Shall I use in this way? is there any option to find the function name?
I assume that the file you are reading is a C source file.
This is not a trivial task, if you want to do it properly (means, if you reliably want to recognize all functions). See Listing C/C++ functions (Code analysis in Unix) for some additional information.
I'm not concerned about any specific tools. I want to get it programmed.
That is certainly possible, but you will basically end up with a scanner/parser frontend for C, similar to what is already implemented in tools like Doxygen or Synopsis (github / waybackmachine). You can probably simplify it a bit and use some heuristics, for example you do not need to parse the complete code (e.g. you can skip anything between {
and }
).
If you still want to implement your own approach, I would follow these steps:
(6.9.1) function-definition
is the production term you should start with.I've used Simple C code to find the name of the function.
#include <stdio.h>
#include <string.h>
#define SIZE 1024
void ffname(char *line)
{
int i=1,j=0;
char *dt;
char name[SIZE];
strtok(line,"(");
dt = strchr(line,' ');
if(dt[i] == '*')
i++;
while(dt[i] != '\0')
{
name[j]=dt[i];
i++;
j++;
}
name[j] ='\0';
printf("Function name is: %s\n", name);
}
int main(int argc, char **argv)
{
if(argc < 2)
{
printf("Give the filename \n");
printf("Usage: %s filename\n", argv[0]);
return -1;
}
int i, lines =0, funlines =0,count =0, fn =0, flag =0;
char c[SIZE],b[SIZE];
FILE *fd;
fd = fopen(argv[1],"r");
while(fgets(c,SIZE,fd))
{
lines++;
i=0;
for(i=0;i<strlen(c);i++)
{
while( c[i] =='\t' || c[i] == ' ')
{
i++;
}
if( c[i] == '{')
{
count++;
if(flag)
{
funlines++;
}
if(count == 1)
{
fn++;
printf("Function %d is Started..............\n", fn);
flag = 1;
ffname(b);
}
break;
}
else if( c[i] == '}')
{
count--;
if(!count)
{
flag = 0;
printf("No of lines in the function %d is: %d\n", fn, funlines);
printf("Function %d is finished..........\n", fn);
funlines = 0;
}
else
{
funlines++;
}
break;
}
else if(flag)
{
funlines++;
break;
}
}
strcpy(b,c);
}
printf("Total no of function%d\n",fn);
printf("Total no of lines%d\n",lines);
return 0;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With