[CastXML] how to print the exact same declaration as in the header ?

Matt mattator at gmail.com
Sat Jul 23 15:59:18 EDT 2016


Modifying the upstream package for personal convenience is rarely a
good solution, I created my own printing function.

In my script I am looking for the "memchr" prototype defined in string.h .
===
/* Search N bytes of S for C.  */
#ifdef __CORRECT_ISO_CPP_STRING_H_PROTO
extern "C++"
{
extern void *memchr (void *__s, int __c, size_t __n)
      __THROW __asm ("memchr") __attribute_pure__ __nonnull ((1));
extern const void *memchr (const void *__s, int __c, size_t __n)
      __THROW __asm ("memchr") __attribute_pure__ __nonnull ((1));

# ifdef __OPTIMIZE__
__extern_always_inline void *
memchr (void *__s, int __c, size_t __n) __THROW
{
  return __builtin_memchr (__s, __c, __n);
}

__extern_always_inline const void *
memchr (const void *__s, int __c, size_t __n) __THROW
{
  return __builtin_memchr (__s, __c, __n);
}
# endif
}
#else
extern void *memchr (const void *__s, int __c, size_t __n)
      __THROW __attribute_pure__ __nonnull ((1));
#endif
====
I want the C function but pygccxml throws a
"pygccxml.declarations.scopedef.multiple_declarations_found_t"
exception because it considers the C++ code I think. In C there should
be only one result since C doesn't accept overloads.

Right now, I search for it with "decl =
global_namespace.free_function(name=row["name"]) " . How can I tell
pygccxml that I look only for the C versions ?

Also, in most projects I know examples are in a top level directory or
in the source so it's easy to find & use them. In pygccxml they are in
the doc subfolders thus I wonder if it were doable to move them there
?

Cheers



2016-07-22 16:21 GMT+02:00 Michka Popoff <michkapopoff at gmail.com>:
> Hi
>
> thanks for the nice comments.
>
> Using print on declarations in pygccxml is a nice way to debug you code,
> but often you may not want to rely on the __str__ implementation in you real code.
>
> The output of the __str__ method may vary depending on you compiler / platform / code,
> and I can not guarantee that this will work in a reliable way in all the situations.
> This is something I may add to the documentation; __str__ is for debugging
> purposes only.
>
> It is probably better to build the string you want by using the .name, .return_type,
> .arguments ... attributes. This is often more flexible, and also more performant,
> as you select only the things that you are interested in.
>
> Cheers
>
> Michka
>
>
>> On 22 Jul 2016, at 16:10, Matt <mattator at gmail.com> wrote:
>>
>> I found the code in declarations/free_calldef.py and hacked it
>> locally, I might copy/paste the code in my script later then.
>>
>> Sorry for the noise
>>
>> 2016-07-22 15:36 GMT+02:00 Matt <mattator at gmail.com>:
>>> Hi,
>>>
>>> I've just started with pygccxml/castxml and I must admit it's quite
>>> impressive: doc/examples and worked straightout of the box.
>>>
>>> I want to use pygccxml to generate wrapper functions around glibc
>>> functions. I can't use LD_PRELOAD or --wrap techniques so I have to
>>> copy/paste the declarations of these functions which is a pain.
>>> I am trying to automate this copy/paste via pygccxml.
>>>
>>> So far, I have:
>>> ==
>>> func1a = global_namespace.free_function(name="printf")
>>> print(func1a)
>>> ==
>>> which output:
>>> extern int printf(__restrict__ char const * __format, ...) [free function]
>>> is very near to what I want:
>>> extern int printf(__restrict__ char const * __format, ...)
>>>
>>> I have done dir(func1a) to see which members I could use and grepped
>>> for __str__ to see the magic but miserably fail to find the location.
>>> How could I output the same declaration as in the header please ?
>>>
>>>
>>> Cheers
>>>
>>> Nb: In the list of  programs using pygccxml you could add www.nsnam.org
>> _______________________________________________
>> CastXML mailing list
>> CastXML at public.kitware.com
>> http://public.kitware.com/mailman/listinfo/castxml
>


More information about the CastXML mailing list