* va_arglist
@ 2008-12-02 12:48 Austin, Alex
2008-12-02 13:30 ` va_arglist Harvey Chapman
2008-12-02 15:37 ` va_arglist Ian Lance Taylor
0 siblings, 2 replies; 7+ messages in thread
From: Austin, Alex @ 2008-12-02 12:48 UTC (permalink / raw)
To: gcc-help
Is there any way to write code to generate a variable argument list and call a variable function?
For example:
int callPrintf(char *format, void *args[])
{
void **arg;
for(arg = args; *arg != NULL; arg++)
PushAnArgument(*arg);
return printf(format);
}
I am trying to wrap a poorly-designed API in a Python extension module. There is no way to separate out the variable argument call to multiple calls.
Is this possible?
- Alex
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: va_arglist
2008-12-02 12:48 va_arglist Austin, Alex
@ 2008-12-02 13:30 ` Harvey Chapman
2008-12-02 15:39 ` va_arglist Austin, Alex
2008-12-02 15:37 ` va_arglist Ian Lance Taylor
1 sibling, 1 reply; 7+ messages in thread
From: Harvey Chapman @ 2008-12-02 13:30 UTC (permalink / raw)
To: Austin, Alex; +Cc: gcc-help
Maybe this will help?
http://www.cl.cam.ac.uk/cgi-bin/manpage?3+stdarg
Although, I tried nesting some printf-like calls and had no success.
Perhaps there's a trick to it?
H.
#include <stdio.h>
#include <stdarg.h>
int testB(char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
printf("%p ", va_arg(ap, char *));
printf("%c\n", va_arg(ap, int));
va_end(ap);
va_start(ap, fmt);
vprintf(fmt, ap);
va_end(ap);
return(0);
}
int testA(char *fmt, ...)
{
int rc = 0;
va_list ap;
va_start(ap, fmt);
printf("%p ", va_arg(ap, char *));
printf("%c\n", va_arg(ap, int));
va_end(ap);
va_start(ap, fmt);
rc = testB(fmt, ap);
va_end(ap);
return(rc);
}
int main(int argc, char *argv[])
{
testA("Hello, %s%c\n", "World", '!');
return(0);
}
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: va_arglist
2008-12-02 12:48 va_arglist Austin, Alex
2008-12-02 13:30 ` va_arglist Harvey Chapman
@ 2008-12-02 15:37 ` Ian Lance Taylor
1 sibling, 0 replies; 7+ messages in thread
From: Ian Lance Taylor @ 2008-12-02 15:37 UTC (permalink / raw)
To: Austin, Alex; +Cc: gcc-help
"Austin, Alex" <Alex.Austin@spectrumdsi.com> writes:
> Is there any way to write code to generate a variable argument list
> and call a variable function?
There is no portable way to do this. You may be able to use the FFI
library. It's distributed with gcc, in the libffi directory.
Ian
^ permalink raw reply [flat|nested] 7+ messages in thread
* RE: va_arglist
2008-12-02 13:30 ` va_arglist Harvey Chapman
@ 2008-12-02 15:39 ` Austin, Alex
2008-12-02 18:24 ` va_arglist David Daney
0 siblings, 1 reply; 7+ messages in thread
From: Austin, Alex @ 2008-12-02 15:39 UTC (permalink / raw)
To: Harvey Chapman; +Cc: gcc-help
That's all about unpacking an arglist. I need to pack an arglist. Also, the function in question isn't actually printf, but a custom API, and it doesn't have a vprintf equivalent.
-----Original Message-----
From: Harvey Chapman [mailto:hchapman-gcc-help@3gfp.com]
Sent: Tuesday, December 02, 2008 7:29 AM
To: Austin, Alex
Cc: gcc-help@gcc.gnu.org
Subject: Re: va_arglist
Maybe this will help?
http://www.cl.cam.ac.uk/cgi-bin/manpage?3+stdarg
Although, I tried nesting some printf-like calls and had no success.
Perhaps there's a trick to it?
H.
#include <stdio.h>
#include <stdarg.h>
int testB(char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
printf("%p ", va_arg(ap, char *));
printf("%c\n", va_arg(ap, int));
va_end(ap);
va_start(ap, fmt);
vprintf(fmt, ap);
va_end(ap);
return(0);
}
int testA(char *fmt, ...)
{
int rc = 0;
va_list ap;
va_start(ap, fmt);
printf("%p ", va_arg(ap, char *));
printf("%c\n", va_arg(ap, int));
va_end(ap);
va_start(ap, fmt);
rc = testB(fmt, ap);
va_end(ap);
return(rc);
}
int main(int argc, char *argv[])
{
testA("Hello, %s%c\n", "World", '!');
return(0);
}
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: va_arglist
2008-12-02 15:39 ` va_arglist Austin, Alex
@ 2008-12-02 18:24 ` David Daney
2008-12-02 23:27 ` va_arglist Robert William Fuller
0 siblings, 1 reply; 7+ messages in thread
From: David Daney @ 2008-12-02 18:24 UTC (permalink / raw)
To: Austin, Alex; +Cc: Harvey Chapman, gcc-help
Austin, Alex wrote:
> That's all about unpacking an arglist.
No, it does both 'packing' and 'unpacking'.
> I need to pack an arglist. Also, the function in question isn't
> actually printf, but a custom API, and it doesn't have a vprintf
> equivalent.
If your architecture is supported by libffi, and the vargs ABI is the
same as the ABI for fixed args, libffi should do exactly what you need.
David Daney
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: va_arglist
2008-12-02 18:24 ` va_arglist David Daney
@ 2008-12-02 23:27 ` Robert William Fuller
2008-12-04 1:37 ` va_arglist Austin, Alex
0 siblings, 1 reply; 7+ messages in thread
From: Robert William Fuller @ 2008-12-02 23:27 UTC (permalink / raw)
To: David Daney; +Cc: Austin, Alex, Harvey Chapman, gcc-help
David Daney wrote:
> Austin, Alex wrote:
>> That's all about unpacking an arglist.
>
> No, it does both 'packing' and 'unpacking'.
>
>> I need to pack an arglist. Also, the function in question isn't
>> actually printf, but a custom API, and it doesn't have a vprintf
>> equivalent.
>
> If your architecture is supported by libffi, and the vargs ABI is the
> same as the ABI for fixed args, libffi should do exactly what you need.
>
> David Daney
Whatever you do, don't try to use __builtin_apply. It's busted on
x86-64. This is why the Objective-C runtime is broken out of the box on
x86-64. The only reason Objective-C works for the GnuStep project is
they are using hooks in the runtime to replace calls to __builtin_apply
with calls to libffi in their runtime.
^ permalink raw reply [flat|nested] 7+ messages in thread
* RE: va_arglist
2008-12-02 23:27 ` va_arglist Robert William Fuller
@ 2008-12-04 1:37 ` Austin, Alex
0 siblings, 0 replies; 7+ messages in thread
From: Austin, Alex @ 2008-12-04 1:37 UTC (permalink / raw)
To: Robert William Fuller, David Daney; +Cc: Harvey Chapman, gcc-help
I'm not aware of __builtin_apply, but the target arch is arm. Not sure whether it's eabi or oabi. Whatever the default of gcc-4.0.1 is.
-----Original Message-----
From: Robert William Fuller [mailto:hydrologiccycle@gmail.com]
Sent: Tuesday, December 02, 2008 5:27 PM
To: David Daney
Cc: Austin, Alex; Harvey Chapman; gcc-help@gcc.gnu.org
Subject: Re: va_arglist
David Daney wrote:
> Austin, Alex wrote:
>> That's all about unpacking an arglist.
>
> No, it does both 'packing' and 'unpacking'.
>
>> I need to pack an arglist. Also, the function in question isn't
>> actually printf, but a custom API, and it doesn't have a vprintf
>> equivalent.
>
> If your architecture is supported by libffi, and the vargs ABI is the
> same as the ABI for fixed args, libffi should do exactly what you need.
>
> David Daney
Whatever you do, don't try to use __builtin_apply. It's busted on
x86-64. This is why the Objective-C runtime is broken out of the box on
x86-64. The only reason Objective-C works for the GnuStep project is
they are using hooks in the runtime to replace calls to __builtin_apply
with calls to libffi in their runtime.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2008-12-04 1:37 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-12-02 12:48 va_arglist Austin, Alex
2008-12-02 13:30 ` va_arglist Harvey Chapman
2008-12-02 15:39 ` va_arglist Austin, Alex
2008-12-02 18:24 ` va_arglist David Daney
2008-12-02 23:27 ` va_arglist Robert William Fuller
2008-12-04 1:37 ` va_arglist Austin, Alex
2008-12-02 15:37 ` va_arglist Ian Lance Taylor
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).