Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C Programming (http://www.velocityreviews.com/forums/f42-c-programming.html)
-   -   variadic function calling variadic function (http://www.velocityreviews.com/forums/t442593-variadic-function-calling-variadic-function.html)

goldfita@signalsguru.net 05-03-2006 05:54 AM

variadic function calling variadic function
 
I'm not sure if I'm doing something stupid, or if I'm not understanding
how to use variadic functions. These functions appear to be working
individually. In ast_call, I can vprintf the argument list and it
looks fine. If I invoke write_cmd, it seems to work fine. But when I
invoke write_cmd in ast_call with argp, I get garbage in argp in
write_cmd. I don't know where it's breaking.

int ast_call(struct ast_connection *conn, char *msg, ...)
{
va_list argp;

va_start(argp,msg);
if(!write_cmd(conn->socket,msg,argp)) {
va_end(argp);
return write_FAIL;
}
va_end(argp);
if(!conn->params.wait_for_resp)
return AST_SUCCESS;
return ast_wait_peek_by_id(conn,conn->cnt++);
}

static int write_cmd(int socket, char *msg, ...)
{
int n=0,len=0,slen;
va_list argp;
char buf[BUFSIZE];

va_start(argp,msg);
vsprintf(buf,msg,argp);
va_end(argp);
slen = strlen(buf);
puts(buf);
for(len=0; len<slen;) {
if((n = write(socket,buf+len,slen-len)) < 0)
return 0;
len += n;
}
return 1;
}


Michael Mair 05-03-2006 05:59 AM

Re: variadic function calling variadic function
 
goldfita@signalsguru.net schrieb:
> I'm not sure if I'm doing something stupid, or if I'm not understanding
> how to use variadic functions. These functions appear to be working
> individually. In ast_call, I can vprintf the argument list and it
> looks fine. If I invoke write_cmd, it seems to work fine. But when I
> invoke write_cmd in ast_call with argp, I get garbage in argp in
> write_cmd. I don't know where it's breaking.
>
> int ast_call(struct ast_connection *conn, char *msg, ...)
> {
> va_list argp;
>
> va_start(argp,msg);
> if(!write_cmd(conn->socket,msg,argp)) {
> va_end(argp);
> return write_FAIL;
> }
> va_end(argp);
> if(!conn->params.wait_for_resp)
> return AST_SUCCESS;
> return ast_wait_peek_by_id(conn,conn->cnt++);
> }
>
> static int write_cmd(int socket, char *msg, ...)
> {
> int n=0,len=0,slen;
> va_list argp;
> char buf[BUFSIZE];
>
> va_start(argp,msg);
> vsprintf(buf,msg,argp);
> va_end(argp);
> slen = strlen(buf);
> puts(buf);
> for(len=0; len<slen;) {
> if((n = write(socket,buf+len,slen-len)) < 0)
> return 0;
> len += n;
> }
> return 1;
> }


http://c-faq.com/varargs/ , especially 15.5 and 15.6

-Michael
--
E-Mail: Mine is an /at/ gmx /dot/ de address.

goldfita@signalsguru.net 05-03-2006 06:10 AM

Re: variadic function calling variadic function
 

Michael Mair wrote:
<snip>

>
> http://c-faq.com/varargs/ , especially 15.5 and 15.6
>
> -Michael
> --
> E-Mail: Mine is an /at/ gmx /dot/ de address.


Isn't that what I'm doing? I don't understand what 15.6 has to do with
my problem. I called

va_start(argp,msg);
vsprintf(buf,msg,argp);
va_end(argp);


and

va_start(argp,msg);
if(!write_cmd(conn->socket,msg,argp)) {
va_end(argp);
return write_FAIL;
}
va_end(argp);

I'm just not seeing it. It must be obvious to someone. Thanks.


Chris Torek 05-03-2006 06:46 AM

Re: variadic function calling variadic function
 
In article <1146635643.356925.180190@j73g2000cwa.googlegroups .com>
<goldfita@signalsguru.net> wrote:
>I'm not sure if I'm doing something stupid, or if I'm not understanding
>how to use variadic functions.


Michael Mair already pointed you at the FAQ entry. I will add
a few more remarks here:

>... In ast_call, I can vprintf the argument list and it
>looks fine.


Note, you are calling vprintf(), not printf(), when it "works fine".

>If I invoke write_cmd [directly], it seems to work fine.


Here you are calling printf-- er, I mean write_cmd(), not vprintf--
oops, I mean vwrite_cmd().

>But when I invoke write_cmd in ast_call ...


You need to call vwrite_cmd().

Of course, you first need to *write* vwrite_cmd(). This is easy
since you already have all the appropriate code:

>static int write_cmd(int socket, char *msg, ...)
>{
> int n=0,len=0,slen;
> va_list argp;
> char buf[BUFSIZE];
>
> va_start(argp,msg);
> vsprintf(buf,msg,argp);
> va_end(argp);
> slen = strlen(buf);
> puts(buf);
> for(len=0; len<slen;) {
> if((n = write(socket,buf+len,slen-len)) < 0)
> return 0;
> len += n;
> }
> return 1;
>}


Change the ", ..." part to take a "va_list" argument, stop calling
va_start and va_end (since you already have the va_list), and leave
the rest of the code as-is. Then rewrite write_cmd() in terms of
a call to vwrite_cmd() (to eliminate redundancy and thus improve
maintainability, and incidentally save code space too).
--
In-Real-Life: Chris Torek, Wind River Systems
Salt Lake City, UT, USA (4039.22'N, 11150.29'W) +1 801 277 2603
email: forget about it http://web.torek.net/torek/index.html
Reading email is like searching for food in the garbage, thanks to spammers.

Flash Gordon 05-03-2006 08:52 AM

Re: variadic function calling variadic function
 
goldfita@signalsguru.net wrote:
> Michael Mair wrote:
> <snip>
>
>> http://c-faq.com/varargs/ , especially 15.5 and 15.6
>>
>> -Michael
>> --
>> E-Mail: Mine is an /at/ gmx /dot/ de address.

>
> Isn't that what I'm doing? I don't understand what 15.6 has to do with
> my problem. I called
>
> va_start(argp,msg);
> vsprintf(buf,msg,argp);
> va_end(argp);
>
>
> and
>
> va_start(argp,msg);
> if(!write_cmd(conn->socket,msg,argp)) {
> va_end(argp);
> return write_FAIL;
> }
> va_end(argp);
>
> I'm just not seeing it. It must be obvious to someone. Thanks.


Michael did not point you at the most appropriate question, which is 15.12

He possibly expected you to work it out from how vsprintf works.
--
Flash Gordon, living in interesting times.
Web site - http://home.flash-gordon.me.uk/
comp.lang.c posting guidelines and intro:
http://clc-wiki.net/wiki/Intro_to_clc

goldfita@gmail.com 05-03-2006 05:23 PM

Re: variadic function calling variadic function
 

Flash Gordon wrote:
> goldfita@signalsguru.net wrote:
> > Michael Mair wrote:
> > <snip>
> >
> >> http://c-faq.com/varargs/ , especially 15.5 and 15.6
> >>
> >> -Michael
> >> --
> >> E-Mail: Mine is an /at/ gmx /dot/ de address.

> >
> > Isn't that what I'm doing? I don't understand what 15.6 has to do with
> > my problem. I called
> >
> > va_start(argp,msg);
> > vsprintf(buf,msg,argp);
> > va_end(argp);
> >
> >
> > and
> >
> > va_start(argp,msg);
> > if(!write_cmd(conn->socket,msg,argp)) {
> > va_end(argp);
> > return write_FAIL;
> > }
> > va_end(argp);
> >
> > I'm just not seeing it. It must be obvious to someone. Thanks.

>
> Michael did not point you at the most appropriate question, which is 15.12
>
> He possibly expected you to work it out from how vsprintf works.
> --
> Flash Gordon, living in interesting times.
> Web site - http://home.flash-gordon.me.uk/
> comp.lang.c posting guidelines and intro:
> http://clc-wiki.net/wiki/Intro_to_clc



For some reason the vprintf/printf thing wasn't clicking. The last two
posts put me on the right track. Thanks.



All times are GMT. The time now is 10:47 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.