[comp.sys.sgi] ctags and function prototypes

tomm@voodoo.voodoo.uucp (Tom Mackey) (10/31/90)

    I'm trying to DoTheRightThing and use full function prototyping
    and have run into a little problem with ctags.  I wonder whether
    there is a problem with the parsing mechanism in ctags, or if I
    am doing the prototypes incorrectly.  Allow me to demonstrate.

    I am writing a declaration for a function which takes a pointer to
    an integer, a pointer to a function which returns void and itself
    takes a pointer to void (generic pointer), and a third parameter
    which is a pointer to void.  Here's the declaration:

void   my_func(int *, void ((*fn)(void *)), void *);

    And here is a definition, body left empty since it is
    immaterial to the discussion at hand:

void my_func(int *flag, void (*sfunc)(void *), void *arg)
{
    /* Do Whatever */
}

    Now, if I run ctags on this, here is what I get:

Script started on Tue Oct 30 10:52:37 1990
tomm logging onto hank:/dev/ttyq7 at 10:52:37 AM on Tue 30_Oct_90
% cat foo.c
void    my_func(int *, void (*fn)(void *), void *);

void my_func(int *flag, void (*sfunc)(void *), void *arg)
{
    /* Do Whatever */
}

% ctags foo.c
Duplicate entry in file foo.c, line 3: my_func
Second entry ignored
% cat tags
my_func foo.c   /^void    my_func(int *, void (*fn)(void *), void *)/
% exit
% 
script done on Tue Oct 30 10:52:56 1990

    OK.  Now I'll reduce the declaration by removing most of that
    function pointer prototype:

Script started on Tue Oct 30 11:08:45 1990
tomm logging onto hank:/dev/ttyq7 at 11:08:45 AM on Tue 30_Oct_90
% cat foo.c
void    my_func(int *, void (*fn), void *);

void my_func(int *flag, void (*sfunc)(void *), void *arg)
{
    /* Do Whatever */
}

% ctags foo.c
% cat tags
my_func foo.c   /^void my_func(int *flag, void (*sfunc)(void *), voi/
% exit
% 
script done on Tue Oct 30 11:09:00 1990

    That worked OK.... tags contains the actual function definition.
    Now I'll add back in the paren-pair for the function pointer:


Script started on Tue Oct 30 11:11:01 1990
tomm logging onto hank:/dev/ttyq7 at 11:11:01 AM on Tue 30_Oct_90
ca% t foo.c
void    my_func(int *, void (*fn)(), void *);

void my_func(int *flag, void (*sfunc)(void *), void *arg)
{
    /* Do Whatever */
}

% ctags foo.c
Duplicate entry in file foo.c, line 3: my_func
Second entry ignored
% cat tags
my_func foo.c   /^void    my_func(int *, void (*fn)(), void *);$/
% exit
% 
script done on Tue Oct 30 11:11:22 1990

    Oops!  Bad news.  The tags file contains the function declaration.
    What gives?  Any ideas?

--
Tom Mackey       (206) 865-6575        tomm@voodoo.boeing.com
Boeing Computer Services         ....uunet!bcstec!voodoo!tomm
M/S 7K-20,     P.O. Box 24346,     Seattle, WA     98124-0346

tomm@uucp (Tom Mackey) (10/31/90)

In article <515@voodoo.UUCP> tomm@voodoo.voodoo.uucp (Tom Mackey) writes:
>
>    I'm trying to DoTheRightThing and use full function prototyping
>    and have run into a little problem with ctags.  I wonder whether

     <Most of my previous drivel ommitted>

A co-worker just popped in and said he thought he had seen something
about this 3 or so weeks ago.  I just got caught up in c.s.sgi, so it
may have expired.  He said there may have been something about it
being a known bug and was to be fixed in Release 3.3 of the OS.  I am
running Release 3.3.1 on a 4D/25TG.


--
Tom Mackey       (206) 865-6575        tomm@voodoo.boeing.com
Boeing Computer Services         ....uunet!bcstec!voodoo!tomm
M/S 7K-20,     P.O. Box 24346,     Seattle, WA     98124-0346

tomm@uucp (Tom Mackey) (11/03/90)

In article <517@voodoo.UUCP> tomm@uucp (Tom Mackey) writes:
>In article <515@voodoo.UUCP> tomm@voodoo.voodoo.uucp (Tom Mackey) writes:

>>    I'm trying to DoTheRightThing and use full function prototyping
>>    and have run into a little problem with ctags.  I wonder whether

>     <Most of my previous drivel ommitted>

>A co-worker just popped in and said he thought he had seen something
>about this 3 or so weeks ago.  I just got caught up in c.s.sgi, so it
>may have expired.  He said there may have been something about it
>being a known bug and was to be fixed in Release 3.3 of the OS.  I am
>running Release 3.3.1 on a 4D/25TG.

<     Didja ever get the feeling no one's listening and yer just
      talking to yerself?  ;^)                                        >


Here is a workaround to the ctags and prototypes problem that I've been
discussing with myself:


/*
** The following cheap trick is made necessary by a broken ctags(1).
** Ctags is fooled by function prototypes containing pointer to
** function declarations, so we hide them in a define.  Now lint(1)
** stays happy, too!
*/

#define PARMLIST1 void (*fn)(void *, int)
#define PARMLIST2 void (*fn)(void *)

void    add_event(event_pp, int, int, int, PARMLIST1, void *);
void    add_update(update_pp, int *, PARMLIST2, void *);

Enjoy!
--
Tom Mackey       (206) 865-6575        tomm@voodoo.boeing.com
Boeing Computer Services         ....uunet!bcstec!voodoo!tomm
M/S 7K-20,     P.O. Box 24346,     Seattle, WA     98124-0346