Fix for __va_copy on FreeBSD i386.
authorUlrich Wilkens <mail@uwilkens.de>
Wed, 5 Sep 2012 14:49:35 +0000 (16:49 +0200)
committerJon Trulson <jon@radscan.com>
Thu, 6 Sep 2012 01:28:31 +0000 (19:28 -0600)
cde/programs/dtappbuilder/src/abmf/write_c.c
cde/programs/dtksh/ksh93/src/lib/libast/hash/hashalloc.c
cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfvprintf.c

index 93d561937590a8ea4a9c8f06968861e58715a8b9..7a41b85e3ea27055bc57542218e54df421ea2f00 100644 (file)
@@ -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
index d09af247b6b10446e3c201763de5ca605dca1f82..361bd1463297563e70f57bfe5902d66e2d82a420 100644 (file)
@@ -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)
index a95084bb7ceb8f5b043de86d8c101449b2791910..4a93a8d21446277d02d7e8364081e57c9b2cdb5e 100644 (file)
@@ -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 */