Code Comments

Programming Forum and web based access to our favorite programming groups.
For Programmers: Free Programming Magazines | New: Database administration forum
Registration is free! Edit your profileCalendarFind other membersFrequently Asked QuestionsSearch -> 
Post New Thread











Thread
Author

Using C::Scan : How to ignore #includes ?
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?


Report this thread to moderator Post Follow-up to this message
Old Post
Abhinav
09-23-04 08:58 PM


Re: Using C::Scan : How to ignore #includes ?
[A complimentary Cc of this posting was sent to
Abhinav
<matrix_calling@yahoo.dot.com>], who wrote in article <_iA4d.39$6E4.112@news.oracle.com>:[c
olor=darkred]
>     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][/color]

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.p
m
> 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




Report this thread to moderator Post Follow-up to this message
Old Post
Ilya Zakharevich
09-24-04 08:57 AM


Re: Using C::Scan : How to ignore #includes ?
Ilya Zakharevich wrote:
> [A complimentary Cc of this posting was sent to
> Abhinav
> <matrix_calling@yahoo.dot.com>], who wrote in article <_iA4d.39$6E4.112@ne
ws.oracle.com>:
> 
>
>
> 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.

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

Report this thread to moderator Post Follow-up to this message
Old Post
Abhinav
09-24-04 08:57 AM


Re: Using C::Scan : How to ignore #includes ?
[A complimentary Cc of this posting was sent to
Abhinav
<matrix_calling@yahoo.dot.com>], who wrote in article <QXP4d.2$vx2.76@news.oracle.com>:[col
or=darkred] 

> 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

Report this thread to moderator Post Follow-up to this message
Old Post
Ilya Zakharevich
09-26-04 08:55 AM


Re: Using C::Scan : How to ignore #includes ?
Ilya Zakharevich wrote:
> [A complimentary Cc of this posting was sent to
> Abhinav
> <matrix_calling@yahoo.dot.com>], who wrote in article <QXP4d.2$vx2.76@news
.oracle.com>:
> 
>
> 
>
>
> 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 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).
>
> 
>
>
> 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

Report this thread to moderator Post Follow-up to this message
Old Post
Abhinav
09-27-04 08:56 AM


Re: Using C::Scan : How to ignore #includes ?
[A complimentary Cc of this posting was sent to
Abhinav
<matrix_calling@yahoo.dot.com>], who wrote in article <9qP5d.3$RZ2.83@news.oracle.com>:[col
or=darkred]
> 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 th
e
> 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.[/color]

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
 by the unpreprocessed code.

Hope this helps,
Ilya

Report this thread to moderator Post Follow-up to this message
Old Post
Ilya Zakharevich
09-27-04 09:01 PM


Re: Using C::Scan : How to ignore #includes ?
Abhinav <matrix_calling@yahoo.dot.com> 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.

Report this thread to moderator Post Follow-up to this message
Old Post
Scott W Gifford
09-27-04 09:01 PM


Re: Using C::Scan : How to ignore #includes ?
Ilya Zakharevich wrote:
> [A complimentary Cc of this posting was sent to
> Abhinav
> <matrix_calling@yahoo.dot.com>], who wrote in article <9qP5d.3$RZ2.83@news
.oracle.com>:
> 
>
>
> 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
>  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

Report this thread to moderator Post Follow-up to this message
Old Post
Abhinav
09-29-04 09:59 AM


Re: Using C::Scan : How to ignore #includes ?
[A complimentary Cc of this posting was sent to
Abhinav
<matrix_calling@yahoo.dot.com>], who wrote in article <Hbs6d.58$4V.58@news.o
racle.com>:

> 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


Report this thread to moderator Post Follow-up to this message
Old Post
Ilya Zakharevich
09-30-04 04:35 PM


Sponsored Links




Last Thread Next Thread Next
Search this forum -> 
Post New Thread

PERL Miscellaneous archive

Show a Printable Version Send to friend Email This Page to Someone! subscribe to this thread Receive updates to this thread
Computer Consultants
Programming Jobs
Visual Basic Controls
SQL Server Programming
Webservices
Java Security
Visual Studio
C# Programming
Visual J++
Software engineering
Open source Software
Perl Programming
PHP Programming
ASP Programming
ASP .NET Programming
Visual Basic Programming
Windows Scripting Host
Java Programming
Java Help
Java Beans
VBScript
Cobol
MAC Applications
Unix Programming
Forum Jump:
All times are GMT. The time now is 05:24 PM.

 
Free MCSE Braindumps | Real Estate Topics

Programming forum archive

Copyrights CodeComments.com 2004 - 2006

Powered by vBulletin Copyright 2000-2006 Jelsoft Enterprises Limited.