SWAP macro (utter insanity+interesting question)
bzs at bu-cs.UUCP
bzs at bu-cs.UUCP
Wed Jun 25 15:47:13 AEST 1986
The attached bit of total brain-damage seems to do the job in YAW (yet
another way.) I don't actually proffer it as a solution that you might
use, no way, don't bother...BUT
Interesting question:
What is the semantics of:
sizeof(*ip++)
?? Try it before you guess, I was shocked (late entry for the
obfuscated C contest??) The semantics I found are essential for
my solution.
P.S. It compiled and ran correctly on (code follows):
Hardware OS Software Notes
-------- --- -------- ---------------
SUN3/180 UNIX4.2 R3.0 PCC
DEC2060 TOPS-20 5.4 MIT/PCC provided bcopy()
ATT/3B5 UNIX SYSVR2 C used memcpy()
IBM3090/200 VPS/VM PCC provided bcopy()
Encore/MultiMax UNIX 4.2 PCC
VAX/750 UNIX 4.2 PCC
VAX/780 VMS4.3 VMS/C provided bcopy()
Celerity/1200 UNIX 4.2 PCC
DG MV/10000 AOS/VS 6.03 MVUX 2.01/C used memcpy()
I also tried it on the SUN, DEC2060, IBM3090, MV10000 and VAX750 with
double's instead of ints and it compiled and worked fine, I don't have
the energy right now to go through all the others, requests accepted.
It also passes lint.
YOW, am I portable yet?
-Barry Shein, Boston University
____________
#include <stdio.h>
#define swap(x,y) \
{ \
char t1[sizeof(x)], t2[sizeof(t1)]; \
char *p, *q; \
\
p = (char *) &(x); \
q = (char *) &(y); \
bcopy(p,t1,sizeof(t1)); \
bcopy(q,t2,sizeof(t1)); \
bcopy(t2,p,sizeof(t1)); \
bcopy(t1,q,sizeof(t1)); \
}
main(argc,argv) int argc; char **argv;
{
int ai[2], *ip = ai;
int bi[2], *ip2 = bi;
ai[0] = 1;
ai[1] = 2;
bi[0] = 3;
bi[1] = 4;
swap(*ip++,*ip2++);
printf("ai[0] = %d *ip = %d bi[0] = %d *ip2 = %d\n",
ai[0], *ip, bi[0], *ip2);
exit(0);
}
Should print out something like:
ai[0] = 3 *ip = 2 bi[0] = 1 *ip2 = 4
If I said I used memcpy() I added:
#define bcopy(x,y,z) memcpy(y,x,z)
If I said I provided bcopy() I added:
bcopy(from,to,n) char *from, *to; int n;
{
while(n--) *to++ = *from++;
}
More information about the Comp.lang.c
mailing list