ijalab has asked for the wisdom of the Perl Monks concerning the following question:

I have to write a perl script to go over the C code base and identify all the functions in each file and replace each function name with a keyword, for example, i have a file name 1.c
int func1(struct commandId) { do(); return ( SUCCESS ); } void func2(struct commandId) { do(); return ( SUCCESS ); } float func3(struct commandId) { do(); return ( SUCCESS ); }
My intention is to replace func1, func2, func3 with func1_main, func2_main, func3_main....I see lot of advices, but quite confused as I am very new to PERL as to which method i should follow. The code base is big and there are lot of files and other open close braces in if else statements etc.., so, i would like to know any parser that exist in PERL to do this intended function.

Replies are listed 'Best First'.
Re: Identifying functions in a c file and replacing with a keyword
by marto (Cardinal) on Mar 18, 2013 at 09:51 UTC
Re: Identifying functions in a c file and replacing with a keyword
by tobyink (Canon) on Mar 18, 2013 at 10:48 UTC
    #!/usr/bin/env perl use v5.12; use C::Scan; use Data::Dumper; use File::Temp qw(tempfile); # Create a C source file to parse... my $code = <<'DATA'; int func_a (); void func_b (int foo); float func_c (int foo, float bar); int func_d (char* baz) { return func_a(4); } DATA my ($fh, $name) = tempfile(); print $fh $code; close $fh; # Let's see what's in the file my $scan = "C::Scan"->new(filename => $name); say "Declared functions:"; say for map $_->[1], @{ $scan->get("parsed_fdecls") }; say "Inline functions:"; say for map { /^\w+\s+(\w+)/s } @{ $scan->get("inlines") }; say "---"; # OK, let's make an array of those function names my @funcs = ( (map $_->[1], @{ $scan->get("parsed_fdecls") }), (map { /^\w+\s+(\w+)/s } @{ $scan->get("inlines") }), ); print Dumper \@funcs; say "---"; # Make a regexp out of that. my $regexp = join "|", map quotemeta, @funcs; # Let's do a search and replace on the original code $code =~ s{($regexp)}{$1\_main}g; say $code;
    package Cow { use Moo; has name => (is => 'lazy', default => sub { 'Mooington' }) } say Cow->new->name
      Sir, Thanks for the help. I am unable to install c::span module for windows xp.
        I am unable to install c::span module for windows xp

        C::Scan builds, tests and installs fine for me on windows.
        What prevents you from installing it ?

        Cheers,
        Rob