Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Perl > Perl Misc > Using C::Scan : How to ignore #includes ?

Reply
Thread Tools

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

 
 
Abhinav
Guest
Posts: n/a
 
      09-23-2004
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?

 
Reply With Quote
 
 
 
 
Ilya Zakharevich
Guest
Posts: n/a
 
      09-24-2004
[A complimentary Cc of this posting was sent to
Abhinav
<(E-Mail Removed)>], who wrote in article <_iA4d.39$(E-Mail Removed)>:
> 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



 
Reply With Quote
 
 
 
 
Abhinav
Guest
Posts: n/a
 
      09-24-2004
Ilya Zakharevich wrote:
> [A complimentary Cc of this posting was sent to
> Abhinav
> <(E-Mail Removed)>], who wrote in article <_iA4d.39$(E-Mail Removed)>:
>
>> 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
>
>
>

 
Reply With Quote
 
Ilya Zakharevich
Guest
Posts: n/a
 
      09-26-2004
[A complimentary Cc of this posting was sent to
Abhinav
<(E-Mail Removed)>], who wrote in article <QXP4d.2$(E-Mail Removed)>:
> > 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
 
Reply With Quote
 
Abhinav
Guest
Posts: n/a
 
      09-27-2004
Ilya Zakharevich wrote:
> [A complimentary Cc of this posting was sent to
> Abhinav
> <(E-Mail Removed)>], who wrote in article <QXP4d.2$(E-Mail Removed)>:
>
>>>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, 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
 
Reply With Quote
 
Ilya Zakharevich
Guest
Posts: n/a
 
      09-27-2004
[A complimentary Cc of this posting was sent to
Abhinav
<(E-Mail Removed)>], who wrote in article <9qP5d.3$(E-Mail Removed)>:
> 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
 
Reply With Quote
 
Scott W Gifford
Guest
Posts: n/a
 
      09-27-2004
Abhinav <(E-Mail Removed)> writes:

[...]

> 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.
 
Reply With Quote
 
Abhinav
Guest
Posts: n/a
 
      09-29-2004
Ilya Zakharevich wrote:
> [A complimentary Cc of this posting was sent to
> Abhinav
> <(E-Mail Removed)>], who wrote in article <9qP5d.3$(E-Mail Removed)>:
>
>>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
 
Reply With Quote
 
Ilya Zakharevich
Guest
Posts: n/a
 
      09-30-2004
[A complimentary Cc of this posting was sent to
Abhinav
<(E-Mail Removed)>], who wrote in article <Hbs6d.58$(E-Mail Removed)>:

> 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

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
Using std::lexicographical_compare with ignore case equalitydoesn't always work Alex Buell C++ 18 12-30-2008 09:16 PM
regarding ignore case sensitive of a string using regularexpressions Mosas Python 1 03-22-2005 01:49 PM
Ignore + TEST + Ignore SpooderStank Computer Support 2 04-08-2004 11:26 AM
Searching for Exact Phrase - should I ignore the ignore words? Rob Meade ASP General 6 03-01-2004 11:28 AM



Advertisments