Click here to get back home

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

 HomeNewsGroups | Search | About
 comp.lang.perl.modules    Post an article   get this group's latest topics as an RSS feed add this group's latest topics to your My MSN content add this group's latest topics to your My Yahoo content
Subject Author Date
Using C::Scan : How to ignore #includes ? Abhinav 09-23-2004
Posted by Abhinav on September 23, 2004, 7:54 pm
Please log in for more thread options
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?



Posted by Ilya Zakharevich on September 24, 2004, 4:43 am
Please log in for more thread options
[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





Posted by Abhinav on September 24, 2004, 1:42 pm
Please log in for more thread options
Ilya Zakharevich wrote:
> [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

>
>>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"?

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.

>
> Hope this helps,
> Ilya
>
>
>


Posted by Ilya Zakharevich on September 26, 2004, 8:06 am
Please log in for more thread options
[A complimentary Cc of this posting was sent to
Abhinav
> > 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 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).

> > 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 ';'.

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


Posted by Abhinav on September 27, 2004, 1:55 pm
Please log in for more thread options
Ilya Zakharevich wrote:
> [A complimentary Cc of this posting was sent to
> Abhinav
>
>>>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 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).
>
>
>>>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 ';'.
>
>
> 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, Worldn");         
}

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


Similar ThreadsPosted
Bogus error messages re Perl/lib/CORE/ includes September 30, 2005, 9:36 pm
How to print just numbers includes in Subject using POP3Client Module. April 9, 2007, 9:18 pm

Our other projects:

Art Dolls, Fairies and Mermaids - Sunnyfaces.net

Roy's Linux, Programming and Search Engines messages

1-Script XML SitemapXML Sitemap