Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 554
Dhasneem Avatar asked Oct 14 '25 15:10

Dhasneem


2 Answers

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:

  • In any case, you should run your C file through a C preprocessor first to resolve any macros and to have the raw C code available.
  • Then get familiar with basic Compiler Construction techniques, especially Scanning and Parsing your source file, and the C grammar. Note that there are different grammars, depending on the C version you are using. ISO/IEC 9899:TC2, Annex A1 contains a grammar for C99, for example. Looking at the source code of the mentioned tools should also help.
  • Implement a scanner to tokenize your input, and implement a parser which recognizes function names. From the grammar I mentioned before, (6.9.1) function-definition is the production term you should start with.
like image 177
Andreas Fester Avatar answered Oct 17 '25 03:10

Andreas Fester


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;
}
like image 32
Dhasneem Avatar answered Oct 17 '25 03:10

Dhasneem