Using C::Scan : How to ignore #includes ?

A

Abhinav

Hi,

I have a piece of code which parses a file using C::Scan, and takes in the
declarations :

use strict;
use warnings;
use C::Scan;

my $c = new C::Scan 'filename' => $name;
my $fdec = $c->get('fdecls');

I am able to get the declarations in $fdec, but I also get the following
warnings:

In file included from :1:
sample_main.oc:4:8: macro names must be identifiers
sample_main.oc:4:15: s.h: No such file or directory
sample_main.oc:8:20: adcore.h: No such file or directory
sample_main.oc:12:20: adxstf.h: No such file or directory

I basically am interested *only* in the *prototypes* of the functions.[1]

How can I remove the warnings given below ? I tried looking through Scan.pm
and Data/Flow.pm, but without success.

Thanks
Abhinav

[1] : $fdec contains info for functions with only prototypes, as well as
definitions. I need only the prototypes. I am currently checking if the
result matches with m/[)]\s*[;]\s*$/ to get what I need. Anyway to do it
through C::Scan itself?
 
I

Ilya Zakharevich

[A complimentary Cc of this posting was sent to
Abhinav
my $fdec = $c->get('fdecls');

I am able to get the declarations in $fdec, but I also get the following
warnings:

In file included from :1:
sample_main.oc:4:8: macro names must be identifiers
sample_main.oc:4:15: s.h: No such file or directory
sample_main.oc:8:20: adcore.h: No such file or directory
sample_main.oc:12:20: adxstf.h: No such file or directory

I basically am interested *only* in the *prototypes* of the functions.[1]

You did not explain why the headers are missing. Without headers,
what makes you think the prototypes make sense?
How can I remove the warnings given below ? I tried looking through Scan.pm
and Data/Flow.pm, but without success.

Install the headers? What do you mean by "removing"?
[1] : $fdec contains info for functions with only prototypes, as well as
definitions. I need only the prototypes. I am currently checking if the
result matches with m/[)]\s*[;]\s*$/ to get what I need. Anyway to do it
through C::Scan itself?

Sorry, I cannot understand what you are talking about...

Hope this helps,
Ilya
 
A

Abhinav

