cfunctionc-preprocessorpreprocessor-directive

C program to find the function name of a c file


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?


Solution

  • 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;
    }