Paul Gilmartin wrote: > On Mon, 12 Jan 2009 22:31:50 -0800, Henry Willard wrote: > > > >"memcpy( &ap, &xp, sizeof( va_list ) );" is not legal C. Either use the > >c99 va_copy ("va_copy(ap,xp)") created for this purpose or define > >_VARARG_EXT before including stdarg.h. Up until c99 there was no defined > >way to do what you were trying to do although your method as well as > >direct assignment worked on many but not all systems. > > > Thanks for educating me. Hmmm... > > #define _VARARG_EXT_ > > leads to: > > Trying vsnprintf(); > CEE3204S The system detected a protection exception (System Completion > Code=0C4). > From entry point f2 at compile unit offset +000001A4 at entry offset > +000001A4 at address 448CCADC. > [1] + Done(139) gmake varg && ./varg > 67109204 Segmentation violation ./varg > > ... a step backward. If vsnprintf() is incompatible with _VARARG_EXT_, > it would be a courtesy to the programmer to manifest this at compile > time, possibly by using char** instead of va_list to expose the > incompatibility.
vsnprintf() is incompatible with C89. Although it has shown up in many compilers it was officially introduced to C in C99. You are trying to use two features of the C language that are defined only in C99. > > > I see that va_copy() is defined as: > > #define va_copy(dest, src) ((dest) = (src)) > > ... simple enough. But our systems programmer hasn't configured > the c99 environment. Then I think you have a complaint with your systems programmer if you want to use C99 features. > > > If I undefine and redefine va_start, adding a call to va_arg at > the end, it works OK. But my real goal is to get it working in > enhanced ASCII mode. And that fails with: > > c89 -I.. -D_ALL_SOURCE -Wa,"ASA,RENT" -Wl,xplink,EDIT=NO -Wc,dll,ascii -o > varg ../source/varg.c /usr/lib/Xaw.x /usr/lib/SM.x /usr/lib/ICE.x > /usr/lib/X11.x -lcurses > -sh 0 + ./varg > -sh 0 + 2<& 1 > -sh 0 + iconv -f ISO8859-1 -t IBM-1047 > CEE3204S The system detected a protection exception (System Completion > Code=0C4). > From entry point f2 at compile unit offset +00000060 at entry offset > +00000060 at address 448F0190. > Format: " %s -- %s " Your program using either C99 va_copy or _VARARG_EXT and your technically illegal memcpy technique works fine for me in enhanced ASCII mode if I tell the compiler to use C99 rules. > > > Thanks, > gil > h ---------------------------------------------------------------------- For IBM-MAIN subscribe / signoff / archive access instructions, send email to lists...@bama.ua.edu with the message: GET IBM-MAIN INFO Search the archives at http://bama.ua.edu/archives/ibm-main.html