Ilya said:
[A complimentary Cc of this posting was sent to
Abhinav
my $fdec = $c->get('fdecls');

I am able to get the declarations in $fdec, but I also get the following
warnings:

In file included from :1:
sample_main.oc:4:8: macro names must be identifiers
sample_main.oc:4:15: s.h: No such file or directory
sample_main.oc:8:20: adcore.h: No such file or directory
sample_main.oc:12:20: adxstf.h: No such file or directory

I basically am interested *only* in the *prototypes* of the functions.[1]


You did not explain why the headers are missing. Without headers,
what makes you think the prototypes make sense?

I am checking the C File to ensure that all function definitions have
proper documentation. I do this using doxygen (http://www.doxygen.org).

I do not need to check whether any function prototypes are having any
documentation.

I do the checking on a per-file basis, and do not care about included files
- I will check them individually.


I want to "skip" all the #defines, #includes, etc ..
Hence,

C:Scan should (for my case) ignore any preprocessor directives. (It would
be as if I am removing these before running C::Scan on the file.

This includes #ifdef as well as #include
Install the headers? What do you mean by "removing"?

As I said above, I do not want to.
[1] : $fdec contains info for functions with only prototypes, as well as
definitions. I need only the prototypes. I am currently checking if the
result matches with m/[)]\s*[;]\s*$/ to get what I need. Anyway to do it
through C::Scan itself?


Sorry, I cannot understand what you are talking about...

I do not need to check if prototypes are having comments, but doxygen
apparently has no way to differentiate this, so I used C::Scan to get all
the declarations. C::Scan returns declarations for prototypes as well as
definitions*, and I see if it really is a prototype by iterating over the
returned arrayref and checking whether it ends with a ';'.

I then comment out the prototypes before passing the file to doxygen.
 
I

Ilya Zakharevich

[A complimentary Cc of this posting was sent to
Abhinav
I am checking the C File to ensure that all function definitions have
proper documentation. I do this using doxygen (http://www.doxygen.org).

I still do not have a slightest idea what you want to achieve, and why
do you want to achieve it in the way you do it.
I want to "skip" all the #defines, #includes, etc ..
Hence,

C:Scan should (for my case) ignore any preprocessor directives. (It would
be as if I am removing these before running C::Scan on the file.

I have no idea what "ignore" means here. If you want a broken
pre-processor, write one, and set up C::Scan to use it. However, I'm
not sure that a C preprocessor is a completely trivial program (well,
probably to write one is trivial, but to *understand* what it must do
from the C standard may be a non-trivial task).
I do not need to check if prototypes are having comments, but doxygen
apparently has no way to differentiate this, so I used C::Scan to get all
the declarations. C::Scan returns declarations for prototypes as well as
definitions*, and I see if it really is a prototype by iterating over the
returned arrayref and checking whether it ends with a ';'.

This is still not a full enough description to understand what you
want to do. However, why not just redirect STDERR to /dev/null?

Yours,
Ilya
 
A

Abhinav

Ilya said:
[A complimentary Cc of this posting was sent to
Abhinav
I am checking the C File to ensure that all function definitions have
proper documentation. I do this using doxygen (http://www.doxygen.org).


I still do not have a slightest idea what you want to achieve, and why
do you want to achieve it in the way you do it.

I want to "skip" all the #defines, #includes, etc ..
Hence,

C:Scan should (for my case) ignore any preprocessor directives. (It would
be as if I am removing these before running C::Scan on the file.


I have no idea what "ignore" means here. If you want a broken
pre-processor, write one, and set up C::Scan to use it. However, I'm
not sure that a C preprocessor is a completely trivial program (well,
probably to write one is trivial, but to *understand* what it must do
from the C standard may be a non-trivial task).

I do not need to check if prototypes are having comments, but doxygen
apparently has no way to differentiate this, so I used C::Scan to get all
the declarations. C::Scan returns declarations for prototypes as well as
definitions*, and I see if it really is a prototype by iterating over the
returned arrayref and checking whether it ends with a ';'.


This is still not a full enough description to understand what you
want to do. However, why not just redirect STDERR to /dev/null?


I have no doubt that C::Scan is an excellent module. Maybe I am the one wh
is expecting to do things with it which it isn;t meant for..

I have a C source file, sample.c :

#include <stdio.h>

int func1( int x,
int y, /*This is a comment*/
int z);

int main(void){
print ("Hello, World\n");
}

int func1( int x,
int y, /* This is a comment*/
int x)
{
return 0;
}

I used C::Scan (fdecls) to read this files and get a list of the function
declarations.

For the above file, it rightly gives

int func1( int x,
int y,
int z);

I am using this string, returned from C::Scan, to match the protoype in the
file, and comment it out. Thus, the modified file I have should have the
prototype for func1 commented out.

However, since C::Scan->get('fdecls') strips of comments, I am having a
problem. Thus, In the above case. the comment "/* This is a comment*? is
not present in the searcj expression.

I thought using C::Scan's fdecl would help me out here, as it already
provides me with the list of prototypes..

Is there any way I could get the whole prototype text as it is ? Or should
I just stop using C::Scan ?

Thanks for your help ..

Abhinav
 
I

Ilya Zakharevich

[A complimentary Cc of this posting was sent to
Abhinav
For the above file, it rightly gives

int func1( int x,
int y,
int z);

I am using this string, returned from C::Scan, to match the protoype in the
file, and comment it out. Thus, the modified file I have should have the
prototype for func1 commented out.

However, since C::Scan->get('fdecls') strips of comments, I am having a
problem.

C::Scan needs to write statement/declaration boundaries. To do this,
it needs to deal with whatever is "not C code": preprocessor directives,
comments, literal strings.

The first thing C::Scan does is running the input through
preprocessor. Then the only (?) thing it needs to work with is literal
strings (it needs to ignore C code which is embedded in literal
strings, right?).

As I said, you can use `cat' as a preprocessor; but C::Scan may get
confused by the unpreprocessed code.

Hope this helps,
Ilya
 
S

Scott W Gifford

[...]
I want to "skip" all the #defines, #includes, etc ..
Hence,

C:Scan should (for my case) ignore any preprocessor directives. (It
would be as if I am removing these before running C::Scan on the file.

This includes #ifdef as well as #include

An extremely simplistic solution is to use as your preprocessor:

grep -v '^#'

or perhaps a script containing that.

I'm not familiar with C::Scan at all, so that may be off base, but
from following this discussion it looks like it might be useful.

----ScottG.
 
A

Abhinav

Ilya said:
[A complimentary Cc of this posting was sent to
Abhinav
For the above file, it rightly gives

int func1( int x,
int y,
int z);

I am using this string, returned from C::Scan, to match the protoype in the
file, and comment it out. Thus, the modified file I have should have the
prototype for func1 commented out.

However, since C::Scan->get('fdecls') strips of comments, I am having a
problem.


C::Scan needs to write statement/declaration boundaries. To do this,
it needs to deal with whatever is "not C code": preprocessor directives,
comments, literal strings.

The first thing C::Scan does is running the input through
preprocessor. Then the only (?) thing it needs to work with is literal
strings (it needs to ignore C code which is embedded in literal
strings, right?).

As I said, you can use `cat' as a preprocessor; but C::Scan may get
confused by the unpreprocessed code.

I was not aware of the Preprocessing step and thought that C::Scan was
doing everything itself. Thanks to some help from Hugo, we invoked the
preprocessor with the -C switch, which retained the comments in the file.
Its now working like a charm. :)

Thanks for your help

Abhinav
 
I

Ilya Zakharevich

[A complimentary Cc of this posting was sent to
Abhinav
I was not aware of the Preprocessing step and thought that C::Scan was
doing everything itself.

All one needs to do to implement this is to implement cpp in Perl.
Thanks, but no thanks. ;-) I prefer to delegate the work to a tool
which is known to work, and work well...
Thanks to some help from Hugo, we invoked the
preprocessor with the -C switch, which retained the comments in the file.
Its now working like a charm. :)

I'm very glad that you managed to solve your problem. I think the
principal problem was communication one; it was very hard to
understand what you wanted to do, and why...

Yours,
Ilya
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,901
Latest member
Noble71S45

Latest Threads

Top