From 9a34624e258557c3df1e167433a7c99ff742170c Mon Sep 17 00:00:00 2001 From: Ulrich Wilkens Date: Wed, 5 Sep 2012 16:49:35 +0200 Subject: [PATCH] Fix for __va_copy on FreeBSD i386. --- cde/programs/dtappbuilder/src/abmf/write_c.c | 4 +++- .../dtksh/ksh93/src/lib/libast/hash/hashalloc.c | 9 +++++++++ .../dtksh/ksh93/src/lib/libast/sfio/sfvprintf.c | 14 ++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/cde/programs/dtappbuilder/src/abmf/write_c.c b/cde/programs/dtappbuilder/src/abmf/write_c.c index 93d561937..7a41b85e3 100644 --- a/cde/programs/dtappbuilder/src/abmf/write_c.c +++ b/cde/programs/dtappbuilder/src/abmf/write_c.c @@ -350,8 +350,10 @@ write_func_def_params( va_list va_params ) { -#if defined(__ppc) || defined(linux) || defined(CSRG_BASED) +#if defined(__ppc) || defined(linux) || defined(__OpenBSD__) #define va_start_params() __va_copy(params, va_params) +#elif defined(__FreeBSD__) +#define va_start_params() va_copy(params, va_params) #else #define va_start_params() (params = va_params) #endif diff --git a/cde/programs/dtksh/ksh93/src/lib/libast/hash/hashalloc.c b/cde/programs/dtksh/ksh93/src/lib/libast/hash/hashalloc.c index d09af247b..361bd1463 100644 --- a/cde/programs/dtksh/ksh93/src/lib/libast/hash/hashalloc.c +++ b/cde/programs/dtksh/ksh93/src/lib/libast/hash/hashalloc.c @@ -214,6 +214,10 @@ hashalloc __PARAM__((Hash_table_t* ref, ...), (va_alist)) __OTORP__(va_dcl) tab->flags |= HASH_STATIC; break; case HASH_va_list: +#if defined(__FreeBSD__) && !defined(__LP64__) + if (vp < &va[elementsof(va)]) *vp++ = ap; + ap = va_arg(ap, va_list); +#else if (vp < &va[elementsof(va)]) { __va_copy( *vp, ap ); @@ -221,12 +225,17 @@ hashalloc __PARAM__((Hash_table_t* ref, ...), (va_alist)) __OTORP__(va_dcl) } vl = va_arg(ap, va_list); __va_copy(ap, vl); +#endif break; case 0: if (vp > va) { +#if defined(__FreeBSD__) && !defined(__LP64__) + ap = *--vp; +#else vp--; __va_copy( ap, *vp ); +#endif break; } if (tab->flags & HASH_SCOPE) diff --git a/cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfvprintf.c b/cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfvprintf.c index a95084bb7..4a93a8d21 100644 --- a/cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfvprintf.c +++ b/cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfvprintf.c @@ -301,9 +301,15 @@ loop_fa : GETARG(form,form,argf,args,char*,char*,'1',t_user,n_user); if(!form) form = ""; +#if defined(__FreeBSD__) && !defined(__LP64__) + GETARG(argsp,argsp,argf,args,va_list*,va_list*,'2',t_user,n_user); + memcpy((Void_t*)(&(fa->args)), (Void_t*)(&args), sizeof(va_list)); + memcpy((Void_t*)(&args), (Void_t*)argsp, sizeof(va_list)); +#else GETARGL(argsp,argsp,argf,args,va_list*,va_list*,'2',t_user,n_user); __va_copy( fa->args, args ); __va_copy( args, argsp ); +#endif fa->argf.p = argf; fa->extf.p = extf; fa->next = fast; @@ -313,8 +319,12 @@ loop_fa : default : /* unknown directive */ if(extf) { +#if defined(__FreeBSD__) && !defined(__LP64__) + va_list savarg = args; /* is this portable? */ +#else va_list savarg; /* is this portable? Sorry .. NO. */ __va_copy( savarg, args ); +#endif GETARG(sp,astr,argf,args,char*,char*,fmt,t_user,n_user); astr = NIL(char*); @@ -322,7 +332,11 @@ loop_fa : if((sp = astr) ) goto s_format; +#if defined(__FreeBSD__) && !defined(__LP64__) + args = savarg; /* extf failed, treat as if unmatched */ +#else __va_copy( args, savarg ); /* extf failed, treat as if unmatched */ +#endif } /* treat as text */